От SGD до Адама — обзор алгоритмов оптимизации глубокого обучения (1)

машинное обучение искусственный интеллект глубокое обучение алгоритм

клин

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

Эта статья в основном опирается на

@JuliuszhИдея статьи [1] использует общую структуру для описания каждого варианта алгоритма градиентного спуска. Фактически данную статью можно рассматривать как переформулировку [1], на основании чего в недостаточно подробное описание исходного текста внесены некоторые дополнения, а также исправлены многие неверные выражения и формулы.

Другой крупной справочной статьей является обзор Sebastian Ruder [2]. Эта статья очень известная и, наверное, лучшая в обзоре алгоритмов оптимизации глубокого обучения. Рекомендуется читать исходный текст напрямую. Многие выводы и иллюстрации в этой статье взяты из этого обзора.

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

введение

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

Градиентный спуск — один из наиболее широко используемых алгоритмов оптимизации в нейронных сетях. Чтобы восполнить недостатки наивного градиентного спуска, исследователи изобрели серию вариантов алгоритмов, постепенно эволюционирующих от исходного SGD (стохастический градиентный спуск) к NAdam. Тем не менее, многие из самых передовых статей в академическом мире не используют слепо самоадаптивные алгоритмы, которые признаны «простыми в использовании», такие как Adam/NAdam, и многие даже выбирают самый простой SGD или SGD с Momentum. .

Эта статья направлена ​​на то, чтобы разобраться в процессе разработки алгоритмов оптимизации глубокого обучения, а также проанализировать и сравнить алгоритмы оптимизации в более общей структуре.

Gradient Descent

Градиентный спуск означает, что при заданных оптимизируемых параметрах модели\theta \in \mathbb{R}^dи целевая функцияJ(\theta)После этого алгоритм проходит по градиенту\nabla_\theta J(\theta)обновить в обратном направлении\thetaсвести к минимумуJ(\theta). скорость обучения\etaОпределяет размер шага обновления в каждый момент времени. на каждый моментt, мы можем описать процесс градиентного спуска следующими шагами:

(1) Рассчитать градиент целевой функции по параметрам

g_t = \nabla_\theta J(\theta)

(2) Рассчитать импульс первого и второго порядка на основе исторического градиента

m_t = \phi(g_1, g_2, \cdots, g_t)

v_t = \psi(g_1, g_2, \cdots, g_t)

(3) Обновить параметры модели

\theta_{t+1} = \theta_t - \frac{1}{\sqrt{v_t + \epsilon}} m_t

в,\epsilonявляется сглаживающим членом, который предотвращает нулевое значение знаменателя, обычно 1e-8.

Градиентный спуск и варианты его алгоритма

В соответствии с приведенной выше структурой мы анализируем и сравниваем различные варианты градиентного спуска.

Vanilla SGD

Простой SGD (стохастический градиентный спуск) является самым простым, без понятия импульса, а именно

m_t = \eta g_t

v_t = I^2

\epsilon = 0

На данный момент шаг обновления является самым простым

\theta_{i+1}= \theta_t - \eta g_t

Недостатком SGD является то, что он медленно сходится и может колебаться в седловой точке. Более того, как разумно выбрать скорость обучения, является основной трудностью SGD.

Momentum

SGD склонен к шоку при столкновении с оврагами. Для этого в него можно ввести Momentum[3], который ускоряет спуск SGD в правильном направлении и подавляет колебание.

m_t = \gamma m_{t-1} + \eta g_t

В дополнение к исходному размеру шага SGD-M добавляет размер шага, относящийся к предыдущему моменту.\gamma m_{t-1},\gammaОбычно берется около 0,9. Это означает, что направление обновления параметра определяется не только текущим градиентом, но также связано с предыдущим накопленным направлением спуска. Это позволяет изменять размеры параметров, направления градиента которых не сильно меняются, чтобы ускорить обновление и уменьшить величину обновлений измерений, где направления градиента сильно меняются. Это приводит к ускорению сходимости и уменьшению колебаний.

Рисунок 1(а): SGD
Рисунок 1(b): SGD с импульсом

Как видно из рисунка 1, введение импульса эффективно ускоряет процесс сходимости градиентного спуска.

Nesterov Accelerated Gradient

Рисунок 2: Обновление Нестерова

Кроме того, есть надежда, что нисходящий процесс будет более интеллектуальным: алгоритм может замедлить скорость обновления до того, как целевая функция начнет увеличиваться.

Для этого предназначен NAG, и он дополнительно улучшает формулу расчета градиента на шаге 1 на основе SGD-M:

g_t = \nabla_\theta J(\theta - \gamma m_{t-1})

Ссылаясь на рисунок 2, размер шага SGD-M вычисляет текущий градиент (короткий синий вектор) и момент импульса (длинный синий вектор). Однако, поскольку для обновления использовался термин импульса, давайте сначала рассчитаем следующий момент\theta, и вычислить градиент (красный вектор) от этого будущего положения, а затем вычислить размер шага (зеленый вектор) так же, как в SGD-M. Такой способ расчета градиентов позволяет алгоритму лучше «предсказывать будущее» и заранее регулировать частоту обновления.

Adagrad

SGD, SGD-M и NAG обновляются с одинаковой скоростью обучения.\thetaкаждого компонента. В моделях глубокого обучения часто задействовано большое количество параметров, и частота обновления разных параметров часто бывает разной. Для параметров, которые обновляются нечасто (типичный пример: обновление низкочастотных слов при встраивании слов), мы надеемся, что размер одного шага будет больше, чтобы получить больше знаний; для часто обновляемых параметров мы надеемся, что размер шага будет небольшим, так что изученные параметры более стабильны и не будут слишком сильно зависеть от одного образца.

Алгоритм Adagrad[4] позволяет достичь этого эффекта. Он вводит импульс второго порядка:

v_t = \text{diag}(\sum_{i=1}^t g_{i,1}^2, \sum_{i=1}^t g_{i,2}^2, \cdots, \sum_{i=1}^t g_{i,d}^2)

в,v_t \in \mathbb{R}^{d\times d}— диагональная матрица, элементы которойv_{t, ii}для параметраiизмерение от начального момента до моментаtСумма квадратов градиента.

На данный момент это можно понять следующим образом: скорость обучения эквивалентна\eta / \sqrt{v_t + \epsilon}. Для параметров, которые ранее часто обновлялись, соответствующая составляющая импульса второго порядка больше, а скорость обучения меньше. Этот метод хорошо работает в сценариях с разреженными данными.

RMSprop

В Адаграде,v_tмонотонно увеличивается, в результате чего скорость обучения постепенно снижается до 0, что может привести к преждевременному завершению процесса обучения. Чтобы исправить этот недостаток, мы можем рассмотреть возможность не накапливать все исторические градиенты при расчете импульса второго порядка, а сосредоточиться только на нисходящих градиентах в недавнем временном окне. По этой идее есть RMSprop[5]. Помнитеg_t \odot g_tзаg_t^2,имеют

v_t = \gamma v_{t-1} + (1-\gamma) \cdot \text{diag}(g_t^2)

Его импульс второго порядка рассчитывается с использованием формулы экспоненциального скользящего среднего, что позволяет избежать проблемы непрерывного накопления импульса второго порядка. Аналогично параметрам в СГД-М,\gammaОбычно берется около 0,9.

Adadelta

Быть добавленным

Adam

Adam[6] можно рассматривать как комбинацию RMSprop и Momentum. Подобно тому, как RMSprop использует экспоненциальную скользящую среднюю для импульса второго порядка, Адам использует экспоненциальную скользящую среднюю для импульса первого порядка.

m_t = \eta[ \beta_1 m_{t-1} + (1 - \beta_1)g_t ]

v_t = \beta_2 v_{t-1} + (1-\beta_2) \cdot \text{diag}(g_t^2)

Среди них начальное значение

m_0 = 0

v_0 = 0

Обратите внимание, что на начальном этапе итерацииm_tиv_tИмеется смещение к начальному значению (слишком большое смещение к 0). Следовательно, импульс первого и второго порядка может быть скорректирован с учетом смещения (коррекция смещения),

\hat{m}_t = \frac{m_t}{1-\beta_1^t}

\hat{v}_t = \frac{v_t}{1-\beta_2^t}

обновить снова,

\theta_{t+1} = \theta_t - \frac{1}{\sqrt{\hat{v}_t} + \epsilon } \hat{m}_t

Это может гарантировать, что итерация будет относительно стабильной.

NAdam

НАдам[7] включает в себя идею НАГ поверх Адама.

Сначала просмотрите формулу NAG,

g_t = \nabla_\theta J(\theta_t - \gamma m_{t-1})

m_t = \gamma m_{t-1} + \eta g_t

\theta_{t+1} = \theta_t - m_t

Суть NAG заключается в том, что для расчета градиента используется «будущая позиция».\theta_t - \gamma m_{t-1}. В НАдам предложена идея деформации формулы [7].Общую идею можно понять так: пока при расчете градиента можно учитывать «фактор будущего», можно достичь эффекта Нестерова; случае, при расчете градиента можно еще использовать исходную формулуg_t = \nabla_\theta J(\theta_t), но рассчитано на предыдущей итерации\theta_t, используется импульс будущего момента, т.е.\theta_t = \theta_{t-1} - m_t, то теоретически достигаемый эффект аналогичен.

В настоящее время формула изменена на

g_t = \nabla_\theta J(\theta_t)

m_t = \gamma m_{t-1} + \eta g_t

\bar{m}_t = \gamma m_t + \eta g_t

\theta_{t+1} = \theta_t - \bar{m}_t

Теоретически импульс в следующий момент равенm_{t+1} = \gamma m_t + \eta g_{t+1}, в предположении, что градиент двух последовательных моментов времени сильно не меняется, т. е.g_{t+1} \approx g_t,имеютm_{t+1} \approx \gamma m_t + \eta g_t \equiv \bar{m}_t. На этом этапе вы можете использовать\bar{m}_tПриблизительное представление будущего импульса, добавленного к\thetaв итерационной формуле.

Точно так же в Адаме вы можете присоединиться\bar{m}_t \leftarrow \hat{m}_tдеформация, воля\hat{m}_tрасширяться с

\hat{m}_t = \frac{m_t}{1-\beta_1^t} = \eta[ \frac{\beta_1 m_{t-1}}{1-\beta_1^t} + \frac{(1 - \beta_1)g_t}{1-\beta_1^t} ]

вводить

\bar{m}_t = \eta[ \frac{\beta_1 m_{t}}{1-\beta_1^{t+1}} + \frac{(1 - \beta_1)g_t}{1-\beta_1^t} ]

обновить снова,

\theta_{t+1} = \theta_t - \frac{1}{\sqrt{\hat{v}_t} + \epsilon } \bar{m}_t

Эффект ускорения Нестерова можно ввести в Адама.

Визуальный анализ

Рисунок 3: Оптимизация SGD на контурах поверхности потерь
Рисунок 4: Оптимизация SGD в седловой точке

На рисунках 3 и 4 наглядно показана производительность различных алгоритмов. (Изображение предоставлено:Alec Radford)

На рисунке 3 мы можем видеть процесс обучения различных алгоритмов на графике контура поверхности потерь, все они начинаются с одной и той же точки, но следуют разными путями, чтобы достичь точки минимума. Среди них Adagrad, Adadelta и RMSprop нашли правильное направление с самого начала и быстро сошлись; SGD нашла правильное направление, но скорость сходимости была очень медленной; SGD-M и NAG изначально отклоняются от курса, но также могут быть окончательно скорректирована на правильное направление, Инерция отклонения СГД-М больше, чем у НАГ.

На рис. 4 показана производительность различных алгоритмов в седловых точках. Здесь SGD, SGD-M и NAG сильно зависят от седловой точки, хотя последние два в конечном итоге избегают седловой точки; в то время как Adagrad, RMSprop и Adadelta быстро находят правильное направление.

Для обсуждения этих двух рисунков также обратитесь к [2] и [8].

Видно, что некоторые адаптивные алгоритмы показывают лучшую производительность в этих сценариях.

Обсуждаем, выбираем стратегии

Содержание обсуждения в отчете о книге относительно беспорядочно, и эта часть будет опубликована после завершения.

References

[1] Адам такой молодец, почему он до сих пор зациклен на SGD(1) - фреймворке для понимания алгоритма оптимизации

[2] An overview of gradient descent optimization algorithms

[3] On the momentum term in gradient descent learning algorithms

[4] Adaptive Subgradient Methods for Online Learning and Stochastic Optimization

[5] CSC321 Neural Networks for Machine Learning - Lecture 6a

[6] Adam: A Method for Stochastic Optimization

[7] Incorporating Nesterov Momentum into Adam

[8] CS231n Convolutional Neural Networks for Visual Recognition