当gradient太小的时候,大多是这种saddle point情况,而不是local minima。
如果出现了saddle point怎么办呢?
通常使用泰勒展开解决问题。将Loss Funciton在 θ ′ \bm{\theta '} θ′二阶展开:
L ( θ ) = L ( θ ′ ) + ( θ − θ ′ ) T g + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(\bm{\theta}) = L(\bm{\theta '}) + (\bm{\theta} - \bm{\theta '})^T \bm g + \frac{1}{2}(\bm{\theta} - \bm{\theta '})^T \bm H (\bm{\theta} - \bm{\theta '}) L(θ)=L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′)
其中 θ ′ \bm{\theta '} θ′表示某一组未知参数。上式为在 θ ′ \bm{\theta '} θ′处的展开。用于研究在 θ ′ \bm{\theta '} θ′附近的Loss Function曲线的形状。
g为梯度向量,因迭代中他已经非常小了,所以可以近似看作零向量,从而将等式右边第二项近似视为0。
上式中的 H \bm H H叫Hessian矩阵。他每个元素的值,就是L关于该角标对应权重的二阶导。
如: H [ 0 , 1 ] = ∂ 2 L ∂ w 0 ∂ w 1 \bm H[0, 1] = \frac{\partial ^2 \bm L}{\partial w_0 \partial w_1} H[0,1]=∂w0∂w1∂2L
L ( θ ) ≈ L ( θ ′ ) + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(\bm{\theta}) \approx L(\bm{\theta '}) + \frac{1}{2}(\bm{\theta} - \bm{\theta '})^T \bm H (\bm{\theta} - \bm{\theta '}) L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
如此便可通过上式最后一项的正负判断在 θ ′ \bm{\theta '} θ′附近,Loss Function是大于还是小于 θ ′ \bm{\theta '} θ′点的Loss值。
为了方便书写,令 v = ( θ − θ ′ ) \bm v = (\bm{\theta} - \bm{\theta '}) v=(θ−θ′)。
则 ( θ − θ ′ ) T H ( θ − θ ′ ) = v T H v (\bm{\theta} - \bm{\theta '})^T \bm H (\bm{\theta} - \bm{\theta '}) = \bm v ^T \bm H \bm v (θ−θ′)TH(θ−θ′)=vTHv
设 u \bm u u为 H \bm H H的特征向量、 λ \lambda λ为 H \bm H H的特征值。
则将 u \bm u u带入上式中的 v \bm v v可得
u T H u = λ ∣ ∣ u ∣ ∣ 2 \bm u ^T \bm H \bm u = \lambda ||\bm u||^2 uTHu=λ∣∣u∣∣2
其中 ∣ ∣ u ∣ ∣ 2 ||\bm u||^2 ∣∣u∣∣2肯定大于零,所以该式大小只与 λ \lambda λ有关
所以只需要计算在 θ ′ \bm{\theta'} θ′附近的hessian矩阵以及他的特征向量与特征值即可.
因为我们带入的 u \bm u u是带入到 v \bm v v中,且 v = ( θ − θ ′ ) \bm v = (\bm{\theta} - \bm{\theta '}) v=(θ−θ′)
所以: u = ( θ − θ ′ ) \bm u = (\bm{\theta} - \bm{\theta '}) u=(θ−θ′)
θ = u + θ ′ \bm{\theta} = \bm u + \bm{\theta '} θ=u+θ′
上式便是 θ \bm{\theta} θ的迭代方向, 且朝着这个方向迭代的结果与该特征向量对应的特征值相关, 若对应的特征值大于0则此方向Loss变大; 若对应的特征值小于0, 则此方向Loss变小, 这便是我们需要的方向.
无动量梯度下降法 | 有动量 |
---|---|
θ 1 = θ 0 − η g \bm {\theta ^1} = \bm{\theta ^0} - \eta \bm g θ1=θ0−ηg | 原参数: θ 0 \bm {\theta ^0} θ0 原movement: m 0 \bm {m^0} m0 先迭代movement: m 1 = λ m 0 − η g \bm{m^1} = \lambda \bm{m^0} - \eta \bm g m1=λm0−ηg 再迭代参数: θ 1 = θ 0 + m 1 \bm {\theta ^1} = \bm {\theta ^0} + \bm{m^1} θ1=θ0+m1 |
即momentum就是把过去所有的gradient按照一定权重相加。
有动量的好处:每次移动都带着此前的梯度方向,即使当前进入一个更新梯度为零的位置,但前几次的动量会让参数 θ \bm \theta θ继续迭代,但因为有 λ \lambda λ所以越久远梯度的影响会越小。
即给每一个参数不同的learning rate
有时候 loss不再下降不一定是说明到了local minima或者saddle point (统称critical point)还有可能是再local minima的两侧来回移动,并没有到达local minima,这时单纯修改learning rate是不够的。即使调小learning rate可以让参数的迭代不在两个山谷间震荡,但是当到达较平缓的区域时会因为learning rate太小而无法继续更新参数。
希望能够使得learning rate根据梯度gradient自动调整大小
仅一一个参数 θ i \theta _i θi举例:
θ i t + 1 = θ i t − η σ i t g i t \theta ^{t + 1} _i = \theta ^t _i - \frac {\eta}{\sigma ^t _i} g^t _i θit+1=θit−σitηgit
其中的 σ i t \sigma ^t _i σit对于每次迭代t不同,对于每一个参数的i也不同。 η σ i t \frac {\eta}{\sigma ^t _i} σitη就是parameter dependent leaning rate
以一个元素为例
第一次: θ i 1 = θ i 0 − η σ i 0 g i 0 \theta ^{1} _i = \theta ^0 _i - \frac {\eta}{\sigma ^0 _i} g^0 _i θi1=θi0−σi0ηgi0
其中 σ i 0 = ( g i 0 ) 2 = ∣ g i 0 ∣ \sigma _i ^0 = \sqrt{(g ^0 _i)^2} = |g ^0 _i| σi0=(gi0)2=∣gi0∣
第二次: θ i 2 = θ i 1 − η σ i 1 g i 1 \theta ^{2} _i = \theta ^1 _i - \frac {\eta}{\sigma ^1 _i} g^1 _i θi2=θi1−σi1ηgi1
其中 σ i 1 = 1 2 ∗ [ ( g i 0 ) 2 + ( g i 1 ) 2 ] \sigma _i ^1 = \sqrt{\frac 1 2 * [(g ^0 _i)^2 + (g ^1 _i)^2]} σi1=21∗[(gi0)2+(gi1)2]
第三次: θ i 3 = θ i 2 − η σ i 2 g i 2 \theta ^{3} _i = \theta ^2 _i - \frac {\eta}{\sigma ^2 _i} g^2 _i θi3=θi2−σi2ηgi2
其中 σ i 2 = 1 3 ∗ [ ( g i 0 ) 2 + ( g i 1 ) 2 + ( g i 2 ) 2 ] \sigma _i ^2 = \sqrt{\frac 1 3 * [(g ^0 _i)^2 + (g ^1 _i)^2 + (g ^2 _i)^2]} σi2=31∗[(gi0)2+(gi1)2+(gi2)2]
…
第t+1次: θ i t + 1 = θ i t − η σ i t g i t \theta ^{t+1} _i = \theta ^t _i - \frac {\eta}{\sigma ^t _i} g^t _i θit+1=θit−σitηgit
其中 σ i 2 = 1 t + 1 ∗ [ ( g i 0 ) 2 + ( g i 1 ) 2 + . . . + ( g i t ) 2 ] \sigma _i ^2 = \sqrt{\frac {1}{t+1} * [(g ^0 _i)^2 + (g ^1 _i)^2 + ... + (g ^t _i)^2]} σi2=t+11∗[(gi0)2+(gi1)2+...+(git)2]
= 1 t + 1 ∑ j = 0 j = t ( g i , j t ) 2 =\sqrt{\frac {1}{t+1} \sum ^{j=t} _{j=0} {(g ^t _{i,j}) ^2}} =t+11∑j=0j=t(gi,jt)2
即个t的 σ i t \sigma ^t _i σit,都是前面所有的gradient的各自平方求和取平均再开根号
这一招被用在adagrad中。
通过上述的方法,可以看出每一次迭代的学习率与 σ \sigma σ做商,来算出最终的学习率,这个分母的 σ \sigma σ的大小又是这次迭代前的每一次的gradient的综合。其中每个gradient的地位(权重)相等。若是此前的gradient都大的话(意味着此时在比较陡峭的位置),则对应学习率就会减小,如此便可减慢下坡速度防止一步走到山谷的另一边然后来回徘徊。反之,当每个gradient都小的时候(所处位置较为平缓)随着t的增大,求和的部分并没有明显的增大,则 σ \sigma σ减小,对应的最终学习率增大,如此便可让迭代在较为平缓的地区有更快的速度。
上述方法假设同一个参数的gradient的大小是固定差不多的值,但事实上不一定如此。
所以希望能有个即使对于同一个参数,同一个方向,learning rate也能动态调整。
(没有论文的一个方法)
迭代的核心公式同样是:
θ i t + 1 = θ i t − η σ i t g i t \theta ^{t+1} _i = \theta ^t _i - \frac {\eta}{\sigma ^t _i} g^t _i θit+1=θit−σitηgit
但是关于 σ i t \sigma ^t _i σit的计算方法则略有不同。
第一次: θ i 1 = θ i 0 − η σ i 0 g i 0 \theta ^{1} _i = \theta ^0 _i - \frac {\eta}{\sigma ^0 _i} g^0 _i θi1=θi0−σi0ηgi0
其中 σ i 0 = ( g i 0 ) 2 = ∣ g i 0 ∣ \sigma _i ^0 = \sqrt{(g ^0 _i)^2} = |g ^0 _i| σi0=(gi0)2=∣gi0∣
第一步的迭代与adagrad方法一样。
第二次: θ i 2 = θ i 1 − η σ i 1 g i 1 \theta ^{2} _i = \theta ^1 _i - \frac {\eta}{\sigma ^1 _i} g^1 _i θi2=θi1−σi1ηgi1
σ i 1 = α ( σ i 0 ) 2 + ( 1 − α ) ( g i 1 ) 2 \sigma ^1 _i = \sqrt{\alpha(\sigma^0_i)^2 + (1 - \alpha)(g ^1 _i)^2} σi1=α(σi0)2+(1−α)(gi1)2
在这里的 α \alpha α表示的是,现在可以自行决定,对于当前这个参数的、这一次迭代的gradient的权重 ( 1 − α ) (1 - \alpha) (1−α)是多少。
第三次: θ i 3 = θ i 2 − η σ i 2 g i 3 \theta ^{3} _i = \theta ^2 _i - \frac {\eta}{\sigma ^2 _i} g^3 _i θi3=θi2−σi2ηgi3
σ i 2 = α ( σ i 1 ) 2 + ( 1 − α ) ( g i 3 ) 2 \sigma ^2 _i = \sqrt{\alpha(\sigma^1_i)^2 + (1 - \alpha)(g ^3 _i)^2} σi2=α(σi1)2+(1−α)(gi3)2
与adagrad所用的root mean square(RMS)方法相比,则可以看出,RMS Prop方法,对于每次迭代的当前gradient有了更好的权重选择。例如, α \alpha α设置小一点则新的gradient权重更大,当接触到了比较陡的区域的时候就可以很快的使learning rate变小,进入平缓区域了之后也可以很快变大。
现在最常用一种optimizer(optimization策略)就是adam:RMS Prop + momentum:
θ i t + 1 = θ i t − η σ i t m i t \theta^{t+1} _i = \theta^t _i - \frac{\eta}{\sigma ^t _i}m^t_i θit+1=θit−σitηmit
如果只用RMS的话会怎么样呢?
如上图所示,在红圈内部为什么会出现这样突然的波动呢,是因为gradient向量中对纵轴的分量在经过前面的迭代后,随着公式中,t增大已经让对应 σ \sigma σ变得越来越小,相应的学习率也变得越来越大,导致后半段的迭代积累到一定程度会突然出现纵向的参数迭代。但是随着纵向增大,对应的学习率会降低,最后还会收敛回到正确路线上。
解决上图的情况的方法:
对RMS迭代参数的公式进行更进一步的改进:
θ i t + 1 = θ i t − η t σ i t g i t + 1 \theta ^{t+1} _i = \theta ^t _i - \frac{\eta^t}{\sigma^t _i}g^{t+1} _i θit+1=θit−σitηtgit+1
本来的RMS的 η \eta η是个固定的值,但learning rate scheduling将 η \eta η也视为一个随时间变化的参数。
对 η \eta η的迭代,最常见的方法是learning rate decay。即随着参数的update,让 η \eta η越来越小。
这样就让迭代的速度随着次数的增加而减慢,使得即使后期的纵轴方向的 σ \sigma σ太小也不至于出现严重的波动。
(训练bert的时候常用到,最初在residual network中提到,后来又用到transformer中)
让 η \eta η先增加在减少。他的变大的速度和变小的速度则是我们要自己设定的hyper parameter。
momentum | RMS root mean square |
---|---|
带着权重将gradient相加,将方向考虑在内 | 都进行平方操作,没有正负号的影响,不考虑方向, |
增加历史运动的惯性 | 调节运动的速度 |
所以在adam:RMS Prop + momentum中:
θ i t + 1 = θ i t − η σ i t m i t \theta^{t+1} _i = \theta^t _i - \frac{\eta}{\sigma ^t _i}m^t_i θit+1=θit−σitηmit
不会有动量和 σ \sigma σ抵消的情况。