3.3 自适应学习率
1. 遇到的问题:损失不再下降的时候,梯度并没有真的变得很小。随着迭代次数增多,虽然损失不再下降,但是梯度的范数并没有真的变小((图 3.18-19))。
2. 解决方法:在梯度下降里面,所有的参数都是同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率小一点。
3.3.1 AdaGrad(Adaptive Gradient)
1. 典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。
2. 调整大概描述如下(图 3.24):有两个参数:θ1 和 θ2。θ1 坡度小,θ2 坡度大。因为 θ1 坡度小,按照公式(下)以及前面的概念,θi1 这个参数上面算出来的梯度值都比较小,所以算出来的 σit 就小,σit 小学习率就大。反过来,θ12坡度大,所以计算出的梯度都比较大,σit 就比较大,在更新的时候,步伐(参数更新的量)就比较小。因此有了 σit 这一项以后,就可以随着梯度的不同,每一个参数的梯度的不同,来自动调整学习率的大小。
3.3.2 RMSProp
同一个参数需要的学习率,也会随着时间而改变。因此同一个参数的同个方向,学习率也是需要动态调整的,引入了RMSprop(Root Mean Squared propagation)。
3.3.3 Adam
最常用的优化的策略或者优化器(optimizer)是Adam(Adaptive moment estimation)[7]。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面预制 Adam 优化器,有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了。
3.4 学习率调整(learning rate scheduling)
1. 之前的方法中 η 是一个固定的值,而在学习率调度中 η 跟时间有关。学习率调度中最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rateannealing)。随着参数的不断更新,让 η 越来越小。
2. 另外一个经典的学习率调度的方式是预热。预热的方法是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络使用了预热的,在残差网络里面,学习率先设置成 0.01,再设置成 0.1,并且其论文还特别说明,一开始用 0.1 反而训练不好。除了残差网络,BERT 和 Transformer 的训练也都使用了预热。
3. 为什么需要预热?当我们使用 Adam、RMSprop 或 AdaGrad 时,需要计算 σ。而 σ 是一个统计的结果。从 σ 可知某一个方向的陡峭程度。统计的结果需要足够多的数据才精准,一开始统计结果 σ 是不精准的。一开始学习率比较小是用来探索收集一些有关误差表面的情报,先收集有关 σ 的统计数据,等 σ 统计得比较精准以后,再让学习率慢慢爬升。
3.5 优化总结
最新版本公式见下:
这个版本的动量不是顺着某个时刻算出的梯度方向来更新参数,而是把过去所有算出梯度的方向做一个加权总和当作更新的方向。接下来的步伐大小为 m/σ。最后通过 η来实现学习率调度。这个是目前优化的完整的版本。
注意:m和 σ在使用过去所有梯度的方式是不一样的,动量是直接把所有的梯度都加起来,所以它考虑方向,考虑梯度的正负。但是均方根不考虑梯度的方向,只考虑梯度的大小,计算 σ的时候,都要把梯度取一个平方项,把平方的结果加起来,所以只考虑梯度的大小,所以动量跟 σ计算出来的结果并不会互相抵消。
3.6 分类
3.6.1 分类与回归的关系
举例:根据一个人的身高跟体重,预测他的年级,一年级、二年级还是三年级。一年级跟二年级关系比较近,一年级跟三年级关系比较远。用数字来表示类会预设 1 和 2 有比较近的关系,1 和 3 有比较远的关系。但假设三个类本身没有特定的关系,类 1 是 1,类 2 是 2 类 3 是 3。这种情况,需要引入独热向量来表示类。实际上,在做分类的问题的时候,比较常见的做法也是用独热向量表示类。如果用独热向量计算距离的话,类两两之间的距离都是一样的。
3.6.2 带有 softmax 的分类
softmax 的计算如下图所示,先把所有的 y 取一个指数(负数取指数后也会变成正的),再对其做归一化(除掉所有 y 的指数值的和)得到 y′。图 3.33 是 softmax 的块(block),输入 y1、y2 和 y3,产生 y′1、y′2 和 y′3。比如 y1 = 3,y2 = 1,y3 = −3,取完指数的时候,exp(3) = 20、exp(1) = 2.7 和 exp(−3) = 0.05,做完归一化后,就变成 0.88、0.12 跟 0。−3取完指数,再做归一化以后,会变成趋近于 0 的值。所以 softmax 除了归一化,让 y′1、y′2 和y′3,变成 0 到 1 之间,和为 1 以外,它还会让大的值跟小的值的差距更大。
3.6.3 分类损失
1. 均方误差,即把 y 里面每一个元素拿出来,计算它们的平方和当作误差。
2. 交叉熵,当 yˆ 跟 y′ 相同时,可以最小化交叉熵的值,此时均方误差也是最小的。最小化交叉熵其实就是最大化似然(maximize likelihood)。
3. 相较于均方误差,交叉熵更常用于分类。