Эта статья поможет вам решить, где именно использовать 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 | +---------------------------+-----------------------------------+
СОДЕРЖАНИЕ
- Определение ReLU
- Определение модели
- Определение эвристики
- Эксперименты и результаты
- Будущая работа
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 | +------+------+------+ +------+------+------+
- ratio_num: количество отрицательных чисел / количество положительных чисел.
- 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, активации_2, активации_3, активации_4, активации_5, активации_6, активации_7, активации_8, активации_9 и активации_10 были удалены при определении модели.
- Мы достигли наилучшей точности проверки 64,07% в 10 эпоху.
- Мы выбрали изображение из всех 10 классов и выяснили эвристику для каждого класса и каждого слоя (после чего мы должны были использовать активацию ReLU) после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
- Смотрите результат здесь:
2. with_relu_activation (Модель 2):
- Мы обучили модель со всеми уровнями активации, то есть со всеми уровнями активации_1, активация_2, активация_3, активация_4, активация_5, активация_6, активация_7, активация_8, активация_9 и активация_10.
- Мы достигли наилучшей точности проверки 78,52% в 48-ю эпоху.
- Мы выбрали изображение из всех 10 классов и нашли эвристику для каждого класса в слое, который находится непосредственно перед слоями активации после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
- Смотрите результат здесь:
Мы заметили, что добавив активацию 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, активация_3, активация_4, активация_5, активация_6, активация_7, активация_8, активация_9 и активация_10. Обратите внимание, что мы удалили активацию_2 из этой модели.
- Мы достигли наилучшей точности проверки 78,12% в 45-ю эпоху.
- Мы выбрали изображение из всех 10 классов и обнаружили эвристику для каждого класса в слое, которое находится непосредственно перед слоями активации после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
- Смотрите результат здесь:
Мы видим, что точность проверки снизилась с 78,52% до 78,12%.
Теперь в этой модели мы видим из таблицы, что индекс 3 теперь имеет самые низкие ratio_num и ratio_sum.
Поэтому мы заново определим модель без слоев Activation_2 и Activation_3 и снова обучим.
4. with_relu_activation_2_3 (Модель 4):
- Мы обучили модель со слоями активация_1, активация_4, активация_5, активация_6, активация_7, активация_8, активация_9 и активация_10. Обратите внимание, что мы удалили активацию_2 и активацию_3 из этой модели.
- Мы достигли наилучшей точности проверки 77,55% в 48-ю эпоху.
Общая точность снизилась на 1%, так что это не самый эффективный способ сделать это.
Теперь мы попытаемся удалить слои с максимальным значением ration_num и ratio_sum (т.е. активацией_7).
5. with_relu_activation_7 (Модель 5):
- Мы обучили модель слоям активация_1, активация_2, активация_3, активация_4, активация_5, активация_6, активация_8, активация_9 и активация_10. Обратите внимание, что мы удалили активацию_7 из этой модели.
- Мы достигли наилучшей точности проверки 78,80% в 42-ю эпоху.
- Мы выбрали изображение из всех 10 классов и обнаружили эвристику для каждого класса в слое, которое находится непосредственно перед слоями активации после обучения модели для 50 эпох. Мы также узнаем среднее значение для эвристики.
- Смотрите результат здесь:
Мы наблюдаем, что точность проверки выросла с 78,52% до 78,80%.
Теперь в этой модели мы видим из таблицы, что индекс 10 теперь имеет самые высокие ratio_num и ratio_sum.
Поэтому мы заново определим модель без слоев activate_7 и activate_10 и снова обучим.
6. with_relu_activation_7_10 (Модель 6):
- Мы обучили модель со слоями активация_1, активация_2, активация_3, активация_4, активация_5, активация_6, активация_8 и активация_9. Обратите внимание, что мы удалили активацию_7 и активацию_10 из этой модели.
- Мы достигли наилучшей точности проверки 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. Будущая работа
- Лучшая эвристика: здесь мы взяли прямые отношения, чтобы получить еще лучшую эвристику. Например, включите стандартное отклонение в качестве решающего фактора.
- Другой набор данных: мы можем протестировать один и тот же принцип на разных наборах данных и посмотреть, сможем ли мы обобщить решение.
- Мы можем выбрать другие функции активации и попытаться найти эвристику, которая поможет нам решить, хотим мы использовать активацию или нет.
- Это решение жадного подхода, которое может не быть оптимальным. Нам нужно найти эффективный способ достичь оптимального решения.