深度学习中的优化函数总结

1. 梯度下降

沿着负梯度的方向更新参数

w = w − α d w w = w-\alpha dw w=wαdw

其中 α \alpha α是学习率, 被更新的参数是 w w w,其梯度为 d w dw dw梯度->位置
梯度下降法相关的优化方法容易产生震荡,且容易被困在鞍点,迟迟不能到达全局最优值

2. 动量法

动量法是一类从物理中的动量获得启发的优化方法,可以简单理解为:当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。实现如下:

v = μ v − α d x w = w + v v = \mu v-\alpha dx \\ w = w+v v=μvαdxw=w+v

变量 v v v的初始值被定为0,超参数 μ \mu μ在优化过程中被视为动量,其物理意义可以视为摩擦系数,加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。和之前不同的是梯度不会直接对位置造成影响,梯度->速度->位置

3. RMSprop

RMSprop是一种自适应学习率方法,依旧是基于梯度对位置进行更新。为了消除梯度下降中的摆动,加入了梯度平方的指数加权平均。梯度大的指数加权平均就大,梯度小的指数加权平均就小,保证各维度的梯度都在一个良机,进而减少摆动。

c a c h e = β ∗ c a c h e + ( 1 − β ) ∗ d w 2 w = w − α ∗ d w / ( c a c h e + ϵ ) cache = \beta*cache+(1-\beta)*dw^2 \\ w = w-\alpha*dw/(\sqrt{cache}+\epsilon) cache=βcache+(1β)dw2w=wαdw/(cache +ϵ)

其中 β \beta β ϵ \epsilon ϵ都是超参数, α \alpha α是学习率,每一步变量cache值都不同,所以可以看做自适应得对学习率进行调整

3.1 指数加权平均

常用的平均数法是: v a v e r = v 1 + … + v 100 100 v_{a v e r}=\frac{v_{1}+\ldots+v_{100}}{100} vaver=100v1++v100,假设现在有100天的温度值,通过上面的公式就可以直接求出100天的平均值。
指数加权平均本质上就是一种近似求平均的方法,其公式为:

v t = β ∗ v t − 1 + ( 1 − β ) θ t v_t = \beta*v_{t-1}+(1-\beta)\theta_t vt=βvt1+(1β)θt

其中 v t v_t vt代表到第 t t t天的平均温度, θ t \theta_t θt代表第 t t t天的温度值, β \beta β代表可调节的超参数

加入 β = 0.9 \beta=0.9 β=0.9 ,可以得到指数平均公式的如下平均值求法:
v t = β v t − 1 + ( 1 − β ) θ t v 100 = 0.9 v 99 + 0.1 θ 100 v 99 = 0.9 v 98 + 0.1 θ 99 v 98 = 0.9 v 97 + 0.1 θ 98 \begin{array}{l} v_{t}=\beta v_{t-1}+(1-\beta) \theta_{t} \\ v_{100}=0.9 v_{99}+0.1 \theta_{100} \\ v_{99}=0.9 v_{98}+0.1 \theta_{99} \\ v_{98}=0.9 v_{97}+0.1 \theta_{98} \end{array} vt=βvt1+(1β)θtv100=0.9v99+0.1θ100v99=0.9v98+0.1θ99v98=0.9v97+0.1θ98

化简得到如下表达式:
v 100 = 0.1 θ 100 + 0.9 v 99 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 v 98 ) = 0.1 θ 100 + 0.1 ∗ 0.9 ∗ θ 99 + 0.1 ∗ 0. 9 2 θ 98 + . . . . . v_{100} = 0.1\theta_{100} + 0.9v_{99} = 0.1\theta_{100} + 0.9(0.1\theta_{99} + 0.9v_{98})\\ =0.1\theta_{100} + 0.1*0.9*\theta_{99} + 0.1*0.9^2\theta_{98} + ..... v100=0.1θ100+0.9v99=0.1θ100+0.9(0.1θ99+0.9v98)=0.1θ100+0.10.9θ99+0.10.92θ98+.....

通过上面表达式,我们可以看到, V 100 V_{100} V100 等于每一个时刻天数的温度值再乘以一个权值。

本质就是以指数式递减加权的移动平均。各数值的权重随时间而指数式递减,越近的数据加权越重,但较旧的数据也给予一定的加权

而在我们上面提到的普通平均数求法,它的每一项的权值都是一样的,如果有n项,权值都为1/n。

指数加权平均的优势:
指数加权平均的求解过程实际上是一个递推的过程,那么这样就会有一个非常大的好处,每当我要求从0到某一时刻n的平均值的时候,并不需要像普通求解平均值那样保留所有的时刻值,类和然后除以n。
而是只需要保留0到n-1时刻的平均值和n时刻的温度值即可。也就是每次只需要保留常数值,然后进行运算即可,这对于深度学习中的海量数据来说,是一个很好的减少内存和空间的做法

4.Adam

Adam可以看做动量法和RMSprop的结合
m = β 1 ∗ m + ( 1 − β 1 ) d w v = β 2 ∗ v + ( 1 − β 2 ) ∗ d w 2 w = w − α ∗ m / ( v + ϵ ) m = \beta_1*m+(1-\beta_1)dw \\ v=\beta_2*v + (1-\beta_2)*dw^2 \\ w = w- \alpha*m/(\sqrt{v}+\epsilon) m=β1m+(1β1)dwv=β2v+(1β2)dw2w=wαm/(v +ϵ)
对于m和v的处理,同样使用了指数加权平均

5. AdamW

L2 正则化是减少过拟合的经典方法,它会向损失函数添加由模型所有权重的平方和组成的惩罚项,并乘上特定的超参数以控制惩罚力度。

final_loss = loss + alpha * all_weights.pow(2).sum()/2

其中 wd 为我们设置的超参数,用以控制惩罚力度。这也可以称为权重衰减,因为每一次运用原版 SGD 时,它都等价于使用如下方程式更新权重

w = w - lr*w.grad - lr*wd*w

其中 lr 表示学习率、w.grad 表示损失函数对 w 的导数,而后面的 wd * w 则表示惩罚项对 w 的求导结果。在这个等式中,我们会看到每一次更新都会减去一小部分权重,这也就是「衰减」的来源

注意上面的L2正则和权重衰减的说法只对于原版 SGD 是等价的,而当我们添加动量或使用如 Adam 那样复杂的最优化方法,L2 正则化(第一个方程)和权重衰减(第二个方程)就会存在很大的不同。

如下在带动量的 SGD 中,L2 正则化与权重衰减是不等价的。L2 正则化会将 wd*w 添加到梯度中,但现在权重并不是直接减去梯度。首先我们需要计算移动均值:

moving_avg = alpha * moving_avg + (1-alpha) * (w.grad + wd*w)

然后权重才能通过减去乘上了学习率的移动均值而得到更新。所以 w 更新中涉及到的正则化为。

w = w - lr*moving_avg = w - lr*(alpha*moving_avg+(1-alpha)*(w.grad+wd*w)) 

而权重衰减为:

moving_avg = alpha * moving_avg + (1-alpha) * w.grad 
w = w - lr * moving_avg - lr * wd * w

我们可以观察到,从 w 中减去有关正则化的部分在两种方法中是不同的。当我们使用 Adam 优化器时,权重衰减的部分可能相差更大。因为 Adam 中的 L2 正则化需要添加 wd*w 到梯度中,并分别计算梯度及其平方的移动均值,然后再能更新权重。然而权重衰减方法只是简单地更新权重,并每次从权重中减去一点。

AdamW是在Adam+L2正则化的基础上进行改进的算法。
使用Adam优化带L2正则的损失并不有效。如果引入L2正则项,在计算梯度的时候会加上对正则项求梯度的结果。那么如果本身比较大的一些权重对应的梯度也会比较大,由于Adam计算步骤中减去项会有除以梯度平方的累积,使得减去项偏小。按常理说,越大的权重应该惩罚越大,但是在Adam并不是这样。而权重衰减对所有的权重都是采用相同的系数进行更新,越大的权重显然惩罚越大。

AdamW事项
m = β 1 ∗ m + ( 1 − β 1 ) d w v = β 2 ∗ v + ( 1 − β 2 ) d w 2 u p d a t e = m / ( v + ϵ ) u p d a t e = u p d a t e + w e i g h t _ d e c a y _ r a t e ∗ w u p d a t e _ w i t h _ l r = l r ∗ u p d a t e w = w − u p d a t a _ w i t h _ l r m = \beta_1*m+(1-\beta_1)dw\\ v = \beta_2*v+(1-\beta_2)dw^2\\ update = m/(\sqrt{v}+\epsilon)\\ update = update+weight\_decay\_rate*w\\ update\_with\_lr = lr*update\\ w = w-updata\_with\_lr m=β1m+(1β1)dwv=β2v+(1β2)dw2update=m/(v +ϵ)update=update+weight_decay_ratewupdate_with_lr=lrupdatew=wupdata_with_lr
简化:
m = β 1 ∗ m + ( 1 − β 1 ) d w v = β 2 ∗ v + ( 1 − β 2 ) d w 2 w = w − α ( m / ( v + ϵ ) + w e i g h t _ d e c a y _ r a t e ∗ w ) m = \beta_1*m+(1-\beta_1)dw\\ v = \beta_2*v+(1-\beta_2)dw^2\\ w = w-\alpha(m/(\sqrt{v}+\epsilon)+weight\_decay\_rate*w) m=β1m+(1β1)dwv=β2v+(1β2)dw2w=wα(m/(v +ϵ)+weight_decay_ratew)

解释
在Adam中加入L2正则,仅仅把权重的平方加入到损失函数中是不正确的,因为那样会与m和v相互作用,我们想要一种权重衰减的方式,它不会与m和v相互作用,这相当于把权重的平方加入到损失函数中向普通的SGD那样。

reference

跟着代码理解BERT中的优化器AdamW(AdamWeightDecayOptimizer)
通俗理解指数加权平均
当前训练神经网络最快的方式:AdamW优化算法+超级收敛

你可能感兴趣的:(自然语言处理)