常见优化器Optimizer总结
文章目录
- 优化器 Optimizer
- 1. 梯度下降 (Gradient Descent, GD)
- 2. 批量梯度下降 (Batch Gradient Descent, BGD)
- 3. 小批量梯度下降 (Mini-batch Gradient Descent, MBGD)
- 4. 随机梯度下降 (Stochastic Gradient Descent, SGD)
- 带动量的随机梯度下降
- 使⽤Nesterov动量的SGD
- 5.RMSProp - Root Mean Square Propagation
- 6.⾃适应矩估计Adam - Adaptive Moment Estimation
- 7.AdamW(Adam with Weight Decay Fix)
优化器 Optimizer
在 PyTorch 中,优化器(optimizer)是⽤于更新神经⽹络参数的⼯具
,它会根据计算得到的损失函数的梯度来调整模型的参数,通常是以最⼩化损失函数来改进模型的性能 。结合着计算图在运⾏时动态更新张量(模型参数)的需要,PyTorch 已实现了所有主流的优化器算法。
我们从最基础的梯度下降开始,⼀步步了解并掌握开发中常⽤的优化器。
1. 梯度下降 (Gradient Descent, GD)
模型参数为 W W W,代价函数为 J ( W t ) J(W_t) J(Wt),则代价函数关于模型参数的偏导数即相关梯度为 Δ J ( W t ) \Delta J(W_t) ΔJ(Wt),学习率为 η t \eta_t ηt,则使用梯度下降法更新参数为:
W t + 1 = W t − η t Δ J ( W t ) W_{t+1} = W_t - \eta_t \Delta J(W_t) Wt+1=Wt−ηtΔJ(Wt)
对于 t + 1 t + 1 t+1 时刻的模型参数 W W W,它的取值决定于 t t t 时刻的参数值加上负的学习率 η \eta η 乘以梯度值。
特点:
- 训练速度慢
- 容易陷入局部最优解
2. 批量梯度下降 (Batch Gradient Descent, BGD)
批量梯度下降法是最原始的形式,就是指在每一次训练迭代时
使用所有样本
来进行梯度的更新。参数的更新方式和 GD
一样。
特点:
- 理想状态下经充分训练,梯度可以达到全局最优
- 缺点是不适合大样本和大模型
3. 小批量梯度下降 (Mini-batch Gradient Descent, MBGD)
模型样本的总批次为 n n n,把自变量 X X X 和因变量 Y Y Y 拆分为 X ( i ) X^{(i)} X(i) 和 Y ( i ) Y^{(i)} Y(i) 批样本。学习率 η t \eta_t ηt 和梯度的计算方式和 GD
一致。但 Δ J i \Delta J_i ΔJi 计算的是 X ( i ) X^{(i)} X(i)、 Y ( i ) Y^{(i)} Y(i) 批次下的梯度,因此模型参数的调整更新与当前批次样本得到的损失函数值相关。
W t + 1 = W t − η t ∑ i = 1 n Δ J i ( W t , X ( i ) , Y ( i ) ) W_{t+1} = W_t - \eta_t \sum_{i=1}^n \Delta J_i (W_t, X^{(i)}, Y^{(i)}) Wt+1=Wt−ηti=1∑nΔJi(Wt,X(i),Y(i))
特点:
- 训练速度比GD快
- 通过批次大小(batch size)控制模型训练速度
4. 随机梯度下降 (Stochastic Gradient Descent, SGD)
在每次训练迭代时,通过打乱样本原始排序实现随机梯度下降。这种方法也可以看作增强模型泛化能力的手段。
实际上深度学习中最常用的SGD优化器是随机小批量梯度下降(Stochastic Mini-batch Gradient Descent)的混合形式:
- 结合了SGD的随机性
- 保留了MBGD的小批量特性
数学表示:
W t + 1 = W t − η t Δ J i ( W t , X ( i ) , Y ( i ) ) W_{t+1} = W_t - \eta_t \Delta J_i (W_t, X^{(i)}, Y^{(i)}) Wt+1=Wt−ηtΔJi(Wt,X(i),Y(i))
其中 ( X ( i ) , Y ( i ) ) (X^{(i)}, Y^{(i)}) (X(i),Y(i))表示随机选取的小批量样本
特点:
- 引入随机性有助于逃离局部最优
- 适合大规模数据集训练
- 需要仔细调整学习率 η t \eta_t ηt
1.计算梯度:找到当前点的斜率
2.更新参数:往下降方向走一步
3.使用随机样本(SGD):不计算全部数据,只用一部分
4.重复这个过程,直到找到最低点(最优解)
- 计算过程
-
输入参数说明
- ( l r ) (lr) (lr):学习率,控制参数更新的步长。
- θ 0 \theta_0 θ0 ( p a r a m s ) (params) (params):初始参数值。
- f ( θ ) f(\theta) f(θ) ( o b j e c t i v e ) (objective) (objective):目标函数,需要优化(最大化或最小化)的函数。
- λ \lambda λ ( w e i g h t d e c a y ) (weight\ decay) (weight decay):权重衰减系数,用于防止过拟合,对参数进行惩罚。
- μ \mu μ ( m o m e n t u m ) (momentum) (momentum):动量系数,用于加速收敛,模拟物理中的动量概念。
- τ \tau τ ( d a m p e n i n g ) (dampening) (dampening):阻尼系数,调整动量更新时的影响。
- nesterov:一个布尔值,指示是否使用Nesterov加速梯度法。
- maximize:一个布尔值,指示是最大化还是最小化目标函数。
-
计算过程步骤
-
初始化循环:从 t = 1 t = 1 t=1 开始迭代训练,直到满足指定的循环条件。
-
计算梯度:
g t ← ∇ f t ( θ t − 1 ) g_t \leftarrow \nabla f_t(\theta_{t-1}) gt←∇ft(θt−1)
计算目标函数 f f f 在当前参数 θ t − 1 \theta_{t-1} θt−1 处的梯度 g t g_t gt。 -
权重衰减:
- 如果 λ ≠ 0 \lambda \neq 0 λ=0,执行 g t ← g t + λ θ t − 1 g_t \leftarrow g_t + \lambda \theta_{t-1} gt←gt+λθt−1,将权重衰减项加入梯度中,使得参数更新时考虑对参数大小的惩罚。
权重衰减 weight decay
权重衰减是通过对模型参数施加⼀个约束,来提升模型的泛化能⼒。模型在训练数据上表现的过好是,可能学习到的是⽆关特征。权重衰减通过惩罚较⼤的参数值,迫使模型参数趋于更⼩更平滑的参数值。这种惩罚也可以理解为:抑制模型对训练数据的“记忆ˮ,提升模型
对未知数据的泛化能⼒
-
动量更新:
- 如果 μ ≠ 0 \mu \neq 0 μ=0,说明使用动量:
- 当 t = 1 t = 1 t=1 时, b t ← g t b_t \leftarrow g_t bt←gt,因为没有上一时刻的动量,直接将当前梯度作为动量。
- 当 t > 1 t > 1 t>1 时, b t ← μ b t − 1 + ( 1 − τ ) g t b_t \leftarrow \mu b_{t-1} + (1 - \tau) g_t bt←μbt−1+(1−τ)gt,结合上一时刻的动量项 b t − 1 b_{t-1} bt−1 和当前梯度 g t g_t gt 计算当前动量项 b t b_t bt,起到阻尼作用。
- Nesterov加速梯度处理:
- 如果 nesterov 为真, g t ← g t + μ b t g_t \leftarrow g_t + \mu b_t gt←gt+μbt,对梯度进行Nesterov修正,提前考虑下一时刻的动量影响。
- 否则, g t ← b t g_t \leftarrow b_t gt←bt,直接使用计算得到的动量项作为更新梯度。
- 如果 μ ≠ 0 \mu \neq 0 μ=0,说明使用动量:
-
参数更新:
- 如果 maximize 为真, θ t ← θ t − 1 + γ g t \theta_t \leftarrow \theta_{t-1} + \gamma g_t θt←θt−1+γgt,朝着梯度上升的方向更新参数以最大化目标函数。
- 否则, θ t ← θ t − 1 − γ g t \theta_t \leftarrow \theta_{t-1} - \gamma g_t θt←θt−1−γgt,朝着梯度下降的方向更新参数以最小化目标函数。
- 返回结果:循环结束后,返回最终的参数 θ t \theta_t θt。
-
带动量的随机梯度下降
具有动量(momentum)的SGD是⽤于提⾼神经⽹络性能的优化器之⼀
带有动量的SGD,就是在连续的梯度更新过程中,将之前的梯度项通过动量⽽建⽴起关联,让每⼀次的梯度更新都不再孤⽴。也就是让每⼀次的参数更新⽅向都不再仅取决于当前位置的梯度,还会受到上⼀次参数更新⽅向的影响
-
动量的作用:
- 动量可以帮助优化器在梯度下降过程中更快地收敛,尤其是在梯度变化较大的情况下。
- 它通过累积之前的梯度信息,使得参数更新不仅依赖于当前的梯度,还考虑了之前的梯度方向,从而减少震荡和提高收敛速度。
-
动量的计算:
- 在每次迭代中,动量会根据当前梯度和之前的动量进行更新。
- 具体来说,动量的更新公式为:
v t = μ v t − 1 + η ∇ J ( θ t − 1 ) v_t = \mu v_{t-1} + \eta \nabla J(\theta_{t-1}) vt=μvt−1+η∇J(θt−1)
其中, v t v_t vt 是当前的动量, μ \mu μ 是动量系数, η \eta η 是学习率, ∇ J ( θ t − 1 ) \nabla J(\theta_{t-1}) ∇J(θt−1) 是当前梯度。 - 然后,参数更新公式为:
θ t = θ t − 1 − v t \theta_t = \theta_{t-1} - v_t θt=θt−1−vt
-
动量系数:
- 动量系数 μ \mu μ 通常取值在 0.5 0.5 0.5 到 0.99 0.99 0.99 之间。
- 较大的动量系数可以使得优化器更快地收敛,但也可能导致震荡;较小的动量系数则会使得优化器更加稳定,但收敛速度较慢。
-
使⽤动量的SGD优势
- 动量⽐随机梯度下降快,训练也⽐ SGD 快。
- 由于涉及到动量,可以逃离局部最⼩值的可能并达到全局最⼩值。
在动图中,我们可以看到紫⾊是具有动量的SGD,浅蓝⾊是没有动量的SGD,具有动量的SGD可以达到全局最⼩值,⽽SGD则停留在局部最⼩值。 但有⼀个问题,动量本⾝有时可能是⼀个问题,因为达到全局最⼩值后的⾼动量仍在波动,需要⼀些时间才能稳定在全局最⼩值。这种⾏为会导致时间消耗,这使得动量 SGD ⽐其他优化慢,但仍然⽐ SGD 快。
惯性存在的同时有好处也有坏处,紫色小球需要更大的衰减,更长时间的震荡才能停下来
使⽤Nesterov动量的SGD
Nesterov动量是对传统动量的改进,主要通过提前计算梯度来提高收敛速度。
- Nesterov动量的原理:
Nesterov动量在计算梯度时,不是直接使用当前参数,而是先根据当前动量预测下一个参数位置,然后在这个位置计算梯度。这样可以更好地利用动量信息,减少震荡。 - Nesterov动量的计算:
- 在每次迭代中,先计算预测位置:
θ p r e d = θ t − 1 − μ v t − 1 \theta_{pred} = \theta_{t-1} - \mu v_{t-1} θpred=θt−1−μvt−1
其中, v t − 1 v_{t-1} vt−1 是上一次的动量。 - 然后,在预测位置计算梯度:
g t = ∇ J ( θ p r e d ) g_t = \nabla J(\theta_{pred}) gt=∇J(θpred) - 最后,更新动量和参数:
v t = μ v t − 1 + η g t v_t = \mu v_{t-1} + \eta g_t vt=μvt−1+ηgt
θ t = θ t − 1 − v t \theta_t = \theta_{t-1} - v_t θt=θt−1−vt
- 在每次迭代中,先计算预测位置:
- Nesterov动量的优势:
- Nesterov动量可以更快地收敛,尤其是在梯度变化较大的情况下。
- 它通过提前计算梯度,使得参数更新更加准确,从而减少震荡和提高收敛速度。
但是,在随机梯度的情况下,Nesterov动量没有改进收敛率。
5.RMSProp - Root Mean Square Propagation
RMSProp 的核⼼思想是保持梯度平⽅的移动平均,并使⽤这个移动平均值来调整学习率,从⽽使参数更新更加稳定和⾼效。
算法引⼊⼀个类似于Momentum中的衰减系数r,让r每回合都衰减⼀定⽐例。
-
输入参数
- α \alpha α:用于计算梯度平方的平滑系数
- γ \gamma γ ( l r ) (lr) (lr):学习率,控制参数更新步长
- θ 0 \theta_0 θ0:模型初始参数
- f ( θ ) f(\theta) f(θ):目标函数
- λ \lambda λ:权重衰减系数
-
模型训练相关要素
- μ \mu μ:动量系数
- centered:布尔值,指示是否计算中心梯度
- c c c:平滑项,防止分母为零
-
参数初始化
- v 0 ← 0 v_0 \leftarrow 0 v0←0:初始化平方梯度的指数加权平均值
- b 0 ← 0 b_0 \leftarrow 0 b0←0:初始化动量缓冲区
- g 0 a v e ← 0 g_0^{ave} \leftarrow 0 g0ave←0:初始化平均梯度(用于中心梯度计算)
-
计算过程步骤
- 初始化循环
- 从 t = 1 t = 1 t=1 开始迭代训练,直到满足指定的循环条件。
- 计算当前梯度
- g t ← ∇ f ( t ) ⋅ ( f t − 1 ) g_t \leftarrow \nabla f(t) \cdot (f_{t-1}) gt←∇f(t)⋅(ft−1)
对目标函数 f f f 在参数 θ t − 1 \theta_{t-1} θt−1 处求梯度,得到当前梯度 g t g_t gt。
- 权重衰减处理
- 若 λ ≠ 0 \lambda \neq 0 λ=0,执行 g t ← g t + λ θ t − 1 g_t \leftarrow g_t + \lambda \theta_{t-1} gt←gt+λθt−1
将权重衰减项 λ θ t − 1 \lambda \theta_{t-1} λθt−1 加入梯度,惩罚参数大小,防止过拟合。
- 计算梯度平方的指数加权平均
- v t ← α v t − 1 + ( 1 − α ) g t 2 v_t \leftarrow \alpha v_{t-1} + (1 - \alpha) g_t^2 vt←αvt−1+(1−α)gt2
更新梯度平方的指数加权平均值 v t v_t vt,融合历史梯度平方信息。
- 中心梯度计算
- v ~ t ← v t \tilde{v}_t \leftarrow v_t v~t←vt(直接使用 v t v_t vt 作为归一化分母)
- 若 centered 为 True:
g t a v e ← g t a v e α + ( 1 − α ) g t g_t^{ave} \leftarrow g_t^{ave} \alpha + (1 - \alpha) g_t gtave←gtaveα+(1−α)gt
计算梯度的指数加权平均值 g t a v e g_t^{ave} gtave;
v ~ t ← v ~ t − ( g t a v e ) 2 \tilde{v}_t \leftarrow \tilde{v}_t - (g_t^{ave})^2 v~t←v~t−(gtave)2
用 v t v_t vt 减去梯度均值的平方,得到修正后的 v ~ t \tilde{v}_t v~t(用于归一化)。
- 动量更新与参数迭代
- 若 μ > 0 \mu > 0 μ>0(使用动量):
b t ← μ b t − 1 + g t / ( v ~ t + ϵ ) b_t \leftarrow \mu b_{t-1} + g_t / (\sqrt{\tilde{v}_t} + \epsilon) bt←μbt−1+gt/(v~t+ϵ)
结合历史动量 b t − 1 b_{t-1} bt−1 和当前归一化梯度 g t / ( v ~ t + ϵ ) g_t / (\sqrt{\tilde{v}_t} + \epsilon) gt/(v~t+ϵ),更新动量项 b t b_t bt;
θ t ← θ t − 1 − γ b t \theta_t \leftarrow \theta_{t-1} - \gamma b_t θt←θt−1−γbt
用动量项 b t b_t bt 和学习率 γ \gamma γ 更新参数 θ t \theta_t θt。 - 若 μ ≤ 0 \mu \leq 0 μ≤0(不使用动量):
θ t ← θ t − 1 − γ g t / ( v ~ t + ϵ ) \theta_t \leftarrow \theta_{t-1} - \gamma g_t / (\sqrt{\tilde{v}_t} + \epsilon) θt←θt−1−γgt/(v~t+ϵ)
直接用归一化后的梯度 g t / ( v ~ t + ϵ ) g_t / (\sqrt{\tilde{v}_t} + \epsilon) gt/(v~t+ϵ) 和学习率 γ \gamma γ 更新参数 θ t \theta_t θt。
-
输出结果
- 循环结束后,返回最终更新的参数 θ t \theta_t θt,完成模型训练中的参数优化。
特点:
解决了深度学习中过早结束的问题,适合RNN⽹络
依赖于全局学习率,引⼊了和momentum ⼀样的平滑系数 α \alpha α
6.⾃适应矩估计Adam - Adaptive Moment Estimation
Adam算法,通过计算梯度的⼀阶矩和⼆阶矩估计来调整学习率,对不同参数设置⾃适应学习率
。
-
输入参数:
- γ \gamma γ (lr):学习率;
- β 1 , β 2 \beta_1, \beta_2 β1,β2 (betas):一阶矩、二阶矩的指数衰减系数;
- θ 0 \theta_0 θ0:模型初始参数;
- f ( θ ) f(\theta) f(θ):目标函数;
- λ \lambda λ:权重衰减系数;
- amsgrad:指示是否使用AMSGrad变体;
- e e e:平滑项,防止分母为零;
- maximize:指示最大化或最小化目标函数。
-
初始化:
- m 0 ← 0 m_0 \leftarrow 0 m0←0:初始化一阶矩(动量相关);
- v 0 ← 0 v_0 \leftarrow 0 v0←0:初始化二阶矩(梯度平方的累积);
- v 0 ‾ m a x ← 0 \overline{v_0}^{max} \leftarrow 0 v0max←0:初始化AMSGrad所需的最大二阶矩。
-
计算过程步骤:
- 初始化循环
- 从 t = 1 t = 1 t=1 开始迭代训练,直到满足指定的循环条件。
- 计算梯度方向
- 若 maximize 为 True:
g t ← − ∇ f t ( θ t − 1 ) g_t \leftarrow -\nabla f_t(\theta_{t-1}) gt←−∇ft(θt−1),取负梯度(沿梯度反方向更新)。 - 若 maximize 为 False:
g t ← ∇ f t ( θ t − 1 ) g_t \leftarrow \nabla f_t(\theta_{t-1}) gt←∇ft(θt−1),直接计算梯度。
- 权重衰减处理
- 若 λ ≠ 0 \lambda \neq 0 λ=0,执行 g t ← g t + λ θ t − 1 g_t \leftarrow g_t + \lambda \theta_{t-1} gt←gt+λθt−1,将权重衰减项加入梯度,抑制参数过大。
- 计算一、二阶矩
- m t ← β 1 m t − 1 + ( 1 − β 1 ) g t m_t \leftarrow \beta_1 m_{t-1} + (1 - \beta_1) g_t mt←β1mt−1+(1−β1)gt:更新一阶矩,融合历史梯度与当前梯度。
- v t ← β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t \leftarrow \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt←β2vt−1+(1−β2)gt2:更新二阶矩,累积梯度平方的指数加权平均。
- 偏差修正
- m ^ t ← m t / ( 1 − β 1 t ) \hat{m}_t \leftarrow m_t / (1 - \beta_1^t) m^t←mt/(1−β1t):修正一阶矩的偏差(消除初始阶段 m t m_t mt 偏小的影响)。
- v ^ t ← v t / ( 1 − β 2 t ) \hat{v}_t \leftarrow v_t / (1 - \beta_2^t) v^t←vt/(1−β2t):修正二阶矩的偏差。
- 参数更新
- 若 amsgrad 为 True:
- v ^ t m a x ← max ( v ^ t − 1 m a x , v ^ t ) \hat{v}_t^{max} \leftarrow \max (\hat{v}_{t-1}^{max}, \hat{v}_t) v^tmax←max(v^t−1max,v^t):更新最大二阶矩(AMSGrad核心,保证二阶矩不下降);
- θ t ← θ t − 1 − γ m ^ t / ( v ^ t m a x + ϵ ) \theta_t \leftarrow \theta_{t-1} - \gamma \hat{m}_t / (\sqrt{\hat{v}_t^{max}} + \epsilon) θt←θt−1−γm^t/(v^tmax+ϵ):使用最大二阶矩归一化一阶矩,更新参数。
AMSGrad算法是针对 Adam 在收敛性上的不足提出的改进算法。
- 若 amsgrad 为 False:
- θ t ← θ t − 1 − γ m ^ t / ( v ^ t + ϵ ) \theta_t \leftarrow \theta_{t-1} - \gamma \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon) θt←θt−1−γm^t/(v^t+ϵ):直接用修正后的二阶矩归一化一阶矩,更新参数。
- 返回结果
- 循环结束后,返回最终更新的参数 θ t \theta_t θt,完成模型训练中的参数优化。
在Adam优化器中,计算一阶矩估计( m t m_t mt)与二阶矩估计( v t v_t vt)的比值( m ^ t v t \frac{\hat{m}_t}{\sqrt{v_t}} vtm^t),其核心目的是实现自适应学习率调整。
- 自适应调整步长:根据梯度的方向和大小动态调整每个参数的更新幅度。
- 稳定训练过程:减少噪声干扰,避免梯度震荡,提高收敛效率。
- 解耦参数更新:使不同参数的学习率独立于全局学习率,适应不同特征的优化需求。
7.AdamW(Adam with Weight Decay Fix)
AdamW 在Adam算法的基础上,对参数 θ t \theta_t θt加⼊了权重衰减项的计算。
-
计算过程
-
Aadm算法和AdamW算法结构对⽐
步骤 Adam AdamW 梯度计算 g t = ∇ J ( θ t ) + λ ⋅ θ t g_t = \nabla J(\theta_t) + \lambda \cdot \theta_t gt=∇J(θt)+λ⋅θt g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t) gt=∇J(θt) 一阶矩估计 m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt−1+(1−β1)gt 与Adam相同 二阶矩估计 v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2 与Adam相同 偏差修正 m ^ t = m t / ( 1 − β 1 t ) \hat{m}_t = m_t / (1 - \beta_1^t) m^t=mt/(1−β1t) 与Adam相同 v ^ t = v t / ( 1 − β 2 t ) \hat{v}_t = v_t / (1 - \beta_2^t) v^t=vt/(1−β2t) 与Adam相同 更新公式 θ t + 1 = θ t − γ ⋅ m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \gamma \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t + \epsilon}} θt+1=θt−γ⋅v^t+ϵm^t θ t + 1 = θ t − γ ⋅ m ^ t v ^ t + ϵ − γ ⋅ λ ⋅ θ t \theta_{t+1} = \theta_t - \gamma \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t + \epsilon}} - \gamma \cdot \lambda \cdot \theta_t θt+1=θt−γ⋅v^t+ϵm^t−γ⋅λ⋅θt -
Adam
运用传统的正则化方法,具体是在梯度计算时,把正则项 λ ⋅ θ t \lambda \cdot \theta_t λ⋅θt 添加到原始梯度中:
g t = ∇ J ( θ t ) + λ ⋅ θ t g_t = \nabla J(\theta_t) + \lambda \cdot \theta_t gt=∇J(θt)+λ⋅θt
这种方式下,权重衰减和学习率是关联的。因为正则项会受到自适应学习率 α / v t \alpha / \sqrt{v_t} α/vt 的缩放影响,所以当学习率变化时,权重衰减的强度也会跟着改变。 -
AdamW
采用独立的权重衰减策略,将权重衰减和梯度更新分开进行操作:
θ t + 1 = θ t − learning_rate ⋅ ( m t v t + ϵ + λ ⋅ θ t ) \theta_{t+1} = \theta_t - \text{learning\_rate} \cdot \left( \frac{m_t}{\sqrt{v_t + \epsilon}} + \lambda \cdot \theta_t \right) θt+1=θt−learning_rate⋅(vt+ϵmt+λ⋅θt)
在这里,权重衰减直接以 λ ⋅ θ t \lambda \cdot \theta_t λ⋅θt 的形式独立作用于权重更新,和学习率的缩放没有关系。