最全深度学习优化器详解

本文详细介绍了深度学习中常用的优化算法,包括批量梯度下降(BGD)、小批量梯度下降(MBGD)、随机梯度下降(SGD)以及一阶动量的Momentum和NAG方法。接着,文章讨论了自适应学习率的Adagrad、RMSProp算法,并最终引出了结合一阶和二阶动量的Adam优化器,它是现代深度学习中的主流选择。这些优化器通过不同的方式调整学习率,以提高模型训练的效率和准确性。
摘要由CSDN通过智能技术生成

优化器

BGD

每次用整个批次的数据来计算梯度:
θ = θ − η ▽ θ L \theta = \theta -\eta \triangledown_\theta L θ=θηθL

for i in range(nb_epochs):
	params_grad = evaluate_gradient(loss_function, data, params)
	params = params - learning_rate * params_grad

MBGD

MBGD 每一次利用一小批样本,即 n 个样本进行计算梯度更新值:
θ = θ − η ▽ θ L ( f ( x ( i : i + n ) ) , ( y ( i : i + n ) ) ) \theta = \theta -\eta \triangledown_\theta L(f(x^{(i:i+n)}),(y^{(i:i+n)})) θ=θηθL(f(x(i:i+n)),(y(i:i+n)))

for i in range(epochs):
	np.random.shuffle(data)
    for batch in get_batches(data, batch_size=50):
        params_grad = evaluate_gradient(loss_function, batch, params)
        params = params - learning_rate * params_grad

SGD

每次随机选择一个样本,对 θ \theta θ进行更新:
θ = θ − η ▽ θ L ( f ( x i ) , y i ) \theta = \theta -\eta \triangledown_\theta L(f(x_i),y_i) θ=θηθL(f(xi),yi)

for i in range(nb_epochs):
    np.random.shuffle(data)
    for example in data:
        params_grad = evaluate_gradient(loss_function, example, params)
        params = params - learning_rate * params_grad

从下面的优化器开始需要用到一阶动量和二阶动量的指数加权平均:
一阶动量的指数加权平均记为 m t m_t mt
二阶动量的指数加权平均记为 v t v_t vt

Momentum

让梯度在下降速度快的地方速度更快,相当于加上惯性,实现方式是参数不仅要减去当前梯度,还要减去历史梯度更新方向的指数加权平均
g t = ▽ θ L m t = γ m t − 1 + η g t θ = θ − m t g_t=\triangledown_\theta L\\ m_t=\gamma m_{t-1}+\eta g_t\\ \theta = \theta - m_t gt=θLmt=γmt1+ηgtθ=θmt

NAG(Nesterov Accelerated Gradient)

与Momentum相似,只不过是在未来的位置上计算梯度 g t g_t gt
g t = ▽ θ L ( θ − γ m t − 1 ) m t = γ m t − 1 + η g t θ = θ − m t g_t=\triangledown_\theta L(\theta-\gamma{m_{t-1}})\\ m_t=\gamma m_{t-1}+\eta g_t\\ \theta = \theta - m_t gt=θL(θγmt1)mt=γmt1+ηgtθ=θmt
唯一的区别就是当前梯度是在减去了上一刻历史梯度的指数加权平均值之后进行计算的,这就是所谓的在未来位置上进行计算梯度。


上面的方法学习率不会根据训练的推进而改变

Adagrade

在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,学习率下降的幅度较小,梯度更新的更快),并且能够使得陡峭的方向变得平缓,从而加快训练速度。
如图,假设两个参数w和b,明显梯度在b方向更陡峭,在w方向更平缓,绿色代码MBGD方法更新路线,该方法无论梯度平缓还是陡峭,学习率都不改变,红色代表Adagrade,梯度平缓时(w方向),更新的更快,梯度陡峭时(b方向),更新更慢:

Adagrad根据二阶动量的指数加权平均的倒数对学习率进行更新,学习率会随着二阶动量的积累逐渐变小:
g t = ▽ θ L v t = v t − 1 + g t ⋅ g t △ θ = − η δ + v t g t θ t = θ t − 1 + △ θ g_t=\triangledown_\theta L\\ v_t=v_{t-1}+g_t\cdot g_t\\ \triangle\theta = -\frac{\eta}{\delta+\sqrt{v_t}}g_t\\ \theta_t = \theta_{t-1} + \triangle \theta gt=θLvt=vt1+gtgtθ=δ+vt ηgtθt=θt1+θ

RMSProp

Adagrad随着梯度平方和的累积,使得学习率急速下降,所以引入RMSProp,作为改进版,唯一的区别就是 v t v_t vt的计算:
g t = ▽ θ L v t = ρ v t − 1 + ( 1 − ρ ) g t ⋅ g t △ θ = − η δ + v t g t θ t = θ t − 1 + △ θ g_t=\triangledown_\theta L\\ v_t=\rho v_{t-1}+(1-\rho)g_t\cdot g_t\\ \triangle\theta = -\frac{\eta}{\delta+\sqrt{v_t}}g_t\\ \theta_t = \theta_{t-1} + \triangle \theta gt=θLvt=ρvt1+(1ρ)gtgtθ=δ+vt ηgtθt=θt1+θ
RMSProp算法不是像AdaGrad算法那样暴力直接的累加平方梯度,而是加了一个衰减系数 ρ \rho ρ来控制历史信息的获取多少:
v t = ρ v t − 1 + ( 1 − ρ ) g t ⋅ g t v_t=\rho v_{t-1}+(1-\rho)g_t\cdot g_t vt=ρvt1+(1ρ)gtgt

Adam

Adam是RMSProp和Momentum的结合:
首先计算一阶动量和二阶动量的指数加权平均值
g t = ▽ θ L m t = η ( β 1 m t − 1 + ( 1 − β 1 ) g t ) v t = η ( β 2 v t − 1 + ( 1 − β 2 ) g t 2 ) g_t=\triangledown_\theta L\\ m_t=\eta(\beta_1 m_{t-1}+(1-\beta_1) g_t)\\ v_t=\eta(\beta_2 v_{t-1}+(1-\beta_2) g_t^2) gt=θLmt=η(β1mt1+(1β1)gt)vt=η(β2vt1+(1β2)gt2)

注意到,在迭代初始阶段, m t m_t mt v t v_t vt 有一个向初值的偏移(过多的偏向了 0)。因此,可以对一阶和二阶动量做偏置校正 (bias correction):
m ^ t = m t 1 − β 1 \hat{m}_t=\frac{m_t}{1-\beta_1} m^t=1β1mt
v ^ t = v t 1 − β 2 \hat{v}_t=\frac{v_t}{1-\beta_2} v^t=1β2vt
用校正后的值更新参数:
θ t = θ t − 1 − 1 δ + v ^ t m ^ t \theta_t = \theta_{t-1} -\frac{1}{\delta+\sqrt{\hat{v}_t}}\hat{m}_t θt=θt1δ+v^t 1m^t

参考

https://zhuanlan.zhihu.com/p/32626442
https://www.cnblogs.com/guoyaohua/p/8542554.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值