概述

随机梯度下降(Stochastic Gradient Descent, SGD)是机器学习与优化领域中一种基础的迭代优化算法。与批量梯度下降每次迭代使用全部样本计算梯度不同,SGD每次仅随机选取一个或一小批样本估计梯度,从而显著降低单次迭代的计算开销,并引入随机噪声以帮助逃离局部极小值。SGD及其变体(如动量SGD、Adam)已成为深度学习模型训练的核心工具,尤其适用于大规模数据集和在线学习场景。


1 基本概念

1.1 定义与核心思想

随机梯度下降是一种通过最小化损失函数来更新模型参数的迭代算法。其核心思想是:在每步迭代中,从训练集中随机抽取一个样本(或一小批样本),计算该样本上的梯度作为真实梯度的无偏估计,并沿负梯度方向更新参数。由于每次只用一个样本计算梯度,计算成本极低,且随机性带来的波动有助于跳出不利的局部区域。

1.2 与批量梯度下降的对比

1.2.1 计算效率差异

批量梯度下降(Batch Gradient Descent, BGD)每次迭代需遍历整个训练集,计算所有样本的梯度平均值。当样本量巨大(例如数百万级)时,单次迭代的计算开销极高,甚至无法装入内存。SGD每次仅需处理一个或几个样本,单步计算量降低数个数量级,因而在大规模数据场景下实际效率远高于BGD。

1.2.2 收敛路径特征

BGD的梯度方向稳定,每一步都沿全局最陡方向下降,收敛路径平滑且单调,但容易困在较差的局部极小值。SGD由于每次梯度估计带有随机噪声,更新方向波动较大,收敛路径曲折甚至振荡。这种噪声虽降低了收敛速度,却赋予了算法逃离浅洼和鞍点能力,在非凸问题中往往能到达更优的解。

2 算法原理

2.1 基本步骤

2.1.1 参数初始化

确定模型参数的初始值。常见的做法包括全零初始化(仅适用于某些线性模型)、小随机数(如服从均值为0的正态分布)或利用更复杂的Xavier初始化等。初始化质量对最终性能有显著影响。

2.1.2 随机采样与梯度计算

在第 \( t \) 次迭代,从训练集中随机均匀抽取一个样本(或一个 mini-batch)\((x^{(i)}, y^{(i)})\)。计算该样本上的损失函数 \( L_i(\theta) \) 关于参数 \(\theta\) 的梯度:

\[ g_t = \nabla L_i(\theta_t) \]

如果使用小批量,则取多个样本梯度的平均值。

2.1.3 参数更新公式

沿负梯度方向更新参数,步长为 \(\eta_t\)(学习率):

\[ \theta_{t+1} = \theta_t - \eta_t \, g_t \]

重复以上步骤直至满足停止条件(如达到最大迭代次数损失不再下降等)。

2.2 学习率(步长)

2.2.1 固定学习率与衰减策略

固定学习率即在整个训练过程中使用恒定值,简单但难以适配不同阶段的收敛需求。实践中更常用衰减策略,使学习率随迭代次数逐渐减小,以平衡初期快速探索与后期精细收敛。典型方案包括阶梯式衰减(每若干轮乘以固定系数)、指数衰减和余弦退火等。

2.2.2 学习率对收敛的影响

学习率过大,梯度更新步长过猛,参数可能振荡发散,甚至跳过最优区域;学习率过小,收敛极慢,且易陷入局部极值。SGD对学习率尤为敏感,需谨慎调参。通常从 0.1 或 0.01 开始尝试,并配合衰减。

2.3 随机性的作用

2.3.1 噪声与泛化能力

SGD每次引入的随机梯度噪声具有正则化效果。研究表明,这种噪声能抑制模型在训练集上的过拟合倾向,使得最终模型的泛化能力(在测试集上的表现)往往优于使用精确梯度的BGD。此外,噪声帮助算法跳出尖锐的局部极小值,找到更平缓的最优点。

2.3.2 收敛的方差问题

由于每次只用一个样本估计梯度,方差较大,导致收敛路径剧烈振荡,无法精确收敛到极小值点,只能在其邻域内波动。这使得SGD在严格凸优化中不保证精确收敛,通常需要使用衰减学习率或小批量来平衡方差与收敛精度

3 变体与改进

3.1 动量法(Momentum

3.1.1 物理直观解释

动量法借鉴物理中的惯性概念:物体运动时会保持原有速度方向,动量项累积历史梯度方向,使更新更平滑。想象一个小球从山顶滚下,动量使其加速冲过谷底的小坑,避免停滞。

3.1.2 更新公式与效果

引入速度变量 \( v \),参数更新为:

\[ v_{t+1} = \gamma v_t + \eta g_t \] \[ \theta_{t+1} = \theta_t - v_{t+1} \]

其中 \(\gamma\) 为动量系数(通常取 0.9)。动量法可加速收敛,抑制振荡,尤其在高曲率或梯度方向一致的区域表现优异。

3.2 自适应学习率方法

3.2.1 AdaGrad

AdaGrad为每个参数单独调整学习率,对频繁更新的参数给予较小步长,对稀疏参数给予较大步长。其更新公式为:

\[ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \odot g_t \]

其中 \( G_t \) 为历史梯度平方的累积和。AdaGrad免去了手动衰减学习率,但累积和不断增长会导致学习率过早归零,不适合长期训练。

3.2.2 RMSProp

RMSProp在AdaGrad基础上引入指数衰减移动平均,解决累积无界的问题:

\[ E[g^2]_t = \beta E[g^2]_{t-1} + (1-\beta) g_t^2 \] \[ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t \]

它使学习率自适应调整,在非平稳目标上表现稳定,是深度学习中常用的方法。

3.3 Adam优化器

3.3.1 动机与设计原理

Adam结合动量法与RMSProp,同时存储梯度的一阶矩(动量)和二阶矩(梯度平方加权平均),实现自适应步长与平滑更新。其更新公式为:

\[ 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 \] \[ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t + \epsilon}} m_t \]

3.3.2 偏差修正机制

在迭代初期,一阶矩和二阶矩被初始化为零,导致估计值偏向零。Adam引入偏差修正来抵消:

\[ \hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t} \]

修正后的矩估计更为无偏,使Adam在初始阶段也能稳定更新,成为深度学习中最流行的优化器之一。

3.4 其他常见变体

3.4.1 Nesterov加速梯度

Nesterov动量(NAG)是对标准动量的改进:它先用当前速度“前瞻”一步,再在该前瞻点处计算梯度。更新时相当于在正确方向施加更精准的修正,有助于减少振荡,加速收敛。公式:

\[ \theta_{\text{lookahead}} = \theta_t - \gamma v_t \] \[ v_{t+1} = \gamma v_t + \eta \nabla L(\theta_{\text{lookahead}}) \] \[ \theta_{t+1} = \theta_t - v_{t+1} \]

3.4.2 Nadam

Nadam将Nesterov动量与Adam结合,以整合两者的优势。它在Adam基础上,将修正后的一阶矩替换为Nesterov机制,使得更新方向更为准确。实际使用中,Nadam相比Adam有时可获得更快的收敛速度和更好的泛化性。

4 收敛性分析

4.1 凸优化情形

4.1.1 强凸条件下的收敛率

对于强凸且光滑的目标函数,SGD(使用衰减学习率 \(\eta_t = O(1/t)\))的期望误差以 \(O(1/t)\) 速率收敛。若学习率适当,甚至可以到达线性收敛速率,但受限于随机梯度的方差,最终只能收敛到最优点的邻域内。

4.1.2 一般凸条件下的次线性收敛

对于一般凸函数(非强凸),SGD的期望最优误差的收敛率为 \(O(1/\sqrt{t})\),即次线性收敛。这意味着要达到精度 \(\epsilon\),需要的迭代次数与 \(1/\epsilon^2\) 成正比。当使用小批量时,收敛率可提升至 \(O(1/t)\),取决于样本量的调节。

4.2 非凸优化情形

4.2.1 鞍点与局部极小值的挑战

在高维非凸问题中,目标函数布满鞍点和局部极小值。SGD的随机性使其可能逃离梯度为零的鞍点(因为鞍点附近的梯度方向噪声容易带动参数沿曲率负方向移动),但依然有陷入深层局部极值的风险。实践中往往采用多次重启或自适应方法缓解。

4.2.2 收敛到临界点的保证

在适当条件下(如光滑性、梯度有界等),SGD几乎必然收敛到某个临界点(梯度为零的点)。但该点可能是局部极小值、极大值或鞍点。近年来理论证明,带有噪声的SGD能以大概率收敛到二阶临界点(避免鞍点),但需要较长的收敛时间。

5 实践技巧与调参

5.1 学习率调度策略

5.1.1 阶梯式衰减

将总训练轮次划分为若干阶段,每经过 \(k\) 个 epoch,学习率乘以一个衰减因子(如 0.1)。例如在训练图像分类模型时,常在 30、60、90 epoch 处将学习率降低为原来的十分之一。这种方法简单有效,但需要预先设定节点。

5.1.2 余弦退火

学习率按照余弦函数周期性地从初始值降至零,再周期性回升,形成“热重启”效果。公式:

\[ \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\frac{t}{T}\pi\right)\right) \]

余弦退火可使模型在多次重启中探索不同的损失盆地,提升最终性能。

5.2 批次大小选择

5.2.1 小批量与单样本取舍

单样本(batch size = 1)的SGD方差极大,收敛不稳定,但可在线实时更新。小批量(例如 32、64、128)是折中方案:既保持了计算效率,又通过平均梯度降低了方差,使得收敛更为平滑,并可利用矩阵运算的硬件加速。极端大批量(如 1024 以上)会损失随机性,可能降低泛化。

5.2.2 批次大小与收敛稳定性

小批量越大,梯度方差越小,更新方向越接近真实梯度,学习率可适当增大,但计算成本也随之上升。最佳批次大小与数据集、模型结构和硬件内存有关,通常推荐按 2 的幂次选择并配合学习率线性缩放法则。

5.3 初始化与正则化

5.3.1 参数初始化方法

不当的初始化会导致梯度爆炸或消失,使SGD难以启动。常用方法包括:

  • Xavier初始化:方差与输入输出维度成反比,适用于sigmoid/tanh激活。
  • He初始化:方差放大2倍,适用于ReLU类激活。
  • 零均值小随机数:简单但需控制方差。

5.3.2 权重衰减与SGD

权重衰减(Weight Decay)等价于在损失函数中加入 L2 正则项,更新时等效为:

\[ \theta_{t+1} = (1 - \lambda \eta_t) \theta_t - \eta_t g_t \]

其中 \(\lambda\) 为衰减系数。它在SGD更新中自动对参数施加阻尼,防止过拟合,是训练深度网络的标准配置。

6 应用与局限性

6.1 在深度学习中的应用

6.1.1 图像分类与CNN

SGD及其动量变体是训练卷积神经网络(CNN)的经典选择。在ImageNet等大型数据集上,配合学习率衰减和权重衰减,SGD能够稳定地训练深层网络(如ResNet、VGG),获得具有竞争力的分类精度。尽管Adam在工程上更便捷,但很多顶级比赛仍偏爱SGD+动量,因其常能取得更好的泛化。

6.1.2 自然语言处理与RNN

在循环神经网络(RNN、LSTM)训练中,SGD同样占据重要地位。由于RNN的梯度存在长时间依赖问题,动量法和梯度裁剪常与之结合使用。Adam等自适应方法在Transformer架构(如BERT、GPT)中也广泛使用,但SGD在微调阶段仍被青睐。

6.2 局限性及应对

6.2.1 对超参数敏感

SGD的性能高度依赖学习率、学习率衰减策略、动量系数、权重衰减系数等超参数。不同任务和模型需要反复调试,调参成本高昂。应对方式是采用网格搜索、贝叶斯优化,或直接使用Adam等对超参数鲁棒性更强的自适应方法。

6.2.2 无法保证全局最优

对于非凸问题,SGD最多收敛到局部极小值或鞍点,无法保证找到全局最优。实际应用中对初始点敏感,常需多次随机初始化或使用集成方法缓解。在深度学习中,多数情况下“足够好的局部极小值”已能满足任务要求。

6.2.3 与二阶方法的对比

二阶方法(如牛顿法、L-BFGS)利用曲率信息,通常收敛更快、迭代次数更少,但每次迭代需计算海森矩阵或近似逆,计算和存储代价极为高昂,在深度学习中不实用。SGD虽然迭代次数多,但单步计算轻量,结合硬件并行和分布式训练,总体时间开销仍占优。当数据规模巨大时,SGD家族几乎是最实用的选择。