我们有了之前指数加权平均的基础,就可以快速理解目前较为常用的一些优化算法的原理。
01
—
动量梯度下降法
上一节我们讨论了指数加权平均,并了解了指数加权平均的实际意义。这将使我们能更好地理解动量梯度下降法。 先来回顾一下我们梯度下降的目的,我们需要使代价函数J 达到最小值,或者是局部的相对最小值,从而使深度学习产生的模型能够更好地拟合实际的数据。对于大多数情况,代价函数都不止一个参数,因为我们输入的特征feature (X )往往是多个的,我们需要满足多个feature (X )同时权重达到相对最优(调整每个X 的W 和b ,output = input*W+b ),并且神经网络大多不止一层,这就增加了更多的参数需要梯度下降调优。 我们通过了解两个参数的代价函数的梯度下降方式,从而帮助我们理解更高维的代价函数的调优。 图像中间的红点是代价函数的最低点,由于两个参数不同,往往画出全部图像会形成这样椭圆的等高线,而不是圆形的等高线,这就会导致向梯度方向移动一段距离,方向不会指向最低点(蓝色线),多次执行梯度下降,会形成下图这种情况。我们进行了多次迭代,但总是上下波动,向红点处移动的距离很小,这样就会大大降低梯度下降的速度,我们需要更多次的迭代才能使代价函数收敛到最小。 甚至如果选用的学习率过大,会直接摆动到更大的代价函数位置上(紫色线)。为了避免这种情况,就需要选用更小的学习率,这也会减慢梯度下降的速度。 现在总结一下我们需要解决的问题:在纵轴上,我们需要摆动得小一些,而在横轴上,我们希望移动得大一些,这样就会使梯度下降更有效,减少不必要的移动损耗。 于是由这个问题,我们就引出了动量梯度下降法(gradient descent with momentum ),我们先算出当前mini-batch 中的梯度dW ,db ,然后再迭代下式,α是设定的学习率,V dW ,V db 的初始值为0 : 也就是计算出了W 和b 的移动平均数,梯度下降路径变为了红色线,在抵达最小值的路上减少了摆动。 动量梯度下降的命名则是因为将其类比到了物理中的动量公式,β<1 ,可以看做摩擦力对速度的作用,摩擦力使本来运动速度降低,但是又有一个加速度在横向上,导致总体来说抵消掉了纵向的摆动速度,增加了横向的运动速度。 一般情况下β会设置为0.9 ,在动量梯度下降下,往往不会使用指数加权平均的偏差修正,因为梯度下降需要非常多次迭代,初始的偏差在第十多次迭代后影响就很小了,最终不会产生什么显著差异。 在一些论文中,往往会删去(1- β )项,这相当于dW ,db 变化了1/ (1- β)倍,实际性质没有变化,但需要调整学习率α的值。02
—
RMSprop(root mean square prop)
RMSprop 是另一种优化算法,目的也是使代价函数更快地到达最小值,为了方便理解,我们假设横轴为W ,纵轴为b 。在这个图中(蓝线),梯度下降法在b 轴移动较快,在W 轴移动较慢,说明在梯度db 的绝对值比较大。这里说是绝对值,是因为我们需要找的是最小点,要移动的方向是向比较小的值移动。根据基本的数学知识,如果函数是单调递增的,那么导数符号为正,反之导数符号为负,这里的基本数学问题就不再赘述。 我们希望在b 方向上的函数值变化减小,W 方向上的函数值增大。于是我们引入一个S ,不同于之前动量梯度下降法的v ,S 不直接作为变化量,而是作为分母,如以下公式所示: 当b 方向上的梯度较大时,S db 就会较大,从而 项较小,也就是纵轴上的更新较小;同理 W 方向上的梯度较小,S dW 较小, 项较大,也是就是横轴上的更新较大。从而使各方向上的更新一致,从而消除摆动,更快到达最小值(绿线)。 如果摆动幅度降低,我们还可以适当增加学习率α,从而更快达到最小值,又不会摆动到更偏离的位置。实际上我们不会在一个二维参数中优化学习率,而是参数更多,在这种情况下,我们的等高线(暂且类比地理的等高线)会更加复杂,而不是单纯为一个椭圆形。无论如何,消除摆动都会使我们更快到达最低点。 在实际中需要避免S 趋于0 的情况下出现,我们需要在分母中加一个很小的ε,防止S 趋于0 后产生的问题。一般来说ε=10^(-8) 是一个不错的选择。 花书中也有相对应的算法,红色字是在我们之前推导过程中所用的符号,对比就能看懂花书中算法执行过程。 计算梯度时,因为存在一个 mini-batch ,对于 m 个样本,每个样本的 feature 都有相应梯度,我们取其平均值来计算,这就是计算梯度算式的含义。03
—
Adam优化算法
Adam 优化算法是结合了动量梯度下降法和RMSprop 方法的一种优化算法。 首先我们设置初始值:V dW=0 ,S dW=0 ,V db=0 ,S db=0 。 接下来我们进行迭代,因为动量梯度下降法和RMSprop 都有β作为指数加权平均的衰减值,为了加以区分,我们将动量梯度下降部分设为β 1 ,RMSprop 部分设为β 2 。 首先我们计算动量梯度下降法的部分: 然后我们计算RMSprop 部分: 一般在使用Adam 时,需要计算偏差修正后的V 和S , 是修正后的V , 是修正后的S ,修正方法在指数加权平均中提到,在此就不再赘述: 最后进行参数的更新: 学习率α需要调试来找出合适的学习率,β 1 一般选用0.9 ,β 2 一般选用0.999 ,ε一般选用10^(-8) ,但ε的选用其实并不是那么重要,因为它并不会影响算法表现。一般在应用的时候,只需要调整学习率。 花书中也有相对应的算法,红色字是在我们之前推导过程中所用的符号,对比就能看懂花书中算法执行过程。04
—
算法对比以及pytorch实现
通过以下的可视化图片,我们可以明显看出RMSprop 和Adam 算法的性能较好,能够迅速收敛到一个较小值。图片来源:https://zhuanlan.zhihu.com/p/78622301
图片来源:https://imgur.com/a/Hqolp#NKsFHJb
Pytorch 的优化器放置在 torch.optim 包中,通过以下方式调用优化方法:opt_SGD = torch.optim.SGD(model.parameters(), lr=LR)opt_Momentum = torch.optim.SGD(model.parameters(), lr=LR, momentum=0.8)opt_RMSprop = torch.optim.RMSprop(model.parameters(), lr=LR, alpha=0.9)opt_Adam = torch.optim.Adam(model.parameters(), lr=LR, betas=(0.9, 0.99))
model是我们的深度学习模型。
迭代时,先进行对之前储存梯度清零,释放内存,再进行backward
,通过backword
收集到梯度后调用优化器进行参数更新:
optimizer.zero_grad()loss.backward()optimizer.step()
Reference
深度学习课程 --吴恩达
Deep learing --Ian Goodfellow,Yoshua bengio,Aaron Courville