上一期我们讲到了批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD), 为了加快训练速度我们从GBD引入了SGD, 但是使用SGD之后又遇到了新的问题, 导致了梯度的方向来回震荡, 如图:
那如何尽量少走弯路, 减少梯度的来回震荡呢?
经过业界大牛们不懈的研究提出了很多改进的方法, 下面看一看比较流行的几种吧
Momentum
Momentum的改进非常简单,参数的更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度⽅向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了了加速收敛和减小震荡的效果
如果原来SGD的梯度下降是:
Momentum带入动量后:
引⼊入一个超参数β 衰减速率, 一般常用0.9效果最好
加入动量后梯度的变化, 震荡已经小了很多:
Adagrad
SGD、Momentum都是以相同的学习率去更新θ的各个分量, 但是在深度学习模型中往往涉及大量的参数, 不同参数的更新频率又有所区别.
对于更新不频繁的参数,我们希望单次步长更大,多学习一些知识;对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多, 这时候就出现了Adagrad了
步骤: Adagrad的梯度变化, 针对梯度取平方
α 学习率
ε 保证分母不为0的小常数, 如 1e-8
对梯度取平方为什么会有效果呢?我们看下图:
横轴代表参数θ1, 纵轴代表参数θ2
横轴θ1因为抖动小,所以dθ1的值很小,g1的值很小,最终与α相乘的值就会很大,θ1抖动变动大,在横轴就会前进的更快
纵轴θ2因为抖动大,所以dθ2的值很大,g2的值很大,最终与α相乘的值就会很小,θ2抖动变小,纵向的变化相对平缓
RMSprop
RMSprop基本上就是在Adagrad基础上再加个动量了, 兼顾梯度动量和不同参数的步长
α 学习率
β 衰减速率
ε 保证分母不为0的小常数, 如 1e-8
Adam
Momentum,RMSprop是很长时间来最经得住考验的优化算法,适合用于不同的深度学习结构。
这时候又有牛人脑洞大开了,何不将这俩方法结合到一起呢?
对的你没看错Adam就是前面Momentum+RMSprop的集合体, 而且结合以后效果真的更好了!
β1 一阶衰减速率 0.9
β2 二阶衰减速率 0.999
α 学习率 0.001
ε 保证分母不为0的小常数 1e-8
最后我们看一下使用MNIST对几种梯度下降的评测效果, Adam确实拟合的效率更快, 这也就是为什么现在深度学习常用Adam作为优化器的原因吧
(部分图片来源于网络, 侵删)
关注公众号
网友评论