动量SGD
动量SGD的思路很容易理解:我们可以想象一个小球从山坡上滑下来,如果速度很慢,它就很容易卡在局部最低点处。但是如果我们加大小球的动量,小球冲出局部最低点的概率将会变大。
因此若我们使用的SGD学习速率很小,就无法冲出局部最低点;若学习速率足够大,就很有可能冲出去,进入下一个下坡轨道。
为了再局部最低点或鞍部保持向前冲的势头,在梯度下降的每一步都移动小球,更新参数w时不仅要考虑当前的加速度(梯度),也要考虑上一次参数更新(当前的速度,来自之前的加速度)
在Keras的SGD优化器中,可以通过momentum选项设定动量:
optimizer = keras.optimizer.SGD(lr=0.01, # 在优化器中设定学习速率
momentum=0.9) # 在优化器中设定动量大小
上坡时减少动量——NAG
延续动量的思路,小球在冲过局部最低点后,顺着斜坡达到坡顶,但是由于速度过快,在寻找下一个最低点的时候会盲目选择方向。因此,更好的办法是在谷底加速之后,上坡之时重新放慢速度。涅斯捷罗夫梯度加速(Nesterov Accelerated Gradient,NAG)的思路就是在下坡时增加动量,但是在越过局部最低点后的上坡过程中,又减去动量项。
在Keras的SGD优化器中,可以通过nesterov选项设定涅斯捷罗夫梯度加速:
optimizer = keras.optimizer.SGD(lr=0.01, # 在优化器中设定学习速率
momentum=0.9, # 在优化器中设定动量大小
nesterov=True) # 设定涅斯捷罗夫梯度加速
各参数的不同学习速率——Adagrad
Adagrad也是一种基于梯度的优化算法,叫做自适应梯度(adaptive gradient),即不同参数拥有不同的学习速率。它可以根据前几轮迭代时的历史梯度值调整学习速率。
对于数据集中的稀疏特征,学习速率较快,步幅较大。但是对于非稀疏特征,则使用较小的速率更新。因此这个算法适合处理含有稀疏特征的数据集。比如,在文本处理的词向量(word embedding)训练过程中,对频繁出现的词汇赋予较小发更新,对于很少出现的单词则赋予较大的更新。
Adagrad有一个类似的变体叫AdaDelta,也是在每次迭代时利用梯度值随时构建参数更新值。
加权平均值计算二阶动量——RMSProp
均方根前向梯度下降(Root Mean Square Propogation,RMSProp)解决的是Adagrad中学习速率有时会急剧下降的问题。RMSProp抑制衰减的方法不同于普通的动量,它采用了滑动窗口加权平均值计算二阶动量。同时它也有保存Adagrad中每个参数自适应不同的学习速率的优点。
keras.optimizers.RMSprop() # RMSProp优化器
多重优化思路的集大成者——Adam
Adam全称为:Adaptive Moment Estimation,相当于Adaptive+Momentum。它集成了SGD的一阶动量和RMSProp的二阶动量。而且也是一种不同参数自适应不同学习速率的方法。区别在于:其计算历史梯度衰减的方式类似动量,而不是使用平方衰减。