Навчання нейронних мереж

Вступ

Машинне навчання (ML) — це галузь, що стрімко розвивається завдяки популярності та широкому використанню великих мовних моделей (LLM) — особливого класу нейронних мереж, що асоціюються з архітектурою трансформерів. Ви, ймовірно, використовували додатки, які їх застосовують, такі як Chat-GPT від OpenAI або Claude від Anthropic. На перший погляд ці мережі здаються експертами в різних галузях, але, як і люди, вони не виходять з коробки з знаннями в конкретній темі. Насправді нейронні мережі повинні пройти процес навчання, щоб стати штучно інтелектуальними.

У ML цей процес навчання називається тренуванням. Алгоритм, який найчастіше використовується для тренування цих моделей, — це градієнтний спуск. Простими словами, градієнтний спуск — це алгоритм оптимізації, який намагається поступово покращувати продуктивність нейронної мережі в процесі її тренування на даних. У цьому блозі ми розберемо градієнтний спуск, дізнаємось про його варіанти, а також розглянемо популярні оптимізатори, що покращують алгоритм.

Але що саме ми хочемо вирішити?

Завдяки таким компаніям, як Hugging Face, кількість даних, доступних для різних галузей, стала універсальною. Ми хочемо використовувати ці дані або інтерпретувати їх для конкретної мети. Найчастіше ми намагаємося знайти кореляцію між вхідними та вихідними даними для вирішення певного завдання.

Наприклад, ми можемо хотіти визначити, чи є пухлина доброякісною або злоякісною за допомогою рентгенівських зображень; або інтерпретувати об'єкти навколо автономного транспортного засобу, щоб він міг реагувати належним чином. За допомогою LLM ми хочемо отримати шматок тексту, семантично його зрозуміти та дати розумну відповідь, виходячи з контексту. Спільною темою серед цих завдань є те, що ми хочемо точно прогнозувати виходи з вхідних даних. Нейронні мережі разом з градієнтним спуском дозволяють нам досягти цієї мети в рамках контрольованого навчання (supervised learning), або навчання на основі передбачення очікуваного результату з вхідних даних, знаючи їх справжнє значення.

Градієнтний спуск

Як згадувалося раніше, градієнтний спуск — це алгоритм оптимізації. Його основна мета — поступово зменшувати втрати (також звані витратами або помилкою) цільової функції J: → ℝ₊_ параметризованої параметрами нейронної мережі θ , де d — це кількість параметрів мережі (тобто ваги та зсуви). Цільова функція або функція втрат в цьому контексті — це вимірювання того, як добре (або погано) модель передбачає правильні виходи з вхідних даних.

Для зручності втрати часто записуються в скороченій формі J(θ) що ігнорує вхідні дані, мітки та саму нейронну мережу як функцію в її межах. Це справді для стислості, де вхідні дані, мітки та нейронна мережа як функція є імпліцитними. Я буду використовувати це скорочення, щоб спростити пояснення, але робитиму винятки, де це необхідно.

Якщо ми виконуємо задачу класифікації — наприклад, намагаємося передбачити об'єкти на зображенні (наприклад, людину, автомобіль або птаха) — ми використовуємо функцію втрат перехресної ентропії, щоб порівняти передбачену модель розподілу ймовірностей на наборі зображень з їхніми правильними мітками з набору даних.

Тепер, градієнтний спуск намагається досягти глобального мінімуму цієї функції втрат, якщо вона є випуклою, однак, якщо вона не є випуклою, він намагається досягти локального мінімуму.

Як це досягається?

Фокус у тому, як це досягається, полягає в використанні градієнтів після зворотного поширення, коли вхідні дані передаються через мережу.

pic

Загальний вектор градієнтів, де кожен елемент показує, наскільки певний параметр у θ впливає на втрати J.

По суті, градієнти є оцінкою найкрутішого підйому втрат (тобто, де вони збільшуються найбільше). Оскільки ми хочемо мінімізувати втрати, ми зміщуємо параметри мережі в напрямку, протилежному до градієнта (тобто, в негативний бік градієнта), щоб зменшити втрати на наступному кроці тренування*.

* Крок тренування — це одна ітерація градієнтного спуску, коли оновлюються параметри нейронної мережі.

По суті, градієнтний спуск — це покроковий процес, який використовує ці концепції та ідеї. Його можна більш формально описати так:

Алгоритм градієнтного спуску

  1. Пропустіть вхідні дані через нейронну мережу для генерації передбачень мережі.
  2. Обчисліть втрати між передбаченнями мережі та їх правильними мітками за допомогою функції втрат.
  3. Обчисліть градієнти втрат щодо параметрів мережі за допомогою зворотного поширення.
  4. Крок (тобто, відрегулюйте параметри мережі) в напрямку, протилежному до градієнта.
  5. Повторюйте кроки 1–4, поки модель не збіжиться: це коли градієнти наближаються до нуля, і втрати більше не покращуються на наступних кроках тренування.

У цьому процесі ми поступово спускаємось з певної точки втрат за допомогою градієнтів, тому й назва "градієнтний спуск". Правило оновлення — як ми робимо крок для кожної ітерації градієнтного спуску — сформульовано так:

pic

Правило оновлення градієнтного спуску.

де t — це поточний крок часу під час тренування, а η — це гіперпараметр, званий швидкістю навчання (learning rate), що контролює, наскільки великий крок ми робимо під час оптимізації параметрів мережі. З цим додатковим терміном, крок 4 має бути:

Крок (тобто, відрегулюйте параметри мережі) в напрямку, протилежному до градієнта, масштабованого швидкістю навчання.

Швидкість навчання насправді відіграє значну роль під час тренування. Якщо значення занадто велике, параметри мережі будуть коливатися назад і вперед у субоптимальній області втрат; або вони дивергуватимуть (тобто, виходитимуть з оптимальної області) повністю. З іншого боку, якщо вибрати занадто малу швидкість навчання, градієнтний спуск, ймовірно, збіжиться, але на це знадобиться значний час.

pic

Швидкість навчання, що веде до збіжності.

pic

Швидкість навчання, що спричиняє дивергенцію.

pic

Швидкість навчання, що спричиняє коливання.

pic

Швидкість навчання, що спричиняє повільну збіжність.

Вибір швидкості навчання сам по собі вважається "мистецтвом", але ми дізнаємось пізніше в цьому блозі, що цей тягар знімається. А поки давайте зосередимось на трьох варіантах градієнтного спуску, які визначають частоту оновлень параметрів: batch, stochastic та mini-batch градієнтний спуск.

Batch градієнтний спуск

Batch (або ванільний) градієнтний спуск — це варіант градієнтного спуску, який оновлює параметри мережі лише після того, як побачить весь набір даних. Точніше кажучи, ми повинні пропустити всі приклади набору даних через мережу, обчислити втрати від згенерованих передбачень, а потім використовувати градієнти зворотного поширення для кроку.

Правило оновлення визначається як:

pic

Правило оновлення для batch градієнтного спуску.

де Xᵐ ˣ ⁿ і Yᵐ ˣ ᶜ — це вхідні дані та мітки тренувального набору даних відповідно. Далі, n — це кількість ознаок вхідних даних, c — це кількість [класів/виходів](https://en.wikipedia.org/wiki/Statisticalclassification#:~:text=In%20machine%20learning,%20the%20observations%20are%20often%20known%20as%20instances,%20the%20explanatory%20variables%20are%20termed%20features%20(grouped%20into%20a%20feature%20vector) міток, і _m — це кількість прикладів тренувального набору.

pic

Графік втрат нейронної мережі, натренованої на наборі даних з рукописними цифрами MNIST. Якщо поглянути на графік, можна побачити, що спочатку batch градієнтний спуск трохи застоюється, але потім стає більш плавним, коли починає збіжуватись до оптимуму (ноутбук).

Переваги:

  • Завжди збігається до глобального мінімуму, якщо втрати є опуклими. Якщо ні, він зійдеться до локального мінімуму.

Недоліки:

  • Увесь набір даних потрібно передати моделі та функції втрат за один раз. Без апаратного прискорення це викликає затримки під час тренування.
  • Увесь набір даних повинен поміщатися в пам’яті, що створює додаткове навантаження на пам'ять і навантажує машину без достатньої пропускної здатності.
  • Деякі приклади втрачаються на певному кроці тренування. По суті, модель буде генерувати схожі передбачення для схожих вхідних даних, що спричиняє однакові градієнти після зворотного поширення. Це означає, що градієнти не принесуть жодної нової інформації для допомоги моделі в її поточному стані; вони лише підкріплюють те, що модель вже "знала".
  • Відсутня підтримка онлайн-навчання — можливості оновлювати модель після кожного нового прикладу, який з’являється в процесі роботи. Деякі моделі, розгорнуті онлайн, такі як рекомендаційні системи, повинні вдосконалюватися з часом на основі індивідуальних взаємодій користувачів, але з batch градієнтним спуском це не можливо, оскільки алгоритм потребує всіх вхідних даних для одного оновлення.

pic

Відомий збій пам'яті CUDA в PyTorch. Графічні процесори мають обмежену кількість пам'яті (VRAM), і це обмеження заважає певному обсягу даних потрапити в пам'ять пристрою. Виконання batch градієнтного спуску з оновленням за весь набір даних означає, що навіть сучасні графічні процесори навряд чи можуть вмістити ці дані в своїй пам'яті.

Стохастичний градієнтний спуск

Стохастичний градієнтний спуск (SGD) — це ще один варіант градієнтного спуску, який оновлює параметри мережі для кожного прикладу, що з'являється під час тренування. Головним чином, ми обчислюємо втрати та градієнти втрат щодо параметрів мережі лише для одного прикладу, а потім оновлюємо. Правило оновлення для SGD виглядає так:

pic

де x⁽ⁱ⁾ та y⁽ⁱ⁾ — це i-й вхід та мітка з тренувального набору даних відповідно. Якщо m — це розмір набору даних, то i буде в межах [1, m].

pic

Графік моделі, натренованої та оптимізованої за допомогою SGD для підгонки під MNIST. SGD є "рваним", оскільки йому важко було зійтися до втрат на тестуванні, але він все ж перевершив batch градієнтний спуск у зменшенні втрат (ноутбук).

Переваги:

  • Він обчислювально швидший за batch градієнтний спуск (без апаратного прискорення), оскільки для одного кроку тренування потрібно лише одне значення.
  • Кожне оновлення потребує лише одного прикладу, тому витрати пам'яті менші.
  • Градієнти, відповідно, приклади не витрачаються, оскільки кожен створений градієнт спеціалізується на конкретному прикладі та стані моделі.
  • Це робить оновлення більш інформативними і також дає моделі можливість вибратися з субоптимальних мінімумів.
  • Підтримується онлайн-навчання, оскільки цей варіант спеціалізується на оновленні параметрів для кожного прикладу.

Недоліки:

  • Кожне оновлення є стохастичним — можна сказати, що воно випадкове. Ця варіативність у градієнтах може ускладнити нейронній мережі навігацію по втратам, оскільки напрямки часто змінюються.
  • Параметри мають тенденцію осцилювати навколо мінімуму внаслідок того, що кроки тренування здійснюються для кожного прикладу. Це може вимагати вручну зменшити швидкість навчання, щоб модель могла збігатися.

Mini-batch градієнтний спуск

Mini-batch градієнтний спуск — це останній варіант градієнтного спуску, який здійснює крок тренування для кожного mini-batch. Mini-batch — це технічно будь-яка підмножина прикладів з набору даних, визначена гіперпараметром batch size: просто кількість прикладів у кожному mini-batch. Розмір batch майже завжди є степенем двійки*, зазвичай не меншим за 16 і не більшим за 512. Правило оновлення для mini-batch градієнтного спуску визначається як:

pic

Правило оновлення для mini-batch градієнтного спуску.

де i — це деякий індекс між 1 і початком останнього mini-batch, а b — гіперпараметр розміру batch. Вибір X та Y — це два відповідних mini-batch вхідних даних та міток тренувального набору даних відповідно.

* Причина, чому розмір batch є степенем двійки, полягає в ефективній обробці даних між фізичними та віртуальними процесорами. Дивіться це повідомлення на Data Science Stack Exchange для детальнішого пояснення.

pic

MNIST, навчений за допомогою mini-batch градієнтного спуску з розміром batch 32. Видно, що mini-batch градієнтний спуск мінімізує втрати більш контрольовано і врешті-решт сходиться до хорошого мінімуму. Він перевершує як batch, так і стохастичний градієнтний спуск при пошуку мінімуму втрат (ноутбук).

Переваги:

  • При відповідному розмірі batch, кроки тренування не викликають таких великих обчислювальних або пам'ятевих навантажень, оскільки mini-batch є відносно невеликим порівняно з розміром всього набору даних.
  • Приклади не витрачаються, оскільки кожне оновлення має рівень стохастичності, оскільки mini-batch [повинен] мати різні вхідні дані. В певному сенсі, mini-batch градієнтний спуск захоплює достатньо інформації для навчання, але не настільки багато, щоб ця інформація стала надлишковою.
  • Кроки тренування є більш стабільними, оскільки більше прикладів включено в кожне оновлення, що веде до більш поступових кроків до мінімуму.
  • Mini-batch градієнтний спуск може використовувати спеціалізоване обладнання, яке використовує пакети даних для паралельних та прискорених обчислень. Бібліотеки, такі як numpy і PyTorch, майже завжди використовують SIMD та/або CUDA для обробки даних паралельно, що робить обчислення швидкими та ефективними по мірі масштабування вхідних даних.

Недоліки:

  • Гіперпараметр розміру batch може впливати на продуктивність нейронної мережі. Тому можуть знадобитися додаткові експерименти та тестування для вибору розміру batch, який дасть найкращу продуктивність.
  • Mini-batch градієнтний спуск може вимагати перемішування набору даних для того, щоб зберегти варіативність розподілу даних у mini-batch, щоб оновлення узагальнювались на різні ознаки та вхідні дані.

pic

Модель MNIST, натренована з різними розмірами batch. Розмір batch 256 дав найкращі втрати на тестах, однак існують невеликі відмінності між експериментами, що може призвести до різних результатів при повторному тренуванні (ноутбук).

Варіанти використання

  • Batch: Коли набір даних відносно невеликий (тобто
    ~10,000 прикладів), набір даних є рідким, і можна використовувати апаратне прискорення.
  • SGD: У ситуаціях, коли модель повинна оновлюватися на основі окремих потокових вхідних даних (тобто онлайн-навчання).
  • Mini-batch: Коли набір даних є відносно великим (тобто десятки тисяч або мільйони прикладів) і коли є доступ до апаратного прискорення.

Як останнє зауваження, посилання на SGD у номенклатурі машинного навчання зазвичай стосуються якоїсь форми mini-batch градієнтного спуску з модифікаціями. На ранніх етапах машинного навчання (особливо в глибокому навчанні), “чистий” SGD був дуже простим, але з розвитком апаратного забезпечення та появою емпіричних доказів, використання mini-batch є ефективним і дає продуктивні моделі. Термін “SGD” просто закріпився під час цієї трансформації. Також важливо, що mini-batch градієнтний спуск все ще є стохастичним за своєю природою, що підтримує сенс цієї назви. Як результат, я збережу цю номенклатуру.

Нарешті, щоб полегшити розуміння нашої наступної теми, я абстрагую градієнт втрат відносно параметрів нейронної мережі як g — маючи на увазі mini-batch:

pic

Оптимізатори

Оптимізатори роблять саме те, що вказує їхня назва — оптимізують; але чому вони необхідні? Коли ми розглядали градієнтний спуск, ми говорили про кілька речей, таких як реалізації градієнтного спуску, гіперпараметри (наприклад, швидкість навчання та розмір batch), а також градієнти втрат відносно параметрів моделі.

Усі ці фактори та багато інших сильно впливають на те, як нейронна мережа сходиться під час тренування. Для простих і менш складних завдань, таких як класифікація рукописних цифр MNIST, один із трьох варіантів градієнтного спуску, ймовірно, впорається з завданням. Однак більш інтенсивні завдання вимагають більш тонких підходів.

Наприклад, поверхня втрат може бути занадто складною, щоб без додаткових евристик знайти оптимальну область. Далі, нам потрібно [ретельно] вибирати гіперпараметри, такі як швидкість навчання через експерименти, що може зайняти багато часу — особливо якщо немає доступу до потужного комп'ютерного обладнання. Нарешті, у нас є можливість використовувати минулий досвід (градієнти), щоб приймати кращі рішення під час тренування, але ця інформація втрачається після того, як вона була використана для кроку оновлення.

Оптимізатори існують для вирішення цих та багатьох інших дрібніших проблем, які виникають під час тренування нейронних мереж. Зараз існує велика різноманітність оптимізаторів, які допомагають нейронним мережам сходитися під час градієнтного спуску, і я не буду охоплювати всі їх у цьому блозі. Однак я розгляну те, що, на мою думку, є основними оптимізаторами, які охоплюють їхню мету: Стохастичний градієнтний спуск з моментумом (SGDM), RMSprop та Adam.

Стохастичний градієнтний спуск з моментумом (SGDM)

SGD з моментумом (SGDM) модифікує SGD, щоб зменшити шум у градієнтах під час етапів оптимізації. Оскільки оновлення здійснюються для mini-batch, їхні градієнти будуть варіюватися від одного mini-batch до іншого — в результаті чого моделі буде важко інтерпретувати, в якому напрямку вони повинні рухатися, щоб досягти оптимуму.

Крім того, SGDM намагається запобігти тому, щоб параметри моделі не потрапили в ущелини. Ущелини — це області на поверхні втрат, які мають крутіші градієнти в деяких напрямках, ніж в інших. Ця крутизна може збити модель з пантелику і призвести до того, що вона потрапить у субоптимальні мінімум, де вона застрягне або буде повільно сходитися. Щоб протидіяти цьому, SGDM відстежує експоненційно зважені середні (EMA) градієнтів.

pic

Зображення параметрів моделі (червона точка), що застрягли в ущелині на поверхні втрат.

Детальне пояснення EMA виходить за рамки цього блогу, але на поверхневому рівні це зважені середні за певний проміжок даних, де вплив старіших даних експоненційно зменшується, коли нові дані додаються до середнього.
По суті, SGDM відстежує EMA всіх градієнтів під час кожної ітерації градієнтного спуску. Потім він використовує траєкторію EMA для кроку на основі наступного правила оновлення*:

pic

де vₜ — це швидкість на поточному кроці часу — в основному загальний напрямок, в якому рухаються градієнти в певний момент часу; v= 0. γ — це коефіцієнт тертя (термін зважування), який визначає, скільки інформації потрібно включити/зберегти, коли SGDM бачить новий градієнт; зазвичай γ ∈ [0.9, 1).

* Альтернативні форми SGDM можуть визначати vₜ = γvₜ₋₁ + (1 — γ)gₜ, а оновлення ваг виконувати як θₜ₊₁ = θₜ — ηvₜ. Ця формулювання не є обов'язково неправильною і розділяє γ та η при виборі гіперпараметрів. Який вибір зробити — залежить від уподобань і простору проблеми (тобто, це залежить).

Більше значення гамма (наприклад, 0.9999) робить швидкість більш плавною і менш шумною (тобто зберігає більше середнього і менше враховує нові градієнти), тоді як менше значення гамма (наприклад, 0.1) робить оновлення стохастичними і більш чутливими до змін (тобто зберігає менше середнього і більше враховує нові градієнти).

pic

На графіку вище показано навчання трансформерної моделі Distil BERT на наборі даних Stanford IMDB — набір даних, що складається з рецензій на фільми та їхніх оцінок як позитивних або негативних. На основі рецензії на фільм модель повинна передбачити бінарну класифікацію, чи була рецензія негативною (1) чи позитивною (0). Навчена за 3 епохи і оптимізована через SGDM, модель досягла помилки на тестуванні 0.2756. Не погано, але можна досягти кращої продуктивності (ноутбук).

SGDM можна розглядати як аналогію: параметри нейронної мережі можна уявити як металеву кулю, яка котиться по горбистому пагорбу (простір параметрів). Коли куля котиться вниз по пагорбу, вона набирає швидкість і накопичує момент (v). Коли вона стикається з такими перешкодами, як ямки і маленькі дірки (субоптимальні мінімуми, стохастичні градієнти, ущелини тощо), її моментум допомагає їй прокотитися повз них і продовжити рух до низу. Крім того, маса кулі і тертя, що діють на неї (γ), сповільнюють її і запобігають перекиданню кулі через дно пагорба (оптимум).

pic

Як моментум допомагає параметрам моделі (червона точка) спускатися до оптимального мінімуму, уникати субоптимальних регіонів та ущелин.

Оскільки SGDM використовує інформацію про градієнти, щоб зробити параметри мережі більш стійкими до ущелин і направити їх у оптимальну область функції втрат, SGDM, як правило, сходиться швидше за SGD.

Nesterov прискорений градієнт (NAG)

Nesterov прискорений градієнт (NAG), також відомий як Nesterov моментум, є похідною SGDM, яка застосовує моментум розумним чином. Спочатку нагадаємо, що моментум відстежує рухомі середні в терміні швидкості v, припускаючи, що це середній напрямок градієнтів. Але що якщо моментум починає неправильно рухатися і починає рухатися в неправильному напрямку?

Згадуючи нашу аналогію, куля потрапляє в велику ямку з вершини пагорба і повністю збивається зі шляху. Що тепер?

NAG протидіє цій потенційній помилці, заглядаючи в майбутнє. Спочатку NAG робить “теоретичний крок” з поточним моментумом, щоб помістити параметри туди, куди вони повинні потрапити — в точку огляду. Потім обчислюються градієнти втрат відносно цієї точки; це “теоретичні градієнти”, якби цей крок вже був зроблений. Використовуючи ці градієнти, NAG коригує будь-які помилки, допущені під час стрибка моментуму, і робить крок у напрямку відкоригованого градієнта.

Правило оновлення можна побачити нижче:

pic

pic

Навчання тієї ж трансформерної моделі Distil BERT за допомогою Nesterov Momentум замість SGDM.
Ми можемо побачити, що графіки схожі, причому Nesterov дає трохи кращі результати, лише з 0.0035 Δ у помилці передбачення та 0.0034 Δ у помилці тренування (ноутбук).

Хоча NAG звучить чудово в теорії, на практиці він не дає значного покращення порівняно з SGDM (іноді навіть гірше) і вимагає додаткових обчислень, які не завжди виправдані.

Root Mean Squared Propagation (RMSprop)

Root Mean Squared Propagation (RMSprop) — це другий алгоритм оптимізації, який ми розглянемо. RMSprop використовує інформацію про градієнти, щоб зменшити небажані осциляції під час тренування. Причина його існування походить від проблеми монотонного зменшення швидкості навчання, яка спостерігалася в AdaGrad, більш ранньому алгоритмі оптимізації.

AdaGrad використовував квадратний корінь накопичених квадратів градієнтів для масштабування швидкості навчання. Ідея полягала в тому, що параметри з відносно великими градієнтами — які мають ще більші значення при піднесенні до квадрату — будуть мати свою ефективну швидкість навчання значно зменшену порівняно з параметрами з відносно малими градієнтами. Оскільки квадрат градієнтів завжди позитивний і накопичувальний, корінь буде лише збільшуватись, викликаючи зменшення ефективної швидкості навчання до нуля, навіть якщо модель ще не збіглася. Це зупиняло подальше навчання.

Правило оновлення AdaGrad:

pic

√Gₜ збільшується лише тоді, коли t зростає відповідно до визначення Gₜ.

Подібно до SGDM, RMSprop вирішує цю проблему, використовуючи EMA квадратів градієнтів. По суті, RMSprop використовує EMA квадратів минулих градієнтів для аналізу градієнтів кожного параметра на конкретному кроці тренування. Далі RMSprop бере квадратний корінь із середніх значень і масштабує ефективну швидкість навчання для кожного параметра, використовуючи RMS. Оскільки зворотне поширення градієнтів і RMS використовуються разом, алгоритм отримав назву Root Mean Square Propagation. Його правило оновлення виглядає так:

pic

де vₜ — це дисперсія швидкості (EMA квадратів градієнтів) на кроці часу t; v₀ = 0. Гамма (як і раніше) є зважувальним терміном, який контролює швидкість згасання для минулих квадратів градієнтів; зазвичай γ ∈ [0.9, 1). Нарешті, ϵ — це невелика константа для числової стабільності; ϵ = 1e-8.

Оскільки навчання масштабується через середнє значення, а не через суму, кожен параметр буде адаптувати свою швидкість навчання на основі своєї історії градієнтів під час тренування, без зменшувального штрафу. Якщо градієнти параметра великі протягом тренування, їхні середні значення це зафіксують, і, відповідно, їхня швидкість навчання буде зменшена, щоб послабити осциляції. У випадку параметрів із меншими градієнтами під час тренування, їхня швидкість навчання буде менш масштабованою — що фактично змусить їх більше сприяти (вчитись) процесу оптимізації.

pic

Distil BERT, навчений на Stanford IMDB, використовуючи RMSprop. RMSprop дав найкращі втрати на тренуванні, але з-поміж моделей, навчених до цього моменту, має найгірші втрати на тестах. Це, ймовірно, пояснюється перенавчанням — коли модель настільки добре вчиться на тренувальному наборі, що це погіршує її здатність узагальнювати на невідомих прикладах (ноутбук).

Adaptive Moment Estimation (Adam)

Adaptive Moment Estimation (Adam) — це останній алгоритм оптимізації, який ми розглянемо. Він включає техніки з попередніх алгоритмів оптимізації. Мета Adam, як і раніше, полягає у покращенні швидкості збіжності в градієнтному спуску. Його здатність досягати цього обумовлена використанням перших моментів та других моментів градієнтів.

Перші моменти алгебраїчно є EMA градієнтів, статистично — середнім градієнтів, а семантично вони узагальнюють напрямок параметрів мережі під час тренування.
Автори записують перші моменти як:

pic

де mₜ — це перший момент на кроці часу t; m₀ = 0. Далі, β₁ діє дуже схоже на γ із SGDM та RMSprop — виступає як коефіцієнт згасання для минулих градієнтів; зазвичай β₁ = 0.9.

З іншого боку, другі моменти алгебраїчно є EMA квадратів градієнтів, статистично — незміщеною дисперсією градієнтів, а семантично вони захоплюють інформацію, необхідну для адаптації ефективних швидкостей навчання кожного параметра в мережі. Автори формулюють другі моменти так:

pic

де vₜ — це другі моменти на кроці часу t; v₀ = 0. β₂ — це коефіцієнт згасання для минулих квадратів градієнтів, подібно до β₁, але значно ближче до 1; зазвичай β₂ = 0.999 і β₂ > β₁.

Маючи перші та другі моменти, ми можемо оновити параметри таким чином:

pic

це правило оновлення виглядає як комбінація SGDM (чисельник) і RMSprop (знаменник)*. Проблема цього підходу, яку не вирішують ані SGDM, ані RMSprop, полягає в тому, що перші та другі моменти схильні до зміщення до нуля. Як результат, перші моменти матимуть напрямок, близький до нуля — знижуючи швидкість. З іншого боку, другі моменти (також близькі до нуля) штучно збільшують швидкість навчання, викликаючи занадто великі кроки мережі, що призводить до дивергенції.

* RMSprop із моментумом дійсно існує, однак він відрізняється від Adam тим, що застосовує моментум до градієнтів після їх масштабування другими моментами. Adam, навпаки, працює безпосередньо з оцінками перших і других моментів для оновлення.

Щоб вирішити цю проблему, автори порівняли перші та другі моменти з їхніми істинними очікуваними значеннями 𝔼[gₜ] і 𝔼[gₜ²]. Вони виявили, що істинні очікувані значення середнього та незміщеної дисперсії градієнтів масштабуються за допомогою 1 — β₁ᵗ і 1 — β₂ᵗ відповідно. Щоб виправити це зміщення, вони поділили перші та другі моменти на ці терміни, отримавши:

pic

де m̂ₜ і v̂ₜ — це перші та другі моменти, скориговані на зміщення. З урахуванням корекції зміщення, правило оновлення для Adam записується так:

pic

де ϵ, як у RMSprop, використовується як константа для числової стабільності; зазвичай ϵ = 1e-8. Використовуючи оцінку перших моментів для адаптації напряму, в якому рухаються параметри, та оцінку других моментів для адаптації розміру кроку (звідси й назва), Adam прискорює градієнтний спуск.

Змінні m̂ₜ і v̂ₜ автори називають співвідношенням сигнал/шум (SNR). Високе SNR означає, що модель впевнена у своєму напрямку до оптимуму; це ймовірно на ранніх етапах тренування, коли градієнти інформативні (більші), а модель має місце для покращення. Низьке SNR означає протилежне, коли модель невпевнена у своєму напрямку до оптимуму і тому робить менші й менш ризиковані кроки. Це ймовірно на пізніх етапах тренування, коли градієнти рідкісні, а місце для покращення обмежене (тобто модель близька до оптимуму).

pic

Distil BERT, оптимізована на Stanford IMDB, використовуючи Adam. Графік показує, що Adam досягла найнижчих тестових втрат серед навчених моделей на першій епосі (~0.1900). Однак оновлення, здійснені на другій і третій епосах, спричинили перенавчання, зрівнюючи її з SGDM при мінімізації тестових втрат (ноутбук).

pic

Трансформерні моделі Distil BERT, навчені на Stanford IMDB, з використанням розглянутих оптимізаторів і SGD (mini-batch градієнтний спуск).
Хоча Nesterov показав найкращу продуктивність за тестовими втратами, саме Adam продемонстрував найкращу узагальнювальну здатність (91% точність), а RMSprop посів друге місце (89% точність)._

Висновок

Градієнтний спуск є основою штучного інтелекту, який змінює світ сьогодні. Після обговорення його основ та алгоритмів оптимізації, що допомагають йому, ми тепер можемо розкрити, як моделі ШІ, особливо в генеративному ШІ, можуть виконувати складні завдання.

Застосовуючи принципи правила ланцюга, інтегруючи це в контекст лінійної алгебри та використовуючи пряме насильство, поки ми не будемо задоволені результатами моделі, ми можемо ідентифікувати пухлини, які не завжди бачать радіологи, навчити автомобілі їздити самостійно, генерувати сюрреалістичні зображення з простого запиту та допомогти інженерам створювати програмне забезпечення на передовій.

pic

Градієнтний спуск дозволяє нам вивчати сам градієнтний спуск.

Ресурси, реалізація та додаткові деталі, використані для створення цього блогу, можна знайти в цьому GitHub репозиторії та в посиланнях нижче. Якщо вам цікаві пов'язані блоги, ознайомтесь з What is a Transformer та What’s Automatic Differentiation.

Посилання

Перекладено з: Teaching Neural Networks

Leave a Reply

Your email address will not be published. Required fields are marked *