Пояснення Спайків у програмі втрати тренувань проти ітерацій Адама Оптимізатора


16

Я треную нейронну мережу за допомогою i) SGD та ii) Адапта оптимізатора. Під час використання звичайного SGD я отримую плавну криву втрати тренувань проти ітерації, як показано нижче (червона). Однак, коли я використовував оптимізатор Адама, крива втрати тренувань має деякі сплески. Яке пояснення цих шипів?

Деталі моделі:

14 вхідних вузлів -> 2 прихованих шару (100 -> 40 одиниць) -> 4 вихідних одиниці

Я використовую параметри по замовчуванням для Адама beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8і batch_size = 32.

i) З SGD ii) З АдамомЗ SGD З Адамом


На майбутнє, зниження початкового рівня навчання може допомогти усунути сплески в Адамі
жирний

Відповіді:


12

Шипи - неминучий наслідок міні-партійного градієнтного спуску в Адамі (batch_size=32 ). Деякі міні-партії мають "випадково" невдалі дані для оптимізації, що викликає ті сплески, які ви бачите у своїй вартості функції за допомогою Адама. Якщо ви спробуєте стохастичний градієнтний спуск (такий же, як і використання batch_size=1), ви побачите, що у функції витрат є ще більше сплеску. Те ж не відбувається в (Повному) пакетному GD, оскільки він використовує всі дані тренувань (тобто розмір партії дорівнює кардинальності вашого навчального набору) кожної епохи оптимізації. Як і у вашій першій графіці, вартість монотонно зменшується, здається, що заголовок ( i) З SGD ) неправильний, і ви використовуєте (Повний) пакетний градієнт спуск замість SGD.

Ендрю Нг на своєму великому курсі глибокого навчання в Курсіра дуже детально пояснює це, використовуючи зображення нижче:

Функції витрат


2
"SGD ... використовує всі дані тренінгу" - ви впевнені в цьому? Це означає, що ваги оновлюються після подачі всіх даних вперед, але це називається повнорозмірним gd, а не sgd. Стохастичний має на увазі міні-партію
Алекс

Дякую @Alex за вказівку на мою помилку, я вже виправив її та вдосконалив відповідь із посиланням для отримання додаткової інформації.
xboard

@xboard - Ні, я використовую міні-пакетний градієнтний спуск для першого.
Абдул Фатір

8

Я витратив шалену кількість часу на налагодження вибуху градієнтів і подібної поведінки. Ваша відповідь буде залежати від функції втрати, даних, архітектури тощо. Причин сотні. Я назву декілька.

  • Втратна залежність. Втрати логічності можуть бути відсічені, якщо їх немає, вони можуть оцінюватись log(0)на предмет поганих прогнозів / переживань у наборі даних, викликаючи вибухи градієнтів. Більшість пакетів (факел, тензорфлоу тощо) реалізує відсікання за замовчуванням для їх втрат.
  • Набір даних у наборі даних.
  • ϵу=(х-у)/(с+ϵ)сϵу
  • Підсумкова партія в епоху може бути невеликою, якщо набір даних нероздільний за batchsize. У завантажувачі даних факела є прапор drop_last. Невеликий пакетний розмір = велика дисперсія

Тепер, чому ви бачите це з Адамом, а не з SGD? Очевидно, що ви з Адамом досягли менших втрат. Як зазначалося раніше, якщо 99,9% набору даних мають оптимізацію в одній точці, за винятком деякого спостереження, це може бути те, що спостереження кричить "НІ" та вистрибує з локальних мінімумів, коли випадковим чином вибирається до партії. Якщо ви бачите це на кожному dataset_size//batch_size+1кроці, це, мабуть, через те, що остаточний розмір партії малий. Б'юсь об заклад, ви побачите і шип SGD, якщо ви дозволите йому менші втрати.

Бонус: Ваше дійсно швидке зменшення за допомогою оптимізатора імпульсу (Адам) може означати, що якийсь шар (вхідний шар? Вихідний шар?) Ініціалізується далеко поза шкалою (до великих / малих ваг).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.