为什么要自适应学习率?
学习率固定不好吗?自适应学习率的好处有哪些?首先,在模型训练时参数的梯度大时,往往需要小的学习率,不断改变,以免偏离了轨迹,但梯度较小时,需要较大的学习率,更好的摆脱平坦的位置。固定的学习率往往不能适用于较多实际场景。
如图,学习率较高时,在谷壁震荡,学习率较低时,在平坦地带效果不佳
自适应学习率方法有哪些?
AdaGrad
AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学 习率就放大。参数相关的一个常见的类型是算梯度的均方根(root mean square),在算均方根的时候,每一个梯度都有同等的重要性
RMSProp
计算 θ i 1 的方法跟 AdaGrad 算均方根不一样, 在算均方根的时候,每一个梯度都有同等的重要性,但在 RMSprop 里面,可以自己调整现在 的这个梯度的重要性。
如果使用 RMSprop,就可以动态调整 σ i t 这一项。
Adam
最常用的优化的策略或者优化器(optimizer)是Adam(Adaptive moment estimation)[7]。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自 适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需 要人为决定,但是往往用 PyTorch 预设的参数就足够好了。
学习率调度
在梯度平坦区域,如果长时间梯度较小,很可能导致梯度爆炸的问题,比如当使用AdaGrad时
长时间在BC段的梯度趋近于0,导致均方根较小,出现了梯度爆炸的问题,而又因为在梯度爆炸后,梯度的上升,又会趋近于平稳,如何解决这个问题呢?
第一种:学习率下降
在快到达终点时,主动降低学习率,使其平稳接近终点
第二种:预热
预热的方法 是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络 里 面是有预热的,在残差网络里面,学习率先设置成 0.01,再设置成 0.1,并且其论文还特别说 明,一开始用 0.1 反而训练不好。除了残差网络,BERT 和 Transformer 的训练也都使用了预 热。
Q:为什么需要预热?
A:当我们使用 Adam、RMSprop 或 AdaGrad 时,需要计算 σ。而 σ 是一个统计的结 果。从 σ 可知某一个方向的陡峭程度。统计的结果需要足够多的数据才精准,一开始 统计结果 σ 是不精准的。一开始学习率比较小是用来探索收集一些有关误差表面的情 报,先收集有关 σ 的统计数据,等 σ 统计得比较精准以后,再让学习率慢慢爬升。
优化总结(考察动量)
分类问题
独热向量
为了解决标签之间的距离关系问题,设计了独立向量,使得标签之间是独立的。分类问题常常需要考虑独热向量。
分类函数
第一种:sigmoid
用于二分类
第二种:softmax
多用于多分类,当然也可以用于二分类
分类损失
分类问题较多采用第二种方法即最小化交叉熵,采用第一种方法很多时候会因为梯度较小而导致卡在平坦位置,而训练失败