Оптимизаторы
Градиентный спуск
Градиентный спуск позволяет нам найти
Градиент — это вектор частных производных. В случае с нейросетями градиент — \(\frac{dloss}{dw_{i}}\)
Напомним также, что производная — это скорость изменения функции. Получается, градиент — направление наибольшего роста функции. Следовательно, если мы будем двигаться в обратную сторону, то будем уменьшать значение loss функции. Это нам и нужно.
Обычный градиентный спуск обновляет веса и основывается только на антиградиенте в текущей точке:
где \(θ\) — веса, \(η\) — шаг градентного спуска (learning rate), который является гиперпараметром, \(∇J(θ)\) — градиент loss функции по весам.
В случае обычного градиентного спуска (GD) мы считаем градиент по всем объектам обучающей выборки и делаем шаг. К сожалению, при слишком большой выборке эта операция может оказаться очень дорогостоящей в плане вычислительных ресурсов.
Еще один способ — считать градиент на каждом объекте (SGD). Но тогда путь к минимуму будет очень шумным. Самый распространенный вариант — minibatch SGD (нечто среднее между GD и SGD). В этом случае мы делим тренировочную выборку на батчи (подвыборки) и на каждом батче считаем градиент. Такой метод позволяет уменьшать количество шума при поиске минимума.
Для градиентного спуска очень важно подобрать правильный шаг. Например, если мы выберем слишком большой шаг — мы можем проскочить оптимум:
В то же время при выборе слишком маленького шага мы будем очень медленно двигаться:
Либо вообще не дойдем до оптимума и застрянем в локальном минимуме:
Momentum
Одна из проблем обычного градиентного спуска — застревание в локальных минимумах. Для ее решения можно добавить “импульс” (Momentum) при движении по поверхности loss функции. Как это сделать? Накопить историю нашего предыдущего движения и добавить его к направлению нашего шага. Для этого мы можем применить Moving Average (кстати, мы уже применяли его ранее).
А сейчас напомним следующее:
\(EWMA_t=\beta*x_t+(1-\beta)EWMA_{t-1},\) где \(0<\beta<1\)
Добавив EWMA, мы получим SGD with momentum.
Формула обновления весов будет выглядеть так:
\(θ= θ−V\)
\(V=\beta*V+(1-\beta)*η∇J(θ)\)
Во многих библиотеках, например, в pytorch используется измененная версия формулы:
\(θ= θ−ηV\)
\(V=\beta*V+(1-dampening)*∇J(θ)\)
Параметр dampening малоизучен и почти всегда берется равным 0. Добавление этого параметра позволяет увеличить значимость второго слагаемого, которое отвечает за шаг в сторону текущего градиента.
Обычно \(\beta\) выбирается равной либо 0.9, либо 0.95, либо 0.99. Это такой же гиперпараметр, как и шаг обучения, но обычно его не тюнят, так как он не сильно изменяет качество.
Можно представить, что мы делаем два шага: один — аналогичный шагу в SGD, другой — в сторону Momentum.
Стоит заметить, что в данном случае (как и во всех последующих) нам нужно хранить в памяти вектор \(V\) , размерность которого равна количеству весов модели.
Интересным улучшением является SGD with Nesterov momentum. Его идея заключается в следующем: мы сначала движемся в сторону Momentum, в этой точке пересчитываем градиент и дальше движемся в его направлении.

ADAGRAD и RMSprop
Некоторые параметры могут гораздо быстрее достигать оптимального значения в сравнении с другими. Плюс нам хотелось бы делать меньший шаг для параметров, близких к оптимуму, и больший шаг для параметров, далеких от идеала. С этой целью был придуман метод Adagrad. Он предлагает накапливать сумму квадратов градиентов параметров, которая характеризует изменчивость параметра в прошлом.
\(θ= θ−\frac{η}{\sqrt{G +\epsilon}}∇J(θ)\)
\(G=G+∇J^2(θ)\) \(\epsilon\) — маленькое число, которое добавляется для избегания деления на 0.
У Adagrad есть проблема: величина шага постоянно уменьшается. Это можно решить так — мы храним EWMA квадраты градиентов вместо квадратов градиентов. Такой метод называется RMSprop.
\(G=rG+(1-r)∇J^2(θ)\)
\(r\) является гиперпараметром, который обычно равен 0.99 либо 0.9. Его, как и \(\beta\) , используемый в алгоритмах с momentum, тюнят редко, так как он не сильно влияет на качество.
Это статья от команды DeepSchool — школы повышения квалификации Computer Vision инженеров. Наши образовательные программы: Computer Vision Rocket — научитесь решать CV задачи end-to-end: от сбора данных до деплоя веб-сервисов 3D Computer Vision — освойте задачи из области AR/VR, автономных автомобилей: реконструкция сцен, NeRF, SLAM, Point Clouds, рендеринг

