Я потратил безумное количество времени на отладку взрывающихся градиентов и похожего поведения. Ваш ответ будет зависеть от функции потерь, данных, архитектуры и т. Д. Есть сотни причин. Я назову несколько.
- Потеря иждивенца. Потери логарифмического правдоподобия должны быть отсечены, в противном случае он может оценить почти
log(0)
плохие прогнозы / выбросы в наборе данных, что приведет к взрывным градиентам. Большинство пакетов (torch, tenorflow и т. Д.) По умолчанию реализуют отсечение для своих потерь.
- Выбросы в наборе данных.
- εY= ( x - u ) / ( s + ϵ )sεY
- Конечная партия в эпоху может быть небольшой, если набор данных неделим по размеру партии. В загрузчике факелов есть флаг
drop_last
. Малый размер партии = высокая дисперсия
Теперь, почему вы видите это с Адамом, а не с SGD? Очевидно, вы достигли меньших потерь с Адамом. Как отмечалось ранее, если 99,9% набора данных имеют оптимумы в одной точке, за исключением некоторого наблюдения, это может быть то наблюдение, которое кричит «НЕТ» и выпрыгивает из локальных минимумов при случайном выборе партии. Если вы видите это каждые dataset_size//batch_size+1
шаги, это, вероятно, из-за того, что конечный размер пакета мал. Могу поспорить, что вы также увидите всплеск SGD, если дадите ему понизиться.
Бонус: Ваше действительно быстрое уменьшение с помощью оптимизатора импульса (Адам) может означать, что некоторый слой (входной слой? Выходной слой?) Инициализируется вне масштаба (до больших / малых весов).