梯度下降变体
批量梯度下降(BGD)、随机梯度下降(SGD)和小批量梯度下降(Mini-batch GD)的区别是什么?各自的优缺点?¶
这三种梯度下降法的主要区别在于每次参数更新所使用的样本数量,这直接影响了更新的稳定性、计算效率和收敛行为。
- 批量梯度下降 (Batch Gradient Descent, BGD)
每次更新时,使用整个训练数据集来计算损失函数对参数的梯度,然后进行一步更新。
优点: - 在凸函数上可保证收敛到全局最小值,在非凸情况下可收敛到局部极小值。
- 梯度方向代表了整个数据集的最速下降方向,噪声极小,损失下降曲线平滑且稳定。
-
若学习率固定,理论上能精确线性收敛。
-
缺点:
-
每次更新都要遍历全量数据,对于大规模数据集,计算开销巨大,更新速度非常慢。
-
内存可能无法容纳整个数据集,无法进行在线学习(无法增量更新)。
-
容易陷入较差的局部极小值且由于移动谨慎,缺少探索能力。
-
随机梯度下降 (Stochastic Gradient Descent, SGD) 每次更新时,仅使用一个随机选出的样本的梯度来更新参数。

- 优点:
- 每次更新的计算量极小,速度快,可实时在线学习。
- 参数更新极为频繁,可以快速取得进展。
- 因为梯度的噪声很大,参数的震荡性更新使得它有机会跳出较差的局部极小值或鞍点,从而可能找到更好的解。 缺点:
- 梯度的方差极高,导致损失函数值会剧烈震荡,收敛路径非常不稳定。
- 由于方向混乱,可能永远无法精确收敛到最优点,会在最优点附近来回振荡,需要配合学习率衰减。
-
无法有效利用向量化加速,硬件利用率低。
-
小批量梯度下降 (Mini-batch Gradient Descent, Mini-batch GD) 每次更新使用一个包含 m 个样本的小批次,计算这批样本上的平均梯度。

- 优点:
- 结合了 BGD 和 SGD 的优点:计算效率高(利用矩阵运算的向量化加速),同时梯度方差比 SGD 小,损失下降比 SGD 平滑,比 BGD 快得多。
- 可以通过选择批次大小来灵活调节收敛速度和稳定性。
- 是深度学习训练的标准方法。 缺点:
- 依然存在一定的梯度噪声,需要仔细调节学习率。
- 批次大小的选择成为一个新的超参数,对性能有影响。
- 不能保证收敛到全局最优,但在深度学习中通常能收敛到较好的局部解。

为什么 SGD 的更新方向比 BGD 噪声大?这种噪声有什么好处?¶
-
噪声大的原因 BGD 的梯度是在整个训练集上计算的平均梯度,它反映了真实的总体损失下降方向。而 SGD 仅基于单个样本,单个样本的梯度是该样本损失表面的陡峭方向,样本与样本之间的梯度方向差异很大。这使得 SGD 的每一步方向都在“真实梯度方向”附近剧烈波动,表现出极高的方差。 从统计学角度,SGD 的梯度是真实梯度的无偏估计,但方差很大。Mini-batch GD 的噪声介于两者之间,批次越小,噪声越大。
-
噪声的好处
- 逃离局部极小值和鞍点:在深度神经网络的非凸损失曲面中,存在大量次优的局部极小值和梯度接近于零的鞍点。BGD 的方向很准确,会沿着一个方向一直走,容易掉进这些平坦区域而停滞。SGD 的随机噪声会不断扰动参数,使得它即使在一些梯度很小的点,也可能被推向更有希望的区域,从而有机会找到更优的解。
- 更好的泛化能力:经验发现,带有噪声的梯度更新往往能导向平坦的极小值(flat minima),而平坦极小值对模型泛化更有利,因为参数微小的变化不会导致性能剧降。相反,BGD 倾向于收敛到尖锐极小值(sharp minima),泛化能力通常较差。
- 探索能力:噪声让优化路径更具探索性,在损失面上随机游走,可能跨越沟壑,而不是沿着最直接但可能是次优的峡谷前进。
因此,SGD 的噪声虽然使训练过程变得不稳定,但正是这种扰动赋予了它脱离劣质解、增强泛化的关键能力。
Mini-batch 的大小如何选择?过大或过小对训练有什么影响?¶
选择原则:没有绝对最优值,通常由硬件内存、计算效率和泛化性能共同决定。
- 批次过小(如 1 或极小的 mini-batch):
- 梯度估计的方差极大,损失曲线震荡严重,收敛不稳定。
- 难以充分利用 GPU 的并行计算能力,计算效率低。
- 有时能产生强正则化效果,有可能得到更好的泛化结果,但训练时间会变长。
-
在某些情况下,过于剧烈的震荡可能使得模型根本无法收敛。
-
批次过大(接近数据集大小):
- 梯度估计准确,损失下降平滑。
- 可以充分利用 GPU 并行性,单次迭代计算效率高。
- 但容易收敛到尖锐极小值,泛化能力往往变差。
- 大 batch 的梯度在每次更新中缺乏噪声,使得探索能力降低,更容易被困在局部极小值或鞍点。
- 训练模型可能需要更多的 epoch 才能达到相近的精度,尽管每步更快。
-
内存占用极大,甚至无法放入显存。
-
常用策略:
- 常用的 mini-batch 大小为 32、64、128、256 等,通常是 2 的幂以便硬件对齐。
- 在内存允许的情况下,选择中等大小(如 64 或 128)通常能在稳定性和泛化能力之间取得平衡。
- 当数据极度不平衡或小样本学习时,可能采用更小的 batch。
- 现代大模型训练中,有时会使用非常大的 batch(如数千甚至上万),配合线性缩放学习率(learning rate scaling)和 warmup 来维持训练稳定。
Momentum(动量)是如何加速 SGD 的?写出其更新公式,并解释物理直觉。¶
更新公式
经典动量法(Polyak 动量):

或者等价表述为:

但最常用的形式是:

其中 β 为动量系数(典型值 0.9),v 为累积的速度。
物理直觉
将优化过程想象成一个球在山坡上滚动:
-
梯度项 η∇J 相当于重力产生的加速度,方向指向下坡。
-
动量项 βvβv 类似于物理中的惯性,让球保持之前的速度方向。
-
在梯度方向一致的维度上,速度会不断累积,使得参数在该方向上越来越快地前进,加速收敛。
-
在梯度方向反复震荡的维度(如峡谷侧壁),动量会平滑掉震荡:相邻步的梯度方向相反,速度会相互抵消,从而衰减横向震荡,使运动方向趋于稳定的下降通道。
因此,动量能够加速收敛、减少震荡,并帮助越过沟壑中的一些小障碍。
Nesterov 加速梯度(NAG)与标准动量有什么不同?为什么说它“先向前看一步”?¶
不同点:标准动量是先在当前位置计算梯度,然后与累积速度混合并更新。而 NAG 是先根据之前累积的速度向前试探一步,在那个“前瞻”位置上计算梯度,然后修正速度并实际更新。
标准动量更新:

NAG 更新:

“先向前看一步”

点计算梯度,相当于询问:“如果我现在继续按惯性前进,那个地方的斜率是什么?” 然后利用该前瞻点的梯度来修正本次的速度方向和大小。
这样做的好处是,当接近谷底时,如果速度方向指向谷底,前瞻位置可能已经越过谷底,梯度方向会反过来,从而提前减速,减少 overshoot(冲过头),收敛更加平滑稳定。
NAG 在理论上有更好的收敛率(在某些凸优化条件下),且实践中通常比标准动量稍好。
AdaGrad 算法的核心思想是什么?它的自适应学习率是如何实现的?有什么缺点?¶
核心思想
对不同参数使用不同的学习率,根据该参数历史梯度的平方和来自适应地缩小学习率。对于频繁更新的参数(梯度累加值大),学习率衰减得快;对于不常更新的参数(累加值小),学习率衰减得慢,从而在稀疏数据中让每个参数得到更均衡的训练。
自适应学习率实现

缺点

RMSProp 如何改进 AdaGrad 的学习率衰减问题?写出其更新公式。¶
RMSProp 将 AdaGrad 的累加所有历史梯度平方改为指数移动平均,使得分母只反映近期的梯度大小,不会单调无限增长,从而解决了学习率过早衰减的问题。
更新公式


Adam 优化器结合了哪些算法的思想?写出其完整更新规则,并解释每个超参数的作用。¶
Adam (Adaptive Moment Estimation) 结合了动量方法和RMSProp 的自适应学习率,即同时维护梯度的一阶矩(均值)和二阶矩(非中心方差)的指数移动平均,并对它们进行偏差校正。
完整更新规则(针对参数 θ):

超参数作用:
-
αα(学习率):控制参数更新步长的全局尺度,常用默认值 0.001。
-
β1β1:一阶矩估计的指数衰减率,控制梯度的平滑程度(动量效应),典型值 0.9。它让更新方向更平滑,加速收敛。
-
β2β2:二阶矩估计的指数衰减率,控制梯度平方的平滑,影响自适应学习率的调整,典型值 0.999。越高,过去梯度平方影响时间越长。

Adam 的偏差校正项是什么?为什么需要偏差校正?¶
偏差校正项

AdamW 与 Adam 的根本区别在哪里?为什么权重衰减要解耦?¶
根本区别:
AdamW 将权重衰减(Weight Decay) 与自适应学习率的梯度更新解耦,而在 Adam 中,直接使用 L2 正则化会因自适应机制而被扭曲,无法等价于真正的权重衰减。

AdamW 的做法:将权重衰减从梯度更新中剥离,直接在参数更新步骤中减去一个与自适应梯度步骤无关的权重衰减项:

- 这里权重衰减项 αλθt 不受二阶矩 vtvt 的影响,等价于每个参数以恒定的速率衰减。这样就能实现常规意义上的权重衰减(即每次迭代参数朝向零收缩一定比例),达到和 SGD 配合权重衰减类似的正则化效果。
为什么要解耦:
-
解耦之后,正则化强度 λλ 可以独立于自适应学习率调节,使超参数调优更容易。
-
在 Adam 中,L2 正则化和自适应学习率耦合会导致二者相互干扰,难以区分“优化过程”和“正则化过程”的影响。解耦后能够清晰地分离两者,使权重衰减作为一种标准正则化手段,发挥防止过拟合的作用,而不受历史梯度规模扭曲。
-
大量实验(如 Loshchilov & Hutter, 2019)表明,AdamW 相比带 L2 正则的 Adam,显著提升了泛化性能,特别是在图像分类等任务上可接近甚至超越 SGD 的泛化表现。
在实践中,Adam 和 SGD 各适合什么场景?为什么有些任务用 SGD 泛化更好?¶
SGD(带动量)适合的场景:
-
传统的计算机视觉任务(如图像分类、目标检测),尤其是使用 ResNet、VGG 等经典网络时,经验上 SGD + momentum 往往能达到更高的测试精度。
-
数据量充足且可以精细调参的场景,例如通过长时间训练、余弦退火学习率、多阶段衰减等策略。
-
对泛化性能要求极高的任务,因为 SGD 倾向于收敛到平坦极小值(flat minima),这类解对数据扰动和参数微小变化不敏感,泛化能力强。
Adam 适合的场景:
-
训练 Transformer、GAN、序列模型(如 RNN、LSTM)、强化学习等,这些模型经常面临非平稳目标、稀疏梯度或高度非凸的损失曲面。
-
需要快速原型开发或超参数较为鲁棒的情况:Adam 默认参数就能在许多任务上取得不错的结果,调参负担小。
-
处理含噪声或稀疏梯度的问题(如自然语言处理、大规模推荐系统),自适应学习率能对不同的参数维度进行差异化的步长调整,训练初期收敛极快。
为什么有些任务用 SGD 泛化更好:
-
平坦极小值假说:自适应优化器(如 Adam)倾向于寻找损失曲面中尖锐极小值,因为自适应机制会快速放大某些方向的更新,使其“钻入”狭窄的深谷。尖锐极小值对数据或参数的细微变化极为敏感,测试误差较大。
-
学习率的自适应缩放可能过早地缩小了某些关键方向的步长,导致不能充分探索损失曲面,从而错过更好的平坦区域。
-
SGD 的恒定或仅依赖全局衰减的学习率在所有方向上均匀探索,其噪声驱动下更容易跳出尖锐极小值并最终陷入更宽、泛化更好的区域。
-
数据特点:当数据本身噪声低、问题相对平稳时,SGD 的精细调节能够逼近全局最优且不引入过度的自适应偏差。
但这种差异并非绝对,近年来通过解耦权重衰减的 AdamW 和适当的学习率调度,Adam 也能在许多视觉任务上匹敌甚至超越 SGD 的泛化能力。
如果训练过程中 loss 震荡剧烈,应该如何调整优化器参数?¶
Loss 震荡剧烈通常意味着更新步长过大、梯度估计噪声太高或优化器动量/自适应设置不当。排查和调整建议如下:

什么是“学习率预热”(Warmup)?它为什么对 Transformer 等模型很重要?¶
学习率预热:在训练开始的若干步(或 epoch)内,让学习率从一个很小的值(如 0 或接近 0)逐渐线性或指数增加到预设的初始学习率。之后可以维持常数或按照原计划衰减。
对 Transformer 等模型至关重要的原因:
-
高方差的初期梯度:Transformer 通常使用多头注意力机制、层归一化(LayerNorm)和残差连接。模型刚初始化时,参数远离最优,各层输出可能极不稳定,导致梯度变化剧烈。若直接用较大的学习率,可能导致某些层接收到异常大的梯度,使参数更新过度,造成 loss 发散或进入极差的局部区域。
-
避免对随机初始化的过度反应:特别是在使用 Adam 等自适应优化器时,初始时刻 mtmt 和 vtvt 均从零开始,偏差校正后早期梯度估计仍不稳定。过大的学习率会在二阶矩尚未形成可靠估计时大幅度更新参数,容易破坏模型预训练的有效初始状态(如经过特定初始化的权重)。
-
维持残差连接的稳定性:Transformer 有很多残差分支,在初始化时残差分支的主路径几乎为恒等映射,这时若学习率过大,可能会把主路径输出扰动过大,破坏这种恒等性质,导致深层网络难以优化。
-
收敛速度和最终性能:实验表明,不进行预热直接使用较大学习率训练 Transformer,往往一开始 loss 就爆炸或迟迟不能下降,而预热后的学习率曲线能使 loss 平滑下降,最终收敛到更好的模型。这已成为训练 Transformer 的标准实践,例如在原始“Attention is All You Need”论文中就采用了 warmup steps。