深度学习(8):Momentum RMSprop Adam 学习率衰减
指数加权平均
对于一个序列a[1],a[2]…a[3]
我们定义一个数组v[], 其中
v[0]=0
v[i]= beta*v[i-1] + (1-beta)*a[i]
这个v就叫做a的指数加权平均值
可以直观的理解为v[i]代表着a[i]之前的1/(1-beta)组数据的平均值,例如beta为0.9时,v[n]近似代表着v[n-9]-v[n]的平均值
然而我们可以发现,由于v[0]=0,导致在计算初期,我们的平均值是不准确的,例如v[1]和a[1]差了(1-beta)倍。
因此我们想到对其进行偏差修正:
v_correct[i] = v[i]/(1-betai)
可以看到,初始时1/(1-betai)起到修正效果。当i逐渐增大时,滑动平均值已经趋于准确,而此时的1/(1-betai)也恰好接近于1。
Momentum梯度下降法
对于简单的梯度下降法我们如下更新参数:
w = w - dw*learning_rate
在Momentum梯度下降法中我们令vdw代表dw的指数加权平均值:
w = w - vdw*learning_rate
这样做的好处是:对于简单的梯度下降法,在训练参数时可能出现这样的情况:
在训练的过程中参数变化会产生抖动,在某一维上反复横跳。
而采用指数加权平均值的方式,可以中和抖动,进而提升
收敛速度(如下图红线)
RMSprop
还是观察上面的图片,对于简单的梯度下降法,我们出现抖动的原因是:对于某一个维度,它的导数值过分的大导致梯度下降在该维度产生了不必要的位移,在下一次迭代中又要返回。
因此我们想到,如果某一维的偏导数过大,则缩小该维度的更新速度。
对于每一个w,构造其偏导数平方dw2的指数加权移动平均值sdw。按照下列规则更新参数。
w = w - dw*learning_rate/sqrt(sdw)
如果某一维的偏导数过大,则其滑动平均值sdw也会很大,这样1/sqrt(sdw)就会缩小其更新速度,从而避免了反复折返,提升了模型的收敛速度。
Adam优化算法
Adam是以上两种算法的结合,继承了两方面的优点
更新参数规则如下:
w = w - vdw*learning_rate/sqrt(sdw)
学习率衰减
在模型训练初期,我们希望学习率稍微大一点以提升收敛速度。而训练一段时间后,我们的模型会在最低点左右徘徊,因此此时需要小一点的学习率以保证我们能够接近最低点。面对这种要求,产生了学习率衰减。
常见公式有:
learning_rate=1/(1+decay_rate*epoch_num)
这里的decay_rate是一个超参数,能够控制衰减速率,epoch_num代表完整训练所有数据集X的轮数。
learning_rate=k/sqrt(epoch_num)
以及各种离散型衰减函数。
可以看到随着训练轮数的增加,这些方法的学习率都在减小。
局部最优解的讨论
在梯度下降训练过程中,我们最害怕陷入局部最优解的情况,导致我们的模型永远找不到最小的代价函数点
在本图中,有很多极小值点,但只有一个最小值点
然而面对高维输入的情况时,我们往往不会遇到极小值点,而是会遇到鞍点(很难遇到各个维度上凹凸一致的情况):
因此局部最优解往往不成问题。可怕的是局部平坦的情况(局部导数值一直很小,难以走出平坦区域)
往往利用Adam就可以轻松应对这种情况。