Найкращі практики глибокого навчання (1) - Ініціалізація ваги

Основи, підводні камені ініціалізації ваги та кращі практики

https://pixabay.com/photo-1600668/

Мотивація

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

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

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

Основи та позначення

Розглянемо нейронну мережу L шару, в якій є приховані шари L-1 та 1 вихідний шар. Параметри (ваги та ухили) шару l представлені у вигляді

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

Тренування нейронної мережі складається з 4 етапів:

  1. Ініціалізуйте ваги та ухили.
  2. Поширення вперед: Використовуючи вхід X, важить W і зміщення b, для кожного шару обчислюємо Z і A. На кінцевому шарі обчислюємо f (A ^ (L-1)), що може бути сигмоїдною, софтмакс або лінійною функцією A ^ (L-1), і це дає прогноз y_hat.
  3. Обчисліть функцію втрати: Це функція фактичної мітки y та передбачуваної мітки y_hat. Він фіксує, наскільки далеко наші фактичні прогнози від фактичної мети. Наша мета - мінімізувати цю функцію втрат.
  4. Поширення назад: На цьому кроці ми обчислюємо градієнти функції втрат f (y, y_hat) щодо A, W та b, що називаються dA, dW та db. За допомогою цих градієнтів ми оновлюємо значення параметрів від останнього шару до першого.
  5. Повторіть кроки 2–4 для n ітерацій / епох, поки ми не відчуємо, що ми мінімізували функцію втрат, не переставляючи дані поїзда (докладніше про це пізніше!)

Ось короткий огляд кроків 2, 3 та 4 для мережі з двома шарами, тобто одним прихованим шаром. (Зверніть увагу, що я тут не додав термінів упередженості для простоти):

Вперед поширенняВідсталене поширення

Ініціалізація ваг W

Одне з вихідних пунктів, про яке слід піти, будуючи мережу, - правильно ініціалізувати свою матрицю ваги. Розглянемо 2 сценарії, які можуть викликати проблеми під час навчання моделі:

1. Ініціалізація всіх ваг до 0

Давайте просто поставимо його там - це робить вашу модель рівнозначною лінійній моделі. Якщо встановити всю вагу до 0, похідна відносно функції втрат однакова для кожного w в W ^ l, таким чином, всі ваги мають однакові значення в наступній ітерації. Це робить приховані одиниці симетричними і продовжуються для всіх n ітерацій, які ви виконуєте. Таким чином, встановлення ваги до нуля робить вашу мережу не кращою, ніж лінійна модель. Важливо зауважити, що встановлення зміщення у 0 не створюватиме проблем, оскільки ненульові ваги дбають про порушення симетрії, і навіть якщо зміщення дорівнює 0, значення у кожного нейрона все ще відрізняються.

2. Ініціалізація ваг випадковим чином

Ініціалізація ваг випадковим чином, дотримуючись стандартного нормального розподілу (np.random.randn (size_l, size_l-1) в Python) під час роботи з (глибокою) мережею, потенційно може призвести до 2 проблем - зникнення градієнтів або вибуху градієнтів.

a) Зникаючі градієнти - У випадку глибоких мереж для будь-якої функції активації abs (dW) буде менше і менше, коли ми будемо рухатись назад з кожним шаром під час поширення назад. Попередні шари є найповільнішими для навчання в такому випадку.

Оновлення ваги незначне і призводить до уповільнення зближення. Це робить оптимізацію функції втрат повільною. У гіршому випадку це може повністю зупинити нервову мережу від подальшого навчання.

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

б) Вибухові градієнти - це точно протилежне зниклим градієнтам. Вважайте, що у вас є негативні та великі ваги та малі активації A (як це може бути у випадку сигмоїди (z)). Коли ці ваги множать уздовж шарів, вони викликають велику зміну вартості. Таким чином, градієнти також будуть великими. Це означає, що зміни W, W - ⍺ * dW, відбуватимуться величезними кроками, спадний момент збільшиться.

Це може призвести до коливань навколо мінімумів або навіть до перевищення оптимального знову і знову, і модель ніколи не навчиться!

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

Кращі практики

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

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

a) Для RELU (z) - множимо випадково генеровані значення W на:

б) Для tanh (z) - евристику називають ініціалізацією Ксав'є. Він аналогічний попередньому, за винятком того, що k дорівнює 1, а не 2.

У TensorFlow W = tf.get_variable ('W', [dims, ініціалізатор), де ініціалізатор = tf.contrib.layers.xavier_initializer ()

c) Іншим поширеним евристичним є:

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

3. Градієнтний відсікання - це ще один спосіб вирішення проблеми, що вибухнув градієнтом. Встановлюємо порогове значення, і якщо обрана функція градієнта більша за цей поріг, ми встановлюємо його на інше значення. Наприклад, нормалізуйте градієнти, коли норма L2 перевищує певний поріг –W = W * поріг / l2_norm (W), якщо поріг l2_norm (W)>

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

Висновок

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

Список літератури

  1. https://www.coursera.org/learn/deep-neural-network/lecture/RwqYe/weight-initialization-for-deep-networks
  2. Нейронні мережі: тренування з зворотним розмноженням - Джеремі Джордан
  3. Ніжний вступ до вибуху градієнтів в нейронних мережах Джейсона Браунлі
  4. Проблема градієнта, що зникає
  5. https://www.quora.com/Why-is-it-a-problem-to-have-exploding-gradients-in-a-neural-net-esperely-in-an-RNN

Про мене: Закінчивши MS Data Science в USF та магістерську програму з комп'ютерних наук, я маю 2-річний досвід у розробці алгоритмів прогнозування та рекомендацій та отримання ділової інформації для клієнтів з фінансів та роздрібної торгівлі. Я схвильований можливістю застосування мого машинного навчання та глибокого вивчення знань у реальних проблемах.
Перевірте інші мої блоги тут!
LinkedIn: https://www.linkedin.com/in/neerja-doshi/