Изменения

Перейти к: навигация, поиск

Настройка глубокой сети

4162 байта добавлено, 09:01, 27 января 2019
Способы настройки параметров
== Способы настройки параметров ==
[[File:basins.png|450px|thumb|right|Рисунок 4. Сравение мотификаций метода градиентного спуска на ландшафте "бассейны и стены".]]
[[File:wolby.png|450px|thumb|right|Рисунок 5. Сравение мотификаций метода градиентного спуска на "шатком" ландшафте.]]
Ниже представлены различные вариации градиентного спуска (более подробное сравнение, применительно к данной задаче <ref>[https://habr.com/post/318970/ Методы оптимизации нейронных сетей, Habr]</ref>). Градиентный спуск — итеративный алгоритм поиска минимума или максимума функции, метриками качества алгоритма этого семейства методов являются скорость сходимости и сходимость в глобальный оптимум. Методы имеют различные преимущества на различных функциях. Так например на рисунке 4 из локального минимума методы adam и nag не могут достигнуть глобального, а в случае "шаткого" ландшафта (рисунок 5) эти методы сходятся быстрее.
Ниже представлены различные вариации градиентного спуска (более подробное сравнение, применительно к данной задаче * Стохастический градиентный спуск<ref>[httpshttp://habrwww.machinelearning.comru/postwiki/318970index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%81%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%B0 Метод стохастического градиента]</ Методы оптимизации нейронных сетейref> заключается в том, Habr]что алгоритм делает шаг постоянной величины в направлении, указанном градиентом в текущей точке: <tex>w^{(0)}</reftex> — начальные весы сети, <tex>w^{(k+1)}=w^{(k).}-\mu\frac{\partial L(w^{(k)})}{\partial w}</tex>;
* Стохастический градиентный спуск<ref>[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%81%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%B0 Метод стохастического градиента]</ref>: <tex>w^{(0)}</tex> — начальные весы сети, <tex>w^{(k+1)}=w^{(k)}-\mu\frac{\partial L(w^{(k)})}{\partial w}</tex>;
* Модификация Momentum <ref>[https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum Momentum, Wikipedia]</ref>запоминает скорость на предыдущем шаге и добавляет в <tex>\alpha</tex> раз меньшую величину на следующем шаге: <tex> \Delta w:=\alpha \Delta w-\eta \nabla Q_{i}(w)</tex>, <tex> w:=w+\Delta w</tex> или <tex> w:=w-\eta \nabla Q_{i}(w)+\alpha \Delta w</tex>;
* NAG (Nesterov accelerated gradient)<ref>[https://jlmelville.github.io/mize/nesterov.html#nag Nesterov accelerated gradient]</ref>: <tex> w^{(k+1)} = w^{(k)}-v^{(k)}; v^{(k+1)}=\gamma v^{(k)}+\mu\frac{\partial L(w^{(k)}-v^{(k)})}{\partial w}</tex>
*AdagradNAG (Nesterov accelerated gradient)<ref>[httphttps://akyrillidisjlmelville.github.io/notesmize/AdaGrad AdaGradnesterov.html#nag Nesterov accelerated gradient]</ref>добавляет к методу Momentum идею "заглядывания вперёд", используя производную не в текущей точке, а в следующей (если бы мы продолжали двигаться в этом же направлении без измений): <tex>g_w^{i,(k+1)}=\fracw^{\partial L(w_ik)}-v^{(k)})}{\partial w_i}, w_i; v^{(k+1)}=w_i\gamma v^{(k)}-+\mu\frac{\mu}{\sqrt{Gpartial L(w^{(k)}_i,i+\epsilon}}g_-v^{i,(k)})}{\partial w}</tex>, где G — диагональная матрица, элементы которой, суммы квадратов координат градиента к k-ой итерации алгоритма;
*RMSProp<ref>[https://towardsdatascience.com/a-look-at-gradient-descent-and-rmsprop-optimizers-f77d483ef08b RMSProp]</ref>: <tex>E^{(k)}[g_i^2] = \gamma E^{(k-1)}[g_i^2]+(1-\gamma)g^2_{i, (k)}, w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{E^{(k)}[g_i^2]+\epsilon}}g_{i, (k)}</tex>;
*Adagrad имеет преимущество в плане обучения нейронных сетей в предположении, что процесс обучения должен сходится (т.е. не нужно сильно менять веса сети, когда мы уже немного научились). В процессе обучения после каждого прецендента алгоритм будет уменьшать шаг за счёт суммы квадратов координат градиента предыдущих итераций<ref>[http://akyrillidis.github.io/notes/AdaGrad AdaGrad]</ref>: <tex>g_{i,(k)}=\frac{\partial L(w_i^{(k)})}{\partial w_i}, w_i^{(k+1)}=w_i^{(k)}-\frac{\mu}{\sqrt{G^{(k)}_i,i+\epsilon}}g_{i,(k)}</tex>, где G — диагональная матрица, элементы которой, суммы квадратов координат градиента к k-ой итерации алгоритма;
*Adadelta<ref>[https://arxiv.org/abs/1212.5701 Adadelta]</ref>:<tex>w^{(k+1)}=w^{(k)}-\mu(Q''(w^{(k)})^{-1}Q'(w^{(k)}</tex>, вычисление матрицы Q вторых производных довольно сложная задача, поэтому вместо неё можно брать приближение: <tex>w^{(k+1)}=w^{(k)}-\frac{RMS^{(k-1)}[\delta w_i}{RMS^{(k)}[g_i]}g_i^{(k)}</tex>, где <tex>RMS^{(k)}[x_i]=\sqrt{E^{(k)}[x^2_i]+\epsilon}</tex>;
*RMSProp<ref>[https://towardsdatascience.com/a-look-at-gradient-descent-and-rmsprop-optimizers-f77d483ef08b RMSProp]</ref> основан на идее Adagrad'a, но с учётом того элементы матрицы G могут быть большими величинами и начать препятствовать обучению. Для этого RMSProp делит шаг не на полную сумму градиентов, а на скользящую, т.е. <tex>E^{(k)}[g_i^2] = \gamma E^{(k-1)}[g_i^2]+(1-\gamma)g^2_{i, (k)}</tex>, обновление весов осталось таким же как в Adagrad : <tex> w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{E^{(k)}[g_i^2]+\epsilon}}g_{i, (k)}</tex>;  *Adadelta<ref>[https://arxiv.org/abs/1212.5701 Adadelta]</ref> устраняет "нефизичность" методов Adagrad и RMSProp, добавка с градиентом в которых не имеет размерности весов(точнее вообще безразмерна). Умножение этого слагаемого на любую величину правильной размерности — не самая хорошая идея. Используем разложение ряда Тейлора в точке с большим числом членов, тогда появится матрица Q вторых производных:<tex>w^{(k+1)}=w^{(k)}-\mu(Q''(w^{(k)})^{-1}Q'(w^{(k)}</tex>, рассчёт которой повлечёт за собой дополнительные затраты на её расчёт (сами градиенты мы получаем сразу при обратном распространии ошибки), поэтому вместо неё можно брать приближение (из сложных выводов получаем необходимиый множитель <tex>RMS^{(k-1)}[\delta w_i]</tex>, однако в данном случае знание предыдущей скорости не довляет алгоритму "инерции" методов Momentum и NAG): <tex>w^{(k+1)}=w^{(k)}-\frac{RMS^{(k-1)}[\delta w_i]}{RMS^{(k)}[g_i]}g_i^{(k)}</tex>, где <tex>RMS^{(k)}[x_i]=\sqrt{E^{(k)}[x^2_i]+\epsilon}</tex>;  *Adam<ref>[https://arxiv.org/pdf/1412.6980.pdf Adam]</ref>сочетает в себе преимущества Nag и Adadelta над обычным градиентным спуском: <tex> w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{\hat{b}^2_{(k)}+\epsilon}}\hat{m}_{(k)}</tex>, где <tex>\hat{m}_{(k)}=\frac{\gamma_1 E^{(k-1)}[g_i]+(1-\gamma_1)g_{i,(k)}}{1-\gamma_1^k}</tex> и <tex>\hat{b}^2_{(k)}= \frac{\gamma_2 E^{(k-1)}[g^2_i]+(1-\gamma_2)g:2_{i,(k)}}{1-\gamma_2^k}</tex>.
==См.также==
26
правок

Навигация