Добавлено: Стэнфордский курс по нейронным сетям,
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 - Нестеров Г.Д.
Нестеров Г.Д. обычно описывают как шаги переменного импульса и шаги градиента :xt→ytyt→xt+1
yt=xt+m(xt−xt−1) - импульс, предиктор - градиент
xt+1=yt+h g(yt)
где - отрицательный градиент, а - размер шага, или скорость обучения.gt≡−∇f(yt)h
Объедините эти два уравнения в одно только в , в точках, в которых оцениваются градиенты, вставив второе уравнение в первое, и переставьте термины:yt
yt+1=yt
+ h gt - градиент - импульс шага - градиент импульса
+ m (yt−yt−1)
+ m h (gt−gt−1)
Последний член - это разница между БД с простым импульсом и БД с импульсом Нестерова.
Можно использовать отдельные термины импульса, скажем, и : - шаговый импульс - градиент импульсаmmgrad
+ m (yt−yt−1)
+ mgrad h (gt−gt−1)
Тогда дает простой импульс, 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)