Частина 2: Градієнтні методи першого порядку.
Цей текст є прололженіем статті про методи навчання багатошарових нейронних мереж прямого поширення. Тут ми поговоримо про градієнтних методах першого порядку навчання класифікатора.
1. Введення.
У попередній статті ми формально поставили завдання навчання класифікатора $ h $ як мінімізацію функції втрати в просторі ваг. \ Begin \ min_W E (h (X, W), C) \ label \ end
Далі ми займемося вирішенням цього завдання.
2. Градієнтні методи навчання першого порядку
Для вирішення завдання (\ ref), ми будемо використовувати градієнтні методи оптимізації (першого порядку). Градієнт функції $ \ nabla E (W) $ в точці $ W $ це напрямок найшвидшого її зростання, відповідно для мінімізації функції необхідно змінювати параметри в сторону протилежну градієнту. Цей підхід називається методом градієнтного спуску. Загальна схема такого навчання виглядає наступним чином.
- форматувати ваги $ W $ (випадковими малими значеннями)
- обчислюємо помилку $ E (h (X, W), C) $
- якщо результат задовільний то кінець роботи
- обчислюємо значення градієнта ф-ції втрати: $ \ nabla E (h (X, W), C) $
- обчислюємо зміна параметрів: $ \ Delta W = \ eta \ cdot \ nabla E $
- коригуємо параметри: $ W: = W- \ Delta W $
- перехід на п.2
Таким чином, наступне завдання, яке необхідно вирішити для реалізації навчання нейронної мережі, це знайти спосіб обчислення градієнта функції втрати $ \ nabla E (h (X, W), C) $.
3. Метод зворотного поширення помилки.
Для вирішення завдання оптимізації (\ ref) методом градієнтного спуску, описаному в попередньому розділі, нам необхідно знайти спосіб обчислення градієнта функції втрати $ \ nabla E $, який представляє собою вектор приватних похідних. $$ \ nabla E (W) = \ left [\ frac \ ldots, \ frac \ right] $$ де $ k $ - загальна кількість ваг мережі.
де $ E $ - функція втрати, $ w_ $ - вага зв'язку нейронів $ i $ і $ j $, $ y_j $ - вихід нейрона номер $ j $, $ s_j $ - стан нейрона $ j $.
Розглянемо частини співвідношення ($ \ ref $) окремо.
$ \ Partial s_j / \ partial w_ $ - вихід $ i $-того нейрона попереднього (по відношенню до нейрона $ j $) шару, ця частина визначена в явному вигляді,
$ \ Partial y_j / \ partial s_j $ боку - значення похідної активационной функції по її аргументу для нейрона $ j $, цю частину досить просто можна обчислити,
$ \ Partial E / \ partial y_j $ - помилка нейрона номер $ j $, тут виникають деякі труднощі. Значення помилки визначено явно тільки для нейронів вихідного шару, як бути з прихованими шарами? Тут нам допоможе спосіб, який носить назву - метод зворотного поширення помилки.
Суть його полягає в послідовному обчисленні помилок прихованих шарів за допомогою значень помилки вихідного шару, тобто значення помилки поширюються по мережі в зворотному напрямку від виходу до входу.
Тут ми не будемо наводити висновок формул, відразу наведемо результат - рекурсивную формулу для розрахунків величини $ \ partial E / \ partial y $.
для вихідного шару $$ \ delta_i: = \ frac $$ для прихованого шару \ begin \ delta_i: = \ frac \ cdot \ sum \ limits_j \ delta_j w_ \ label \ end де $ \ partial y / \ partial s $ - значення похідної активационной функції по її аргументу.
Сам алгоритм розрахунку градієнта функції втрати методом зворотного поширення помилки виглядає наступним чином.- прямий прохід: обчислити стану нейронів $ s $ всіх шарів і вихід мережі
- обчислюємо значення $ \ delta: = \ partial E / \ partial y $ для вихідного шару
- зворотний прохід: послідовно від кінця до початку для всіх прихованих шарів обчислюємо $ \ delta $ за формулою ($ \ ref $)
- для кожного шару обчислюємо значення градієнта $ \ nabla E = \ partial E / \ partial W = y \ cdot \ delta ^ T $,
де $ y $ - вектор-вхід шару, $ \ delta $ - вектор помилки на виході шару.
4. Метод градієнтного спуску
Вище ми вже наводили схему методу градієнтного спуску, тут буде представлена його трохи ускладнена версія, цей алгоритм є базовим для алгоритмів описаних в наступних розділах.
Метод градієнтного спуску в "чистому" вигляді може "застрявати" в локальних мінімумах функції втрати $ E $, для боротьби з цим ми будемо використовувати кілька доповнень для цього методу. Перше доповнення це застосування вже описаної вище стратегії mini-batch, а друге це так звані "моменти".
Метод моментів можна порівняти з поведінкою важкого кульки, який скотився по схилу в найближчу низину деяку відстань здатний рухатися вгору за інерцією, вибираючись таким чином з локальних мінімумів. Формально це виглядає як добавка для зміни ваг мережі. $$ \ Delta W_t: = \ eta \ cdot \ nabla E + \ mu \ cdot \ Delta W_ $$ де $ \ eta $ - коефіцієнт швидкості навчання,
$ \ Nabla E $ - градієнт функції втрати,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W_ $ - зміна ваг на попередній ітерації.
Ще одним удосконаленням методу оптимізації буде застосування регуляризації. Регуляризація "накладає штраф" на надмірний ріст значень ваг це допомагає боротися з перенавчанням. Формально це виглядає ще одна добавка для зміни ваг мережі. $$ \ Delta W_t: = \ eta \ cdot \ left (\ nabla E + \ rho \ cdot W_ \ right) + \ mu \ cdot \ Delta W_ $$ де $ \ eta $ - коефіцієнт швидкості навчання,
$ \ Nabla E $ - градієнт функції втрати,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W_ $ - зміна ваг на попередній ітерації,
$ \ Rho $ - коефіцієнт регуляризації,
$ W_ $ - значення ваг на попередній ітерації.
Так само ми будемо змінювати коефіцієнт швидкості навчання $ \ eta $ на кожній ітерації $ t $ в залежності від зміни помилки $ E $ наступним чином.
$$ \ eta_t = \ left \
$ \ Delta E = E_t - \ gamma \ cdot E_ $ - зміна помилки,
$ \ Alpha = 0.99, \ \ beta = 1.01, \ \ gamma = 1.01 $ - константи
Таким чином, при істотному зростанні помилки $ E $ крок зміни параметрів $ \ eta $, зменшується, в іншому випадку - крок $ \ eta $ збільшується. Це доповнення може збільшити швидкість збіжності алгоритму.
Зберемо все разом, наш алгоритм набуває такого вигляду.- форматувати ваги $ W $ (випадковими малими значеннями)
- форматувати нулями початкові значення зміни ваг $ \ Delta W $
- обчислюємо помилку $ E (h (X, W), C, W) $ і її зміна $ \ Delta E $ на контрольному наборі
- якщо результат задовільний то то виконуємо підсумковий тест і кінець роботи
- випадковим чином вибрати підмножина $ (X, C) _L $ з навчального набору
- обчислюємо значення градієнта функції втрати $ \ nabla E $ на обраному підмножині
- обчислюємо зміна параметрів: $ \ Delta W: = \ eta \ cdot (\ nabla E + \ rho \ cdot W) + \ mu \ cdot \ Delta W $
- коригуємо параметри: $ W: = W- \ Delta W $
- коригуємо швидкість навчання $ \ eta $
- перехід на п.3
5. Метод quickProp
У цьому розділі ми розглянемо модифікацію описаного в попередньому розділі методу градієнтного спуску, яка називається quickProp. Від базового методу він відрізняється тим, що параметр моменту $ \ mu $ і коефіцієнт швидкості навчання $ \ eta $ задаються індивідуально для кожного параметра. Зміна параметрів описується наступним співвідношенням. $$ \ Delta W: = \ eta \ cdot (\ nabla E + \ rho \ cdot W) + \ mu \ cdot \ Delta W $$ де $ \ rho $ - коефіцієнт регуляризації.
Параметр швидкості навчання обчислюється таким чином. $$ \ eta = \ left \
Параметр моменту виглядає наступним чином. $$ \ mu = \ left \
$ S = \ nabla E + \ rho W $,
$ \ Beta = S (t) / (S (t-1) - S (t)) $
$ \ Gamma = S \ cdot (- \ Delta W) \ cdot \ beta $
Далі побудуємо реалізацію і подивимося як це працює.
6. Метод rProp
У цьому розділі ми розглянемо модифікацію описаного в попередньому розділі методу градієнтного спуску, яка називається rProp (resilient back propagation). У разі rProp моменти і регуляризація не використовуються, застосовується проста стратегія full-batch. Ключову роль відіграє параметр швидкості навчання $ \ eta $, він розраховується для кожного ваги індивідуально. $$ \ eta (t) = \ left \
$ \ Eta_ = 50 \, \ \ eta_ = 10 ^ \, \ a = 1.2 \, \ b = 0.5 $ - константи
Зміна параметрів виглядає наступним чином.
$$ \ Delta W_t: = \ eta \ cdot \ left (sign (\ nabla E) + \ rho \ cdot W_ \ right) + \ mu \ cdot \ Delta W_ $$ де $$ sign (x) = \ left \
7. Метод сполучених градієнтів
У цьому розділі ми розглянемо метод сполучених градієнтів (conjugate gradient). Особливість цього методу - спеціальний вибір напрямок зміни параметрів. Воно вибирається таким чином, що б було ортогональним до попередніх напрямів. Повна зміна ваг виглядає наступним чином. $$ \ Delta W: = \ eta \ cdot (p + \ rho \ cdot W) + \ mu \ cdot \ Delta W $$ де $ \ eta $ - коефіцієнт швидкості навчання,
$ P $ - напрямок зміни параметрів,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W $ - зміна ваг на попередній ітерації,
$ \ Rho $ - коефіцієнт регуляризації,
$ W $ - значення ваг на попередній ітерації.
При цьому коефіцієнт швидкості навчання $ \ eta $, вибирається на кожній ітерації, шляхом вирішення задачі оптимізації. $$ \ min_ \ eta E (\ Delta W (\ eta)) $$
Напрямок зміни параметрів вибирається в такий спосіб. $$ p = \ nabla E + \ beta \ cdot p $$ Початковий напрямок вибирається як $ p_0: = \ nabla E $.
Ключовим моментом є обчислення коефіцієнта сполучення $ \ beta $. Його можна обчислювати по крайней мере двома різними способами. Перший спосіб - формула Флетчера-Ривса. $$ \ beta = \ frac ^ T \ cdot g_>; $$ Другий спосіб - формула Полак-Рібьер. $$ \ beta = \ frac)> ^ T \ cdot g_>; $$ де $ g = \ nabla E $ - градієнт функції втрати на цій і попередній ітераціях.
Для компенсації накопичується похибки обчислень метод передбачає скидання сполученого напрямки тобто ($ \ Beta: = 0 $, $ p: = \ nabla E $) через кожні $ n $ циклів, де $ n $ вибирається залежно від кількості параметрів W.
8. Метод NAG (Nesterov's Accelerated Gradient)
У цьому розділі ми розглянемо модифікацію методу градієнтного спуску NAG, тут градієнт обчислюється щодо зсунутих на значення моменту ваг. $$ \ Delta W_t: = \ eta \ cdot \ left (\ nabla E (W_ + \ mu \ cdot \ Delta W_) + \ rho \ cdot W_ \ right) + \ mu \ cdot \ Delta W_ $$ де $ \ eta $ - коефіцієнт швидкості навчання,
$ \ Nabla E $ - градієнт функції втрати,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W_ $ - зміна ваг на попередній ітерації,
$ \ Rho $ - коефіцієнт регуляризації,
$ W_ $ - значення ваг на попередній ітерації.
(I.Sutskever, J.Martens, G.Dahl, G.Hinton On the importance of initialization and momentum in deep learning)
9. Метод AdaGrad (Adaptive Gradient)
Метод AdaGrad враховує історію значень градієнта в такий спосіб. $$ g_t: = \ frac<\nabla E_t><\sqrt<\sum\limits_^t \nabla E_i^2>> $$ $$ \ Delta W_t: = \ eta \ cdot \ left (g_t + \ rho \ cdot W_ \ right) + \ mu \ cdot \ Delta W_ $$ де $ \ eta $ - коефіцієнт швидкості навчання,
$ \ Nabla E $ - градієнт функції втрати,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W_ $ - зміна ваг на попередній ітерації,
$ \ Rho $ - коефіцієнт регуляризації,
$ W_ $ - значення ваг на попередній ітерації.
(J.Duchi, E.Hazan, Y.Singer, Adaptive Subgradient Methods for Online Learning and Stochastic Optimization)
10. Метод AdaDelta
Метод AdaDelta враховує історію значень градієнта і історію зміни ваг наступним чином. $$ S_t: = \ alpha \ cdot S_ + (1 \ alpha) \ cdot \ nabla E_t ^ 2 \; \ S_0: = 0 $$ $$ D_t: = \ beta \ cdot D_ + (1 \ beta) \ cdot \ Delta W_ ^ 2 \; \ D_0: = 0 $$ $$ g_t: = \ frac<\sqrt
$ \ Nabla E $ - градієнт функції втрати,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W_ $ - зміна ваг на попередній ітерації,
$ \ Rho $ - коефіцієнт регуляризації,
$ W_ $ - значення ваг на попередній ітерації,
$ \ Alpha = \ beta = 0.9 $
(M.Zeiler Adadelta: an adaptive learning rate method)
11. Метод Adam
Метод Adam перетворює градієнт наступним чином. $$ S_t: = \ alpha \ cdot S_ + (1 \ alpha) \ cdot \ nabla E_t ^ 2 \; \ S_0: = 0 $$ $$ D_t: = \ beta \ cdot D_ + (1 \ beta) \ cdot \ nabla E_t \; \ D_0: = 0 $$ $$ g_t: = \ frac
$ \ Nabla E $ - градієнт функції втрати,
$ \ Mu $ - коефіцієнт моменту,
$ \ Delta W_ $ - зміна ваг на попередній ітерації,
$ \ Rho $ - коефіцієнт регуляризації,
$ W_ $ - значення ваг на попередній ітерації,
$ \ Alpha = 0.999, \ \ beta = 0.9 $
(Diederik P. Kingma, Jimmy Lei Ba Adam: a method for stochastic optimization)
12. Реалізації.
У цьому розділі ми представимо реалізації описаних вище методів. Тестувати їх будемо на декількох наборах даних - три набори крапок (в двох класах) і набір картинок з цифрами від 0 до 9 для розпізнавання. Кожен набір точок перед запуском процедури навчання випадковим чином ділитися на три частини: навчальний, контрольний і тестовий.
12.1 Перший набір.
Далі представимо результати для різних методів навчання.
Метод градієнтного спуску. будемо використовувати нейронну мережу з трьома обробними шарами: вхідний шар 2 нейрона, перший обробляє шар 20 нейронів з активацією tanh, другий обробляє шар 20 нейронів з активацією експонентний сигмоид, третій шар - 2 нейрона (по числу класів) з активацією softmax. Навчання зайняло 2500 епох, результати представлені нижче.
Рис .: історія зміни помилки ч.1
Рис .: історія зміни помилки ч.2
Рис .: результат тесту
Метод сполучених градієнтів. будемо використовувати нейронну мережу з трьома обробними шарами: вхідний шар 2 нейрона, перший обробляє шар 30 нейронів з активацією експонентний сигмоид, другий обробляє шар 30 нейронів з активацією ReLU, третій шар - 2 нейрона (по числу класів) з активацією softmax. Навчання зайняло 100 епох, результати представлені нижче.
Рис .: історія зміни помилки ч.1
Рис .: історія зміни помилки ч.2
Рис .: результат тесту
Метод quickProp. використовуватимемо будемо використовувати нейронну мережу з трьома обробними шарами: вхідний шар 2 нейрона, перший обробляє шар 20 нейронів з активацією tanh, другий обробляє шар 20 нейронів з активацією tanh, третій шар - 2 нейрона (по числу класів) з активацією експонентний сигмоид. Навчання зайняло 3000 епох, результати представлені нижче.
Рис .: історія зміни помилки ч.1
Рис .: історія зміни помилки ч.2
Рис .: результат тесту
Метод rProp. будемо використовувати нейронну мережу з трьома обробними шарами: вхідний шар 2 нейрона, перший обробляє шар 20 нейронів з активацією tanh, другий обробляє шар 20 нейронів з активацією tanh, третій шар - 2 нейрона (по числу класів) з активацією експонентний сигмоид. Навчання зайняло 350 епох, результати представлені нижче.
Рис .: історія зміни помилки ч.1
Рис .: історія зміни помилки ч.2
Рис .: результат тесту