Stochastic Gradient Descent/zh

    From Marovi AI
    This page is a translated version of the page Stochastic Gradient Descent and the translation is 100% complete.
    Other languages:
    ArticlesMachine LearningOptimization algorithmsStochastic Gradient Descent/zh
    Stochastic Gradient Descent

    Topics {{#arraymap:Optimization, Neural Networks, Gradient Methods|,|@@item@@|@@item@@|}}

    Summary
    Stochastic gradient descent (SGD) is the core optimization algorithm behind modern machine learning. Instead of computing gradients over an entire dataset, it estimates them from small random samples, making training feasible on large-scale data. Nearly all deep learning models are trained using SGD or one of its variants (Adam, RMSProp, etc.).
      {{#arraymap:Estimates gradients from random mini-batches instead of the full dataset; Learning rate schedule is critical for convergence; Variants like Adam and AdamW add adaptive per-parameter rates; Converges to global minimum for convex problems under Robbins–Monro conditions|;|@@item@@|
    • @@item@@
    • |}}

    随机梯度下降(通常缩写为 SGD)是一种迭代优化算法,用于最小化以可微子函数之和形式表示的目标函数。它是现代机器学习训练的主力,驱动着从逻辑回归到深度神经网络的各种模型。

    动机

    在经典的梯度下降中,每次参数更新前都要在整个训练集上计算损失函数的完整梯度。当数据集很大时,这种做法的代价高得难以承受。SGD 通过在每一步从单个随机选取的样本(或一个小的 mini-batch)估计梯度来解决该问题,以较高噪声的估计换取每次迭代成本的大幅降低。

    算法

    给定一个参数化的损失函数

    $ L(\theta) = \frac{1}{N}\sum_{i=1}^{N} \ell(\theta;\, x_i,\, y_i) $

    SGD 在第 $ t $ 步的更新规则为:

    $ \theta_{t+1} = \theta_t - \eta_t \,\nabla_\theta \ell(\theta_t;\, x_{i_t},\, y_{i_t}) $

    其中 $ \eta_t $学习率(步长),$ i_t $ 是随机选取的索引。

    小批量变体

    在实践中通常使用包含 $ B $ 个样本的 mini-batch

    $ \theta_{t+1} = \theta_t - \frac{\eta_t}{B}\sum_{j=1}^{B} \nabla_\theta \ell(\theta_t;\, x_{i_j},\, y_{i_j}) $

    常见的批大小在 32 到 512 之间。较大的批次能降低梯度方差,但会增加内存占用。

    伪代码

    initialise parameters θ
    for epoch = 1, 2, … do
        shuffle training set
        for each mini-batch B ⊂ training set do
            g ← (1/|B|) Σ ∇ℓ(θ; xᵢ, yᵢ)   # estimate gradient
            θ ← θ − η · g                     # update parameters
        end for
    end for
    

    学习率调度

    学习率 $ \eta_t $收敛有重要影响。常见的策略包括:

    • 常数 —— 简单,但可能产生超调或停滞。
    • 阶梯衰减 —— 每 $ k $ 个 epoch 将 $ \eta $ 乘以一个因子(如 0.1)。
    • 指数衰减 —— $ \eta_t = \eta_0 \, e^{-\lambda t} $
    • 余弦退火 —— 沿余弦曲线平滑降低学习率,常配合热重启使用。
    • 线性 warm-up —— 在最初若干次迭代中从较小的 $ \eta $ 逐步增大,以稳定早期训练。

    收敛性质

    对于具有 Lipschitz 连续梯度的目标,使用满足以下条件的衰减学习率的 SGD

    $ \sum_{t=1}^{\infty} \eta_t = \infty, \qquad \sum_{t=1}^{\infty} \eta_t^2 < \infty $

    几乎必然收敛到全局最小值(Robbins–Monro 条件)。对于非凸问题——深度学习中的典型情形——SGD 收敛到一个驻点,经验证据表明它常常能找到良好的局部极小值。

    常见变体

    若干扩展方法可降低梯度估计的方差,或为每个参数自适应地调整步长:

    方法 核心思想 文献
    Momentum 对历史梯度累积指数衰减的移动平均 Polyak, 1964
    Nesterov 加速梯度 在“前瞻”位置上计算梯度 Nesterov, 1983
    Adagrad 为每个参数设置学习率,对频繁更新的特征逐步减小 Duchi et al., 2011
    RMSProp 利用平方梯度的移动平均修正 Adagrad 学习率不断衰减的问题 Hinton(讲义),2012
    Adam momentum 与 RMSProp 风格的自适应学习率结合 Kingma 与 Ba, 2015
    AdamW 将权重衰减与自适应梯度更新解耦 Loshchilov 与 Hutter, 2019

    实践注意事项

    • 数据洗牌 —— 在每个 epoch 重新打乱数据集,避免出现循环模式。
    • 梯度裁剪 —— 对梯度范数进行截断,以防止更新爆炸,尤其是在循环神经网络中。
    • 批归一化 —— 对层输入进行归一化可降低对学习率的敏感度。
    • 混合精度训练 —— 使用半精度浮点数能在现代 GPU 上加速 SGD,同时几乎不损失精度。

    应用

    SGD 及其变体几乎在机器学习的所有领域都有应用:

    • 训练深度神经网络(计算机视觉、NLP、语音识别)
    • 大规模线性模型(逻辑回归、通过 SGD 训练的 SVM)
    • 强化学习中的策略优化
    • 推荐系统与协同过滤
    • 数据以流式方式到达的在线学习场景

    参见

    参考文献

    • Robbins, H. 与 Monro, S. (1951). "A Stochastic Approximation Method". Annals of Mathematical Statistics.
    • Bottou, L. (2010). "Large-Scale Machine Learning with Stochastic Gradient Descent". COMPSTAT.
    • Kingma, D. P. 与 Ba, J. (2015). "Adam: A Method for Stochastic Optimization". ICLR.
    • Ruder, S. (2016). "An overview of gradient descent optimization algorithms". arXiv:1609.04747.