深度学习笔记3-优化函数
深度学习的优化算法有随机梯度下降法(SGD)、标准梯度下降法(BGD)、小批量梯度下降法(MBGD)、Momentum梯度优化(SGDM)、Adagrad、RMSprop、Adam等等算法。SGD、BGD、MBGD很好理解,且在感知机那一节也有简述,不再介绍了。以下重点介绍后四种:
-
Momentum梯度优化(SGDM)
Momentum梯度优化的表达式为:
v = m μ × v − L R × d x v = {m_\mu } \times v - LR \times dx v=mμ×v−LR×dx x + = v x + = v x+=v其中, v v v为速度, m μ m_\mu mμ为其系数, L R LR LR为学习速率, d x dx dx为参数的导数。与SGD相比,SGDM在更新参数 x x x时,会加入一个动量分量 m μ × v {m_\mu } \times v mμ×v。这样做的好处是参数的更新考虑了以前的梯度变化,并且离此次更新越近,权重越高。这就意味着下降方向由此前累积的下降方向和当前时刻的下降方向共同决定。因此,如果前后梯度方向一致时,能够加速学习;前后梯度方向不一致时,能够抑制震荡。这就像小球下斜坡时,利用SGD会匀速下降,但利用SGDM会加速下降;当小球到达谷底,利用SGD会在谷底来回震荡,但利用SGDM会快速收敛到最小值。
另外,在利用SGDM时,由于小球到达谷底会有一个动量,借着这个动量小球可能跳出此局部最小值,从而寻求全局最大值。 -
Adagrad
在以上梯度更新时,学习速率 L R LR LR都是个常数。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。这就需要自适应学习速率了,Adagrad就是基于这样的想法提出来的。Adagrad的表达式为:
c a c h e + = d x 2 cache + = dx^2 cache+=dx2 x + = − L R × d x ( c a c h e + e p s ) x + = - LR \times \frac{{dx}}{{(\sqrt {cache} + eps)}} x+=−LR×(cache+eps)dx此时实际上的学习率由 L R LR LR变成了 L R ( c a c h e + e p s ) \frac{{LR}}{{(\sqrt {cache} + eps)}} (cache+eps)LR。 e p s eps eps是一个小量,防止分母变零。 d x 2 dx^2 dx2是参数的导数的平方。当参数更新越频繁时, c a c h e cache cache就越大,学习率就会越小。因此,能够实现学习率的自动更改。如果这次梯度大,那么学习速率衰减的就快一些;如果这次梯度小,那么学习速率衰减的就慢一些。但它有个缺点,就是经过几轮训练后 L R LR LR变得很小,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。 -
RMSprop
由于Adagrad单调递减的学习率变化过于激进,可以引入一个衰减系数,让学习率每回合都衰减一定比例,类似于Momentum中的做法。这就是RMSprop函数,以下为它的表达式:
c a c h e = d e c a y × c a c h e + ( 1 − d e c a y ) × d x 2 cache = decay \times cache + (1 - decay) \times d{x^2} cache=decay×cache+(1−decay)×dx2 x + = − L R × d x ( c a c h e + e p s ) x + = - LR \times \frac{{dx}}{{(\sqrt {cache} + eps)}} x+=−LR×(cache+eps)dx新引入的decay即为衰减系数。相比于Adagrad,这种方法很好的解决了深度学习中过早结束的问题。但它又会引入新的超参数 d e c a y decay decay。 -
Adam
在以上优化函数中,SGDM能自适应调整梯度 d x dx dx,Adagrad和RMSprop能够自适应调节学习率。Adam则集合了这两种思想,既能调节梯度,又能调节学习率。其表达式为:
m = b e t a 1 × m + ( 1 − b e t a 1 ) × d x m = beta1 \times m + (1 - beta1) \times dx m=beta1×m+(1−beta1)×dx v = b e t a 2 × v + ( 1 − b e t a 2 ) × d x 2 v = beta2 \times v + (1 - beta2) \times d{x^2} v=beta2×v+(1−beta2)×dx2 x + = − L R × m ( v + e p s ) x + = - LR \times \frac{m}{{(\sqrt v + eps)}} x+=−LR×(v+eps)mAdam函数在很多任务中都取得了很好的效果,训练时推荐使用Adam。但Adam也有缺点,这篇文章《Adam那么棒,为什么还对SGD念念不忘》详细说明了它的缺点,并进一步给出了优化算法的选择策略,推荐有兴趣的阅读下。
tensorflow中已经集成了GradientDescentOptimizer、AdagradOptimizer、AdagradDAOptimizer、MomentumOptimizer、AdamOptimizer、FtrlOptimizer、RMSPropOptimizer;相应的pytorch中也有很全的优化函数库。这些都可以很方便地进行调用
参考:
Adam那么棒,为什么还对SGD念念不忘
深度学习各种优化函数详解
贺完结!CS231n官方笔记授权翻译总集篇发布