梯度下降的算法笔记
SGD
SGD是最传统的梯度下降方法.
我们设需要优化的参数是
设输入是
其中,
Momentum
Momentum这种方法引入了动量的概念,除了当前得到的梯度,算法还会考虑上一次的梯度.
其中,
由于动量的缘故,Momentum相比起SGD更加容易跳出局部最小值或者一些驻点.
Nesterov
Nesterov是对Momentum的一个修正.
Nesterov和Momentum的差别在于
我们把Momentum的式子变形,得到:
Momentum就相当于加上两个向量,一个是当前的梯度,另一个是动量.
而Nesterov则希望先加上动量,再计算梯度,然后混合动量和梯度.
这就相当于Nesterov做了两步事情,第一步是加上上一次的动量,第二步是Momentum.
所以,
第一个式子就是说,
下面这个图形象地描述了这两种算法的差别.
蓝色向量是Momentum方法得到的,短的那条是梯度,长的那条是动量.
棕色向量则是Nesterov的第一步,红色是Nesterov的第二步.绿色向量就是Nesterov一次运算的结果.
我们可以看到,Nesterov第一次的绿色向量,和第二次的棕色向量是同方向的.这就是因为,Nesterov的第一步是加上上一次的动量.
和Momentum对比,Nesterov的思想已经变了.Momentum的出发点是动量辅助梯度去进行更新,而Nesterov更加偏向动量为主,梯度为辅.
Adagrad
SGD还有一个严重的问题,就是学习率的设置.
学习率对梯度下降来说,往往是一个很敏感的参数.设得不好,可能不work.
而Adagrad,就是一个用来自适应地调整学习率的算法.
Adagrad的式子和SGD不同的是,学习率还除了一个东西.
我们不妨把这整块
我们会发现,随着训练的进行,
这符合我们以往的经验,刚开始时学习率大一点,之后学习率不断降低.
RMSprop
RMSprop是Adagrad的改进.
从式子上,RMSprop和Adagrad的差别在于
在这里,
那么,
Adam
Adam是结合Momentum的动量思想和RMSprop的均方根思想的一种算法.
而
参考资料
[1] http://blog.****.net/u012759136/article/details/52302426
[2] http://blog.****.net/bvl10101111/article/details/72616516