梯度下降的算法笔记

梯度下降的算法笔记

SGD

SGD是最传统的梯度下降方法.
我们设需要优化的参数是θ,θt表示第t个时刻参数θ的值.
设输入是x,要优化的目标函数是f(x).

gtΔθt==θt1f(x,θt1)ηgt

其中,η 是全局学习率.


Momentum

Momentum这种方法引入了动量的概念,除了当前得到的梯度,算法还会考虑上一次的梯度.

mtΔθt==μmt1+gtηmt

其中,μ 是动量因子.

由于动量的缘故,Momentum相比起SGD更加容易跳出局部最小值或者一些驻点.


Nesterov

Nesterov是对Momentum的一个修正.

gtmtΔθt===θt1f(x,θt1ημmt1)μmt1+gtηmt

Nesterov和Momentum的差别在于gt的计算.Nesterov的这个计算又是什么意思呢?

我们把Momentum的式子变形,得到:

Δθt=ημmt1ηgt

Momentum就相当于加上两个向量,一个是当前的梯度,另一个是动量.

而Nesterov则希望先加上动量,再计算梯度,然后混合动量和梯度.
这就相当于Nesterov做了两步事情,第一步是加上上一次的动量,第二步是Momentum.

所以,θt1ημmt1就是参数加上了动量的意思.
第一个式子就是说,θ先加上动量,再得到梯度,再进行调整.

下面这个图形象地描述了这两种算法的差别.
梯度下降的算法笔记

蓝色向量是Momentum方法得到的,短的那条是梯度,长的那条是动量.
棕色向量则是Nesterov的第一步,红色是Nesterov的第二步.绿色向量就是Nesterov一次运算的结果.
我们可以看到,Nesterov第一次的绿色向量,和第二次的棕色向量是同方向的.这就是因为,Nesterov的第一步是加上上一次的动量.

和Momentum对比,Nesterov的思想已经变了.Momentum的出发点是动量辅助梯度去进行更新,而Nesterov更加偏向动量为主,梯度为辅.


Adagrad

SGD还有一个严重的问题,就是学习率的设置.
学习率对梯度下降来说,往往是一个很敏感的参数.设得不好,可能不work.
而Adagrad,就是一个用来自适应地调整学习率的算法.

ntΔθt==nt1+g2tηnt+ϵgt

Adagrad的式子和SGD不同的是,学习率还除了一个东西.
我们不妨把这整块ηnt+ϵ 看成是当前的学习率.

nt 实际上就是历次梯度的平方和.
我们会发现,随着训练的进行,nt 会不断变大,于是当前学习率就在不断减少.
这符合我们以往的经验,刚开始时学习率大一点,之后学习率不断降低.


RMSprop

RMSprop是Adagrad的改进.

ntΔθt==νnt1+(1ν)g2tηnt+ϵgt

从式子上,RMSprop和Adagrad的差别在于nt 的计算.
在这里,nt 不再是梯度的平方和,而是梯度平方的滑动平均值.
那么,nt+ϵ 从某种意义来说,就是梯度的均方根.


Adam

Adam是结合Momentum的动量思想和RMSprop的均方根思想的一种算法.

mtntmt^nt^Δθt=====μmt1+(1μ)gtνnt1+(1ν)g2tmt1μtnt1νtmt^nt^+ϵη

mtnt 在某种意义上是梯度gt 的一阶矩和二阶矩.
mt^nt^ 是对mtnt 的修正,可以看作是期望E(gt)E(g2t) 的无偏估计.


参考资料

[1] http://blog.****.net/u012759136/article/details/52302426
[2] http://blog.****.net/bvl10101111/article/details/72616516