优化器是为了优化网络参数而设置的各种参数更新算法,主要围绕损失函数的梯度而计算的。
SGD主要是按照梯度下降的斜率来决定参数的更新。
因为神经网络参数更新的目的就是找到使loss函数最小的地方,例如loss = w^2这种函数,你只要顺着梯度的下降方向调整你的参数就可以顺利找到x = 0这个最小值点。
而在寻找的过程中,loss的梯度函数为2w,当x<0时,grad算出来是负数,此时w = w - lr * grad就可以向正确的方向更新参数。lr(learning rate)就是学习速率,在其中的作用可以简单看做步幅,当lr较小时,就相当于步幅比较小,假设你此时的w初值在比较高的地方,想要下降到最低点就要走很多步,而反之如果你的lr比较大,你虽然前期下降的很快,可是当你快到底端的时候,尽管此时的梯度已经很小了,可你的步幅太大,总会跨过那个最低点,就会导致你收敛不到最佳值。
SGDM可以看做是SGD的进阶版。主要体现在它在SGD的基础上增加了一阶动量的影响。
这个一阶动量看上去很抽象,其实和物理上的动量有着相似的原理。下边引用台大教授李宏毅老师的解释:
在SGD中我们知道是为了寻找loss的最小值点,在SGD中我们举例的函数是w^2,这个loss函数只有一个极小值点,我们知道有些函数是有很多最小值点的,假设有如下图函数,我们的初值是在绿色球处,函数有两个最小值点,用红色点标记出。
梯度下降就可以直观的看做是绿色球往下滚的过程,当斜率较大时,相同的lr下绿球会滚得更远,或者说绿球一步会滚得很远。
在SGD下我们通过求每一次的梯度来获得下一次更新的参数,这就会遇到一个问题,那就是当你的lr设置比较小的时候,绿球可能滚不过两个红点之间的“峰”,就会导致收敛到一个不太完美的地方。而SGDM中加入了一阶动量这个概念,我们就可以想象绿球会因为前边的大下坡而积攒大量的动量,从而借机冲过那个“峰”到达下一个最小值点。
这就是SGDM的优势。
它是又增加了二阶动量,也就是一阶动量平方的累积和,公式如下图:
二阶动量会在前期有较大的步幅,但是当你一直处于一个快速的下降的时候就会逐渐将步幅降下来,防止冲的过度,单也优缺点,就是二阶动量会不断累积,可能在大下坡的时候累积的过大而导致收敛所需要的步数变多。给出代码:
同样为在SGD上面加入了二阶动量,但是与Adagrad不同的是二阶动量不会在下坡的时候疯狂累积,公式如下。
代码如下:
同时结合了SGDM的一阶动量和RMSProp的二阶动量,可以理解为集大成者。
下边给出代码:
在课程中老师将每种优化器放在了同一个神经网络中(3中的鸾尾花),借此比较每种算法的好使和最后的loss值收敛情况。在遇到不同的问题时选用不同的优化器可能会有不同的效果,所以谨慎选择。
下边给出对比代码