Я тренирую нейронную сеть, используя i) SGD и ii) Adam Optimizer. При использовании обычного SGD я получаю плавную кривую потери обучения и итерации, как показано ниже (красная). Тем не менее, когда я использовал Adam Optimizer, кривая тренировочных потерь имела некоторые всплески. Чем объясняются эти спайки?
Детали модели:
14 узлов ввода -> 2 скрытых слоя (100 -> 40 единиц) -> 4 единицы вывода
Я использую параметры по умолчанию для Адама beta_1 = 0.9
, beta_2 = 0.999
, epsilon = 1e-8
и batch_size = 32
.
neural-networks
deep-learning
adam
Абдул Фатир
источник
источник
Ответы:
Шипы являются неизбежным следствием мини-градиентного спуска в Адаме (
batch_size=32
). Некоторые мини-пакеты «случайно» содержат неудачные данные для оптимизации, которые вызывают те всплески, которые вы видите в своей функции затрат с помощью Адама. Если вы попробуете стохастический градиентный спуск (так же, как и при использованииbatch_size=1
), вы увидите, что в функции стоимости еще больше всплесков. То же самое не происходит в (полной) пакетной GD, потому что она использует все данные обучения (т. Е. Размер партии равен количеству элементов вашего обучающего набора) каждую эпоху оптимизации. Поскольку на вашем первом графике стоимость монотонно плавно снижается, кажется, что название ( i) с SGD ) неверно, и вы используете (полный) пакетный градиентный спуск вместо SGD.На своем отличном курсе глубокого обучения в Coursera Эндрю Нг подробно объясняет это, используя изображение ниже:
источник
Я потратил безумное количество времени на отладку взрывающихся градиентов и похожего поведения. Ваш ответ будет зависеть от функции потерь, данных, архитектуры и т. Д. Есть сотни причин. Я назову несколько.
log(0)
плохие прогнозы / выбросы в наборе данных, что приведет к взрывным градиентам. Большинство пакетов (torch, tenorflow и т. Д.) По умолчанию реализуют отсечение для своих потерь.drop_last
. Малый размер партии = высокая дисперсияТеперь, почему вы видите это с Адамом, а не с SGD? Очевидно, вы достигли меньших потерь с Адамом. Как отмечалось ранее, если 99,9% набора данных имеют оптимумы в одной точке, за исключением некоторого наблюдения, это может быть то наблюдение, которое кричит «НЕТ» и выпрыгивает из локальных минимумов при случайном выборе партии. Если вы видите это каждые
dataset_size//batch_size+1
шаги, это, вероятно, из-за того, что конечный размер пакета мал. Могу поспорить, что вы также увидите всплеск SGD, если дадите ему понизиться.Бонус: Ваше действительно быстрое уменьшение с помощью оптимизатора импульса (Адам) может означать, что некоторый слой (входной слой? Выходной слой?) Инициализируется вне масштаба (до больших / малых весов).
источник