acecase 发表于 2022-6-16 07:03

深度学习优化算法

历史发展:
SGD -> SGDM -> NAG ->AdaGrad(2011) -> AdaDelta(2012) ->RMSprop(2013) -> Adam(2014) -> AdamW/Amsgrad(2017)->AdaBound/NosAdam/RAdam(2019)
作为优化的基础方式,自然从梯度入手

https://www.zhihu.com/equation?tex=%5Cnabla+f%28%5Cmathbf%7Bx%7D%29%3D%5Cleft%5B%5Cfrac%7B%5Cpartial+f%28%5Cmathbf%7Bx%7D%29%7D%7B%5Cpartial+x_%7B1%7D%7D%2C+%5Cfrac%7B%5Cpartial+f%28%5Cmathbf%7Bx%7D%29%7D%7B%5Cpartial+x_%7B2%7D%7D%2C+%5Cdots%2C+%5Cfrac%7B%5Cpartial+f%28%5Cmathbf%7Bx%7D%29%7D%7B%5Cpartial+x_%7Bd%7D%7D%5Cright%5D%5E%7B%5Ctop%7D

https://www.zhihu.com/equation?tex=%5Cmathbf%7Bx%7D+%5Cleftarrow+%5Cmathbf%7Bx%7D-%5Ceta+%5Cnabla+f%28%5Cmathbf%7Bx%7D%29
传统数学优化问题中通常对整个数据集进行梯度下降优化,而在深度学习任务中由于数据量极大,因而使用批量(batch)处理,作用在单个样本上就是SGD。
我们知道在一般问题中,损失函数是非凸的,同时参数和样本量都比较大,那么直接使用梯度下降优化则会有两个明显的问题:1. 容易在停滞在鞍点/局部极小值。 2. 优化速度可能比较慢
一个显然的做法是融入梯度的历史信息,统计上最常用的做法就是指数滑动平均(Exponentially Moving Average,EMA),假设v是存储(计算)值,θt 是t 时刻的观测值,计算形式如下:

https://www.zhihu.com/equation?tex=v_+t+%3D+%CE%B2_%7Bv_%7Bt-1%7D%7D%2B+%281+%E2%88%92+%CE%B2%29%CE%B8_t+%3D%281-%CE%B2%29%CE%B8_t+%2B+%5Csum_%7Bi%3D1%7D%5E%7Bt-1%7D%281-%5Cbeta%29%CE%B2%5Ei%CE%B8_%7Bt-i%7D
其中 https://www.zhihu.com/equation?tex=0%3C%3D%5Cbeta%3C1%2C+v_0+%3D+%5Ctheta_0 。显然,由上式可知, 时刻的指数加权移动平均值其实可以看做前t 时刻所有观测值的指数加权平均值,除第t 时刻的观测值权重为1-β外,其他时刻的观测值权重为 https://www.zhihu.com/equation?tex=%281-%CE%B2%29%CE%B2%5Ei 。由于通常对于那些权重小于1/e的观测值可以忽计,所以忽掉那些观测值以后,上式就可以看做在求指数加权移动平均值。
这一做法除了在优化算法中随处可见,在BatchNormalization中也可以看到。为了避免统计初期偏差过大产生震荡,可以在分母加入修正因子:


主要优化方法涉及一阶矩/二阶矩,为了方便起见,重新定义符号:
待优化参数: https://www.zhihu.com/equation?tex=%5Ctheta_t+%5Cin+R%5Ed ,目标函数: https://www.zhihu.com/equation?tex=J%28x%3B%5Ctheta%29 ,学习率 https://www.zhihu.com/equation?tex=%5Ceta,则每次迭代时有:

[*]参数的梯度: https://www.zhihu.com/equation?tex=g_t%3D%5Cnabla+J%28x_i%2C+%5Ctheta_t%29
[*]根据历史梯度计算一阶动量和二阶动量:https://www.zhihu.com/equation?tex=m_t+%3D+%5Cphi%28g_1%2C+g_2%2C+%5Ccdots%2C+g_t%29%3B+V_t+%3D+%5Cpsi%28g_1%2C+g_2%2C+%5Ccdots%2C+g_t%29,
[*]增量: https://www.zhihu.com/equation?tex=%5CDelta%5Ctheta+%3D-+%5Ceta+%5Ccdot+%5Cfrac%7B+m_t%7D+%7B+%5Csqrt%7BV_t%7D%7D
[*]更新: https://www.zhihu.com/equation?tex=%5Ctheta_%7Bt%2B1%7D+%3D+%5Ctheta_t+%2B+%5CDelta%5Ctheta
SGDM

一阶动量:https://www.zhihu.com/equation?tex=m_t+%3D+%5Cbeta_1+%5Ccdot+m_%7Bt-1%7D+%2B+%281-%5Cbeta_1%29%5Ccdot+g_t


SGD with Nesterov Acceleration

将预测的下一时刻梯度应用于当前更新


AdaGrad

开始使用二阶动量,考虑对于同维度的参数采用同的学习率(网络参数量往往很大),为辨别参数的更新频率或者说幅度,可以使用历史梯度的平方来度量。


即:


注意到随着时间步的拉长,历史累计梯度平方和 https://www.zhihu.com/equation?tex=v_%7Bt%2Ci%7D 会越来越大,这样会使得所有维度参数的学习率都断减小(单调递减),无论新幅度如何。
RMSProp

在AdaGrad的基础上将普通的历史累计梯度平方和换成历史累计梯度平方和的指数加权移动平均值,所以只需将AdaGrad中 v 的公式改成指数加权移动平均值的形式即可,也即


AdaDelta

对更新量的二阶矩做指数滑动平均,




因而此时不需要设置学习率,只需要两个EMA的衰减参数即可。
Adam

融合了前述的思想,可以看作Momentum+RMSprop


Adam在许多实验中表现出色,收敛速度快。但存在些潜在问题:

[*]可能不收敛,二阶动量是固定时间窗口内的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得 https://www.zhihu.com/equation?tex=V_t 可能会时大时小,不是单调变化。这就可能在训练后期引起学习率的震荡,导致模型无法收敛。
[*]后期无法找到全局最优解,收敛到较差的解。The Marginal Value of Adaptive Gradient Methods in Machine Learning 指出自适应优化算法训练出来的结果通常都不如SGD,尽管这些自适应优化算法在训练时表现的看起来更好。 使用者应当慎重使用自适应优化算法。自适应算法类似于过学习的效果,生成的模型面对整体分布时是过拟合的。


amsgrad

RMSProp和Adam算法下的Vt可能是负的,所以文章探讨了一种替代方法,通过把超参数β1、β2设置为随着t变化而变化,从而保证Vt始终是个非负数。


漂亮的是Amsgrad解决了某些Adam无法收敛情形的优化问题,然而在一般的实验中,并没有表现出稳定的优势(最终结果上)。

一些参考:
页: [1]
查看完整版本: 深度学习优化算法