理解BERT中的optimization
引言
最近参加的爱奇艺剧本情感分析大赛中,苦于对baseline调参无任何实质性的效果,在查阅了相关资料后,开始学习2019CCF的互联网新闻情感分析大赛的baseline代码。学习到optimization时,不太清楚每行代码的原理逻辑,因此查阅了BERT中关于optimization.py的源码,下面是这段时间查阅资料的总结。
BERT中使用了AdamWeightDecayOptimizer,本来Adam都没太搞懂,现在又来个WeightDecay,一起学一下吧!
不查不知道,一查吓一跳,2014年提出来的Adam优化器的收敛性证明是错误的,之前大部分机器学习框架中对于Adam的权重衰减的实现也是错误的。关注其收敛性的论文也获得了ICLR2017的Best Paper,在2017年的论文《Fixing Weight Decay Regularization in Adam》中,提出了一种新的方法用于修复Adam的权重衰减错误,命名为AdamW。实际上,L2正则化和权重衰减在大部分情况下并不等价,只是在SGD优化的情况下是等价的。而大多数框架中对于Adam+L2正则使用的是权重衰减的方式,两者不能混为一谈。
先回顾一下Adam优化器的前置只是,先结合源码理解Adam优化器,再来看AdamW与之的不同之处。
Adam的前置知识
1、梯度下降法
最基本的优化方法,沿着负梯度的方向更新参数,实现如下:
x + = − l r ∗ d x x += -lr*dx x+=−lr∗dx,其中,lr是超参数代表学习率,被更新的变量为x,其梯度为dx,梯度->位置,很好理解~
但是梯度下降法相关的优化方法很容易产生震荡,且很容易被困在鞍点,迟迟不能达到全局最优值。
2、动量法
动量法是一类从屋里中的动量获得启发的优化方法,可以简单理解为:当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小,实现如下:
v = μ ∗ v − l r ∗ d x , 梯 度 影 响 速 度 ; x + = v , 速 度 决 定 位 置 。 v=\mu*v-lr*dx,梯度影响速度;x+=v,速度决定位置。 v=μ∗v−lr∗dx,梯度影响速度;x+=v,速度决定位置。
变量v的初始值被定位0,超参数 μ \mu μ在优化过程中被视为动量,其物理意义可以视为摩擦系数,加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并较小震荡。和之前不同的是梯度不会直接对位置造成影响。梯度->速度->位置。
3、RMSpop
RMSprop是一种自适应学习率方法满意就是基于梯度对位置进行更新,为了消除梯度下降中的摆动,埃及如了梯度平方的指数加权平均,梯度大的指数加权平均就大,梯度小的指数加权平均就小,保证各维度的梯度都在一个良机,进而减少摆动。
指数加权平均的通俗理解
参考博客:通俗理解指数加权平均 - 知乎 (zhihu.com)
在深度学习优化算法中,我们通常会涉及到指数加权平均这个概念,下面我们通过例子来一步一步引出这个概念。
平均数求法
比如我们现在有100天的温度值,要求这100天的平均温度值。
24,25,24,26,34,28,33,33,34,35…32。
我们直接可以用公式:

通过上面的公式就可以直接求出10天的平均值,而我们要介绍的指数加权平均本质上就是一种近似求平均的方法。
指数加权平均
我们现在可以直接给出公式:


化简开得到如下表达式:

通过上面表达式,我们可以看到,V100等于每一个时刻天数的温度值再乘以一个权值。
本质就是以指数式递减加权的移动平均。各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。**
而在我们上面提到的普通平均数求法,它的每一项的权值都是一样的,如果有n项,权值都为1/n。
指数加权平均的本质还可以用下图表示:

指数加权平均的结果是由当天温度值乘以指数衰减函数值,然后类和求得!
指数加权平均的优势
那么指数加权平均法有什么好处呢?首先我们来看它的实现:

我们可以看到指数加权平均的求解过程实际上是一个递推的过程,那么这样就会有一个非常大的好处,每当我要求从0到某一时刻(n)的平均值的时候,我并不需要像普通求解平均值的作为,保留所有的时刻值,类和然后除以n。
而是只需要保留0-(n-1)时刻的平均值和n时刻的温度值即可。也就是每次只需要保留常数值,然后进行运算即可,这对于深度学习中的海量数据来说,是一个很好的减少内存和空间的做法。
书接上文
RMSprop公式:
# RMSprop
cache = decay_rate * cache + (1 - decay_rate) * dx**2 # 梯度平方的指数加权平均
x += - learning_rate * dx / (np.sqrt(cache) + eps) # 基于梯度更新
其中decay_rate和eps都是超参数,每一步的变量cache的值都不同,所以可以看做自适应得对学习率进行调整。
还有一些其他效果较好的优化器,由于这些前置知识已经足够理解Adam了,所以在此不做过多介绍。
AdamW
AdamW是在Adam+L2正则化的基础上进行改进的算法。
使用Adam优化带L2正则的损失并不有效。如果引入L2正则项,在计算梯度的时候会加上对正则项求梯度的结果,那么如果本身比较大的一些权重对应的梯度也会比较大,由于Adam计算步骤中减去项会有除以梯度平方的累积,使得减去项偏小。按常理说,越大的权重应该惩罚越大,但是在Adam并不是这样。而权重衰减对所有的权重都是采用相同的系数进行更新,越大的权重显然惩罚越大。在常见的深度学习库中只提供了L2正则,并没有提供权重衰减的实现。

图片中红色是传统的Adam+L2 regularization的方式,绿色是Adam+weightdecay的方式。可以看出两个方法的区别仅在于“系数乘以上一步参数值“这一项的位置。再结合代码来看一下AdamW的具体实现。
本文介绍了BERT中使用的AdamWeightDecayOptimizer,着重讲解了Adam优化器的原理,指出其早期收敛性证明的错误,并阐述了AdamW(修复版Adam+L2正则)的区别。通过动量法、RMSprop和Adam的对比,解释了AdamW如何改进Adam+L2正则的不足。
1108

被折叠的 条评论
为什么被折叠?



