CS231n课程笔记6.1:优化迭代算法之SGD,Momentum,Netsterov Momentum,AdaGrad,RMSprop,Adam

CS231n简介

详见 CS231n课程笔记1:Introduction
注:斜体字用于注明作者自己的思考,正确性未经过验证,欢迎指教。

优化迭代算法

写在前面:Karpathy推荐Adam作为默认算法,如果full batch的话,在去除所有噪声的情况下尝试L-BFGS(一种二阶优化算法,详情请自行搜索)。关于优化算法的实现请参考CS231n作业笔记2.3:优化算法Momentum, RMSProp, AdamCS231n作业笔记1.4:随机梯度下降(SGD)


1. SGD (Simple Gradient Descent Update Stochastic gradient descent)

最简单原始的迭代算法,就是减去learning_rate*梯度值。
SGD
Stochastic的名字好像是对比于全训练集训练方法的,每次只使用训练集中的一小部分(batch),具体请参照Optimization: Stochastic Gradient Descent
这个算法具有的问题之一就是会根据梯度值的大小决定步长,所以如果各个维度的步长相差很大,就会不断震荡,而且收敛缓慢,如图所示。
jitter

2. Momentum动量法

如图所示,把更新迭代的问题考虑成为物理问题,模拟为使得小球收敛到谷底的问题。那么梯度值对应于小球在某一点所受到的力(加速度),参数每次更新的量对应于小球当时的速度,参数值对应于小球当时的高度(位置,能量)。注意这里力是不会直接影响高度的,而是通过更改速度,间接影响高度。上诉模拟方式,也是Momentum的由来。
Momentum1
优化算法如下:
Momentum
其中v对应于速度,dx对应于加速度,x则对应于高度。同时为了使得小球可以收敛于谷底,加入了能量损失机制,即每次在mu*v的基础上改变。mu的值通常是0.5,0.9,0.99。v被初始化为0.
回答SGD中的问题,Momentum通过对于速度的修改间接影响高度,所以具有延迟作用以及累加作用,有效的解决了震荡的问题。同时因为会累加小梯度的维度上的速度值,所以可以加快收敛速度。

3. Nesterov Momentum update

此算法是对Momentum的改进算法,不是在当前位置求梯度,而是每次都向前看一步,使用未来的梯度值。如上节所诉,对于Momentum算法,如果不考虑每次因为梯度值带来的v的变化,下一刻x会变为x+mu*v(这里就叫做向前看一步),这里的梯度值应该更加有助于收敛(被证明),如下图所示。
Nesterov1
原始公式如下图所示:
Netsterov2
注意到这里求得梯度值不再是当前位置的梯度值,所以和SGD以及Momentum这种原始模型的接口不兼容。通过对原公式进行形式转换,可以使得接口兼容。如下图所示:
Netsterov

4. AdaGrad

注意到上诉三种算法中的learning rate不变,从而每次更新的步长变化不大。但实际应用中,我们在开始的时候需要高学习率收敛到最优值附近,然后使用低学习率收敛到最优值(因为如果步长过大,参数会在最优点附近震荡而不收敛(此处的震荡无法被Momentum解决))这里就需要引入自适应的算法,可以在迭代过程中合理的减小学习率,使得收敛效果更好。
AdaGrad是第一个自适应算法,通过每次除以根号下之前所有梯度值的平方和,从而使得步长单调递减。同时因为cache的变化与每个维度上的值有关,所以此方法可以解决各个维度梯度值相差较大的问题。
AdaGrad
注意到在AdaGrad算法中,学习率是单调递减的,有的时候这种调整步长的方式过于贪婪了,即可能使得学习率过早的降低,最后停留在最优点较远的位置。RMSprop就是对于AdaGrad的改进版本。

5. RMSProp

简单的说,RMSProp对于AdaGrad的改进在于cache的更新方法。不同于不断的累加梯度的平方,RMSProp中引入了泄露机制,使得cache每次都损失一部分,从而使得步长不再是单调递减了。
RMSProp

6.Adam

Adam是Karpathy在课上推荐的默认迭代算法,可以理解为Momentum和RMSProp的融合,同时为了处理初始几次迭代中m和v过小的问题,引入了偏差纠正。
具体算法如下图所示。(下图PPT中的方程与原论文不符,正确方法见下文)其中beta1通常设为0.9,而beta2通常设为0.995。
Adam Wrong
上图中ppt中的方程与原论文不符,正确方法如下图,详见Adam: A Method for Stochastic Optimization。区别有两点:
1. bias correction的部分,得到的纠正后的m和v只对当前步更新负责,并不会传播到后续循环中,即不更新m和v。
2. t的更新时间点为循环开始,例如第一次循环的时候t=1。
Adam

7. 调整learning rate

learning rate(学习率)作为上诉所有算法的公有超参数,其大小直接影响模型的结果。如下图所示,合适的学习率既不能过高,又不能过低。
learning rate
而且在训练的不同阶段可能需要不同大小的学习率。所以除了采取自适应的优化算法之外,这里介绍一种显式的学习率递降的算法。本质上就是按照三种不同的方式,随着迭代次数的增加,减小学习率。详情如下图所示:
learning rate decay
其中的自变量t通常是迭代次数,也可以是iteration或者epoch数。

猜你喜欢

转载自blog.csdn.net/silent56_th/article/details/59680033
今日推荐