Adam算法

  1. 梯度下降
    在深度学习里,目标函数通常是训练数据集中有关各个样本的损失函数的平均。设
    是有关索引为
    的训练数据样本的损失函数,
    是训练数据样本数,
    是模型的参数向量,那么目标函数定义为

目标函数在
处的梯度计算为

梯度下降公式为:

如果使⽤用梯度下降,每次要计算所有样本的损失平均,每次自变量迭代的计算开销为
,它随着
线性增长。因此,当训练数据样本数很大时,梯度下降每次迭代的计算开销很高

1.1 随机梯度下降
每次选择一个样本来计算梯度,并更新

1.2 小批量随机梯度下降
小批量随机梯度下降通过重复采样或者不重复采样
个样本得到一个小批量样本集。

小批量随机梯度在每个迭代周期的耗时介于梯度下降和随机梯度下降的耗时之间。

「小结」 梯度下降法相关的优化方法容易产生震荡,且容易被困在鞍点,迟迟不能到达全局最优值

  1. 动量法
    2.1 梯度下降的问题
    考虑目标函数为
    ,这里
    的系数和
    的系数不在同一个数量级,使用学习率为 0.4 时自变量的迭代轨迹如下:

可以看到,同一位置上,目标函数在竖直方向(
轴⽅方向)比在水平方向(
轴方向)的斜率的绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。那么,我们需要一个较小的学习率从而避免自变量在竖直方向上越过目标函数最优解。然而,这会造成自变量在水平方向上朝最优解移动变慢

我们试着将学习率调得稍大一点,此时自变量在竖直方向不断越过最优解并逐渐发散

2.2 动量法

其中,
表示一个batch的样本的梯度,在时间步0动量法创建速度

是学习率,动量超参数
满足

图2.1 动量法的迭代轨迹

「动量法原理」 我们知道
代表

的指数加权平均,我们常常将
看作是对最近
个时间步的
值的加权平均。例如,当
时,
可以被看作对最近20个时间步的
值的加权平均;

我们对动量法的速度变量做变形

相比于小批量随机梯度下降, 动量法在每个时间步的自变量更新量近似于将最近
个时间步的普通更新量做了指数加权移动平均后再除以
。所以,「在动量法中,自变量在各个方向上的移动幅度不仅取决当前梯度,还取决于过去的各个梯度在各个方向上是否一致」。

在2.1节中提到的例子,使用动量法后,在x轴方向上(向右)每一步的梯度方向都大致相同(向右)所以指数加权平均后也向右,而在y轴方向上,每一步梯度方向时上时下,方向不同,指数加权平均后总体的跳动幅度就会减小,这样的话,在x轴上更新加快,在y轴上震荡减缓,总体上迭代更新更快

「小结」 使用动量法「梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。」

3 Adagrad
在之前介绍过的优化算法中,目标函数自变量的每一个元素在相同时间步都使⽤用同一个学习率来自我迭代,如下所示:

上一节中我们看到当

的梯度值有较大差别时,需要选择足够小的学习率使得自变量 在梯度值较大的维度上不发散。但这样会导致自变量在梯度值较小的维度上迭代过慢。动量法依赖指数加权移动平均使得自变量的更新方向更加一致,从而降低发散的可能

本节AdaGrad算法,「它根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率,从而避免统一的学习率难以适应所有维度的问题」

3.1 Adagrad算法

Adagrad算法如上式所示,首先他会使用一个小批量随机梯度
将元素平方后累加到变量
。其中

表示按元素相乘;接着,将目标函数自变量中每个元素的学习率通过按元素运算重新调整一下,其中
是学习率,
是非常小的常数,一般为
,这里开方、除法和乘法的运算都是按元素运算的。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。

小批量随机梯度按元素平方的累加变量
出现在学习率的分母项中。因此,如果目标函数有关自变量中某个元素的偏导数一直都较大,那么该元素的学习率将下降较快;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么该元素的学习率将下降较慢

「缺点」 由于
一直在累加按元素平方的梯度,自变量中每个元素的学习率在迭代过程中一直在降低,当学习率在迭代早期降得较快且当前解依然不佳时, AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解

「小结」

AdaGrad算法在迭代过程不断调整学习率,并让目标函数自变量中每个元素都分别拥有自己的学习率
使用AdaGrad算法时,自变量中每个元素的学习率在迭代过程中一直在降低(或不变)
4. RMSProp算法
Adagrad 调整学习率时分母上的变量一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代早期降得较快且当前解依然不佳时, AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。RMSprop就是为了解决这个问题

4.1 RMSprop算法
不同于Adagrad算法直接将
时刻前所有的梯度
平方后累加到
,RMSProp算法将这些梯度按元素平方做指数加权移动平均。具体来说,给定超参数
, RMSProp算法在时间步
计算

和AdaGrad算法一样, RMSProp算法将目标函数自变量中每个元素的学习率通过按元素运算重新调整,然后更新自变量

其中
是学习率,
是很小的常数,一般取
,因为
是前
个时间步的指数加权平均,因此自变量每个元素的学习率在迭代过程中就不再一直降低

5 AdaDelta算法
AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进

AdaDelta算法也像RMSProp算法一样,使用了小批量随机梯度
按元素平方的指数加权移动平均变量

AdaDelta算法还维护一个额外的状态变量
,其元素同样在时间步0时被初始化为0。我们使用
来计算自变量的变化量:

最后,我们使用
来记录「自变量变化量」
按元素平方的指数加权移动平均

可以看到,如不考虑
的影响, AdaDelta算法跟RMSProp算法的不同之处在于使用
来替代学习率

  1. Adam算法
    Adam算法将动量法和RMSprop结合,Adam 中对一阶动量也是用指数移动平均计算

其中
,作者建议取0.9 ,
,作者建议取 0.999


较小时,过去各时间步小批量随机梯度权值之和会较小,例如,当
时,
。为了消除这样的影响,对于任意时间步
,我们可以将
再除以
,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作「偏差修正」。在Adam算法中,我们对变量

均作偏差修正

「注意」:(1)之所以偏差修正除以
, 是因为在时间步

将过去各时间步小批量随机梯度的权值相加,得到

(2)为什么要使用偏差修正? 当
较小时,过去各时间步小批量随机梯度权值之和会较小,例如,当
时,
。此时若不进行偏差修正,直接计算,即:

会很小,因为本身
就变成了原来的1/10, 然后再乘上一个学习率,就会更小

接下来调整每个变量的学习率,并更新变量

「小结」

Adam算法在RMSProp算法的基础上对小批量随机梯度也做了了指数加权移动平均
Adam算法使⽤用了了偏差修正
7. AdamW
7.1 L2正则和权重衰减
L2正则如下:

权重衰减如下:

其中
是学习率,
是正则化系数,(2)式中每一次更新都会减去一小部分权重, 因此叫做权重衰减

从上面两个式子可知,L2正则和权重衰减的说法对于原版 SGD 是等价的,而当我们使用如 Adam 那样复杂的最优化方法,L2 正则化和权重衰减就会存在很大的不同;因为 Adam 中的 L2 正则化需要添加
到梯度中,并分别计算梯度及其平方的移动均值,然后再能更新权重。然而权重衰减方法只是简单地求梯度更新权重,并每次从权重中减去一点

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

AdamW算法如下:

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

现在有很多算法都是用AdamW,如BERT,GPT2,Transformer等

  1. 指数加权平均
    常用的平均数法是:
    ,假设现在有100天的温度值,通过上面的公式就可以直接求出100天的平均值。 指数加权平均本质上就是一种近似求平均的方法,其公式为:

其中
代表到第
天的平均温度,
代表第
天的温度值,
代表可调节的超参数

加入
,可以得到指数平均公式的如下平均值求法:

化简得到如下表达式:

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值