深度学习库中优化算法介绍

1. 简介

梯度优化算法是最流行的优化算法,也是在神经网络训练过程中最为常见的算法。梯度下降算法主要是依靠梯度的不断更新来对神经网络中的权重矩阵和偏置矩阵参数的学习操作。虽然经过训练之后的神经网络具有非常好的表达能力,但是当应用神经网络模型到机器学习时候依旧存在一些问题,分别描述如下:

  • 优化问题:神经网络模型是一个非凸函数,再加上深度网络中的梯度消失问题,很难以进行数学优化;另外,深度神经网络模型中的参数比较多,训练过程中的数据量也非常多,所以会导致训练的效果比较低下。
  • 泛化问题:泛化问题指的是在神经网络训练过程中的过拟合问题,这是神经网络在拟合过程中拟合能力过于强的表现。一般情况下,在深度神经网络中使用正则化方法来改进网络的泛化能力。

是什么原因导致很深层次的神经网络难以训练和优化呢?其中之一的原因就是,当神经网络训练到一定程度的时候,在高维空间中如何逃离函数中的鞍点。这是由于鞍点的梯度为0,无法正常进行梯度下降算法的计算。另一个原因就是,深度的神经网络参数非常地多,并且具有一定的冗余性,这导致每单个参数对于最终损失的影响都比较小,这导致了损失函数在局部最优点附近是一个平坦区域,或称之为平坦最小值。这些问题都不同程度影响了梯度优化算法的过程。本文通过讨论,比较一些梯度优化算法来对这些问题进行讨论和实践。

2. 优化算法的数学原理

深度神经网络在训练过程中有很多办法来更新参数值,但最为主要的算法都是基于梯度下降算法。根据不同的数据量和参数量来实现不同的梯度下降算法。梯度下降算法是一种通过在目标函数梯度 ∇ θ J ( θ ) \nabla_{\theta }J(\theta) θJ(θ)更新参数,从而来最小化模型参数的目标函数 J ( θ ) J(\theta) J(θ)的方法。学习率 η \eta η决定了下降到极小值点的步长,即通过沿着目标函数构造的曲面的斜面按照向下的方向走动。本文中首先不介绍牛顿法、拟牛顿法等计算量复杂的算法,接下来我们开始介绍这些梯度下降算法。

2.1 梯度下降优化算法

梯度下降算法主要包含了三种最为基本的算法,即随机梯度下降算法,批梯度下降算法以及小批量梯度下降算法。

2.1.1 批梯度下降算法(Batch gradient descent)

这是一种最为常见的梯度下降算法,即将数据一次性喂入神经网络中,利用所有的训练数据计算目标函数的梯度:
θ = θ − η ⋅ ∇ θ J ( θ ) \theta=\theta-\eta\cdot{\nabla_{\theta}J(\theta)} θ=θηθJ(θ)

每一次训练过程都会将数据喂入神经网络中进行整体梯度的计算,这也导致一种程序上运行的负担,即消耗了很大的内存,计算量比较大。
批量化计算神经网络梯度如下所示:

for k in range(nb_epoches):
	params_grad = calculate_gradient(loss_funcion,data,params)
	params = params - learning_rate

对于一个预先定义的迭代次数,先通过整体数据计算损失函数的前向传播结果(forward过程),然后通过反向传播算法计算关于参数向量params的梯度向量weight_grad(backward过程),最后更新参数(update gradient过程)。

2.1.2 随机梯度下降算法(Stochastic gradient descent,SGD)

随机梯度下降算法中根据每一条样本 x ( i ) x^{(i)} x(i)和标签 y ( i ) y^{(i)} y(i)更新参数信息:
θ = θ − η ⋅ ∇ θ J ( θ ; x ( i ) , y ( i ) ) \theta=\theta-\eta\cdot{\nabla_{\theta}J(\theta;x^{(i)},y^{(i)})} θ=θηθJ(θ;x(i),y(i))

SGD可以用于在线学习,消除了在批梯度算法中计算相似样本的梯度,每次更新中只执行一次运算,消除了冗余现象。由于SGD的波动性,不仅可以使得在训练过程中,网络可以跳到新的潜在更好的局部最优值。对于非凸优化和凸优化,可以分别收敛到局部最小值和全局最小值。与批梯度下降算法相比较来说,SGD算法仅仅是对训练样本的遍历和利用每一条样本计算梯度的过程中增加一层循环。更新的例子可以由如下的代码片段来表达:

for k in range(nb_epoches):
	np.random.shuffle(data)
	for example in data:
		params_grad = evaludate_gradient(loss_function,example,params)
		params = params - learning_rate * params_grad

2.1.3 小批量梯度下降算法(Mini-batch gradient descent)

结合批梯度下降算法和随机梯度下降算法的优点,所以在训练过程中可以进行每一小批次进行模型的训练:
θ = θ − η ⋅ ∇ θ J ( θ ; x i : i + k ; y i : i + k ) \theta=\theta-\eta\cdot{\nabla_{\theta}J(\theta;x^{i:i+k};y^{i:i+k})} θ=θηθJ(θ;xi:i+k;yi:i+k)

这样做的好处是:
a) 减少参数更新的方差,这样会得到更加稳定的收敛结果;
b) 可以利用最新的深度库中高度优化的矩阵优化方法,以便于高效地求解每个小批量数据的梯度。
f ( x ; θ ) f(x;\theta) f(x;θ)是一个深度神经网络, θ \theta θ是网络参数,在使用小批量梯度下降算法进行优化时,每次选取 K K K个训练样本 L t = { ( x ( k ) , y ( k ) ) } k = 1 K L_{t}=\{(x^{(k)},y^{(k)})\}_{k=1}^{K} Lt={ (x(k),y(k))}k=1K。所以第 t t t次迭代时候损失函数关于参数 θ \theta θ的偏导数为
g ( θ ) = 1 K ∑ ( x ( k ) , y ( k ) ) ∈ L t ∂ L ( y ( k ) , f ( x ; θ ) ) ∂ θ g(\theta)=\frac{1}{K}\sum_{(x^{(k)},y^{(k)})\in{L_{t}}}\frac{\partial L(y^{(k)},f(x;\theta))}{\partial \theta} g(θ)=K1(x(k),y(k))LtθL(y(k),f(x;θ))

其中 L ( . ) L(.) L(.)是可微分的损失函数, K K K是批量大小。
使用梯度进行参数更新:
θ t ← θ t − 1 − η ⋅ g ( θ t − 1 ) \theta_{t}\leftarrow\theta_{t-1}-\eta\cdot{g(\theta_{t-1})} θtθt1ηg(θt1)

从上面的公式可以看出,影响小批量梯度下降算法的因素包括有:
a. 批量的大小 K K K
b. 学习率 η \eta η
c. 梯度估计。

在小批量处理训练的神经网络中,批量的大小会影响梯度的方差。一般情况下,随机梯度的方差越小,引入的噪声也就越小,这样训练过程中也就十分稳定。学习率通常要随着批量的大小的增大而相应地增大。一个简单有效的方法是:线性缩放规则:当批量大小增加 m m m倍的同时,学习率也增加 m m m倍。线性缩放规则往往在批量大小比较小时候适用,当批量大小非常大的时候,线性缩放也会使得训练不够稳定。

2.1.4 学习率的调整与选择

在随机梯度下降算法中有很多改进学习率的方法。学习率是神经网络优化过程中重要的超参数,设置学习率的取值非常关键,决定着模型在训练过程中的收敛速度。常用到的学习率调整的算法有学习率衰减、学习率预热、周期性学习率调整以及自适应调整学习率的方法。下面介绍这几种学习率调整的方法:
学习率衰减
设初始的学习率大小为 α 0 \alpha_{0} α0,在第 t t t次迭代时的学习率为 α t \alpha_{t} αt
其中有一种学习率衰减的方法为,分段常数衰减(Piecewise constant decay)的方法,即每当经过 T 1 , T 2 , . . . , T m T_{1},T_{2},...,T_{m} T1,T2,...,Tm次迭代时候,将学习率衰减为原来的 β 1 , β 2 , . . . , β m \beta_{1},\beta_{2},...,\beta_{m} β1,β2,...,βm倍,其中 T m T_{m} Tm β m \beta_{m} βm根据经验设置的超参数。
有一种衰减方法被称作是逆时衰减(Reverse time decay)的方法,即有表达式:
α t = α 0 1 + β t \alpha_{t}=\frac{\alpha_{0}}{1+\beta t} αt=1+βtα0

其中 β \beta β是衰减常数。
指数衰减(Exponential decay)的方法也是较为常见的衰减方法,即
α t = α 0 β t , 0 < β < 1 \alpha_{t}=\alpha_{0}\beta^{t},0<\beta<1 αt=α0βt,0<β<1

或者为自然底数衰减(Natural base decay)
α t = α 0 e − β t \alpha_{t}=\alpha_{0}e^{-\beta t} αt=α0eβt

其中 β \beta β称作是衰减率。
余弦衰减(Cosine decay)方法
α t = 1 2 α 0 ( 1 + cos ⁡ ( t π T ) ) \alpha_{t}=\frac{1}{2}\alpha_{0}(1+\cos{(\frac{t\pi}{T})}) αt=21α0(1+cos(Ttπ))

其中 T T T是总迭代次数。
下面是不同衰减方法的比较:
学习率衰减函数图片
学习率预热
为了提高训练的稳定性,在最初几轮迭代时候,采用比较小的学习率,等梯度下降到一定程度的时候再恢复到初始的学习率,这种方法被称为学习率预热。最常见的是一种称为逐渐预热的学习方法。假设预热的迭代次数为 T ′ T{'} T,初始的学习率为 α 0 \alpha_{0} α0,在预热过程中,每次更新的学习率为
α t ′ = t T ′ α 0 , 1 ≤ t ≤ T ′ \alpha_{t}{'}=\frac{t}{T{'}}\alpha_{0},1\leq t\leq T{'} αt=Ttα0,1tT
当然,预热过程结束之后,可以再选择一种学习率衰减的办法来逐渐降低学习率。

周期性学习率
周期性学习率方法是为了梯度下降算法中能够逃离局部最小值或者鞍点,所以一种方法就是周期性地增大学习率。一般有两种方法:循环学习率和带有热重启的随机梯度下降。
循环学习率即使得学习率在一个区间内周期性地增大和减小。通常使用线性缩放的方式来调整学习率。设每个循环周期的长度相等为 2 Δ T 2\Delta T 2ΔT,其中前 Δ T \Delta T ΔT是学习率增大阶段,后 Δ T \Delta T ΔT是学习率线性缩小阶段。所以在 t t t次迭代时候,所在的循环周期数为:
m = ⌊ 1 + t 2 Δ T ⌋ m=\lfloor1+\frac{t}{2\Delta T} \rfloor m=1+2ΔTt

所以第 t t t次迭代的学习率为
α t = α m i n ( m ) + ( α m a x ( m ) − α m i n ( m ) ) ⋅ ( max ⁡ ( 0 , 1 − b ) ) \alpha_{t}=\alpha_{min}^{(m)}+(\alpha_{max}^{(m)}-\alpha_{min}^{(m)})\cdot(\max(0,1-b)) αt=αmin(m)+(αmax(m)αmin(m))(max(0,1b))

其中 α m a x ( m ) \alpha_{max}^{(m)} αmax(m) α m i n ( m ) \alpha_{min}^{(m)} αmin(m)是学习率的上界和下界, b ∈ [ 0 , 1 ] b\in{[0,1]} b[0,1]计算方法为:
b = ⌊ t Δ T − 2 m + 1 ⌋ b=\lfloor\frac{t}{\Delta T}-2m+1\rfloor b=ΔTt2m+1

带热重启的随机梯度下降是指用热重启方式替代学习率衰减方法。学习率每次间隔一定的周期之后重新初始化为某一个预先设定值,然后逐渐衰减。
设在梯度下降过程中重启 M M M次,第 m m m次重启在上次重启开始第 T m T_{m} Tm个回合后进行, T m T_{m} Tm称为重启周期。在第 n n n次重启之前,使用余弦衰减来降低学习率。第 t t t次迭代的学习率为
α t = α m i n ( m ) + 1 2 ( α m a x ( m ) − α m i n ( m ) ) ( 1 + cos ⁡ ( T c u r T m π ) ) \alpha_{t}=\alpha_{min}^{(m)}+\frac{1}{2}(\alpha_{max}^{(m)}-\alpha_{min}^{(m)})(1+\cos(\frac{T_{cur}}{T_{m}}\pi)) αt=αmin(m)+21(αmax(m)αmin(m))(1+cos(TmTcurπ))

其中 α m a x ( m ) \alpha_{max}^{(m)} αmax(m) α m i n ( m ) \alpha_{min}^{(m)} αmin(m)是第 m m m个周期中的学习率上界和下界,可以随着 m m m的增大而降低; T c u r T_{cur} Tcur是从上次重启之后的回合数。

2.2 Momentum梯度优化算法

在小批量随机梯度下降算法中,SGD很难以通过陡谷,即在一个维度上的表面弯曲程度大于其他维度的区域,这种情况下通常出现在局部最优点附近,优化过程可以使用下图来表示:
SGD有和无momentum图示
这是由论文[1]中提出的图。动量是模拟物理中的概念,指的是这个物体在运动方向上保持运动的趋势,是物体和速度的乘积。动量的方法是用之前积累动量来替代真正的梯度,每次迭代的梯度可以看做是加速度。更新的公式如下所示:
v t = γ v t − 1 + η ⋅ ∇ θ J ( θ ) θ = θ − v t v_{t}=\gamma v_{t-1}+\eta\cdot{\nabla_{\theta}J(\theta)}\\ \theta=\theta-v_{t} vt=γvt1+ηθJ(θ)θ=θvt

通常动量项 γ \gamma γ通常设置为 0.9 0.9 0.9左右。在梯度更新过程中,对于在梯度处具有相同的方向维度,其动量项增大,对于在梯度点处改变方向的维度,其动量项减小,故而可以得到更快的收敛速度。

2.2 NAG(Nesterov accelerated gradient)

Nesterov加速梯度,也称为Nesterov动量法是一种对动量法的改进方法,它能够给动量项预知梯度下降的方向。利用动量项 γ v t − 1 \gamma v_{t-1} γvt1来更新参数 θ \theta θ。通过计算 θ − γ v t − 1 \theta-\gamma v_{t-1} θγvt1能够告诉我们参数未来位置的一个近似值,通过计算关于参数未来的近似位置的梯度,而不是关于当前的参数 θ \theta θ的梯度,可以高效求解:
v t = γ v t − 1 + η ⋅ ∇ θ J ( θ − γ v t − 1 ) θ = θ − v t v_{t}=\gamma v_{t-1}+\eta\cdot{\nabla_{\theta}J(\theta-\gamma v_{t-1})}\\ \theta=\theta-v_{t} vt=γvt1+ηθJ(θγvt1)θ=θvt

其中的动量项 γ \gamma γ大约为 0.9 0.9 0.9。动量方法首先计算当前的梯度值,然后再更新的累积梯度方向上前进一大步,Nesterov加速梯度下降法NAG首先在先前累积梯度方向上前进一大步,计算梯度值,然后做一个修正。这一点对于RNN的性能提高有着重要的意义。
两种动量方法之间的比较
对于NAG直观理解可以看Overview of mini-­‐batch gradient descent

2.3 Adagrad

在标准的梯度下降算法中,每个参数在每次迭代时候使用相同的学习率,由于每个参数的维度上收敛速度都不相同,因此需要根据不同参数的收敛情况分别设置学习率,该学习算法是一种学习率自适应的算法。

在第 t t t次迭代时候,先计算每个参数梯度平方的累计值:
G t = ∑ τ = 1 t ∇ θ , τ J ( θ ) ⊙ ∇ θ , τ J ( θ ) G_{t}=\sum_{\tau=1}^{t}\nabla_{\theta,\tau} J(\theta)\odot\nabla_{\theta,\tau} J(\theta) Gt=τ=1tθ,τJ(θ)θ,τJ(θ)

∇ θ , τ J ( θ ) \nabla_{\theta,\tau} J(\theta) θ,τJ(θ)指的是第 τ \tau τ次迭代时候的梯度。
此时AdaGrad算法的参数更新差值为
θ = θ − α G t + ϵ ⊙ ∇ θ J ( θ ) \theta= \theta-\frac{\alpha}{\sqrt{G_{t}+\epsilon}}\odot\nabla_{\theta}J(\theta) θ=θGt+ϵ αθJ(θ)

其中 α \alpha α是初始的学习率, ϵ \epsilon ϵ是为了保持数值稳定性而设置非常小的常数,一般取值 ϵ = e − 10 ∼ e − 7 \epsilon=e^{-10}\sim e^{-7} ϵ=e10e7。这里主要是为了防止除数为 0 0 0。此外,这里的开平方、除、加运算都是按元素进行操作。
在AdaGrad算法中,如果某个参数的偏导数累积比较大,其学习率相对较小;相反,如果其偏导数累积较小,其学习率相对较大。但是整体随着迭代次数的增加,学习率逐渐缩小。这种梯度下降算法最大的缺点是在经过一定次数之后依然没有找到最优点的时候,这时候的学习率已经非常小了,很难以继续找到最优点。Adagrad算法的一个主要优点是无需手动调整学习率。

2.4 RMSprop

RMSprop算法是Geoff Hinton提出的一种自适应学习率的方法,可以在有些情况下避免AdaGrad算法中学习率不断单调下降至于过早衰减的缺点。它和AdaGrad一样,都是起源于对AdaGrad的极速递减学习率问题上的求解。RMSprop算法首先计算每次迭代梯度 g t g_{t} gt平方的指数衰减移动的平均:
G t = β G t − 1 + ( 1 − β ) g t ⊙ g t G_{t}=\beta G_{t-1}+(1-\beta)g_{t}\odot g_{t} Gt=βGt1+(1β)gtgt

其中 β \beta β为衰减率,一般取 β = 0.9 \beta=0.9 β=0.9
梯度更新的表达式为
θ t + 1 = θ t − η G t + ϵ ⊙ g t \theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{G_{t}+\epsilon}}\odot g_{t} θt+1=θtGt+ϵ ηgt

同样的方法,RMSprop将学习率分解成为一个平方梯度的指数衰减的平均。 η \eta η指的是初始学习率的大小,一般取 η = 0.001 \eta=0.001 η=0.001

2.5AdaDelta

AdaDelta梯度下降算法是AdaGrad算法的一个改进。与RMSProp算法类似,AdaDelta算法通过梯度的平方的指数衰减移动平均来调整学习率。另外,AdaDelta算法还引入了每次参数更新差 Δ θ \Delta\theta Δθ的平方的指数衰减权移动平均。
在AdaDelta算法中,并不需要存储先前 w w w个平方梯度,而是将梯度的平方递归地表示成所有历史梯度平方的均值。在 t t t时刻的均值 E [ g t ] t E[g^{t}]_{t} E[gt]t只取决于先前的均值和当前的梯度( γ \gamma γ很类似于动量项):
G t = β G t − 1 + ( 1 − β ) g t ⊙ g t G_{t}=\beta G_{t-1}+(1-\beta)g_{t}\odot g_{t} Gt=βGt1+(1β)gtgt

一般取值 β = 0.9 \beta=0.9 β=0.9左右。第 t t t次迭代过程中每次参数更新的差:
Δ θ t 2 = β Δ θ t − 1 2 + ( 1 − β ) Δ θ t − 1 2 \Delta\theta^{2}_{t}=\beta\Delta\theta^{2}_{t-1}+(1-\beta)\Delta\theta^{2}_{t-1} Δθt2=βΔθt12+(1β)Δθt12

所以最终得到AdaDelta的梯度更新规则:
Δ θ t = − Δ θ t − 1 2 + ϵ G t + ϵ g t \Delta\theta_{t}=-\frac{\sqrt{\Delta\theta_{t-1}^{2}+\epsilon}}{\sqrt{G_{t}+\epsilon}}g_{t} Δθt=Gt+ϵ Δθt12+ϵ gt

θ t + 1 = θ t + 1 + Δ θ t \theta_{t+1}=\theta_{t+1}+\Delta\theta_{t} θt+1=θt+1+Δθt

2.6 Adam

自使用动量估计(Adaptive Moment Estimation,Adam算法)可以看作是动量法和RMSprop算法的结合版本,不仅能够使用动量作为参数更新方向,而且可以自适应调整学习率的大小。
Adam算法一方面计算梯度平方的指数加权平均(和RMSprop算法类似),另一方面计算梯度 g t g_{t} gt的指数加权平均(和动量的方法类似)。
M t = β 1 M t − 1 + ( 1 − β 1 ) g t M_{t}=\beta_{1}M_{t-1}+(1-\beta_{1})g_{t} Mt=β1Mt1+(1β1)gt

G t = β 2 G t − 1 + ( 1 − β 2 ) g t ⊙ g t G_{t}=\beta_{2}G_{t-1}+(1-\beta_{2})g_{t}\odot g_{t} Gt=β2Gt1+(1β2)gtgt

其中,参数一般取值 β 1 = 0.9 , β 2 = 0.99 \beta_{1}=0.9,\beta_{2}=0.99 β1=0.9,β2=0.99分别为两个移动平均的衰减率。
一般地, M t M_{t} Mt可以是看做梯度的均值(一阶矩), G t G_{t} Gt可以看作是梯度的未减去均值的方差(二阶矩)。
有些特殊情况需要对上面的值进行修正处理。假设 M 0 = 0 , G 0 = 0 M_{0}=0,G_{0}=0 M0=0,G0=0,那么在迭代初期 M t M_{t} Mt G t G_{t} Gt的值会比真实的均值和方差都要小。特别是当 β 1 \beta_{1} β1 β 2 \beta_{2} β2都接近于 1 1 1的时候,误差会很大,所以需要对偏差进行修正处理:
M ^ = M t 1 − β 1 t \hat M=\frac{M_{t}}{1-\beta_{1}^{t}} M^=1β1tMt

G ^ = G t 1 − β 2 t \hat G=\frac{G_{t}}{1-\beta_{2}^{t}} G^=1β2tGt

所以最终Adam算法的参数更新差值为:
Δ θ t = − η G ^ t + ϵ M ^ t \Delta\theta_{t}=-\frac{\eta}{\sqrt{\hat G_{t}+\epsilon}}\hat M_{t} Δθt=G^t+ϵ ηM^t

θ t + 1 = θ t + Δ θ t \theta_{t+1}=\theta_{t}+\Delta\theta_{t} θt+1=θt+Δθt

Adam算法是RMSprop算法与动量法的结合,所以自然也可以对Adam算法改进引入Nesterov加速度,称之为Nadam算法

2.7 Nadam

算法出处:IncorporatingNesterovMomentumintoAdam
NAdam算法是带有动量项的Adam算法,公式如下所示:
NAdam算法

NAdam算法对学习率有了更强的约束,同时对梯度的更新也有了更加直接的影响。一般情况下,使用带有动量项的RMSprop,或者是Adam的地方,NAdam方法能够取得更好的效果。

2.8 Adamax

算法出处:Adam: A Method for Stochastic Optimization
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。在Adam中,单个权重的更新规则是将其梯度与当前和过去梯度的 L 2 L^{2} L2范数(标量)成反比例缩放。将基于 L 2 L^{2} L2范数的更新规则泛化到基于 L p L^{p} Lp范数的更新规则中。虽然这样的变体会因为p的值较大而在数值上变得不稳定,但是在特例中,令 p → ∞ p\rightarrow\infty p会得出一个极其稳定和简单的算法。原论文中是这样描述这个算法的:
算法描述

下面推导 u t u_{t} ut。这里的衰减项等价为 β 2 p \beta_{2}^{p} β2p,并不是 β 2 \beta_{2} β2。令 p → ∞ p\rightarrow\infty p,并定义
u t = lim ⁡ p → ∞ ( v t ) 1 / p u_{t}=\lim\limits_{p\rightarrow\infty}(v_{t})^{1/p} ut=plim(vt)1/p

从而有
u t = lim ⁡ p → ∞ ( v t ) 1 / p = lim ⁡ p → ∞ ( ( 1 − β 2 p ) ∑ i = 1 t β 2 p ( t − i ) ⋅ ∣ g i ∣ p ) 1 / p = lim ⁡ p → ∞ ( 1 − β 2 p ) 1 / p ( ∑ i = 1 t β 2 p ( t − i ) ⋅ ∣ g i ∣ p ) 1 / p = lim ⁡ p → ∞ ( ∑ i = 1 t β 2 p ( t − i ) ⋅ ∣ g i ∣ p ) 1 / p = max ⁡ ( β 2 t − 1 ∣ g 1 , β 2 t − 2 ∣ g 2 , . . . , β 2 ∣ g t − 1 ∣ , ∣ g t ∣ ) u_{t}=\lim\limits_{p\rightarrow\infty}(v_{t})^{1/p}\\ =\lim\limits_{p\rightarrow\infty}((1-\beta_{2}^{p})\sum\limits_{i=1}^{t}\beta_{2}^{p(t-i)}\cdot{|g_{i}|^{p}})^{1/p}\\ =\lim\limits_{p\rightarrow\infty}(1-\beta_{2}^{p})^{1/p}(\sum\limits_{i=1}^{t}\beta_{2}^{p(t-i)}\cdot{|g_{i}|^{p}})^{1/p}\\ =\lim\limits_{p\rightarrow\infty}(\sum\limits_{i=1}^{t}\beta_{2}^{p(t-i)}\cdot{|g_{i}|^{p}})^{1/p}\\ =\max(\beta_{2}^{t-1}|g_{1},\beta_{2}^{t-2}|g_{2},...,\beta_{2}|g_{t-1}|,|g_{t}|) ut=plim(vt)1/p=plim((1β2p)i=1tβ2p(ti)gip)1/p=plim(1β2p)1/p(i=1tβ2p(ti)gip)1/p=plim(i=1tβ2p(ti)gip)1/p=max(β2t1g1,β2t2g2,...,β2gt1,gt)

所以相当于极其简单的迭代公式:
u t = max ⁡ ( β 2 ⋅ u t − 1 , ∣ g t ∣ ) u_{t}=\max(\beta_{2}\cdot{u_{t-1},|g_{t}|}) ut=max(β2ut1,gt)

初始值 u 0 = 0 u_{0}=0 u0=0。详细见原论文。

2.9 AdamW

算法出处:Fixing Weight Decay Regularization in Adam

AdamW算法是在 L 2 L_{2} L2正则化方向说明的。在论文Fixing Weight Decay Regularization in Adam中提到的一种修正Adam算法的一种算法。在标准的SGD算法中 L 2 L_{2} L2正则化等效于Weight decay,但是在自适应梯度下降算法中,Adam不再成立。所以,对Adam算法进行一个修正处理,即将Weight decay和损失函数耦合处理,从而提高Adam的泛化能力:

Δ θ t = − η G ^ t + ϵ ( α M ^ t + w W ) \Delta\theta_{t}=-\frac{\eta}{\sqrt{\hat G_{t}+\epsilon}}(\alpha \hat M_{t}+wW) Δθt=G^t+ϵ η(αM^t+wW)

2.10 AMSGrad

算法出处:On the Convergence of Adam and Beyond
对于Adam算法,也有不少抨击这种算法的失效性。论文The Marginal Value of Adaptive Gradient Methods in Machine Learning中对Adam算法进行很重的吐槽。文中详细谈到同样一个优化问题不同的优化算法可能会有不同的答案,但是自适应学习率算法很难以找到非常好的答案。用特定的数据例子进行说明,自适应算法会对前期出现的特征过拟合,后期才出现的特征很难纠正前期的拟合效果。论文On the Convergence of Adam and Beyond中详细说明了Adam算法中的缺点,并提出改进Adam的算法,算法流程如下所示:
算法描述
文中也指出自适应优化算法训练处的结果通常并没有SGD算法更好,尽管自适应优化算法在训练的时候表现起来更好,但是慎重使用,很多情况下这种自适应学习率的算法会导致过学习的现象,生成的模型整体分布是有些过拟合。

3. 优化算法的实现与比较

最典型的形象化比较各个算法的优化程度以及算法收敛性、逃离鞍点等图如下所示(图片来自于 斯坦福CS231 Lecture7):
opt1图片
opt2图片

在实现各个算法的同时,笔者用theano实现了多种优化算法,并且在自然语言处理数据集SemEval-2014 Task 1上使用循环神经网络做了一些详细实验,详细见笔者github
另外,用经典的手写体数字数据集进行了各种算法的比较,实验结果如下所示:

损失函数值表示
(图片来自于[2])

各种优化算法小结

综上所述,优化算法可以用下面的公式统一概括:
Δ θ t = − α t G t + ϵ M t G t = ψ ( g 1 , . . . , g t ) M t = ϕ ( g 1 , . . . , g t ) \Delta\theta_{t}=-\frac{\alpha_{t}}{\sqrt{G_{t}+\epsilon}}M_{t}\\ G_{t}=\psi(g_{1},...,g_{t})\\ M_{t}=\phi(g_{1},...,g_{t}) Δθt=Gt+ϵ αtMtGt=ψ(g1,...,gt)Mt=ϕ(g1,...,gt)

上面的式子中, g t g_{t} gt是第 t t t步的梯度; α t \alpha_{t} αt是第 t t t步的学习率,可以衰减,也可以不变; ψ ( . ) \psi(.) ψ(.)是学习率缩放函数,取 1 1 1或者是梯度模的移动平均; ϕ ( . ) \phi(.) ϕ(.)是优化后的参数更新方向,可以是当前梯度 g t g_{t} gt或者历史梯度的移动平均。我们可以最终总结出下面的优化方法表:

类别 优化算法
固定衰减学习率 分段常数衰减、逆时衰减、(自然)指数衰减、余弦衰减
周期性衰减 循环学习率、SGDR
自适应学习率 AdaGrad、RMSprop、AdaDelta
梯度估计修正方法 动量法、Nesterov加速度
综合方法 Adam类的算法 ≈ \approx 动量方法+RMSprop

在实际问题应用中,注意适合使用这些优化算法。SGD是最基本的优化算法,在这个基础之上加入了动量法和加速度方法等等。有些特定的问题中注意这些优化算法的过拟合效应,应当具体问题具体分析和应用。

参考文献

[1] An overview of gradient descent optimization algorithms
[2] 神经网络与深度学习,邱锡鹏
[3] 斯坦福CS231 Lecture7
[4] 梯度下降优化算法综述
[5] RMSprop算法网址

猜你喜欢

转载自blog.csdn.net/Zhang_Pro/article/details/105232195
今日推荐