目录
3.Nesterov动量法(Nesterov accelerated gradient (NAG))
7. Adam(Adaptive Moment Estimation)
优化器的作用就是使用一种策略利用梯度下降法,不断的调整参数,来使loss越来越小,最终令预测尽可能接近真实值。
1. 随机梯度下降法 SGD
小批量
从训练集中随机抽取小批量的样本,计算他们的平均loss,来实行一次参数更新。使用小批量样本的平均loss代替全体样本的平均loss进行参数更新可以加快参数更新频率,加速收敛。小批量样本的平均loss是全体样本平均loss的无偏估计。
如果小批量样本中只有一个样本,那么称为随机梯度下降法,由于矩阵的向量化操作(数据量是2的指数运算效率更高)使得一次计算128个样本的loss比128次计算一个样本要高效的多,所以我们经常使用SGD来指代小批量梯度下降。
为什么小批量样本的平均loss是全体样本平均loss的无偏估计?
因为训练集中的同类样本是相关的,同类样本中不同个体的loss是相似的,所以随机抽取的一个样本loss可以作为该类所有样本平均loss的无偏估计
2. 基本动量法
梯度下降法的直观理解?
如果把梯度下降法想象成一个小球从山坡到山谷的过程,那么前面几篇文章的小球是这样移动的:从A点开始,计算当前A点的坡度,沿着坡度最大的方向走一段路,停下到B。在B点再看一看周围坡度最大的地方,沿着这个坡度方向走一段路,再停下。确切的来说,这并不像一个球,更像是一个正在下山的盲人,每走一步都要停下来,用拐杖来来探探四周的路,再走一步停下来,周而复始,直到走到山谷
为什么加入动量可以改善优化路线的曲折程度?
一个真正的小球要比上述过程聪明多了,从A点滚动到B点的时候,小球带有一定的初速度,在当前初速度下继续加速下降,小球会越滚越快,更快的奔向谷底。momentum 动量法就是模拟这一过程来加速神经网络的优化的。
为什么动量法可以加快网络的收敛?
动量法累积了历史梯度信息,使小球具有惯性:
(1)当累积的历史梯度与当前梯度方向一致时,加速收敛
(2)不一致时,减少优化时路径的曲折程度
基本动量法中梯度方向的确定是:历史梯度的累积和当前点的梯度方向的组合。
公式
代码:
mu = 0.9
v = mu * v
v = v - lr * dx
x = x + v
假设每个时刻的梯度dx总是0(相当于小球滚动到平地),则可得:,可见v是指数衰减,小球只要初速度足够大,就有机会冲出当前平地到达一个更低的山谷。
3.Nesterov动量法(Nesterov accelerated gradient (NAG))
转自:https://blog.csdn.net/tsyccnh/article/details/76673073
思想
计算梯度时,不是在当前位置,而是未来的位置上
Nesterov想到,在基本动量法中每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那么为什么不按照历史梯度先往前走一步获得“超前点”的梯度,然后将这个超前梯度和历史梯度进行合并?小球具有了超前意识,就变的更加聪明。
具体的方法就是:小球先按照历史梯度走一步(先暂时更新一下参数,以便得到新参数值点的梯度),然后根据超前点的梯度来修正当前点的梯度。
直观理解如下:
Nesterov动量法中梯度方向的确定是:历史梯度的累积和超前点的梯度方向的组合
小球在B点先根据历史梯度向前走一步到C点,计算C点的梯度(),然后利用C点的梯度修正当前点B的梯度()
公式
对于在B点的小球,假设待更新的参数是,则有:
......................................先向前走一步到“超前点”
.................计算当前点的梯度【;其中 】
................................................更新参数
↓ 推广公式
代表衰减率, 代表学习率, 代表参数向量(一组参数)
4. AdaGrad
Adagrad是解决不同参数应该使用不同的更新速率的问题。Adagrad自适应地为各个参数分配不同学习率的算法。
如何实现每个参数有不同的学习率?
将每个参数每次迭代的梯度的平方累加再开方,然后用基础习率除以这个数,实现每个参数学习率的动态更新。
公式
对于每个参数,在第t次迭代时的更新公式为:
其中, 代表在第次迭代时参数的梯度
简写成向量的形式:
可以 看出随着不断迭代,学习率会越来越小
为什么随着更新次数的增大,应该让学习率越来越小?
因为我们认为在学习率的最初阶段,我们是距离损失函数最优解很远的,随着更新的次数的增多,越来越接近最优解,学习速率也应随之变慢。
Adagrad优缺点
优点:
- 根据迭代次数和历史梯度,自动调整学习率
- 梯度较小的参数也能有较快的更新速率
缺点:
- 由公式可以看出,仍依赖于人工设置一个全局学习率,设置过大的话,会使正则过于敏感,对梯度的调节太大
- 中后期,分母上梯度平方的累加将会越来越大,使得训练提前结束
- 当前点梯度dx=0时,参数无法得到更新,所以无法冲过鞍点。
5. RMSProp
为了解决Adagrad学习率急剧下降的问题
将Adagrad中梯度的平方累加 ===》梯度的均方根(历史梯度的平方的平均数开根号),公式如下:
-----参数的梯度的均方差
使用的是指数加权平均,旨在消除梯度下降中的摆动(路线曲折?)。当某一维的导数比较大,则指数加权平均就大,该参数的学习率就小;反之。这样就保证了各维度的导数都在一个量级,进而减少了摆动,允许使用更大的学习率。
除了分母之外与Adagrad方法相同,克服了Adagrad学习率一直单调变小的问题,但是仍然无法冲出当前平地。
6. Adadelta
也是为了解决Adagrad学习率急剧下降的问题
首先也是将分母换成了均方根(root mean squared,RMS),参数更新的公式简写如下:
其次将学习率换成了,可以不需要提前设定学习率:
7. Adam(Adaptive Moment Estimation)
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一样存储了历史梯度的平方的指数衰减平均值(二阶,梯度的方差) ,也像 momentum一样保持了历史梯度的指数衰减平均值(一阶,梯度的均值)---也就是将RMSprop更新量中的当前梯度换成了动量发法计算出的历史梯度的累积。公式如下:
---二阶:cache的计算公式(梯度的均方根)
---一阶:v的计算公式(梯度的指数衰减平均值,与动量法中一致)
在初始化的时候初始化cache和v为0,但是会存在偏差。所以要进行偏差校正:
使两者在刚开始训练的时候变大,但是随着迭代次数t的增加, 和 趋近于0,所以偏差校正只在前期进行。
当dx为0的时候(小球滚动到平地),如同动量法,小球有可能凭借历史梯度的累积冲出平地。
8.AmsGrad
Adam、RMSProp、Adadelta方法可能存在不收敛的问题,因为这三种算法的有效学习率的分母是采用梯度的均方根,其值主要受最近的梯度历史信息的影响(由于衰减系数的存在,久远的历史梯度会逐渐遗忘),故其值波动较大。当它取值较小的时候会使有效学习率很大,使网络不能收敛。
改进方法就是使有效学习率不能增加:
cache = np.max(cache, (decay_rate*cache + (1-decay_rate)*(dx**2)))
所以让cache随着迭代次数的增加而变化时,一定不会减小,则有效学习率不会增加,保证了收敛
效果比较
几种算法在鞍点和等高线上的表现
鞍点:
等高线:
上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。
由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。
总结
动量 (一阶,梯度的均值) |
超前点的梯度 |
梯度的平方和开根号 (递增) |
梯度的均方根 (二阶,梯度的方差,主要受最近历史梯度的影响) |
动态学习率 | |
SGD | |||||
动量法 | √ | ||||
Neverov动量法 | √ | √ | |||
Adagrad | √ | ||||
RMSProp | √ | ||||
Adadelt | √ | √ | |||
Adam | √ | √ | |||
AmsGrad | √ | √(保证有效学习率不增) |