优化器

目录

1. 随机梯度下降法 SGD

2. 基本动量法

梯度下降法的直观理解?

为什么加入动量可以改善优化路线的曲折程度?

为什么动量法可以加快网络的收敛?

公式

3.Nesterov动量法(Nesterov accelerated gradient (NAG))

思想

公式

4. AdaGrad

如何实现每个参数有不同的学习率?

公式

Adagrad优缺点

5. RMSProp

6. Adadelta

7. Adam(Adaptive Moment Estimation)

8.AmsGrad

效果比较

总结


优化器的作用就是使用一种策略利用梯度下降法,不断的调整参数,来使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)不一致时,减少优化时路径的曲折程度

基本动量法中梯度方向的确定是:历史梯度的累积和当前点的梯度方向的组合。

è¿éåå¾çæè¿°

公式

v_t=\gamma \cdot v_{t-1}+\eta\cdot\nabla_{\theta}J(\theta)

\theta_{new}=\theta - v_t

代码:

mu = 0.9
v = mu * v
v = v - lr * dx
x = x + v

假设每个时刻的梯度dx总是0(相当于小球滚动到平地),则可得:v = mu ^n\cdot v_0,可见v是指数衰减,小球只要初速度足够大,就有机会冲出当前平地到达一个更低的山谷。

 

3.Nesterov动量法(Nesterov accelerated gradient (NAG))

转自:https://blog.csdn.net/tsyccnh/article/details/76673073

思想

计算梯度时,不是在当前位置,而是未来的位置上

Nesterov想到,在基本动量法中每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那么为什么不按照历史梯度先往前走一步获得“超前点”的梯度,然后将这个超前梯度和历史梯度进行合并?小球具有了超前意识,就变的更加聪明。

具体的方法就是:小球先按照历史梯度走一步(先暂时更新一下参数,以便得到新参数值点的梯度),然后根据超前点的梯度来修正当前点的梯度。

直观理解如下:

Nesterov动量法中梯度方向的确定是:历史梯度的累积和超前点的梯度方向的组合

è¿éåå¾çæè¿°

小球在B点先根据历史梯度向前走一步到C点,计算C点的梯度(\overrightarrow{CD}),然后利用C点的梯度修正当前点B的梯度(\overrightarrow{BC}

 

公式

对于在B点的小球,假设待更新的参数是\theta,则有:

\theta_{tmp}=\theta - \gamma\cdot v_{pre}......................................先向前走一步到“超前点”

v_B=\gamma \cdot v_{pre}+\eta\cdot\nabla_{\theta}J(\theta_{tmp}).................计算当前点的梯度【v_B=\gamma \cdot v_{pre}+v_C;其中v_C=\eta\cdot\nabla_{\theta}J(\theta_{tmp}) 】

\theta=\theta- v_B................................................更新参数\theta

↓ 推广公式

v_t=\gamma \cdot v_{t-1}+\eta\cdot\nabla_{\theta}J(\theta-\gamma\cdot v_{t-1})

\theta_{new}=\theta - v_t

\gamma 代表衰减率,\eta 代表学习率,\theta 代表参数向量(一组参数)

 

4. AdaGrad

Adagrad是解决不同参数应该使用不同的更新速率的问题。Adagrad自适应地为各个参数分配不同学习率的算法。

如何实现每个参数有不同的学习率?

将每个参数每次迭代的梯度的平方累加再开方,然后用基础习率除以这个数,实现每个参数学习率的动态更新。

公式

对于每个参数\theta_i,在第t次迭代时的更新公式为:

\theta_i^{t+1}=\theta_i^{t}-\frac{lr}{\sqrt{\sum_{j=0}^{t}(g^j)^2}}\cdot g^t

其中,g^j=\nabla_{\theta_i^j}J(\theta) 代表在第j次迭代时参数\theta_i的梯度

简写成向量的形式:

\theta^{t+1}=\theta^{t}-\frac{lr}{\sqrt{\sum_{j=0}^{t}(g^j)^2}}\cdot g^t

可以 看出随着不断迭代,学习率会越来越小

为什么随着更新次数的增大,应该让学习率越来越小?

因为我们认为在学习率的最初阶段,我们是距离损失函数最优解很远的,随着更新的次数的增多,越来越接近最优解,学习速率也应随之变慢。

Adagrad优缺点

优点:

  • 根据迭代次数和历史梯度,自动调整学习率
  • 梯度较小的参数也能有较快的更新速率

缺点:

  • 由公式可以看出,仍依赖于人工设置一个全局学习率\ ETA,设置过大的话,会使正则过于敏感,对梯度的调节太大
  • 中后期,分母上梯度平方的累加将会越来越大,使得训练提前结束 梯度\ TO0
  • 当前点梯度dx=0时,参数无法得到更新,所以无法冲过鞍点

 

5. RMSProp

为了解决Adagrad学习率急剧下降的问题

将Adagrad中梯度的平方累加 ===》梯度的均方根(历史梯度的平方的平均数开根号),公式如下:

E(g^2)_t=\gamma \cdot E(g^2)_{t-1}+(1-\gamma)\cdot g_t^2    -----参数的梯度的均方差

\theta^{t+1}=\theta^{t}-\frac{lr}{\sqrt{{E(g^2)_t}}} \cdot g^t

使用的是指数加权平均,旨在消除梯度下降中的摆动(路线曲折?)。当某一维的导数比较大,则指数加权平均就大,该参数的学习率就小;反之。这样就保证了各维度的导数都在一个量级,进而减少了摆动,允许使用更大的学习率。

除了分母之外与Adagrad方法相同,克服了Adagrad学习率一直单调变小的问题,但是仍然无法冲出当前平地

 

6. Adadelta

也是为了解决Adagrad学习率急剧下降的问题

首先也是将分母换成了均方根(root mean squared,RMS),参数更新的公式简写如下:

\theta^{t+1}=\theta^{t}-\frac{lr}{RMS(g)_t} \cdot g^t

其次将学习率换成了RMS(\Delta \theta),可以不需要提前设定学习率:

\theta^{t+1}=\theta^{t}-\frac{RMS(\Delta \theta)_{t-1}}{RMS(g)_t} \cdot g^t

 

7. Adam(Adaptive Moment Estimation)

这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一样存储了历史梯度的平方指数衰减平均值(二阶,梯度的方差) ,也像 momentum一样保持了历史梯度的指数衰减平均值(一阶,梯度的均值---也就是将RMSprop更新量中的当前梯度g^t换成了动量发法计算出的历史梯度的累积。公式如下:

E(g^2)_t=\gamma \cdot E(g^2)_{t-1}+(1-\gamma)\cdot g_t^2   ---二阶:cache的计算公式(梯度的均方根)

E(g)_t=\beta \cdot E(g)_{t-1}+(1-\beta)\cdot g_t      ---一阶:v的计算公式(梯度的指数衰减平均值,与动量法中一致)

\theta^{t+1}=\theta^{t}-\frac{lr}{\sqrt{{E(g^2)_t}}} \cdot E(g)_t

在初始化的时候初始化cache和v为0,但是会存在偏差。所以要进行偏差校正:

E(g^2)_t= \frac{E(g^2)_t}{1-\gamma ^t}

E(g)_t= \frac{E(g)_t}{1-\beta ^t}

使两者在刚开始训练的时候变大,但是随着迭代次数t的增加,\gamma^t 和 \beta^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     (保证有效学习率不增)  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章