В чем разница между градиентным спуском на основе импульса и ускоренным градиентным спуском Нестерова?

48

Таким образом, градиентный спуск на основе импульса работает следующим образом:

v=self.momentummlrg

где - это предыдущее обновление веса, а - текущий градиент относительно параметров , - скорость обучения, а - постоянная величина.mgplrself.momentum

pnew=p+v=p+self.momentummlrg

и ускоренный градиентный спуск Нестерова работает следующим образом:

pnew=p+self.momentumvlrg

что эквивалентно:

pnew=p+self.momentum(self.momentummlrg)lrg

или же

pnew=p+self.momentum2m(1+self.momentum)lrg

источник: https://github.com/fchollet/keras/blob/master/keras/optimizers.py

Поэтому мне кажется, что ускоренный градиентный спуск Нестерова просто придает больший вес члену lr * g в течение предыдущего члена m изменения веса (по сравнению с простым старым импульсом). Правильно ли это толкование?

яблочный сидр
источник
7
Будет ли просить вас ввести слишком много? LATEX
Родриго де Азеведо

Ответы:

35

Ответ Ареша о импульсе Нестерова правильный, но код, по сути, делает то же самое. Таким образом, в этом отношении метод Нестерова придает больший вес термину и меньшему весу члену .vlrgv

Чтобы проиллюстрировать, почему реализация Keras верна, я заимствую пример Джеффри Хинтона .
введите описание изображения здесь

Метод Нестерова использует подход «азартная игра-> коррекция». Коричневый вектор - это (gamble / jump), красный вектор - (исправление), а зеленый вектор - это (куда мы должны перейти). - это функция градиента.
v=mvlr(w+mv)
w=w+v
mvlr(w+mv)mvlr(w+mv)()

Код выглядит иначе, потому что он перемещается по коричневому вектору вместо зеленого , поскольку метод Нестерова требует только вычисления вместо . Поэтому на каждом этапе мы хотим(w+mv)=:g(w)

  1. вернуться туда, где мы были(10)
  2. следуйте зеленому вектору туда, где мы должны быть(02)
  3. сделать еще одну игру(23)

Код Кераса, написанный для краткости: , и мы выполним некоторые математические вычисленияp=p+m(mvlrg)lrg

p=pmv+mv+m(mvlrg)lrg=pmv+mvlrg+m(mvlrg)=pmv+(mvlrg)+m(mvlrg)

и это ровно . На самом деле исходный код использует более короткий путь . 1023123

Фактическое оценочное значение (зеленый вектор) должно быть , которое должно быть близко к когда обучение сходится.ppmvp

dontloo
источник
2
@youkaichao попробуйте это youtube.com/watch?v=LdkkZglLZ0Q
смотрите
13

Мне кажется, что на вопрос ОП уже был дан ответ, но я постараюсь дать другое (надеюсь, интуитивное) объяснение об импульсе и разнице между классическим импульсом (CM) и ускоренным градиентом Нестерова (NAG).


tl; dr
Просто перейдите к изображению в конце.
Рассуждения NAG_ball - это еще одна важная часть, но я не уверен, что без всего остального это будет легко понять.



CM и NAG оба являются методами выбора следующего вектора в пространстве параметров, чтобы найти минимум функции .θf(θ)

В других новостях, в последнее время появились эти два диких разумных шара:
CM_ball NAG_ball

Оказывается (в соответствии с наблюдаемым поведением шаров и согласно статье « О важности инициализации и импульса в глубоком обучении» , которая описывает CM и NAG в разделе 2), что каждый шар ведет себя точно так же, как один из этих методов , и поэтому мы бы назвали их «CM_ball» и «NAG_ball»:
(NAG_ball улыбается, потому что он недавно наблюдал конец лекции 6c - Метод импульса, Джеффри Хинтон с Нитишем Шриваставой и Кевином Сверским , и, таким образом, верит больше, чем когда-либо, что его поведение приводит к поиску минимума быстрее.)

Вот как ведут себя шары:

  • Вместо того, чтобы катиться как обычные шары, они прыгают между точками в пространстве параметров.
    Пусть будет шара в пространстве параметров, а будет прыжок шара . Тогда переход между точками в пространстве параметров может быть описан как .θttvttθt=θt1+vt
  • Они не только прыгают вместо броска, но и их прыжки особенные: каждый прыжок на самом деле является двойным прыжком, который представляет собой композицию из двух прыжков: vt
    • Momentum Jump - прыжок, который использует импульс от , последнего двойного прыжка. Небольшая доля импульса теряется из-за трения с воздухом. Пусть будет частью оставшегося импульса (шары довольно аэродинамические, поэтому обычно ). Тогда скачок импульса равен . (И в CM, и в NAG - это гиперпараметр, называемый «коэффициент импульса».)vt1
      vt1
      μ0.9μ<1μvt1
      μ
    • Наклонный прыжок - прыжок, который напоминает мне о результате размещения нормального шара на поверхности - мяч начинает катиться в направлении самого крутого склона вниз, в то время как чем круче склон, тем больше ускорение.
      Аналогичным образом, прыжок с уклона идет в направлении самого крутого склона вниз (в направлении, противоположном градиенту), и чем больше уклон, тем больше скачок.
      Наклонный прыжок также зависит от , уровня готовности мяча (естественно, ): чем больше стремление к мячу, тем дальше будет проходить наклонный прыжок. (И в CM, и в NAG - это гиперпараметр, называемый «скорость обучения».) Пустьϵϵ>0
      ϵ
      gбыть градиентом в начальной точке прыжка с наклона. Тогда скачок наклона равен .ϵg
  • Таким образом, для обоих шаров двойной прыжок равен: Единственная разница между шарами - это порядок двух прыжков в двойном прыжке.
    vt=μvt1ϵg
  • CM_ball не думал, что это имело значение, поэтому он решил всегда начинать с Slope Jump.
    Таким образом, двойной прыжок CM_ball:
    vt=μvt1ϵf(θt1)
  • Напротив, NAG_ball некоторое время думал об этом, а затем решил всегда начинать с Momentum Jump.
    Поэтому двойной прыжок NAG_ball:

    vt=μvt1ϵf(θt1+μvt1)

    NAG_ball рассуждения

    • Какой бы прыжок ни пришел первым, мой Momentum Jump будет таким же.
      Поэтому я должен рассмотреть ситуацию так, как будто я уже совершил Momentum Jump, и я собираюсь совершить прыжок с уклона.
    • Теперь мой Прыжок по уклону концептуально начнется отсюда, но я могу выбрать, будет ли рассчитываться, каким будет мой Прыжок по уклону, как если бы он начался до Momentum Jump, или как если бы он начался здесь.
    • Думая об этом таким образом, становится совершенно ясно, что последний лучше, как правило, градиент в некоторой точке приблизительно указывает вам направление в направлении от к минимуму (с относительно правильной величиной), в то время как градиент в некотором другая точка менее вероятно направит вас в направлении от к минимуму (с относительно правильной величиной).θθθ

Наконец, вчера мне посчастливилось наблюдать, как каждый шарик прыгает в одномерном пространстве параметров.
Я думаю, что взгляд на их изменяющиеся позиции в пространстве параметров не сильно поможет в достижении интуиции, так как это пространство параметров является линией.
Поэтому вместо каждого шара я нарисовал двухмерный график, на котором горизонтальная ось равна . Затем я нарисовал используя черную кисть, а также нарисовал каждый шарик в его первых позициях вместе с числами, чтобы показать хронологический порядок позиций. Наконец, я нарисовал зеленые стрелки, чтобы показать расстояние в пространстве параметров (т. Е. Горизонтальное расстояние на графике) для каждого скачка импульса и скачка наклона.θ
f(θ)7

Пример CM_ball vs NAG_ball


Приложение 1 - Демонстрация рассуждений NAG_ball

В этом завораживающем GIF Алек Рэдфорд , вы можете увидеть, что NAG работает, возможно, лучше, чем CM ("Momentum" в GIF).
(Минимум - это то, где находится звезда, а кривые - это контурные линии . Объяснение контурных линий и почему они перпендикулярны градиенту, см. В видео 1 и 2 легендарной 3Blue1Brown .)

NAG лучше чем CM (Momentum)

Анализ конкретного момента демонстрирует рассуждения NAG_ball:

CM против NAG в конкретный момент

  • (Длинная) фиолетовая стрелка является подэтапом импульса.
  • Прозрачная красная стрелка является подэтапом градиента, если он начинается до подэтапа импульса.
  • Черная стрелка является подэтапом градиента, если он начинается после подэтапа импульса.
  • КМ попадет в цель темно-красной стрелки.
  • NAG попадет в цель черной стрелки.

Приложение 2 - вещи / термины, которые я придумал (для интуиции)

  • CM_ball
  • NAG_ball
  • Двойной прыжок
  • Импульсный прыжок
  • Импульс теряется из-за трения с воздухом
  • Наклонный прыжок
  • Рвение мяча
  • Я наблюдаю за шарами вчера

Приложение 3 - термины, которые я не составил

Орен Мильман
источник
1
Я нахожу часть из «Вот как ведут себя шары: ...», чтобы «указать вам направление от θ до минимума (с относительно правильной величиной)». отлично, как объяснение разницы.
Поэт Модит
12

Я так не думаю.

Есть хорошее описание свойств Nesterov Momentum (aka Nesterov Accelerated Gradient), например, в Sutskever, Martens и др. «О важности инициализации и импульса в глубоком обучении» 2013 .

Основное отличие состоит в том, что в классическом импульсе вы сначала корректируете свою скорость, а затем делаете большой шаг в соответствии с этой скоростью (а затем повторяете), но в импульсе Нестерова вы сначала делаете шаг в направлении скорости, а затем делаете поправку к вектору скорости на основе на новом месте (затем повторите).

т.е. Классический импульс:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) )
W(t+1) = W(t) + vW(t+1)

В то время как импульс Нестеров заключается в следующем:

vW(t+1) = momentum.*Vw(t) - scaling .* gradient_F( W(t) + momentum.*vW(t) )
W(t+1) = W(t) + vW(t+1)

На самом деле, это имеет огромное значение на практике ...

Arech
источник
5

Добавлено: Стэнфордский курс по нейронным сетям, cs231n , дает еще одну форму шагов:

v = mu * v_prev - learning_rate * gradient(x)   # GD + momentum
v_nesterov = v + mu * (v - v_prev)              # keep going, extrapolate
x += v_nesterov

Здесь vскорость ака шаг ака состояние и muявляется фактором импульса, обычно 0,9 или около того. ( v, xИ learning_rateможет быть очень длинные векторы, с NumPy, код тот же.)

vв первой строке - градиентный спуск с импульсом; v_nesterovэкстраполирует, продолжает идти. Например, с mu = 0,9,

v_prev  v   --> v_nesterov
---------------
 0  10  -->  19
10   0  -->  -9
10  10  -->  10
10  20  -->  29

Следующее описание имеет 3 термина:
один термин - простой градиентный спуск (GD),
1 + 2 - GD + импульс,
1 + 2 + 3 - Нестеров Г.Д.

Нестеров Г.Д. обычно описывают как шаги переменного импульса и шаги градиента :xtytytxt+1

yt=xt+m(xtxt1) - импульс, предиктор - градиент
xt+1=yt+h g(yt)

где - отрицательный градиент, а - размер шага, или скорость обучения.gtf(yt)h

Объедините эти два уравнения в одно только в , в точках, в которых оцениваются градиенты, вставив второе уравнение в первое, и переставьте термины:yt

yt+1=yt
+ h gt - градиент - импульс шага - градиент импульса
+ m (ytyt1)
+ m h (gtgt1)

Последний член - это разница между БД с простым импульсом и БД с импульсом Нестерова.


Можно использовать отдельные термины импульса, скажем, и : - шаговый импульс - градиент импульсаmmgrad
+ m (ytyt1)
+ mgrad h (gtgt1)

Тогда дает простой импульс, Nesterov. усиливает шум (градиенты могут быть очень шумными), - фильтр сглаживания IIR.m g r a d = m m g r a d > 0 m g r a d- .1mgrad=0mgrad=m
mgrad>0
mgrad.1

Кстати, импульс и размер шага могут изменяться со временем, и , или для каждого компонента (ada * координатное снижение), или для обоих - больше методов, чем в тестовых примерах.ч тmtht


График сравнения простого импульса с импульсом Нестерова в простом двумерном тестовом примере :
(x/[cond,1]100)+ripple×sin(πx)

введите описание изображения здесь

Денис
источник