Эта статья поможет вам решить, где именно использовать ReLU (Rectified Linear Unit) и как он играет роль в повышении точности вашей модели. Используйте эту ссылку GitHub для просмотра исходного кода.

Приведенная ниже таблица является окончательным результатом этой статьи, обученной на наборе данных cifar10 за 50 эпох. Точность базовой модели составила 64%. Оптимизированное использование слоев активации повысило точность до 80%.

+---------------------------+-----------------------------------+
|         model_name        | validation accuracy | time taken  |
+---------------------------+-----------------------------------+
|  without_any_activation   |               64.00 |  1171.98    |
|  with_relu_activation     |               78.52 |  1300.42    |
|  with_relu_activation_2   |               78.12 |  1305.67    |
|  with_relu_activation_2_3 |               77.55 |  1303.76    |
|  with_relu_activation_7   |               78.80 |  1349.62    |
|  with_relu_activation_7_10|               80.56 |  1368.53    |
+---------------------------+-----------------------------------+

СОДЕРЖАНИЕ

  1. Определение ReLU
  2. Определение модели
  3. Определение эвристики
  4. Эксперименты и результаты
  5. Будущая работа

1. Определение ReLU:

  • Он удаляет все отрицательные значения из слоя или матрицы, которая представляет этот слой в нейронных сетях.
def relu (x):
 return x if x > 0 else 0
  • Мы также можем использовать Leaky ReLU.
  • Мы использовали пакетную нормализацию, которая достигается за счет шага нормализации, который фиксирует средние значения и отклонения входных данных каждого слоя.

2. Определение модели, использованной для этого эксперимента.

Приведенный ниже пример представляет собой очень простую модель, поскольку мы хотим сосредоточиться только на роли активации ReLU.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)           (None, 30, 30, 48)          1344      
_________________________________________________________________
activation_1 (Activation)    (None, 30, 30, 48)            0         
_________________________________________________________________
batch_normalization_1 (Batc (None, 30, 30, 48)           192       
_________________________________________________________________
conv2d_2 (Conv2D)           (None, 28, 28, 48)         20784     
_________________________________________________________________
activation_2 (Activation)    (None, 28, 28, 48)            0         
_________________________________________________________________
batch_normalization_2 (Batc (None, 28, 28, 48)           192       
_________________________________________________________________
conv2d_3 (Conv2D)           (None, 26, 26, 96)         41568     
_________________________________________________________________
activation_3 (Activation)    (None, 26, 26, 96)            0         
_________________________________________________________________
batch_normalization_3 (Batc (None, 26, 26, 96)           384       
_________________________________________________________________
conv2d_4 (Conv2D)           (None, 24, 24, 96)         83040     
_________________________________________________________________
activation_4 (Activation)    (None, 24, 24, 96)            0         
_________________________________________________________________
batch_normalization_4 (Batc (None, 24, 24, 96)           384       
_________________________________________________________________
conv2d_5 (Conv2D)           (None, 22, 22, 96)         83040     
_________________________________________________________________
activation_5 (Activation)    (None, 22, 22, 96)            0         
_________________________________________________________________
batch_normalization_5 (Batc (None, 22, 22, 96)           384       
_________________________________________________________________
conv2d_6 (Conv2D)           (None, 20, 20, 96)         83040     
_________________________________________________________________
activation_6 (Activation)    (None, 20, 20, 96)            0         
_________________________________________________________________
batch_normalization_6 (Batc (None, 20, 20, 96)           384       
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 10, 10, 96)            0         
_________________________________________________________________
conv2d_7 (Conv2D)           (None, 8, 8, 192)         166080    
_________________________________________________________________
activation_7 (Activation)    (None, 8, 8, 192)             0         
_________________________________________________________________
batch_normalization_7 (Batc (None, 8, 8, 192)            768       
_________________________________________________________________
conv2d_8 (Conv2D)           (None, 6, 6, 192)         331968    
_________________________________________________________________
activation_8 (Activation)    (None, 6, 6, 192)             0         
_________________________________________________________________
batch_normalization_8 (Batc (None, 6, 6, 192)            768       
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 3, 3, 192)             0         
_________________________________________________________________
conv2d_9 (Conv2D)           (None, 1, 1, 192)         331968    
_________________________________________________________________
activation_9 (Activation)   (None, 1, 1, 192)              0         
_________________________________________________________________
batch_normalization_9 (Batc (None, 1, 1, 192)            768       
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 1, 1, 10)           1930      
_________________________________________________________________
activation_10 (Activation)   (None, 1, 1, 10)              0         
_________________________________________________________________
batch_normalization_10 (Batc (None, 1, 1, 10)             40        
_________________________________________________________________
flatten_1 (Flatten)          (None, 10)                    0         
_________________________________________________________________
activation_11 (Activation)   (None, 10)                    0         
=================================================================
Total params: 1,149,026
Trainable params: 1,146,894
Non-trainable params: 2,132

В этой модели мы попытаемся повысить точность, используя эти слои или не используя их на основе некоторых эвристик:

activation_1, activation_2, activation_3, activation_4, activation_5, activation_6, activation_7, activation_8, activation_9 and activation_10

3. Определение эвристики

Возьмем единственную матрицу 3x3:

          A                                            B
+------+------+------+                      +------+------+------+
| -0.2 |  0.5 |  0.3 |                      |  0.0 |  0.5 |  0.3 |
+------+------+------+                      +------+------+------+
|  0.4 | -0.6 |  0.4 |      =========>      |  0.4 |  0.0 |  0.4 |
+------+------+------+         ReLU         +------+------+------+
| -0.3 |  0.9 |  0.1 |                      |  0.0 |  0.9 |  0.1 |
+------+------+------+                      +------+------+------+
  1. ratio_num: количество отрицательных чисел / количество положительных чисел.
  2. ratio_sum: сумма отрицательных чисел / сумма положительных чисел.

В данной матрице:

+-----------------+----------------------+-------------------+ 
|     Heuristic   |       Matrix A       |     Matrix B      |
+-----------------+----------------------+-------------------+
|    ratio_num    |      3 / 6 = 0.5     |     0 / 6 = 0     |
+-----------------+----------------------+-------------------+
|    ratio_sum    |  -1.1 / 2.6 = -0.423 |    0 / 2.6 = 0    |
+-----------------+----------------------+-------------------+

Теперь возьмем уровни conv2d_8 и activate_8. Они представляют собой матрицу A и матрицу B соответственно. Его размер - 6x6x192. Это означает, что у него 192 матрицы размером 6x6. Мы будем рассматривать его как одномерный массив для нашего случая использования.

Как мы узнаем, хорошо ли преобразовывать эту матрицу A (conv2d_8) в матрицу B (activate_8) для достижения большей точности или нет?

Итак, мы находим ratio_num и ratio_sum для conv2d_8 и посмотрим, может ли это помочь нам принять какое-либо решение.

4. Эксперименты.

1. without_any_activation (Модель 1):

  1. Мы обучили модель без включения какого-либо уровня активации, то есть все уровни активации_1, активации_2, активации_3, активации_4, активации_5, активации_6, активации_7, активации_8, активации_9 и активации_10 были удалены при определении модели.
  2. Мы достигли наилучшей точности проверки 64,07% в 10 эпоху.
  3. Мы выбрали изображение из всех 10 классов и выяснили эвристику для каждого класса и каждого слоя (после чего мы должны были использовать активацию ReLU) после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
  4. Смотрите результат здесь:

2. with_relu_activation (Модель 2):

  1. Мы обучили модель со всеми уровнями активации, то есть со всеми уровнями активации_1, активация_2, активация_3, активация_4, активация_5, активация_6, активация_7, активация_8, активация_9 и активация_10.
  2. Мы достигли наилучшей точности проверки 78,52% в 48-ю эпоху.
  3. Мы выбрали изображение из всех 10 классов и нашли эвристику для каждого класса в слое, который находится непосредственно перед слоями активации после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
  4. Смотрите результат здесь:

Мы заметили, что добавив активацию ReLU, мы повысили точность с 64% до 78%.

Мы попытаемся удалить 20% всех слоев активации ReLU (т.е. 2 слоя) и посмотрим, сможем ли мы еще больше повысить точность.

Есть два способа удалить слои активации:
1. Удалить слои, где ratio_num и ratio_sum минимальны по величине. (индекс 2 из таблицы)

2. Удалите слои, где ratio_num и ratio_sum максимальны по величине. (индекс 7 из таблицы)

3. with_relu_activation_2 (Модель 3):

  1. Мы обучили модель со слоями активация_1, активация_3, активация_4, активация_5, активация_6, активация_7, активация_8, активация_9 и активация_10. Обратите внимание, что мы удалили активацию_2 из этой модели.
  2. Мы достигли наилучшей точности проверки 78,12% в 45-ю эпоху.
  3. Мы выбрали изображение из всех 10 классов и обнаружили эвристику для каждого класса в слое, которое находится непосредственно перед слоями активации после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
  4. Смотрите результат здесь:

Мы видим, что точность проверки снизилась с 78,52% до 78,12%.

Теперь в этой модели мы видим из таблицы, что индекс 3 теперь имеет самые низкие ratio_num и ratio_sum.

Поэтому мы заново определим модель без слоев Activation_2 и Activation_3 и снова обучим.

4. with_relu_activation_2_3 (Модель 4):

  1. Мы обучили модель со слоями активация_1, активация_4, активация_5, активация_6, активация_7, активация_8, активация_9 и активация_10. Обратите внимание, что мы удалили активацию_2 и активацию_3 из этой модели.
  2. Мы достигли наилучшей точности проверки 77,55% в 48-ю эпоху.

Общая точность снизилась на 1%, так что это не самый эффективный способ сделать это.

Теперь мы попытаемся удалить слои с максимальным значением ration_num и ratio_sum (т.е. активацией_7).

5. with_relu_activation_7 (Модель 5):

  1. Мы обучили модель слоям активация_1, активация_2, активация_3, активация_4, активация_5, активация_6, активация_8, активация_9 и активация_10. Обратите внимание, что мы удалили активацию_7 из этой модели.
  2. Мы достигли наилучшей точности проверки 78,80% в 42-ю эпоху.
  3. Мы выбрали изображение из всех 10 классов и обнаружили эвристику для каждого класса в слое, которое находится непосредственно перед слоями активации после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
  4. Смотрите результат здесь:

Мы наблюдаем, что точность проверки выросла с 78,52% до 78,80%.

Теперь в этой модели мы видим из таблицы, что индекс 10 теперь имеет самые высокие ratio_num и ratio_sum.

Поэтому мы заново определим модель без слоев activate_7 и activate_10 и снова обучим.

6. with_relu_activation_7_10 (Модель 6):

  1. Мы обучили модель со слоями активация_1, активация_2, активация_3, активация_4, активация_5, активация_6, активация_8 и активация_9. Обратите внимание, что мы удалили активацию_7 и активацию_10 из этой модели.
  2. Мы достигли наилучшей точности проверки 80,56% в 45-ю эпоху.

Общая точность увеличилась на 2%, так что это кажется эффективным способом сделать это.

В итоге мы приходим к такому результату:

+---------------------------+-----------------------------------+
|         model_name        | validation accuracy | time taken  |
+---------------------------+-----------------------------------+
|  without_any_activation   |               64    |  1171.98    |
|  with_relu_activation     |               78.52 |  1300.42    |
|  with_relu_activation_2   |               78.12 |  1305.67    |
|  with_relu_activation_2_3 |               77.55 |  1303.76    |
|  with_relu_activation_7   |               78.80 |  1349.62    |
|  with_relu_activation_7_10|               80.56 |  1368.53    |
+---------------------------+-----------------------------------+

Слои, на которых отношение отрицательных значений к положительным значениям велико, мы не должны применять активацию ReLU.

Вы можете протестировать другие наборы данных и сообщить мне, сможете ли вы повысить точность своей модели.

5. Будущая работа

  1. Лучшая эвристика: здесь мы взяли прямые отношения, чтобы получить еще лучшую эвристику. Например, включите стандартное отклонение в качестве решающего фактора.
  2. Другой набор данных: мы можем протестировать один и тот же принцип на разных наборах данных и посмотреть, сможем ли мы обобщить решение.
  3. Мы можем выбрать другие функции активации и попытаться найти эвристику, которая поможет нам решить, хотим мы использовать активацию или нет.
  4. Это решение жадного подхода, которое может не быть оптимальным. Нам нужно найти эффективный способ достичь оптимального решения.