Datawhale X 李宏毅苹果书AI夏令营 | 自适应学习率——学习笔记

138 阅读1分钟

修订历史:

  • 2024.08.31 初稿

学习笔记

《深度学习详解》/王棋等/中国工信出版社/新书

〇 我们现在训练一个网络,训练到现在参数在临界点附近,再根据特征值的正负号判断该临界点是鞍点还是局部最小值。(P52)

在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。(P53)

如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。

〇 AdaGrad(Adaptive Gradient)

AdaGrad 是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。

  1. 初始化参数 σ0i=(g0i)2=g0i\sigma^i_0 = \sqrt{(g^i_0)^2}=|g^i_0|;
  2. 更新过程
σt+1iθti1t+1Σi=0t(gti)2\sigma^i_{t+1} ← \theta^i_t - \sqrt{\frac{1}{t+1}\Sigma^t_{i=0}(g^i_t)^2}

〇 RMSProp(Root Mean Squared propagation)

image.png

如上图所示的误差表面中,如果考虑横轴方向,绿色箭头处坡度比较陡峭,需要较小的学习率,但是走到红色箭头处,坡度变得平坦了起来,需要较大的学习率。因此同一个参数的同个方向,学习率也是需要动态调整的,于是就有了RMSProp。

  1. 初始化参数 σ0i=(g0i)2=g0i\sigma^i_0 = \sqrt{(g^i_0)^2}=|g^i_0|;
  2. 更新过程
σt+1iθtiησtigti,σti=α(σt1i)2+(1α)(gti)2\sigma^i_{t+1} ← \theta^i_t - \frac{\eta}{\sigma_t^i}g_t^i, \sigma^i_t=\sqrt{\alpha(\sigma^i_{t-1})^2+(1-\alpha)(g^i_t)^2}

其中 0<α<10<\alpha<1

〇 Adam(Adaptive moment estimation) Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。它是最常用的优化的策略或者优化器(optimizer)。

image.png

〇 学习率调度(P57)

学习率下降

image.png

一开始优化的时候很顺利,在左转的时候,有 AdaGrad 以后,可以再继续走下去,走到非常接近终点的位置。走到 BC 段时,因为横轴方向的梯度很小,所以学习率会自动变大,步伐就可以变大,从而不断前进。接下来的问题走到上图中红圈的地方,快走到终点的时候突然“爆炸”了。 通过学习率调度(learning rate scheduling)可以解决这个问题。之前的学习率调整方法中 η\eta 是一个固定的值,而在学习率调度中 η\eta 跟时间有关,如θt+1iθtiηtσtigti\theta^i_{t+1} ← \theta^i_t - \frac{\eta_t}{\sigma^i_t}g^i_t 所示。学习率调度中最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rateannealing)。

预热

除了学习率下降以外,还有另外一个经典的学习率调度的方式———预热。预热的方法是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络里面是有预热的,在残差网络里面,学习率先设置成 0.01,再设置成 0.1,并且其论文还特别说明,一开始用 0.1 反而训练不好。除了残差网络,BERT 和 Transformer 的训练也都使用了预热。

〇 总结

梯度下降最终公式

σt+1iθtiηtθtimti\sigma^i_{t+1} ← \theta^i_t - \frac{\eta_t}{\theta^i_t}m^i_t

其中 mtim^i_t 是动量。

这个版本里面有动量,其不是顺着某个时刻算出的梯度方向来更新参数,而是把过去所有算出梯度的方向做一个加权总和当作更新的方向。接下来的步伐大小为 mtiσti\frac{m^i_t}{\sigma^i_t} ,最后通过 ηt\eta_t 来实现学习率调度。