
Код програмних продуктів для машинного навчання часто буває складним та досить заплутаним. Виявлення та ліквідація багів у ньому – ресурсомістка задача. Навіть найпростіші вимагають серйозного підходу до мережевої архітектури, ініціалізації ваги, оптимізації мережі. Невелика помилка може призвести до неприємних проблем.
Ця стаття присвячена алгоритму налагодження ваших нейронних мереж.
Skillbox рекомендує: Практичний курс .
Нагадуємо: для всіх читачів "Хабра" - знижка 10 000 рублів при записі на будь-який курс Skillbox за промокодом "Хабр".
Алгоритм складається з п'яти етапів:
- простий старт;
- підтвердження втрат;
- перевірка проміжних результатів та з'єднань;
- діагностика параметрів;
- контроль роботи.
Якщо вам щось здається цікавішим, ніж інше, можете відразу переходити до цих розділів.
Простий старт
Нейронну мережу зі складною архітектурою, регуляризацією та планувальником швидкості навчання дебатувати складніше, ніж звичайну. Ми тут трохи хитрим, оскільки сам пункт до налагодження має опосередковане відношення, але це все ж таки важлива рекомендація.
Простий старт полягає у створенні спрощеної моделі та навчанні її на одному наборі (точці) даних.
Спочатку створюємо спрощену модель
Для швидкого старту створюємо невелику мережу з єдиним прихованим шаром та перевіряємо, щоб усе працювало коректно. Потім поступово ускладнюємо модель, перевіряючи кожен новий аспект її структури (додаткового шару, параметра тощо) і рухаємося далі.
Навчаємо модель на єдиному наборі (точці) даних
Як швидку перевірку працездатності вашого проекту можна використовувати для навчання одну або дві точки даних, щоб підтвердити, чи коректно працює система. Нейронна мережа має показати 100% точності навчання та перевірки. Якщо це не так, то модель занадто мала, або у вас вже є баг.
Навіть якщо все добре, підготуйте модель до проходу однієї чи кількох епох, перш ніж йти далі.
Оцінка втрат
Оцінка втрат – основний спосіб уточнити продуктивність моделі. Вам необхідно переконатися, що втрата відповідає завданню, а функції втрат оцінюються за коректною шкалою. Якщо ви використовуєте більше одного типу втрат, то переконайтеся, що всі вони одного порядку і правильно масштабовані.
Важливо бути уважним до початкових втрат. Перевірте, наскільки близький реальний результат до очікуваного, якщо модель почалася з випадкового припущення. У : «Переконайтеся, що ви отримуєте результат, очікуваний на початку роботи з невеликим числом параметрів. Краще одразу перевірити втрату даних (із встановленням ступеня регуляризації на нуль). Наприклад, для CIFAR-10 з класифікатором Softmax ми очікуємо, що початкові втрати будуть 2.302, тому що очікувана дифузна ймовірність становить 0,1 для кожного класу (оскільки існує 10 класів), а втрата Softmax є негативною логарифмічною ймовірністю коректного класу ln (0.1) = 2.302».
Для бінарного прикладу просто робиться аналогічний розрахунок кожного з класів. Ось, наприклад, дані: 20% 0's та 80% 1's. Очікувана початкова втрата становитиме до –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Якщо результат більший за 1, це може вказувати на те, що ваги нейромережі не збалансовані належним чином або дані не нормалізовані.
Перевіряємо проміжні результати та з'єднання
Для налагодження нейромережі необхідно розуміти динаміку процесів усередині мережі та роль окремих проміжних шарів, оскільки вони пов'язані. Ось типові помилки, з якими ви можете мати справу:
- неправильні висловлювання для оновлень градієнта;
- не застосовуються поновлення ваги;
- градієнти, що зникають або вибухають (exploding gradients).
Якщо значення градієнта нульові, це означає, що швидкість навчання в оптимізаторі занадто мала, або те, що ви зіткнулися з некоректним виразом оновлення градієнта.
Крім того, необхідно стежити за значеннями функцій активацій, ваги та оновлень кожного з шарів. Наприклад, величина оновлень параметрів (ваг і зміщень) .
Існує явище, яке отримало назву “Dying ReLU” або , коли нейрони ReLU будуть виводити нуль після вивчення великого негативного значення (bias) усунення його ваг. Ці нейрони більше ніколи не активуються в жодному місці даних.
Ви можете використовувати перевірку градієнта виявлення цих помилок шляхом апроксимації градієнта з використанням чисельного підходу. Якщо він близький до розрахованих градієнтів, зворотне поширення було реалізовано правильно. Щоб створити перевірку градієнта, ознайомтеся з цими чудовими ресурсами CS231 и , А також з Ендрю Ына (Andrew Nga) на цю тему.
показує три основні способи візуалізації нейромережі:
- Попередні - прості методи, які показують нам загальну структуру навченої моделі. Вони включають виведення форм або фільтрів окремих шарів нейронної мережі та параметрів у кожному шарі.
- Засновані на активації. Вони розшифровуємо активації окремих нейронів чи групи нейронів, аби зрозуміти їх функції.
- Засновані на градієнтах. Ці методи мають тенденцію маніпулювати градієнтами, які формуються з проходу вперед і назад під час навчання моделі (включаючи карти значущості та карти активації класу).
Є кілька корисних інструментів для візуалізації активацій та сполук окремих шарів, наприклад, и .

Діагностика параметрів
У нейромереж безліч параметрів, які взаємодіють один з одним, що ускладнює оптимізацію. Власне, цей розділ є предметом активних досліджень фахівців, тому пропозиції нижче повинні розглядатися лише як поради, початкові точки, від яких можна відштовхуватися.
Розмір упаковки (batch size) — якщо необхідно, щоб розмір пакета був досить великим для отримання точних оцінок помилки, але досить малим, щоб стохастичний градієнтний спуск (SGD) міг упорядкувати вашу мережу. Невеликі розміри пакетів призведуть до швидкого сходження за рахунок шуму в процесі навчання й надалі – до труднощів оптимізації. Докладніше це описано .
Швидкість навчання — занадто низька призведе до повільної конвергенції чи ризику застрягти у локальних мінімумах. У той же час висока швидкість навчання спричинить розбіжність оптимізації, оскільки ви ризикуєте «стрибнути» через глибоку, але при цьому вузьку частину функції втрати. Спробуйте використати планування швидкості, щоб знизити її у процесі навчання нейромережі. В курсі CS231n .
Відрізання градієнта - обрізання градієнтів параметрів під час зворотного розповсюдження за максимальним значенням або граничною нормою. Корисно для вирішення проблем з будь-якими градієнтами, що вибухають, з якими ви можете зіткнутися в третьому пункті.
Пакетна нормалізація - використовується для нормалізації вхідних даних кожного шару, що дозволяє вирішити проблему внутрішнього зсуву коваріату. Якщо ви використовуєте Dropout та Batch Norma разом, .
Стохастичний градієнтний спуск (SGD) - Існує кілька різновидів SGD, які використовують імпульс, адаптивні швидкості навчання та метод Нестерова. При цьому жодна з них не має явної переваги як щодо ефективності навчання, так і щодо узагальнення ().
Регуляризація — має вирішальне значення для побудови узагальнюваної моделі, оскільки додає штраф за складність моделі чи екстремальні значення параметрів. Це спосіб знизити дисперсію моделі без істотного збільшення її усунення. Більше .
Щоб самому все оцінити, необхідно вимкнути регуляризацію та перевірити градієнт втрати даних самостійно.
Випадання — ще один метод упорядкування вашої мережі для запобігання навантаженню. Під час навчання випадання здійснюється лише підтримкою активності нейрона з деякою ймовірністю p (гіперпараметр) або встановленням його на нуль у протилежному випадку. В результаті мережа повинна використовувати інше підмножина параметрів для кожної навчальної партії, що зменшує зміни певних параметрів, які стають домінуючими.
Важливо: якщо ви використовуєте як випадання, так і пакетну нормалізацію, будьте обережні з порядком цих операцій або навіть їх спільним використанням. Все це ще активно обговорюється та доповнюється. Ось дві важливі дискусії з цієї теми и .
контроль роботи
Йдеться про документування робочих процесів та експериментів. Якщо нічого не документувати, можна забути, наприклад, яка використовується швидкість навчання чи вага класів. Завдяки контролю можна без проблем переглядати та відтворювати попередні експерименти. Це дозволяє знизити кількість експериментів, що дублюються.
Щоправда, ручне документування може стати складним завданням у разі великого обсягу робіт. Тут приходять на допомогу такі інструменти, як Comet.ml, що допомагають автоматично логувати набори даних, зміни коду, історію експериментів та виробничі моделі, включаючи ключові відомості про вашу модель (гіперпараметри, показники продуктивності моделі та відомості про оточення).
Нейронна мережа може бути дуже чутливою до невеликих змін, що призведе до падіння продуктивності моделі. Відстеження та документування роботи – перший крок, який варто зробити для стандартизації середовища та моделювання.

Сподіваюся, що цей пост зможе стати відправною точкою, з якою ви почнете налагодження вашої нейромережі.
Skillbox рекомендує:
- Дворічний практичний курс .
- Онлайн-курс .
- Практичний річний курс .
Джерело: habr.com
