Я витратив шалену кількість часу на налагодження вибуху градієнтів і подібної поведінки. Ваша відповідь буде залежати від функції втрати, даних, архітектури тощо. Причин сотні. Я назву декілька.
- Втратна залежність. Втрати логічності можуть бути відсічені, якщо їх немає, вони можуть оцінюватись
log(0)
на предмет поганих прогнозів / переживань у наборі даних, викликаючи вибухи градієнтів. Більшість пакетів (факел, тензорфлоу тощо) реалізує відсікання за замовчуванням для їх втрат.
- Набір даних у наборі даних.
- ϵу= ( x - u ) / ( s + ϵ )сϵу
- Підсумкова партія в епоху може бути невеликою, якщо набір даних нероздільний за batchsize. У завантажувачі даних факела є прапор
drop_last
. Невеликий пакетний розмір = велика дисперсія
Тепер, чому ви бачите це з Адамом, а не з SGD? Очевидно, що ви з Адамом досягли менших втрат. Як зазначалося раніше, якщо 99,9% набору даних мають оптимізацію в одній точці, за винятком деякого спостереження, це може бути те, що спостереження кричить "НІ" та вистрибує з локальних мінімумів, коли випадковим чином вибирається до партії. Якщо ви бачите це на кожному dataset_size//batch_size+1
кроці, це, мабуть, через те, що остаточний розмір партії малий. Б'юсь об заклад, ви побачите і шип SGD, якщо ви дозволите йому менші втрати.
Бонус: Ваше дійсно швидке зменшення за допомогою оптимізатора імпульсу (Адам) може означати, що якийсь шар (вхідний шар? Вихідний шар?) Ініціалізується далеко поза шкалою (до великих / малих ваг).