深度学习常见优化器(Optimizer)总结

222 阅读3分钟

朴素优化器

最朴素的思想就是将整个数据集计算出一个梯度,并进行更新。这就是Batch Gradient Descent

W=WηgW = W-\eta * g

参数:W为权重,η\eta为学习率,g为当前梯度
缺点:一个数据集仅计算一次梯度,梯度没有变化,模型无法很好拟合数据

当然我们也可以每一个样本都更新一次,这就是Stochastic Gradient Descent(SGD)

Wt+1=WtηgtW_{t+1} = W_{t}-\eta * g_t

参数:0<=t<M, M为数据集样本量
缺点:样本梯度方差大,容易受异常点影响,难以拟合

或者,每N个样本更新一次会不会更好Mini-Batch Gradient Descent

Wt+1=WtηgtW_{t+1} = W_{t}-\eta * g_t

参数:0<=t<M/bz, M为数据集样本量,bz为batch size
缺点:在鞍点处梯度为0,容易陷入局部最优解。针对不同的特征都更新相同的步长,对稀疏数据表现不好。

优化

本质上优化器的更新可以分为两个方面,第一个方面是针对容易陷入鞍点、局部最优解;第二个方面是针对不同的特征进行自适应优化

动量家族-针对第一个方向

在Mini-Batch SGD(后简称SGD)上,加入动量概念。可以冲出鞍点,冲出局部最优,这就是Momentum

vt=vt1+gtWt+1=Wtηvtv_t = v_{t-1} + g_t \\ W_{t+1} = W_{t}-\eta * v_t

参数:vt1v_{t-1}是上一刻的参数更新向量
缺点:容易冲过头
本质:信任过去的梯度方向

既然过去的梯度方向值得信赖,那我直接按过去方向走一步再计算梯度岂不是更好?Nesterov Accelerated Gradient(NAG)

vt=vt1+gt+1Wt+1=Wtηvtv_t = v_{t-1} + g_{t+1}\\ W_{t+1} = W_{t}-\eta * v_t

gt+1g_{t+1}的计算:

Wt+1=Wtηvt1gt+1=J(Wt+1;xt)W'_{t+1} = W_{t} - \eta * v_{t-1} \\ g_{t+1} = \nabla J(W'_{t+1};x_{t})\\

参数:Wt+1W'_{t+1}是按过去梯度方向走一步后的模型参数,仅用计算梯度值,并不真正更新模型
本质:信赖过去积累的梯度方向,相信在该方向上移动后计算的梯度会更加准确。
缺点:慢

自适应家族

既然担心一部分特征更新太频繁,那我计算一个值来抑制他们的更新不就行了?AdaGrad

方法:将梯度除以过去的平方和。

Gt=Gt1+gt2Wt+1=WtηgtGtG_t = G_{t-1} + g_t^2\\ W_{t+1} = W_{t}-\frac {\eta * g_t}{\sqrt{G_t}}

参数:GtG_t是一个积累的平方和
缺点:显然随着训练过程的进行,GtG_t会越来越大,导致后面模型更新得越来越慢
本质:出现更频繁或梯度更大的特征,积累的平方和就越大,因此这部分特征更新的就会越来越慢。通过抑制这部分特征的更新,让稀疏特征有更多机会贡献对模型参数的更新中。\

加个权重来控制平方和的积累 RMSProp

Gt=βGt1+(1β)gt2G_t = \beta G_{t-1} + (1-\beta)g_t^2\\
Wt+1=WtηgtGtW_{t+1} = W_{t}-\frac {\eta * g_t}{\sqrt{G_t}}

参数:β\beta是一个权重,控制平方和的衰减 本质:将累计改为移动指数平均,忽略太久之前的梯度的影响

动量和自适应结合

既然动量有效,自适应有效,为什么不都用起来?Adam

结合动量和自适应梯度,引入β1\beta_1控制动量的积累,β2\beta_2控制平方和的积累:

vt=β1vt1+(1β1)gtv_t = \beta_1 v_{t-1} + (1-\beta_1 )gt
Gt=β2Gt1+(1β2)gt2G_t = \beta_2 G_{t-1} + (1-\beta_2)g_t^2

前期动量和平方和的积累都很小,因此需要根据训练过程纠正beta值,前期尽量少使用积累值:

vt=vt1β1tv_t = \frac{v_t}{1-\beta_1^t} \\
Gt=Gt1β2tG'_t = \frac{\sqrt{G_t}}{1-\beta_2^t} \\

最终的梯度更新公式为

Wt+1=WtηvtGtW_{t+1} = W_t - \frac{ \eta * vt}{G'_t}

参数: β1\beta_1控制动量积累, β2\beta_2控制平方和积累
本质:结合动量和自适应