梯度下降是神经网络优化应用最多的算法。
梯度下降法分成三类,batch GD,stochastic GD,mini-batch GD.
三者分别是使用全量样本、随机一个样本、部分样本计算梯度。
普通的mini-batch GD,不能保证好的收敛。
一些挑战如下:
以下是梯度下降优化算法介绍:
动量算法,目的是为了让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=γvt−1+η∇θJ(θ)θ=θ−vt
可以看出,和传统的SGD相比,增加了一个动量系数 γ γ γ,给上一步算出的梯度一定的权重(类似惯性);
一般,动量系数 γ γ γ设为0.9;也就是说,更新的部分占比更多,更加容易走出局部最优。
对每次更新的不同参数 θ 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,i−Gt,ii+ϵη⋅gt,i
G t ∈ R d × d G_{t} \in \mathbb{R}^{d \times d} Gt∈Rd×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=θt−Gt+ϵη⊙gt
缺点
由于 G 是梯度的平方和,所以会不断的累加,最终导致学习率很低,以至于学不到什么东西。
针对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]t−1+(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
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]t−1+0.1gt2=θt−E[g2]t+ϵηgt
和Adadelta一样,都是为了解决Adagrad的学习率变得很小的问题。
自适应时刻估计,对学习率进行自动学习。
它主要是,对过去平方梯度的指数衰减平均值,(这个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=β1mt−1+(1−β1)gtvt=β2vt−1+(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=θt−v^t+ϵηm^t
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=β2pvt−1+(1−β2p)∣gt∣p
如果是无穷范数:
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=β2∞vt−1+(1−β2∞)∣gt∣∞=max(β2⋅vt−1,∣gt∣)
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)=γmt−1+ηgt=θt−mt
θ 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−(γmt−1+ηgt)
AdamW:和Adam类似,只是加上weight decay的实现有点区别:
ASGD: 平均的SGD
LBFGS:
参考: