梯度下降优化算法(优化器Momentum,Adagrad,Adadelta,Adam)

1、前言

梯度下降是神经网络优化应用最多的算法。

梯度下降法分成三类,batch GD,stochastic GD,mini-batch GD.
三者分别是使用全量样本、随机一个样本、部分样本计算梯度。

普通的mini-batch GD,不能保证好的收敛。
一些挑战如下:

  • 选择好的学习率;
  • 学习率规划,在拟合后期,尽量减少学习率;
  • 尽量避免在非凸函数(神经网络)时陷入局部最优。

以下是梯度下降优化算法介绍:

2、动量(Momentum)

动量算法,目的是为了让SGD尽可能地跳出局部最优值。

v t = γ v t − 1 + η ∇ θ J ( θ ) θ = θ − v t v_t = \gamma v_{t-1} + \eta \nabla_\theta J( \theta) \\ \theta = \theta - v_t vt=γvt1+ηθJ(θ)θ=θvt
可以看出,和传统的SGD相比,增加了一个动量系数 γ γ γ,给上一步算出的梯度一定的权重(类似惯性);

一般,动量系数 γ γ γ设为0.9;也就是说,更新的部分占比更多,更加容易走出局部最优。

3、Adagrad

对每次更新的不同参数 θ i \theta_i θi使用不同的学习率;频繁出现的特征会使用小的学习率,适用处理稀疏数据。研究发现,Adagrad能提高SGD的鲁棒性。

学习率和过去的梯度有关。

g t , i = ∇ θ J ( θ t , i ) θ t + 1 , i = θ t , i − η G t , i i + ϵ ⋅ g t , i g_{t, i}=\nabla_{\theta} J\left(\theta_{t, i}\right) \\ \theta_{t+1, i} = \theta_{t, i} - \dfrac{\eta}{\sqrt{G_{t, ii} + \epsilon}} \cdot g_{t, i} gt,i=θJ(θt,i)θt+1,i=θt,iGt,ii+ϵ ηgt,i
G t ∈ R d × d G_{t} \in \mathbb{R}^{d \times d} GtRd×d是对角矩阵,对角元素是参数 θ i \theta_i θi的梯度平方和。

等价的另一种表达:
θ t + 1 = θ t − η G t + ϵ ⊙ g t \theta_{t+1} = \theta_{t} - \dfrac{\eta}{\sqrt{G_{t} + \epsilon}} \odot g_{t} θt+1=θtGt+ϵ ηgt
缺点
由于 G 是梯度的平方和,所以会不断的累加,最终导致学习率很低,以至于学不到什么东西。

4、 Adadelta

针对Adagrad的缺点,Adadelta 的学习率是和一定长度的积累梯度有关,也就是增加了一个控制计算积累梯度的参数 ω ω ω

定义一个之前梯度的平均和现在梯度的线性和,并称为衰减平均值:
E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) g t 2 E[g^2]_t = \gamma E[g^2]_{t-1} + (1 - \gamma) g^2_t E[g2]t=γE[g2]t1+(1γ)gt2

因此,用 E 代替 G,有:
Δ θ t = − η E [ g 2 ] t + ϵ g t \Delta \theta_t = - \dfrac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_{t} Δθt=E[g2]t+ϵ ηgt

5. RMSprop

E [ g 2 ] t = 0.9 E [ g 2 ] t − 1 + 0.1 g t 2 θ t + 1 = θ t − η E [ g 2 ] t + ϵ g t \begin{aligned} E\left[g^{2}\right]_{t} &=0.9 E\left[g^{2}\right]_{t-1}+0.1 g_{t}^{2} \\ \theta_{t+1} &=\theta_{t}-\frac{\eta}{\sqrt{E\left[g^{2}\right]_{t}+\epsilon}} g_{t} \end{aligned} E[g2]tθt+1=0.9E[g2]t1+0.1gt2=θtE[g2]t+ϵ ηgt

和Adadelta一样,都是为了解决Adagrad的学习率变得很小的问题。

6. Adam(Adaptive Moment estimation)

自适应时刻估计,对学习率进行自动学习。

它主要是,对过去平方梯度的指数衰减平均值,(这个Adadelta也是这样做),同时,Adam 会保持过去梯度的指数衰减平均值。(这个和动量算法是一样的)
m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \\ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2

m t , v t m_t,v_t mt,vt分别计算梯度的均值和方差,初始化都是 0 向量。

并且进行偏差修正,
m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t \hat{m}_t = \dfrac{m_t}{1 - \beta^t_1} \\ \hat{v}_t = \dfrac{v_t}{1 - \beta^t_2} m^t=1β1tmtv^t=1β2tvt

Adam的更新:
θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_{t} - \dfrac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt+1=θtv^t +ϵηm^t

7. AdaMax

p函数的衰减:
v t = β 2 p v t − 1 + ( 1 − β 2 p ) ∣ g t ∣ p v_{t}=\beta_{2}^{p} v_{t-1}+\left(1-\beta_{2}^{p}\right)\left|g_{t}\right|^{p} vt=β2pvt1+(1β2p)gtp

如果是无穷范数:
u t = β 2 ∞ v t − 1 + ( 1 − β 2 ∞ ) ∣ g t ∣ ∞ = max ⁡ ( β 2 ⋅ v t − 1 , ∣ g t ∣ ) \begin{aligned} u_{t} &=\beta_{2}^{\infty} v_{t-1}+\left(1-\beta_{2}^{\infty}\right)\left|g_{t}\right|^{\infty} \\ &=\max \left(\beta_{2} \cdot v_{t-1},\left|g_{t}\right|\right) \end{aligned} ut=β2vt1+(1β2)gt=max(β2vt1,gt)

8. Nadam

g t = ∇ θ t J ( θ t ) m t = γ m t − 1 + η g t θ t + 1 = θ t − m t \begin{aligned} g_{t} &=\nabla_{\theta_{t}} J\left(\theta_{t}\right) \\ m_{t} &=\gamma m_{t-1}+\eta g_{t} \\ \theta_{t+1} &=\theta_{t}-m_{t} \end{aligned} gtmtθt+1=θtJ(θt)=γmt1+ηgt=θtmt

θ t + 1 = θ t − ( γ m t − 1 + η g t ) \theta_{t+1}=\theta_{t}-\left(\gamma m_{t-1}+\eta g_{t}\right) θt+1=θt(γmt1+ηgt)

9. 其他

AdamW:和Adam类似,只是加上weight decay的实现有点区别:
梯度下降优化算法(优化器Momentum,Adagrad,Adadelta,Adam)_第1张图片
ASGD: 平均的SGD

LBFGS:


参考:

  1. 推荐 梯度优化算法;
  2. ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION;
  3. pytorch;
  4. hinton course ppt;

你可能感兴趣的:(算法)