目录

PyTorch 优化器原理

Adam(Adaptive Moment Estimation)是一种自适应学习率优化算法,它结合了动量法(Momentum)和RMSprop的优点,通过计算梯度的一阶矩(均值)和二阶矩(未中心化的方差)来动态调整每个参数的学习率。下面详细解释其公式和原理。


以下是针对你列出的优化器,结合 PyTorch 接口与核心原理的完整补充说明。每个优化器均包含:使用接口(含常用默认参数)、计算公式、原理解释、优缺点、适用场景。


  • 使用接口
    torch.optim.SGD(params, lr=<required>, momentum=0, dampening=0, weight_decay=0, nesterov=False)

    • lr:学习率(必须指定)
    • momentum:动量因子,默认 0
    • dampening:动量阻尼,默认 0
    • weight_decay:权重衰减(L2 惩罚),默认 0
    • nesterov:是否启用 Nesterov 动量,默认 False
  • 计算公式
    不带动量:

    θt+1=θtηL(θt) \theta_{t+1} = \theta_t - \eta \nabla L(\theta_t)


    带动量(标准动量):

    vt+1=μvt+L(θt)θt+1=θtηvt+1 \begin{aligned} v_{t+1} &= \mu v_t + \nabla L(\theta_t) \\ \theta_{t+1} &= \theta_t - \eta v_{t+1} \end{aligned}


    Nesterov 动量:

    θahead=θtμvtvt+1=μvt+L(θahead)θt+1=θtηvt+1 \begin{aligned} \theta_{\text{ahead}} &= \theta_t - \mu v_t \\ v_{t+1} &= \mu v_t + \nabla L(\theta_{\text{ahead}}) \\ \theta_{t+1} &= \theta_t - \eta v_{t+1} \end{aligned}
  • 原理解释
    最基本的参数更新方式,每次沿负梯度方向移动。加入动量后,累积历史梯度方向,加速收敛并抑制振荡。Nesterov 则先按历史方向“前瞻”一步,再计算梯度,提高响应灵敏度。

  • 优缺点

    • 优点:简单、泛化能力强;配合动量/Nesterov 后收敛快且稳定。
    • 缺点:对学习率敏感,需要仔细调参;自适应能力弱。
  • 什么时候使用
    适用于大多数任务,尤其当数据量大、需要强泛化能力时(如 CV 分类任务)。常配合 momentum=0.9 和 Nesterov 使用。


  • 使用接口
    torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)

    • lr:学习率,默认 0.01
    • lambd:衰减项,默认 1e-4
    • alpha:eta 更新的指数,默认 0.75
    • t0:开始平均的步数,默认 1e6
    • weight_decay:权重衰减
  • 计算公式
    维护两组参数:当前迭代参数 θ\theta 和平均参数 θˉ\bar{\theta}
    每次更新:

    θt+1=θtηtL(θt) \theta_{t+1} = \theta_t - \eta_t \nabla L(\theta_t)


    t>t0t > t_0 后,平均参数按递推更新:

    θˉt+1=tt+1θˉt+1t+1θt+1 \bar{\theta}_{t+1} = \frac{t}{t+1} \bar{\theta}_t + \frac{1}{t+1} \theta_{t+1}


    最终输出平均参数。

  • 原理解释
    通过平均迭代历史中的参数,降低方差,使收敛点更稳定,尤其适合凸或近凸问题。

  • 优缺点

    • 优点:对强凸问题有理论最优收敛率;解更平滑稳定。
    • 缺点:需要存储两组参数;在非凸深度网络中优势不明显。
  • 什么时候使用
    适用于强凸或近凸的优化问题(如某些传统机器学习模型);深度学习中较少用,但可作为 SGD 的替代探索。


  • 使用接口
    torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0, amsgrad=False)

    • lr:学习率,默认 0.001
    • betas:一阶、二阶矩的衰减系数,默认 (0.9, 0.999)
    • eps:防止除零的小常数,默认 1e-8
    • weight_decay:权重衰减(L2 惩罚)
    • amsgrad:是否使用 AMSGrad 变体
  • 计算公式

    mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2m^t=mt/(1β1t)v^t=vt/(1β2t)θt=θt1ηm^tv^t+ϵ \begin{aligned} 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 \\ \hat{m}_t &= m_t / (1-\beta_1^t) \\ \hat{v}_t &= v_t / (1-\beta_2^t) \\ \theta_{t} &= \theta_{t-1} - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} \end{aligned}
  • 原理解释
    结合动量(一阶矩)和 RMSProp(二阶矩),为每个参数自适应调整学习率。偏差校正修正初期矩估计的零偏置。

  • 优缺点

    • 优点:收敛快、对超参数不敏感、适合稀疏梯度。
    • 缺点:可能不收敛到最优(尤其是某些 Transformer 训练时),泛化性能有时不如 SGD。
  • 什么时候使用
    默认首选之一,尤其适合 NLP、强化学习、生成模型等任务。若追求泛化,可尝试 SGD 或 AdamW。


  • 使用接口
    torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01, amsgrad=False)

    • 参数含义同 Adam,但 weight_decay 默认常设为 0.01,且实现上与 Adam 不同(解耦)
  • 计算公式
    先计算 Adam 更新量(不含 weight decay),然后单独施加衰减:

    θt=θt1ηm^tv^t+ϵηλθt1 \theta_t = \theta_{t-1} - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \lambda \theta_{t-1}


    其中 λ\lambdaweight_decay

  • 原理解释
    将权重衰减从梯度计算中解耦,使衰减不受自适应学习率缩放,更符合原始权重衰减的意图,提升泛化。

  • 优缺点

    • 优点:比传统 Adam 泛化更好,尤其适合 Transformer 架构;超参数调整更直观。
    • 缺点:仍可能比 SGD 稍差(但通常优于 Adam)。
  • 什么时候使用
    NLP 任务(如 BERT、GPT)和 Vision Transformer 的默认优化器;推荐作为 Adam 的替代。


  • 使用接口
    torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-8, weight_decay=0)

    • lr:学习率,默认 0.002(比 Adam 稍大)
    • betas:一阶、无穷范数衰减系数,默认 (0.9, 0.999)
    • 其余同 Adam
  • 计算公式
    一阶矩同 Adam,二阶矩改用无穷范数:

    mt=β1mt1+(1β1)gtut=max(β2ut1,gt+ϵ)θt=θt1ηmtut \begin{aligned} m_t &= \beta_1 m_{t-1} + (1-\beta_1) g_t \\ u_t &= \max(\beta_2 u_{t-1}, |g_t| + \epsilon) \\ \theta_t &= \theta_{t-1} - \eta \frac{m_t}{u_t} \end{aligned}


    注意:这里 utu_t 是梯度绝对值的加权最大值,而非平方平均。

  • 原理解释
    用梯度绝对值的指数衰减最大值替代平方平均,使学习率对梯度尺度更鲁棒,适合某些噪声分布。

  • 优缺点

    • 优点:在梯度变化剧烈时更稳定;对学习率选择更鲁棒。
    • 缺点:不如 Adam 常用,理论分析较少。
  • 什么时候使用
    在个别任务(如某些 NLP 或嵌入学习)中可尝试,当 Adam 不稳定时可作为备选。


  • 使用接口
    torch.optim.NAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0, momentum_decay=0.004)

    • lrbetasepsweight_decay 同 Adam
    • momentum_decay:动量衰减系数,默认 0.004,用于 Nesterov 修正
  • 计算公式
    在 Adam 基础上引入 Nesterov 前瞻思想,修改一阶矩的更新方式(具体公式较复杂,可参考原论文或源码)。

  • 原理解释
    结合 Adam 的自适应学习率和 Nesterov 动量的前瞻梯度,有时能进一步加速收敛,尤其在训练初期无需 warmup。

  • 优缺点

    • 优点:收敛更快,对学习率更不敏感;无需 warmup 阶段。
    • 缺点:可能在某些任务上不如 Adam 稳定。
  • 什么时候使用
    可替代 Adam,尤其当希望快速收敛且不想做 warmup 时。


  • 使用接口
    torch.optim.RAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0)

    • 参数同 Adam,无额外超参数
  • 计算公式
    动态修正 Adam 早期的二阶矩估计方差,在训练初期使用近似 SGD 的更新,后期平滑过渡到 Adam。

  • 原理解释
    针对 Adam 在训练初期因二阶矩估计不准导致方差过大而提出的修正,通过整流项使更新更稳定,避免需要 warmup。

  • 优缺点

    • 优点:训练初期更稳定,无需 warmup;收敛效果与 Adam 相当。
    • 缺点:计算稍复杂,但影响不大。
  • 什么时候使用
    当使用 Adam 需要 warmup 时,RAdam 可直接替代,省去调 warmup 步骤。


  • 使用接口
    torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-8)

    • 参数同 Adam,但专为稀疏梯度设计(如嵌入层)
  • 计算公式
    与 Adam 类似,但只更新有非零梯度的参数部分,且二阶矩的存储方式针对稀疏性优化。

  • 原理解释
    针对嵌入层等高维稀疏特征,避免为所有零梯度参数更新动量,节省内存和计算。

  • 优缺点

    • 优点:内存占用少,计算快,适合大规模稀疏特征。
    • 缺点:仅适用于稀疏梯度场景,普通参数无法使用。
  • 什么时候使用
    模型中包含嵌入层且特征极度稀疏时(如推荐系统、NLP 词嵌入),替代 Adam。


  • 使用接口
    torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-6, 50))

    • lr:学习率(初始步长),默认 0.01
    • etas:步长增减因子 (etaplus, etaminus),默认 (0.5, 1.2)
    • step_sizes:步长上下界 (min_step, max_step)
  • 计算公式
    根据梯度符号变化调整每个参数的步长:
    若连续两次梯度符号相同,则步长乘以 etaplus;若相反,则步长乘以 etaminus;梯度符号改变时,跳过本次更新。
    更新公式:

    θt+1=θtsign(gt)Δt \theta_{t+1} = \theta_t - \text{sign}(g_t) \cdot \Delta_t


    其中 Δt\Delta_t 为自适应步长。

  • 原理解释
    仅利用梯度符号,忽略梯度大小,步长自适应调整。适合全批量(batch)学习,对梯度噪声不敏感。

  • 优缺点

    • 优点:无需设置学习率(但需设初始步长);对超参数鲁棒。
    • 缺点:仅适用于全批量(不能用于 mini-batch),否则梯度符号不稳定。
  • 什么时候使用
    小规模全批量优化(如传统机器学习、小数据集),深度学习几乎不用。


  • 使用接口
    torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-8, weight_decay=0, momentum=0, centered=False)

    • lr:学习率,默认 0.01
    • alpha:梯度平方移动平均的衰减系数,默认 0.99
    • eps:防止除零
    • momentum:可选动量项
    • centered:是否使用中心化二阶矩(减去均值)
  • 计算公式

    vt=αvt1+(1α)gt2θt=θt1ηgtvt+ϵ \begin{aligned} v_t &= \alpha v_{t-1} + (1-\alpha) g_t^2 \\ \theta_t &= \theta_{t-1} - \eta \frac{g_t}{\sqrt{v_t} + \epsilon} \end{aligned}


    若启用动量,则对除以缩放因子后的梯度再应用动量。

  • 原理解释
    通过梯度平方的移动平均调整学习率,解决 Adagrad 学习率单调下降的问题,适合非平稳目标。

  • 优缺点

    • 优点:自适应学习率,适合 RNN 等时间序列任务。
    • 缺点:可能在某些任务上不如 Adam 稳定。
  • 什么时候使用
    常用于 RNN、强化学习(如 DQN)等需要处理非平稳性的场景。


  • 使用接口
    torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-6, weight_decay=0)

    • lr:学习率(其实已无学习率概念,但保留作为初始系数),默认 1.0
    • rho:梯度平方与更新量平方的衰减系数,默认 0.9
    • eps:防止除零
  • 计算公式
    维护两个移动平均:

    E[g2]t=ρE[g2]t1+(1ρ)gt2Δθt=E[Δθ2]t1+ϵE[g2]t+ϵgtE[Δθ2]t=ρE[Δθ2]t1+(1ρ)(Δθt)2θt+1=θt+Δθt \begin{aligned} E[g^2]_t &= \rho E[g^2]_{t-1} + (1-\rho) g_t^2 \\ \Delta \theta_t &= - \frac{\sqrt{E[\Delta \theta^2]_{t-1} + \epsilon}}{\sqrt{E[g^2]_t + \epsilon}} g_t \\ E[\Delta \theta^2]_t &= \rho E[\Delta \theta^2]_{t-1} + (1-\rho) (\Delta \theta_t)^2 \\ \theta_{t+1} &= \theta_t + \Delta \theta_t \end{aligned}


    其中 E[Δθ2]E[\Delta \theta^2] 是参数更新量的平方平均。

  • 原理解释
    不仅用梯度平方调整步长,还引入更新量的平方平均,使步长单位与参数单位匹配,理论上无需学习率。

  • 优缺点

    • 优点:无需设置学习率(但需初始系数);对超参数鲁棒。
    • 缺点:实践中不如 Adam 常用,收敛速度可能较慢。
  • 什么时候使用
    当希望避免调学习率时,可作为替代方案;在有些任务上表现良好。


  • 使用接口
    torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0, eps=1e-10)

    • lr:学习率,默认 0.01
    • lr_decay:学习率衰减因子
    • initial_accumulator_value:梯度平方累积初始值
    • eps:防止除零
  • 计算公式

    Gt=Gt1+gt2(逐元素累加)θt=θt1ηgtGt+ϵ \begin{aligned} G_t &= G_{t-1} + g_t^2 \quad (\text{逐元素累加}) \\ \theta_t &= \theta_{t-1} - \eta \frac{g_t}{\sqrt{G_t} + \epsilon} \end{aligned}
  • 原理解释
    对每个参数累积历史梯度平方,使稀疏特征获得更大更新,频繁特征更新变小。

  • 优缺点

    • 优点:适合稀疏数据;无需手动调整学习率。
    • 缺点:累积平方和单调增加,学习率会趋近于零,最终停止学习。
  • 什么时候使用
    处理稀疏特征(如大规模词嵌入、逻辑回归)时效果很好;深度学习中已被 Adam/RMSprop 取代。


  • 使用接口
    torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100, line_search_fn=None)

    • lr:学习率,默认 1.0(实际为步长缩放因子)
    • max_iter:每次优化步的最大迭代次数
    • history_size:保存的历史梯度/步长数量
    • line_search_fn:线搜索方法(如 ‘strong_wolfe’)
  • 计算公式
    属于拟牛顿法,利用历史梯度差和参数差近似 Hessian 矩阵的逆,然后计算更新方向,并通过线搜索确定步长。具体公式较复杂,涉及 BFGS 更新。

  • 原理解释
    通过近似二阶导数信息,实现快速收敛,尤其适合小批量确定性优化(即每次用全部数据计算梯度)。

  • 优缺点

    • 优点:收敛速度快(二阶信息);对学习率不敏感。
    • 缺点:需要多次前向/后向(closure 函数),计算量大;不适合 mini-batch 随机优化。
  • 什么时候使用
    小规模全批量优化(如小数据集、传统机器学习),或需要精确求解时(如某些生成模型的训练)。在深度学习中很少用。

gt g_t 为第 t t 步的梯度(关于目标函数的梯度),Adam 维护两个状态变量:

  • 一阶动量 mt m_t :梯度的指数移动平均(即 Momentum)
  • 二阶动量 vt v_t :梯度平方的指数移动平均(即 RMSprop 中的均方根)

具体计算步骤如下:

  1. 更新有偏一阶矩估计

    mt=β1mt1+(1β1)gt m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t

    其中 β1 \beta_1 通常取 0.9,控制历史梯度的衰减率。

  2. 更新有偏二阶矩估计

    vt=β2vt1+(1β2)gt2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2

    其中 β2 \beta_2 通常取 0.999,gt2 g_t^2 表示逐元素的平方。

  3. 偏差校正
    由于 m0,v0 m_0, v_0 初始化为 0,初期估计会偏向于 0,因此需要校正:

    m^t=mt1β1t,v^t=vt1β2t \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t}

    这里 β1t,β2t \beta_1^t, \beta_2^t β \beta t t 次幂,随着 t t 增大分母趋近于 1。

  4. 参数更新

    θt=θt1αm^tv^t+ϵ \theta_{t} = \theta_{t-1} - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

    其中 α \alpha 是学习率(通常默认 0.001),ϵ \epsilon 是一个极小常数(如 10810^{-8})防止除零。


  • 一阶矩 mt m_t :相当于带衰减的梯度累积,捕捉梯度的平均方向。如果梯度方向一致,mt m_t 会增大,从而加速收敛。

  • 二阶矩 vt v_t :记录了梯度幅度的方差。对于梯度较大的参数,vt v_t 较大,导致学习率 αv^t \frac{\alpha}{\sqrt{\hat{v}_t}} 变小,避免振荡;对于梯度较小的参数,学习率变大,加速更新。

  • 偏差校正:在训练初期,mt m_t vt v_t 被初始化为 0,导致估计值偏向于 0。校正后能更快进入正确估计。

    偏差校正原理推导

    要推导 mt=(1β1)i=1tβ1tigi m_t = (1-\beta_1) \sum_{i=1}^{t} \beta_1^{t-i} g_i ,我们从 Adam 中一阶矩的递推定义开始:

    mt=β1mt1+(1β1)gt,初始 m0=0 m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t, \quad \text{初始 } m_0 = 0
    1. 写出 mt m_t 的表达式

      mt=β1mt1+(1β1)gt m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t
    2. 代入 mt1 m_{t-1}

      mt1=β1mt2+(1β1)gt1 m_{t-1} = \beta_1 m_{t-2} + (1-\beta_1) g_{t-1}

      因此:

      mt=β1(β1mt2+(1β1)gt1)+(1β1)gt m_t = \beta_1 \big( \beta_1 m_{t-2} + (1-\beta_1) g_{t-1} \big) + (1-\beta_1) g_t

      mt=β12mt2+β1(1β1)gt1+(1β1)gt m_t = \beta_1^2 m_{t-2} + \beta_1(1-\beta_1) g_{t-1} + (1-\beta_1) g_t
    3. 继续代入 mt2 m_{t-2}

      mt2=β1mt3+(1β1)gt2 m_{t-2} = \beta_1 m_{t-3} + (1-\beta_1) g_{t-2}

      mt=β12(β1mt3+(1β1)gt2)+β1(1β1)gt1+(1β1)gt m_t = \beta_1^2 \big( \beta_1 m_{t-3} + (1-\beta_1) g_{t-2} \big) + \beta_1(1-\beta_1) g_{t-1} + (1-\beta_1) g_t

      mt=β13mt3+β12(1β1)gt2+β1(1β1)gt1+(1β1)gt m_t = \beta_1^3 m_{t-3} + \beta_1^2 (1-\beta_1) g_{t-2} + \beta_1(1-\beta_1) g_{t-1} + (1-\beta_1) g_t
    4. 重复此过程,直到 m0 m_0
      经过 t t 次代入后,m0=0 m_0 = 0 出现:

      mt=β1tm0+(1β1)(gt+β1gt1+β12gt2++β1t1g1) m_t = \beta_1^t m_0 + (1-\beta_1) \big( g_t + \beta_1 g_{t-1} + \beta_1^2 g_{t-2} + \cdots + \beta_1^{t-1} g_1 \big)

      由于 m0=0 m_0 = 0 ,第一项消失:

      mt=(1β1)(gt+β1gt1+β12gt2++β1t1g1) m_t = (1-\beta_1) \big( g_t + \beta_1 g_{t-1} + \beta_1^2 g_{t-2} + \cdots + \beta_1^{t-1} g_1 \big)
    5. 用求和符号表示

      mt=(1β1)i=1tβ1tigi m_t = (1-\beta_1) \sum_{i=1}^{t} \beta_1^{t-i} g_i

      这里 i i 从 1 到 t t ,当 i=t i = t 时,β1tt=β10=1 \beta_1^{t-t} = \beta_1^0 = 1 ,系数为 (1β1)gt (1-\beta_1) g_t ,与上述展开一致。


    注意所有项的权重之和为:

    (1β1)i=1tβ1ti=(1β1)1β1t1β1=1β1t (1-\beta_1) \sum_{i=1}^{t} \beta_1^{t-i} = (1-\beta_1) \frac{1 - \beta_1^t}{1 - \beta_1} = 1 - \beta_1^t

    这正好小于 1,解释了为什么需要偏差校正:因为 mt m_t 是真实梯度期望的 1β1t 1-\beta_1^t 倍。

  • 学习率缩放:最终更新步长为 αm^tv^t+ϵ \alpha \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} ,实现了对每个参数独立调整学习率。


参数推荐值作用
α \alpha 0.001全局学习率
β1 \beta_1 0.9一阶矩的指数衰减率,控制动量影响
β2 \beta_2 0.999二阶矩的指数衰减率,控制梯度平方的影响范围
ϵ \epsilon 10810^{-8}数值稳定项,避免分母为零

优点

  • 自适应学习率,适合处理稀疏梯度(如 NLP、图像 caption 任务)。
  • 超参数鲁棒,通常无需精细调参就能获得不错效果。
  • 计算高效,内存需求小(只需存储 mt,vt m_t, v_t )。

局限

  • 在某些情况下(如 Transformer 训练)可能不收敛到最优,需要使用 AdamW(修正了权重衰减实现方式)或 Adam with decoupled weight decay
  • 二阶矩估计可能受到极端梯度的影响,导致学习率骤降。

  • SGD + Momentum:只使用一阶矩,没有自适应学习率。
  • RMSprop:只使用二阶矩,没有动量。
  • Adam:两者结合,是目前最流行的优化器之一。

权重衰减(Weight Decay)是深度学习中最常用的正则化技术之一,它的作用是防止模型过拟合,通过在每次参数更新时,以一定比例减小参数的数值,从而限制模型的复杂度。


在标准的梯度下降更新中,参数更新方向仅由损失函数的梯度决定:

θθηL(θ) \theta \leftarrow \theta - \eta \nabla L(\theta)

权重衰减在更新时额外减去一小部分当前参数值:

θθηL(θ)ηλθ \theta \leftarrow \theta - \eta \nabla L(\theta) - \eta \lambda \theta

其中 η\eta 是学习率,λ>0\lambda > 0 是权重衰减系数。将后两项合并:

θ(1ηλ)θηL(θ) \theta \leftarrow (1 - \eta \lambda) \theta - \eta \nabla L(\theta)

可以看到,参数在更新前先被缩小了 (1ηλ)(1 - \eta \lambda) 倍,这就是“衰减”名称的由来。


在经典的随机梯度下降(SGD)中,权重衰减等价于在损失函数中加入 L2 正则化项。

L2 正则化:在原始损失函数后加上参数的平方和:

L~(θ)=L(θ)+λ2θ2 \tilde{L}(\theta) = L(\theta) + \frac{\lambda}{2} \|\theta\|^2

对这个新损失函数求梯度:

L~(θ)=L(θ)+λθ \nabla \tilde{L}(\theta) = \nabla L(\theta) + \lambda \theta

使用梯度下降更新:

θθη(L(θ)+λθ)=(1ηλ)θηL(θ) \theta \leftarrow \theta - \eta \left( \nabla L(\theta) + \lambda \theta \right) = (1 - \eta \lambda) \theta - \eta \nabla L(\theta)

这与直接权重衰减的公式完全一致。因此,在 SGD 中,权重衰减和 L2 正则化是等价的。


对于自适应优化器(如 Adam、RMSprop),情况变得复杂。这类优化器会为每个参数独立调整学习率,如果直接将 L2 正则化项加到梯度上,那么正则化项也会被自适应地缩放,导致实际衰减效果与 λ\lambda 不成比例,且难以调节。

Adam 的传统实现(带 weight_decay 参数):

gt=L(θt1)+λθt1 g_t = \nabla L(\theta_{t-1}) + \lambda \theta_{t-1}

然后使用 gtg_t 计算动量、自适应学习率。这样权重衰减项参与了动量和二阶矩的统计,导致衰减效果不稳定。

AdamW 的改进:将权重衰减与梯度更新解耦,直接在参数更新后施加衰减:

θt=θt1ηm^tv^t+ϵηλθt1 \theta_t = \theta_{t-1} - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \lambda \theta_{t-1}

此时权重衰减项 不参与动量计算,也不被自适应学习率缩放,保持了恒定的衰减强度,效果更可控,也更接近传统 SGD 的权重衰减。实验表明,AdamW 能显著提升模型(尤其是 Transformer)的泛化能力。


  • 防止过拟合:通过约束参数范数,限制模型复杂度,降低对训练数据噪声的拟合。
  • 提高泛化能力:使模型在未见数据上表现更好。
  • 数值稳定性:对参数进行软性收缩,有助于避免参数过大导致的梯度爆炸。
  • 超参数 λ:控制正则化强度,λ 越大,参数衰减越快,模型越简单。通常通过交叉验证选择。

优化器权重衰减实现方式更新公式(简化)
SGD(L2)通过梯度隐含θθηL(θ)ηλθ\theta \leftarrow \theta - \eta \nabla L(\theta) - \eta \lambda \theta
Adam(传统)梯度中加入 λθgt=L+λθg_t = \nabla L + \lambda \theta,然后进行 Adam 更新
AdamW解耦更新后直接衰减θθηAdamUpdateηλθ\theta \leftarrow \theta - \eta \cdot \text{AdamUpdate} - \eta \lambda \theta

其中 η\eta 为学习率,λ\lambda 为权重衰减系数。

Nesterov 加速梯度(Nesterov Accelerated Gradient, NAG)是梯度下降算法的一种改进,其核心思想是在计算梯度时引入“前瞻”机制,让优化器不仅依赖当前位置的梯度,还能提前看到如果按当前动量继续前进后可能的位置,从而更准确地调整更新方向


  • 标准动量法:想象一个小球滚下山坡,它根据当前所在位置的坡度(梯度)决定下一步速度,然后滚动到新位置。它不知道自己将要滚向哪里,只是被动地响应当前位置的力。
  • Nesterov 方法:小球不仅看当前脚下的坡度,还“踮起脚尖”向前看一步:它先按照之前的动量往前走一小段,看看那个地方的坡度如何,然后再根据那个“未来位置”的坡度来调整方向。这样能提前感知到地形变化,避免冲过头,尤其在临近谷底时能更平稳地减速。

θt \theta_t 为参数,vt v_t 为动量(速度),η \eta 为学习率,μ \mu 为动量系数(通常 0.9)。

vt=μvt1+ηL(θt1)θt=θt1vt \begin{aligned} v_t &= \mu v_{t-1} + \eta \nabla L(\theta_{t-1}) \\ \theta_t &= \theta_{t-1} - v_t \end{aligned}

先计算当前位置的梯度,再更新速度,最后用新速度更新参数。

vt=μvt1+ηL(θt1μvt1)θt=θt1vt \begin{aligned} v_t &= \mu v_{t-1} + \eta \nabla L(\theta_{t-1} - \mu v_{t-1}) \\ \theta_t &= \theta_{t-1} - v_t \end{aligned}

关键区别:梯度不是在当前 θt1\theta_{t-1} 处计算的,而是在 “前瞻点” θt1μvt1\theta_{t-1} - \mu v_{t-1}(即如果按之前动量走一步会到达的位置)处计算的。


  • 减小振荡:当参数接近最优区域时,梯度方向可能来回变化。Nesterov 能提前看到前方梯度方向,从而及时刹车或转向,避免像标准动量那样冲过头再折返。
  • 理论加速:对于凸优化问题,Nesterov 方法能达到最优的收敛速度 O(1/t2)O(1/t^2),而普通梯度下降只有 O(1/t)O(1/t)。虽然在深度学习中非凸问题没有严格保证,但实际中 NAG 往往比标准动量更稳定,有时收敛更快。

实践中,Nesterov 常被重写为一种更方便实现的形式(例如在 PyTorch 的 SGD 中,通过设置 nesterov=True 启用):

θahead=θt1μvt1g=L(θahead)vt=μvt1+ηgθt=θt1vt \begin{aligned} \theta_{\text{ahead}} &= \theta_{t-1} - \mu v_{t-1} \\ g &= \nabla L(\theta_{\text{ahead}}) \\ v_t &= \mu v_{t-1} + \eta g \\ \theta_t &= \theta_{t-1} - v_t \end{aligned}

这种形式清晰地展示了“先跳一步,再计算梯度,然后更新速度”的过程。


Nesterov 的核心思想是让优化器具有“预见性”:通过在当前动量基础上预先迈出一小步,在那个未来位置评估梯度,从而让更新方向更符合前方的地形,既保留了动量加速的优势,又提升了稳定性和理论收敛率。

相关内容