Що робити, коли моя нервова мережа не навчається?


147

Я треную нейронну мережу, але втрата тренувань не зменшується. Як я можу це виправити?

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


Це питання навмисно загальне, тому інші питання про те, як потренувати нейронну мережу, можуть бути закритими як дублікат цього, з позицією, що "якщо ви дасте чоловікові рибу, ви годуєте його на день, але якщо ви навчаєте людину, щоб ловити рибу, ви можете годувати його до кінця життя ". Дивіться цю мета-ланцюжок для обговорення: Який найкращий спосіб відповісти на питання "моя нейронна мережа не працює, виправте", виправити?

Якщо ваша нейронна мережа не узагальнена, див.: Що робити, коли моя нейронна мережа не спрацьовує добре?


1
Ось випадок, коли НН не може прогресувати. youtu.be/iakFfOmanJU?t=144
Джошуа

4
Блог Іванова " Причини, чому ваша Нейромережа не працює ", особливо розділи II, III та IV, може бути корисним.
користувач5228

Відповіді:


187

Тестування підрозділу - ваш друг

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

Щоразу, коли ви пишете код, вам потрібно переконатися, що він працює за призначенням. Найкращий спосіб, який я коли-небудь знайшов для перевірки правильності, - це розбити свій код на невеликі сегменти та перевірити, чи працює кожен сегмент. Це можна зробити, порівнюючи вихід сегмента з тим, що ви знаєте, як правильну відповідь. Це називається одиничним тестуванням . Складання хороших одиничних тестів є ключовим елементом стати хорошим статистиком / вченим даними / експертом машинного навчання / практикою нейронної мережі. Замінника просто немає.

Ви повинні перевірити, що ваш код не містить помилок, перш ніж ви зможете налаштувати мережеву продуктивність! В іншому випадку ви можете також переставляти шезлонги на RMS Titanic .

Є дві особливості нейронних мереж, які роблять перевірку навіть важливішою, ніж для інших типів машинного навчання або статистичних моделей.

  1. Нейронні мережі не є "позаштатними" алгоритмами таким чином, як випадкові лісові чи логістичні регресії. Навіть для простих мереж, що передаються в режим подачі, в основному користувач приймає численні рішення щодо налаштування, підключення, ініціалізації та оптимізації мережі. Це означає написання коду, а код написання означає налагодження.

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

У цій середній публікації Чейза Робертса " Як розділити код випробувального машинного навчання " більш детально розглядаються одиничні тести для моделей машинного навчання. Я запозичив цей приклад баггі-коду зі статті:

def make_convnet(input_image):
    net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11")
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5")
    net = slim.max_pool2d(net, [4, 4], stride=4, scope='pool1')
    net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5")
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool2')
    net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3")
    net = slim.max_pool2d(net, [2, 2], scope='pool3')
    net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1")
    return net

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

Найбільш поширені помилки програмування, що стосуються нейронних мереж

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

Повзати перед тим, як піти; Гуляйте перед тим, як бігти

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

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

    Навіть якщо ви зможете довести, що математично існує лише невелика кількість нейронів, необхідних для моделювання проблеми, часто трапляється так, що наявність «ще кількох» нейронів полегшує оптимізатору знайти «гарну» конфігурацію. (Але я не думаю, що ніхто повністю не розуміє, чому це так.) Я надаю приклад цього в контексті проблеми XOR: Чи не потрібні мої ітерації для навчання NN для XOR з MSE <0,001 занадто високими? .

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

  • Вибір розумної мережевої проводки може зробити для вас багато роботи. Чи підходить ваше джерело даних до спеціалізованих мережевих архітектур? Конволюційні нейронні мережі можуть досягти вражаючих результатів на "структурованих" джерелах даних, зображення чи аудіоданих. Повторювані нейронні мережі можуть добре працювати з послідовними типами даних, такими як натуральна мова або дані часових рядів. Залишкові з'єднання можуть покращити глибокі мережі передачі даних.

Навчання нейронної мережі - це як вибір блокування

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

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

Це невичерпний список параметрів конфігурації, які також не є параметрами регуляризації чи параметрами чисельної оптимізації.

Усі ці теми є активними напрямами досліджень.

Невипукла оптимізація важка

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

У всіх інших випадках проблема оптимізації є невипуклою, а неконвексова оптимізація - важкою. Проблеми тренування нейронних мереж добре відомі (див.: Чому важко тренувати глибокі нейронні мережі? ). Крім того, нейронні мережі мають дуже велику кількість параметрів, що обмежує нас виключно методами першого порядку (див.: Чому метод Ньютона не широко застосовується в машинному навчанні? ). Це дуже активний напрямок досліджень.

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

  • Відсікання градієнта повторно масштабує норму градієнта, якщо він перевищує деякий поріг. Раніше я вважав, що це параметр встановлення і забуття, як правило, 1,0, але я виявив, що можу зробити модель мови LSTM значно кращою, встановивши її на 0,25. Я не знаю, чому це так.

  • Планування швидкості навчання може знизити рівень навчання протягом курсу навчання. На мій досвід, спроба використовувати планування багато в чому схожа на регулярний вираз : він замінює одну проблему ("Як мені навчитися продовжувати після певної епохи?") На дві проблеми ("Як мені навчитися продовжувати після певної епохи" ? "та" Як вибрати хороший графік? "). Інші люди наполягають на тому, що планування є важливим. Я дам вам вирішити.

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

  • Існує ряд варіантів стохастичного градієнтного спуску, які використовують імпульс, адаптивну швидкість навчання, оновлення Нестерова і так далі, щоб поліпшити ванільний SGD. Проектування кращого оптимізатора - це дуже активна область досліджень. Деякі приклади:

  • Коли він вперше з'явився, оптимізатор Адама викликав чималий інтерес. Але деякі останні дослідження показали, що SGD з імпульсом може випереджати адаптаційні методи градієнта для нейронних мереж. " Гранична цінність адаптивних градієнтних методів у машинному навчанні " Еся Ч. Вілсон, Ребекка Рулофс, Мітчелл Стерн, Натан Сребро, Бенджамін Рехт

  • Але з іншого боку, цей останній документ пропонує новий адаптивний оптимізатор швидкості навчання, який нібито зі швидкістю закриває розрив між методами адаптивного курсу та SGD. " Закриття прогалини узагальнення адаптивних градієнтних методів у навчанні глибоких нейронних мереж " Цзіньхуей Чен, Quanquan Gu

    Спостерігалися адаптивні градієнтні методи, які застосовують історичну градієнтну інформацію для автоматичного регулювання швидкості навчання, щоб узагальнити гірше, ніж стохастичний градієнтний спуск (SGD) з імпульсом при навчанні глибоких нейронних мереж. Це залишає, як закрити розрив узагальнення адаптивних градієнтних методів відкритою проблемою. У цій роботі ми показуємо, що адаптаційні градієнтні методи, такі як Адам, Амсград, іноді «над адаптованими». Ми розробляємо новий алгоритм, який називається методом частково адаптивного імпульсу (Padam), який об'єднує Адама / Амсграда з SGD для досягнення найкращого з обох світів. Експерименти зі стандартними орієнтирами показують, що Padam може підтримувати швидкий рівень конвергенції як Адам / Амсград при одночасному узагальненні, а також SGD при навчанні глибоких нейронних мереж.

Нормалізація

Масштаб даних може істотно змінитись у навчанні.

Регуляризація

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

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

Ця тактика може визначити, де деяка регуляризація може бути погано встановлена. Деякі приклади є

Ведіть Журнал експериментів

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

Причина, по якій я настільки нав'язлива щодо збереження старих результатів, полягає в тому, що це дозволяє дуже легко повернутися назад і переглянути попередні експерименти. Він також захищає від помилкового повторення того ж тупикового експерименту. Психологічно, це також дозволяє озирнутися назад і спостерігати «Ну, проект не може бути там , де я хочу, щоб це було сьогодні, але я роблю успіхи по порівнянні з якою я був тижнів тому.»k

Як приклад, я хотів дізнатися про мовні моделі LSTM, тому вирішив зробити бота Twitter, який пише нові твіти у відповідь на інших користувачів Twitter. Я працював над цим у вільний час, між середньою школою та моєю роботою. Минуло близько року, і я переглянув понад 150 різних моделей, перш ніж перейти до моделі, яка зробила те, що я хотіла: створити новий англомовний текст, який (свого роду) має сенс. (Одним із ключових моментів і частиною причини, що потребує такої кількості спроб, є те, що недостатньо просто отримати низьку втрату, яка не є вибіркою, оскільки ранні моделі з низькими втратами встигли запам'ятати дані тренувань, тож це було просто відтворення германних блоків тексту дослівно у відповідь на підказки - це потребувало певного налаштування, щоб зробити модель більш спонтанною та все ще мати низькі втрати.)


11
Там багато хороших порад. Цікаво, скільки ваших коментарів схоже на коментарі, які я робив (або я бачив, як інші) роблять відносно налагодження оцінки параметрів або прогнозів для складних моделей із схемами вибірки MCMC. (Наприклад, може здатися, що код працює, коли він неправильно реалізований.)
Glen_b

11
@Glen_b Я не думаю, що найкращі практики кодування приділяють достатньо уваги більшості статистичних програм / навчальних програм машинного навчання, тому я наголосив на цьому так сильно. Я бачив ряд записів у мережі "НН", де ОП залишив коментар на кшталт "Ой, я знайшов помилку, зараз вона працює".
Sycorax,

7
Я викладаю програмування для курсу інформатики в python, і ми фактично робимо функції та тестування одиниць у перший день, як основні поняття. Боротьба з доброю боротьбою.
Меттью Друрі

8
+1 для "Все кодування налагоджується". Мене дивує, скільки плакатів на ПС, здається, вважають, що кодування - це проста вправа, що вимагає невеликих зусиль; які очікують, що їх код спрацює правильно під час першого запуску; і хто, здається, не може продовжувати роботу, коли цього не відбувається. Найсмішніше, що вони наполовину праві: кодування є легко - але програмування важко.
Боб Джарвіс

41

Опубліковані відповіді чудові, і я хотів додати кілька "перевірок розсудливості", які мені дуже допомогли в минулому.

1) Навчіть свою модель на одній точці даних. Якщо це працює, навчайте його на двох входах з різними виходами.

Це підтверджує кілька речей. По-перше, це швидко показує, що ваша модель здатна навчитися, перевіривши, чи може ваша модель перевищити ваші дані. У моєму випадку я постійно роблю дурні помилки робити Dense(1,activation='softmax')vs Dense(1,activation='sigmoid')для двійкових прогнозів, і перший дає сміття.

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

2) Зверніть свою первісну втрату.

Продовжуючи двійковий приклад, якщо ваші дані становлять 30% 0 і 70% 1, то ваші очікувані втрати в межах . Це тому, що ваша модель повинна починатись близько до випадкових здогад.L=0.3ln(0.5)0.7ln(0.5)0.7

Багато разів ви побачите початкову втрату чогось смішного, наприклад 6.5. Концептуально це означає, що ваш вихід сильно насичений, наприклад, до 0. Наприклад, , тому якщо ви бачите втрати, що перевищують 1, швидше за все, ваш модель дуже перекошена. Зазвичай це відбувається, коли ваги нейронної мережі недостатньо збалансовані, особливо ближче до softmax / sigmoid. Отже, це підкаже, чи погана ваша ініціалізація.0.3ln(0.99)0.7ln(0.01)=3.2

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

3) Узагальнення результатів моделі для налагодження

Як приклад, уявіть, що ви використовуєте LSTM для прогнозування даних часових рядів. Можливо, у вашому прикладі ви дбаєте лише про останнє передбачення, тому ваш LSTM видає єдине значення, а не послідовність. Переключіть LSTM, щоб повертати прогнози на кожному кроці (в керах це так return_sequences=True). Тоді ви можете переглянути свої приховані результати після кожного кроку і переконатися, що вони насправді різні. Застосування цього полягає в тому, щоб переконатися, що коли ви маскуєте свої послідовності (тобто додаєте їх до даних, щоб зробити їх однаковою довжиною), LSTM правильно ігнорує ваші масковані дані. Без узагальнення вашої моделі ви ніколи не знайдете цього питання .

4) Подивіться на окремі шари

Tensorboard забезпечує корисний спосіб візуалізації результатів шару . Це може допомогти переконатися, що входи / виходи нормалізуються у кожному шарі. Він також може наздогнати баггі активації. Ви також можете запитувати результати шарів у керах на групі прогнозів, а потім шукати шари, які мають підозріло перекошені активації (або всі 0, або всі ненульові).

5) Створіть спочатку більш просту модель

Ви вирішили, що найкращим підходом до вирішення вашої проблеми є використання CNN у поєднанні з детектором обмежувальної коробки, який надалі обробляє зображення сільськогосподарських культур, а потім використовує LSTM для об'єднання всього. Ініціалізація вашої моделі займає 10 хвилин.

Натомість зробіть групу підроблених даних (однакової форми) та розбийте свою модель на компоненти. Тоді складіть замість кожного компонента фіктивні моделі (ваш "CNN" міг би бути лише одинарним 2x2 20-стрічковим згортком, LSTM із лише 2 прихованими одиницями). Це допоможе вам переконатися, що ваша модель моделі правильна та що немає сторонніх проблем. Я деякий час боровся з такою моделлю, і коли я спробував простішу версію, я виявив, що один із шарів не маскується належним чином через помилку керасу. Ви можете легко (і швидко ) запитувати внутрішні шари моделі та побачити, чи правильно ви налаштували графік.

6) Стандартизуйте версії попередньої обробки та упаковки

Зокрема, нейронні мережі надзвичайно чутливі до невеликих змін у ваших даних. Як приклад, два популярні пакети завантаження зображень cv2і PIL. Тільки завдяки відкриттю JPEG, обидва ці пакети будуть створювати дещо різні зображення. Відмінності, як правило, дуже малі, але час від часу ви бачите краплі в продуктивності моделі завдяки цьому. Крім того, це робить налагодження кошмаром: ви отримали бал валідації під час тренувань, а потім пізніше ви використовуєте інший навантажувач і отримуєте різну точність на одному і тому ж темному наборі даних.

Тож якщо ви завантажуєте чиюсь модель з github, зверніть пильну увагу на їх попередню обробку. Які завантажувачі зображень вони використовують? Які підпрограми попередньої обробки зображень вони використовують? Під час зміни розміру зображення, яку інтерполяцію вони використовують? Вони спочатку змінюють розмір, а потім нормалізують зображення? Або навпаки? Який порядок каналів для RGB-зображень?

Найбезпечніший спосіб стандартизації пакетів - використовувати requirements.txtфайл, який окреслює всі ваші пакунки так само, як у налаштуваннях вашої навчальної системи, аж до keras==2.1.5номерів версій. Тоді теоретично використання Docker разом із тим самим графічним процесором, що і у вашій навчальній системі, повинно давати ті самі результати.


7
(+1) Перевірка початкової втрати - чудова пропозиція. Я шкодую, що залишив це без своєї відповіді.
Sycorax

7
Переконатися, що ваша модель може переоцінити - це відмінна ідея. Я настільки звик думати про перевитрату як про слабкість, що ніколи я прямо не думав (поки ви це не згадали), що здатність перевтомлюватися насправді є силою.
Джон Коулман

15

Не тренуйте нейронну мережу для початку!

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

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

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

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


5
Я згоден з цією відповіддю. Нейронні мережі та інші форми ML є "настільки гарячими зараз". Часто пропускаються простіші форми регресу. Крім того, коли мова йде про пояснення вашої моделі, хтось підійде і запитає "який вплив на результат?" і все, що ти зможеш, - знизати плечима. Дивіться на рішення щодо машинного навчання лише тоді, коли простіші методики не вийшли з ладу. xk
Інголіфс

11

По суті, основний робочий процес для навчання моделі NN / DNN є більш-менш завжди однаковим:

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

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

  3. нормалізувати або стандартизувати дані певним чином. Оскільки NN - це нелінійні моделі, нормалізація даних може впливати не тільки на числову стабільність, але і на час тренувань, і на виходи NN (така лінійна функція, як нормалізація не змінюється з нелінійною ієрархічною функцією).

  4. розділити дані в навчальному / валідаційному / тестовому наборі, або в декілька разів, якщо використовується перехресна перевірка.

  5. тренуйте нейронну мережу, одночасно контролюючи втрати на наборі перевірки. Тут ви можете насолоджуватися безтурботними задоволеннями від неопуклої оптимізації, де ви не знаєте, чи існує якесь рішення, чи існує декілька рішень, що є найкращим рішенням з точки зору помилки узагальнення та наскільки близько ви дісталися це. Порівняння між втратою навчання і кривими втратами перевірки направляє вас, звичайно, але не варто недооцінювати живуче відношення Н (і особливо DNNS): вони часто показують (можливо повільно) зниження підготовки втрати / перевірки , навіть якщо у вас є калічить помилок у вашому коді.

  6. Перевірте точність на тестовому наборі та складіть діагностичні схеми / таблиці.

  7. Поверніться до пункту 1, оскільки результати не гарні. Повторіть рекламну нудоту .

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

Основні перевірки архітектури

Це може бути джерелом проблем. Зазвичай я роблю такі попередні перевірки:

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

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

Набір тренувань

Двічі перевірте вхідні дані. Перевірте, чи перевернули ви, наприклад, мітки навчального набору та тестового набору (трапилось зі мною колись –___-), чи ви імпортували неправильний файл. Перегляньте кілька вхідних зразків та пов’язані з ними мітки та переконайтесь, що вони мають сенс. Перевірте, чи нормалізовані дані дійсно нормалізовані (подивіться на їх діапазон). Також набори даних у реальному світі є брудними: для класифікації може бути високий рівень шуму міток (зразки, що мають неправильну мітку класу) або для багатовимірного прогнозу часових рядів, деякі компоненти часових рядів можуть мати багато відсутніх даних ( Я бачив цифри до 94% для деяких вхідних даних).

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

Нарешті, найкращий спосіб перевірити наявність проблем із навчальним набором - це використовувати інший навчальний набір. Якщо ви робите класифікацію зображень, замість зібраних зображень використовуйте стандартний набір даних, такий як CIFAR10 або CIFAR100 (або ImageNet, якщо ви можете дозволити собі це тренування). Ці набори даних добре перевірені: якщо ваша втрата тренувань знизиться тут, але не в оригінальному наборі даних, у вас можуть виникнути проблеми в наборі даних.

Робіть Золоті тести

Є два тести, які я називаю Золотими тестами, які дуже корисні для пошуку проблем у НН, які не навчаються:

  • зменшити навчальний набір до 1 або 2 зразків, і тренуватися на цьому. NN повинен негайно перевищити навчальний набір, досягнувши точності 100% на тренувальному наборі дуже швидко, тоді як точність набору для перевірки / випробування піде на 0%. Якщо цього не відбувається, у вашому коді є помилка.

  • протилежне випробування: ви зберігаєте повний набір тренувань, але перетасуєте мітки. Єдиний спосіб, коли NN може навчитися зараз, - це запам'ятовування навчального набору, а це означає, що втрати тренувань зменшаться дуже повільно, тоді як втрати на тесті будуть збільшуватися дуже швидко. Зокрема, ви повинні досягти випадкових втрат на тестовому наборі . Це означає, що якщо у вас 1000 занять, ви повинні досягти точності 0,1%. Якщо ви не бачите різниці між втратою тренувань перед та після перемішування міток, це означає, що ваш код невдалий (пам’ятайте, що ми вже перевірили мітки тренінгу, встановлені на етапі раніше).

Перевірте, чи має сенс ваша навчальна метрика

Точність (втрата 0-1) - хитра метрика, якщо у вас сильний дисбаланс класу. Спробуйте щось більш значуще, наприклад, крос-ентропійна втрата: ви не просто хочете правильно класифікувати, але хочете класифікувати з високою точністю.

Виведи великі гармати

Якщо нічого не допомогло, зараз прийшов час почати хитатися з гіперпараметрами. Це легко гірша частина навчальної роботи з NN, але це гігантські непізнавальні моделі, параметри яких підходять шляхом вирішення невипуклої оптимізації, тому цих ітерацій часто не уникнути.

  • спробуйте різні оптимізатори: SGD тренується повільніше, але це призводить до меншої помилки узагальнення, тоді як Адам тренується швидше, але тестові втрати зупиняються на більш високе значення
  • спробуйте зменшити розмір партії
  • спочатку збільшуйте ступінь навчання, а потім зменшуйте його або використовуйте циклічний рівень навчання
  • додайте шари
  • додати приховані одиниці
  • видаляйте регуляризацію поступово (можливо, переключіть норму партії на кілька шарів). Втрати на тренуваннях тепер повинні зменшуватися, але втрати на тесті можуть збільшуватися.
  • візуалізувати розподіл ваг і ухилів для кожного шару. Мені ніколи не доводилося потрапляти сюди, але якщо ви використовуєте BatchNorm, ви очікуєте приблизно стандартних нормальних розподілів. Подивіться, чи норма ваг зростає ненормально з епохами.
  • якщо ви отримуєте помилку під час тренувань, google цю помилку . Я витрачав одного ранку, намагаючись виправити ідеально працюючу архітектуру, лише щоб з'ясувати, що версія Keras, яку я встановив, мала помилкову підтримку багато GPU, і мені довелося її оновлювати. Іноді доводилося робити навпаки (знижувати версію пакета).
  • оновіть своє резюме та починайте шукати іншу роботу :-)

+1, але "кривавий зошит Юпітера"? Хочете прокоментувати це? :)
амеба

2
Ось чому я ненавиджу ноутбуки Юпітера . TL; DR: прихований стан, різний - це біль, проблеми із захистом, і це заохочує погані практики програмування, наприклад, не використання тестів на одиницю / регресію / інтеграцію. Навчити НН вже досить важко, без людей забувати про основи програмування.
DeltaIV

2
Я, мабуть, занадто негативний, але, чесно кажучи, мені було достатньо людей, що клонували Jupyter Notebooks від GitHub, думаючи, що це буде питання хвилин, щоб адаптувати код до їхнього використання, а потім прийти до мене зі скаргою, що нічого не працює. Заради ягід, придбайте справжній IDE, такий як PyCharm або VisualStudio Code, і створіть добре структурований код, а не готуйте Блокнот! Особливо, якщо ви плануєте перевезти модель до виробництва, це значно полегшить роботу.
DeltaIV

2
Лол. 'Зошит Юпітера' та 'Тестування блоку' є антикорельованими.
Sycorax

2
(+1) Це гарне оформлення. Пропозиції щодо тестів на рандомізацію - це справді чудові способи потрапляння у невдалі мережі.
Sycorax

6

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

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

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