第四节 类神经网络训练不起来怎么办

第四节 类神经网络训练不起来怎么办

1. saddle point(马鞍点)

当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]=w0w12L

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=λu2

其中 ∣ ∣ u ∣ ∣ 2 ||\bm u||^2 u2肯定大于零,所以该式大小只与 λ \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变小, 这便是我们需要的方向.

2. 批次(batch)与动量(momentum)

批次batch

  • 有平行计算的情况下:batch越大,不会影响更新速度,且整个epoch迭代速度会更快
  • batch越小,在test上的结果会越好,且每个batch迭代的波动越大。

动量momentum

无动量梯度下降法 有动量
θ 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 λ所以越久远梯度的影响会越小。

3. adaptive learning rate 适应性学习率

即给每一个参数不同的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 t \sigma ^t _i σit的计算方法

1. 计算gradient的root mean square

以一个元素为例

第一次: θ 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+11j=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也能动态调整。

2. RMS Prop

(没有论文的一个方法)

迭代的核心公式同样是:

θ 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的话会怎么样呢?

第四节 类神经网络训练不起来怎么办_第1张图片

如上图所示,在红圈内部为什么会出现这样突然的波动呢,是因为gradient向量中对纵轴的分量在经过前面的迭代后,随着公式中,t增大已经让对应 σ \sigma σ变得越来越小,相应的学习率也变得越来越大,导致后半段的迭代积累到一定程度会突然出现纵向的参数迭代。但是随着纵向增大,对应的学习率会降低,最后还会收敛回到正确路线上。

解决上图的情况的方法:

1. learning rate scheduling

对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 σ太小也不至于出现严重的波动。

2. warm up

(训练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 σ抵消的情况。

你可能感兴趣的:(机器学习)