Как стать автором
Обновить

Объясняем на пальцах принцип действия оптимизаторов для нейронных сетей: основные алгоритмы, и зачем они нужны

Время на прочтение10 мин
Количество просмотров21K
Всего голосов 11: ↑10 и ↓1+9
Комментарии9

Комментарии 9

Будьте так добры, расскажите поподробнее, поточнее и конкретнее про «овраги», «седловые» точки и прочие локальные минимумы.
Ведь все оптимизаторы суть выпуклые функции и возникает недопонимание.
Вообще, направление довольно интересное. Имхо, его можно свести к другой задаче: нарисовать модель ландшафта за минимальное число шагов (а потом уже по этой модели вычислять минимум). Каждый шаг — это замер реального ландшафта в определенной точке.

И я бы решал эту задачу совсем по-другому. Я бы решал путем нанесения «сеток» со все уменьшающимся шагом. Таким образом после каждой новой серии замеров — появляется все более уточненная карта. Да, это намного более ресурсоемкий метод, но от него можно ожидать намного бОльшей точности в итоге — он все еще может пропустить впадины, но резкие (сильно меньше шага его последней сетки). А чем резче перепад на коротком промежутке — тем выше шанс, что это банальный мусор в данных и попытки его учесть дальше бессмысленные — т.е. эмпирически где-то есть граница, точнее которой нет смысла снижать шаг.
Я бы соотнес этот алгоритм с существующими так:
1) уменьшение шага сетки. Это идея постепенного увеличения точности. Сейчас в статье ближе всего: «Динамическая корректировка количества обновлений» (уменьшение learning_rate со временем).
2) само использование сетки. У меня происходит из идеи SGD. Ведь почему он оказывается лучше простого градиента — потому что у него из-за вероятностной природы появляется шанс вылезти из локального минимума. И чем больше эта вероятностная составляющая — тем больше шанс.

Все текущие алгоритмы, как мне кажется — они слишком оптимистичны по своей архитектуре — они все подразумевают, что двигаются в правильном направлении на основе замеров Х последних точек (где-то всего за 1 последний замер, где-то побольше). А такая методика плохо подходит для реальных сложных зависимостей.

Учтите, что даже небольшие нейронные сети — это миллионы параметров. То есть, ландшафт нужно стоить в миллиономерном пространстве, где координата точки — это экземпляр нейронной сети. То есть, много координат не сохранишь.


Сетку тоже большую не сделаешь. У каждой ячейки такой сетки будет несколько миллионов соседей.


Пока строится ландшафт, градиентные методы уже сойдутся к какому-то локальному методу.


Есть и неградиентные методы, конечно. Метод Хука — Дживса, например, или вообще эволюционные алооритмы. И идея с ландшафтом тоже давно известна, но для обучения нейронных сетей они, увы, малоприменимы. Разве что для поиска гиперпараметров.


С другой стороны, давайте подумаем, а зачем вам нужен ландшафт? Если вы по нему хотите определять направление дальнейшего движения в сторону минимума, так это градиентные методы и делают. Есть методы второго порядка, которые учитывают локальную кривизну, но даже они очень затратные и на практике редко применяются.


Все текущие алгоритмы, как мне кажется — они слишком оптимистичны по своей архитектуре — они все подразумевают, что двигаются в правильном направлении на основе замеров Х последних точек (где-то всего за 1 последний замер, где-то побольше).

Методов оптимизации намного больше, чем описано в этой статье и они часто очень изощрённые. Методы оптимизации развиваются сотни лет.


В градиентных методах измеряется, кстати, измеряется не ландшафт, а градиент (а то и гессиан), это не просто информация о значении в точке, но и сведения о форме в бесконечно малой окрестности.

НЛО прилетело и опубликовало эту надпись здесь

Как базовое решение используйте Adam. Он хорошо себя зарекомендовал. Несмотря на то, что постоянно публикуют новые методы, часто оказывается, что особого улучшения сходимости они не дают. И даже Adam часто можно заменить на SGD + momentum, только нужно учить дольше.


А вот когда базовое решение получено и хочется его улучшить, тогда уже всё очень сильно зависит от задачи, от стратегии изменения learning rate, от гиперпараметров, от используемых трюков (weight averaging, label smoothing и т.д.)


Со взрывом градиентов можно бороться по-разному. Тут тоже всё зависит от задачи. Есть масса методов: от регуляризаций до клиппинга.

Очень интересно и познавательно все написано. Оптимизм на первом месте.

Недавно Дмитрий Ветров проводил очень интересный вебинар «Необычные свойства функции потерь в глубинном обучении». Там он рассказывал среди прочего об интересных свойствах ландшафтов функций потерь нейронных сетей, которые в перспективе можно использовать для улучшения существующих методов обучения.

Спасибо за статью! Скажите пожалуйста, а применяются ли методы второго порядка в задачах обучения? Например метод множителей Лагранжа и его производные типа SQP

Для обучения нейронных сетей методы множителей Лагранжа и SQP обычно не применяются, так как эта задача не относится к оптимизации с ограничениями.


Методы второго порядка применяют для совсем маленьких моделей или когда нужно оптимизировать, например, вход. Тогда ещё можно встретить ньютоновские или квазиньютоновские методы (например, L-BFGS). Для полноразмерных же моделей методы второго порядка слишком ресурсозатратны. Есть, конечно, методы вроде K-FAC, но с ними много проблем, а выигрыша по сравнению с методами первого порядка почти нет.


В общем, Adam — наше всё. :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий