Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

Adam优化器

自适应矩估计(Adam)优化器是计算每个参数的自适应学习率的另一种方法。 除了存储像Adadelta和RMSprop之类的过去平方梯度vtvt的指数衰减平均数之外,Adam也保持了过去梯度mtmt的指数衰减平均值,类似于动量:

简介

Adam 算法,即一种对随机目标函数执行一阶梯度优化的算法,该算法基于适应性低阶矩估计。Adam 算法很容易实现,并且有很高的计算效率和较低的内存需求。Adam 算法梯度的对角缩放(diagonal rescaling)具有不变性,因此很适合求解带有大规模数据或参数的问题。该算法同样适用于解决大噪声和稀疏梯度的非稳态(non-stationary)问题。超参数可以很直观地解释,并只需要少量调整。Adam 算法与其它一些相类似的算法。论文《ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION》中分析了Adam 算法的理论收敛性,并提供了收敛率的区间,并证明收敛速度在在线凸优化框架下达到了最优。经验结果也展示了Adam 算法在实践上比得上其他随机优化方法。最后,作者在该论文中讨论了AdaMax,即一种基于无穷范数(infinity norm)的Adam 变体。

Adam一种有效的随机优化方法,它只需要一阶的梯度,并且只需要很小的内存。该方法通过第一,第二梯度的估计,计算不同参数的自适应学习速率;Adam的名字来源于自适应矩估计Adaptive moment estimation。Adam方法是结合两种最近流行的方法的优点:AdaGrad (Duchi 等人,2011),它在稀疏梯度上很有效,和RMSProp (Tieleman & Hinton, 2012),它在在非稳态和在线问题上有很有优秀的性能;

Adam的优点是

·直截了当地实现

·高效的计算

·所需内存少

·梯度对角缩放的不变性

·适合解决含大规模数据和参数的优化问题

·适用于非稳态(non-stationary)目标

·适用于解决包含很高噪声或稀疏梯度的问题

·超参数可以很直观地解释,并且基本上只需极少量的调参

上图是Adam算法的伪代码,其中

1.确定参数α(步长)、β1、β2 (矩估计得指数衰弱速率,在[0,1)之间)和随机目标函数f(θ) 。

2.初始化参数向量θ0、一阶矩向量m0、二阶矩向量v0和时间步t。

3.循环,当参数θ没有收敛时,循环迭代地更新各个部分。即时间步t 加1、更新目标函数在该时间步上对参数θ所求的梯度gt、更新偏差的一阶矩估计mt和二阶原始矩估计vt,再计算偏差修正的一阶矩估计和偏差修正的二阶矩估计,然后再用以上计算出来的值更新模型的参数θt。

算法:

上图伪代码为展现了Adam 算法的基本步骤。假定f(θ) 为噪声目标函数:即关于参数θ可微的随机标量函数。目的是为了减少该函数的期望值,即对于不同参数θ,f 的期望值E[f(θ)]。其中f1(θ), ..., , fT (θ) 表示在随后时间步1, ..., T 上的随机函数值。这里的随机性来源于随机子样本(小批量)上的评估和固有的函数噪声。而表示ft(θ) 关于θ的梯度,即在实践步骤t 下ft 对θ的偏导数向量。

该算法更新梯度的指数移动均值(mt)和平方梯度(vt),而参数β1、β2 ∈ [0, 1) 控制了这些移动均值(moving average)指数衰减率。移动均值本身使用梯度的一阶矩(均值)和二阶原始矩(有偏方差)进行估计。然而因为这些移动均值初始化为0 向量,所以矩估计值会偏差向0,特别是在初始时间步中和衰减率非常小(即β接近于1)的情况下是这样的。但好消息是,初始化偏差很容易抵消,因此我们可以得到偏差修正(bias-corrected)的估计mt hat 和vt hat。

注意算法的效率可以通过改变计算顺序而得到提升,例如将伪代码最后三行循环语句替代为以下两个:

Adam更新规则:

Adam 算法更新规则的一个重要特征就是它会很谨慎地选择步长的大小。假定ε=0,则在时间步t 和参数空间上的有效下降步长为

有效下降步长有两个上确界:即在

情况下,有效步长的上确界满足

和其他情况下满足|∆t| ≤α。第一种情况只有在极其稀疏的情况下才会发生:即梯度除了当前时间步不为零外其他都为零。而在不那么稀疏的情况下,有效步长将会变得更小。当

时,有

因此可以得出上确界|∆t| <α。在更通用的场景中,因为|E[g]/ p E[g^2]| ≤ 1,我们有

每一个时间步的有效步长在参数空间中的量级近似受限于步长因子α,即

这个可以理解为在当前参数值下确定一个置信域,因此其要优于没有提供足够信息的当前梯度估计。这正可以令其相对简单地提前知道α正确的范围。

对于许多机器学习模型来说,我们知道好的最优状态是在参数空间内的集合域上有极高的概率。这并不罕见,例如我们可以在参数上有一个先验分布。因为α确定了参数空间内有效步长的量级(即上确界),我们常常可以推断出α的正确量级,而最优解也可以从θ0 开始通过一定量的迭代而达到。我们可以将

称之为信噪比(signal-to-noise ratio/SNR)。如果SNR 值较小,那么有效步长∆t 将接近于0,目标函数也将收敛到极值。这是非常令人满意的属性,因为越小的SNR 就意味着算法对方向

是否符合真实梯度方向存在着越大的不确定性。例如,SNR 值在最优解附近趋向于0,因此也会在参数空间有更小的有效步长:即一种自动退火(automatic annealing)的形式。有效步长∆t 对于梯度缩放来说仍然是不变量,我们如果用因子c 重缩放(rescaling)梯度g,即相当于用因子c 重缩放^mt.和用因子c^2 缩放^vt.,而在计算信噪比时缩放因子会得到抵消:

初始化偏差修正

正如本论文第二部分算法所述,Adam 利用了初始化偏差修正项。本部分将由二阶矩估计推导出这一偏差修正项,一阶矩估计的推导完全是相似的。首先我们可以求得随机目标函数f 的梯度,然后我们希望能使用平方梯度(squared gradient)的指数移动均值和衰减率β2 来估计它的二阶原始矩(有偏方差)。令g1, ..., gT 为时间步序列上的梯度,其中每个梯度都服从一个潜在的梯度分布gt ∼ p(gt)。现在我们初始化指数移动均值v0=0(零向量),而指数移动均值在时间步t 的更新可表示为

(1)

其中gt^2 表示Hadamard 积gt⊙gt,即对应元素之间的乘积。同样我们可以将其改写为在前面所有时间步上只包含梯度和衰减率的函数,即消去v:

我们希望知道时间步t 上指数移动均值的期望值E[vt] 如何与真实的二阶矩E(gt^2 )相关联,所以我们可以对这两个量之间的偏差进行修正。下面我们同时对表达式(1)的左边和右边去期望,即如下所示:

如果真实二阶矩E[gi ^2] 是静态的(stationary),那么ζ= 0。否则ζ可以保留一个很小的值,这是因为我们应该选择指数衰减率β1 以令指数移动均值分配很小的权重给梯度。所以初始化均值为零向量就造成了只留下了(1 − βt^2 ) 项。我们因此在算法1 中除以了ζ项以修正初始化偏差。

在稀疏矩阵中,为了获得一个可靠的二阶矩估计,我们需要选择一个很小的β2 而在许多梯度上取均值。然而正好是这种小β2 值的情况导致了初始化偏差修正的缺乏,因此也就令初始化步长过大。

【引用来源:论文ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION ,URL:https://arxiv.org/pdf/1412.6980.pdf

发展历史

描述

1847, Augustin-Louis Cauchy, 在Méthode générale pour la résolution des systèmes d'équations simultanée中提出提出GD梯度下降

随机梯度下降(SGD)方法是1951年由Robbins和Monro提出的,至今已有60年历史。在当前的深度学习研究中,这种方法至关重要,一般被用在反向传播过程中。1952年,J. Kiefer and J. Wolfowitz 也提出了SGD的方法随机逼近是一种参数的估计方法。它是在有随机误差干扰的情况时,用逐步逼近的方式估计参数的方法。SGD对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。

为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降(Mini Batch Gradient Descent),因为对每个批次中的n个训练样本,这种方法只执行一次更新。

SGD方法中的高方差振荡使得网络很难稳定收敛,所以有研究者提出了一种称为动量(Momentum)的技术。1986年,momentum(动量)算法在Rumelhart, Hinton和Williams关于反向传播学习的开创性论文中首次出现。

1983年,Yurii Nesterov提出Nesterov accelerated gradient算法,它是一种二阶优化算法,计算量庞大。Yurii Nesterov研究员,认为动量方法存在一个问题:如果一个滚下山坡的球,盲目沿着斜坡下滑,这是非常不合适的。一个更聪明的球应该要注意到它将要去哪,因此在上坡再次向上倾斜时小球应该进行减速。实际上,当小球达到曲线上的最低点时,动量相当高。由于高动量可能会导致其完全地错过最小值,因此小球不知道何时进行减速,故继续向上移动。Yurii Nesterov在1983年发表了一篇关于解决动量问题的论文,因此,我们把这种方法叫做Nestrov梯度加速法。

2011年,Duchi, J., Hazan, E.,对随机梯度算法进行修改提出提出Adagrad算法。Adagrad方法是通过参数来调整合适的学习率η,对稀疏参数进行大幅更新和对频繁参数进行小幅更新。因此,Adagrad方法非常适合处理稀疏数据。

2012年,Matthew D. Zeiler.提出了Adadelta算法。这是一个AdaGrad的延伸方法,它倾向于解决其学习率衰减的问题。Adadelta不是累积所有之前的平方梯度,而是将累积之前梯度的窗口限制到某个固定大小w。AdaDelta方法的另一个优点是,已经不需要设置一个默认的学习率。

在之前的方法中计算了每个参数的对应学习率,但是为什么不计算每个参数的对应动量变化并独立存储呢?这就是Adam算法提出的改良点。2014年,Kingma, D. P., & Ba, J. 提出Adam算法,可看作是目前最常用的优化算法之一。这个方法不仅存储了AdaDelta先前平方梯度的指数衰减平均值,而且保持了先前梯度M(t)的指数衰减平均值,这一点与动量类似。

2016年,Dozat, T.将momentum算法应用于Adam算法中,提出Nadam算法。Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。

2018年,在Adam方法收敛到一个次优解时,观察到一些小批次样本贡献了大幅且有效的信息梯度,但是这种情况很少发生,指数平均后减小了它们的影响,导致模型收敛性差。Reddi等人提出AMSGrad算法对SGD算法进行改进.

下图是对鞍点数据进行优化得可视化显示

从上面的动画可以看出,自适应算法能很快收敛,并快速找到参数更新中正确的目标方向;而标准的SGD、NAG和动量项等方法收敛缓慢,且很难找到正确的方向。

主要事件

A

B

C

1

年份

事件

相关论文/Reference

2

1951

Robbins, H., & Monro, S.提出SGD算法

Robbins, H., & Monro, S. (1951). A stochastic approximation method. The annals of mathematical statistics, 400-407.

3

2011

Duchi, J., Hazan, E.,对随机梯度算法进行修改提出提出Adagrad算法

Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive subgradient methods for online learning and stochastic optimization. Journal of Machine Learning Research, 12(Jul), 2121-2159.

4

2012

Zeiler, M. D.对Adagrad提出AdaDelta算法

Zeiler, M. D.(2012). ADADELTA: an adaptive learning rate method. arXiv preprint arXiv:1212.5701.

5

2014

Kingma, D. P., & Ba, J.提出经典的Adam 算法

Kingma, D. P., & Ba, J. (2014). Adam: A method for stochastic optimization. arXiv preprint arXiv:1412.6980.

6

2016

Ruder, S.对多种梯度下降算法进行综述回顾

Ruder, S. (2016). An overview of gradient descent optimization algorithms. arXiv preprint arXiv:1609.04747.

发展分析

瓶颈

Adam算法并不能保证找到极值点。其次,Adam算法在收敛到一个次优解时,观察到一些小批次样本贡献了大幅且有效的信息梯度,指数平均后减小了它们的影响,导致模型收敛性差。

未来发展方向

虽然Adam算法不能保证找到极值点,但是它有很高的计算效率和较低的内存需求,然而,如何避免只能找到局部最优解依旧是需要持续研究的问题。

除此之外,无论哪一种优化器算法来说,参数的设置也是比较重要的,找到每一种算法的合适的参数也是研究的重点。

By Ruining Cai

简介