【Datawhale X 李宏毅苹果书 AI夏令营】Task02

74 阅读4分钟

Note: 除实践外内容均为参考苹果书内容

自适应学习率

有时候损失无法再下降也不是因为到达了局部最小值或鞍点,只是到达了特殊的“地势”,让梯度无法再下降:

image.png 参数在峡谷两端震荡,损失无法降下去,而梯度依旧很大,可以试着把学习率设小一点,这样可以慢慢的滑到山谷内,但降低后的学习率可能无法再前进了。最原始的梯度下降连简单的误差表面都做不好,因此需要更好的梯度下降的版本。在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。

AdaGrad(Adaptive Gradient)

根据梯度大小自动调整学习率,可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大

RMSProp(Root Mean Squared propagation)

同一个参数需要的学习率,也会随着时间而改变。在图 3.25 中的误差表面中,如果考虑横轴方向,绿色箭头处坡度比较陡峭,需要较小的学习率,但是走到红色箭头处,坡度变得平坦了起来,需要较大的学习率。因此同一个参数的同个方向,学习率也是需要动态调整的,于是就有了一个新的方法———RMSprop

image.png

AdaGrad 反应比较慢,而 RMSprop 会把 α 设小一点,让新的、刚看到的梯度的影响比较大

Adam

常用的优化的策略或者优化器(optimizer)是Adam(Adaptive moment estimation)。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了。

image.png


学习率调度

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

为什么需要预热

当我们使用 Adam、RMSprop 或 AdaGrad 时,需要计算 σ。而 σ 是一个统计的结果。从 σ 可知某一个方向的陡峭程度。统计的结果需要足够多的数据才精准,一开始统计结果 σ 是不精准的。一开始学习率比较小是用来探索收集一些有关误差表面的情报,先收集有关 σ 的统计数据,等 σ 统计得比较精准以后,再让学习率慢慢爬升。


分类

  • 在表示分分类的时候,用数字来表示会有基于数字的预设关系,不能很好地表示相互之间没有特定关系的类,所以需要引入独热向量来表示类
  • 带有softmax的分类:一个比较简单的解释是,y 是独热向量,所以其里面的值只有 0 跟 1,但是 yˆ 里面有任何值。既然目标只有 0 跟 1,但 yˆ 有任何值,可以先把它归一化到 0 到 1 之间,这样才能跟标签的计算相似度。

实践任务

遇到问题

在训练过程中的第四步

image.png

如果是Windows训练环境,需要把斜杠改为反斜杠的split(jupyter中需要用双反斜杠表示单反斜杠避免被理解为转义字符),否则会在第八步报错

34d5811db1ba1c395289af35c986547.png

可视化结果:

image.png

image.png