一、什么是反向传播(Backpropagation)
1. 计算总误差(Loss)
前向计算结束后,模型会得到一个最终的 Loss 值。Loss 越大,说明模型错得越离谱。
数学公式如下:
$$ L = f(\hat{\mathbf{y}}, \mathbf{y}) $$2. 梯度(Gradient)与链式法则(Chain Rule)
模型有很多个参数(权重),Loss 的高低是所有参数共同作用的结果。反向传播的核心任务是:计算 Loss 对每一个参数的“导数”(即梯度)。
梯度(Gradient):代表了某个参数的变化对最终 Loss 的影响有多大。如果一个参数的梯度很大,说明它对错误负有主要责任。
链式法则(Chain Rule):一旦标量 (L) 确定,模型就需要计算它对网络中所有可学习参数矩阵 (\mathbf{W}_l) 的偏导数。
神经网络在数学上可以被视为一个多层嵌套的复合函数:
$$ L = f_L(f_{L-1}(...f_1(\mathbf{x}, \mathbf{W}_1)..., \mathbf{W}_{L-1}), \mathbf{W}_L) $$根据微积分的链式法则,对于任意中间层 (l) 的参数 (\mathbf{W}_l),其梯度计算必须沿输出端向输入端逆向追溯:
$$ \frac{\partial L}{\partial \mathbf{W}_l} = \frac{\partial L}{\partial \mathbf{a}_L} \times \frac{\partial \mathbf{a}_L}{\partial \mathbf{a}_{L-1}} \times \dots \times \frac{\partial \mathbf{a}_{l+1}}{\partial \mathbf{a}_l} \times \frac{\partial \mathbf{a}_l}{\partial \mathbf{W}_l} $$(其中 (\mathbf{a}_l) 表示第 (l) 层的激活值向量。上式是便于理解的示意写法;真实网络里是张量形式的 Jacobian,实现上由自动微分完成。)
3. 参数更新(Optimizer Update)
计算出梯度向量后,训练进入最优化(Optimization)阶段。
最速下降原理:为了最小化 Loss,参数必须沿着梯度的反方向(即函数值下降最快的方向)进行迭代移动。
数学更新算式:
$$ \mathbf{W}_l^{(t+1)} = \mathbf{W}_l^{(t)} - \eta \cdot \Delta(\nabla_{\mathbf{W}_l} L^{(t)}) $$- (\eta)(学习率)充当步长因子,控制参数更新大小。
- (\Delta(\cdot)) 代表优化器算子
4. 优化器
主要有三类:
传统梯度下降族
SGD (随机梯度下降):最基础的优化器,每次更新仅依据当前样本的梯度乘以固定的学习率。
SGDM (带动量的 SGD):引入了物理学中的“动量(Momentum)”概念。它会累积历史梯度的方向(一阶矩),像一个滚下山的雪球,在梯度方向一致时加速,在梯度震荡时起到平滑作用,有助于缓解局部极小值和鞍点附近的震荡问题。
自适应学习率族(Adaptive Learning Rate)
这类优化器的核心思想是“为每个参数量身定制学习率”:频繁更新的参数,学习率调小一点;比较稀疏、很少更新的参数,学习率放大一点。
AdaGrad:最早的自适应优化器,通过累加历史梯度的平方(二阶矩)来缩放学习率。缺点是后期分母过大,导致学习率过早“干涸”变为 0。
RMSProp:引入了指数移动平均(EMA),只关注最近一段时间的梯度平方,解决了 AdaGrad 学习率后期不更新的问题。
Adam (Adaptive Moment Estimation):它同时结合了 SGDM 的动量(一阶矩) 和 RMSProp 的自适应缩放(二阶矩)。既能自动调整方向,又能自动调整每一步的步长,是通用深度学习中最稳健、最常用的优化器。
一阶矩(动量):
$$ m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t $$(g_t):当前步骤反向传播算出来的梯度 (\frac{\partial L}{\partial w_t})。
(\beta_1):一阶衰减系数
物理意义:惯性。当前方向要结合历史前进的方向,平滑掉梯度的震荡。
二阶矩(方差):
$$ v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 $$物理意义:阻力/自适应调节。如果某个参数的梯度历史累积非常大((v_t) 很大),说明它更新频繁,后面做分母时就会让它的实际步长变小。
偏差修正(Bias Correction):因为 (m_0) 和 (v_0) 初始被设为 0,在训练刚开始的几步,公式算出来的值会严重偏向 0。所以需要数学修正:
$$ \hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t} $$随着训练步数 (t) 增大,(\beta^t) 迅速趋近于 0,修正系数趋近于 1,该步骤在后期失去影响
参数更新:
$$ w_{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t $$(\eta):全局学习率(Learning Rate)。
(\epsilon):防止分母为 0 的极小值
正则化改进族
AdamW:针对 Adam 的重要改进。在传统的 Adam 中,L2 正则化(权重衰减,Weight Decay)由于自适应梯度的存在,在数学上无法正确生效。AdamW 将权重衰减与梯度的更新解耦,直接作用于参数更新的最后一步。
在机器学习中,为了防止模型过拟合,我们通常会引入 L2 正则化(也叫权重衰减,系数为 (\lambda))。它的目的是在损失函数中加上惩罚项,让权重 (w) 尽量保持较小的值。
公式如下:
$$ w_{t+1} = w_t - \eta \cdot \lambda \cdot w_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \cdot \hat{m}_t $$其中**(\eta \cdot \lambda \cdot w_t):这一项就是权重衰减**。
二、LLM 训练中的主流反向传播与优化方法
训练几百亿甚至上千亿参数的 LLM 时,原始的反向传播方法根本无法运行,因为它需要把前向计算的所有中间状态(Activation,激活值)都保存在显存里,等到反向传播时使用。LLM 的显存开销会发生显存爆炸
现在主流有以下几种改进的主流方式:
1. 激活值检查点(Activation Checkpointing / Gradient Checkpointing)
原理:用时间换空间。这两个名字在工程里常混用,指同一类技巧:前向计算时不再保存所有层的中间激活值,而是只隔几层保存一个 Checkpoint。
反向传播时:当反向传播需要某个未保存的激活值时,模型会从最近的一个检查点出发,临时重新做一次局部的前向计算。
2. 混合精度训练(Mixed Precision Training: FP16 / BF16 / FP8)
现代 LLM 训练几乎不使用传统的标准单精度浮点数(FP32,4字节)做全部计算。
主流做法:前向和反向的大部分计算使用 BF16(Brain Floating Point 16)或 FP16(2字节)。FP16 训练里常配合 loss scaling;BF16 动态范围更大,很多场景更省心。
最新趋势:在极大规模的集群训练中(如 NVIDIA H100/B200 时代),FP8(1字节)训练也在普及。
更准确地说:矩阵乘等计算常用 BF16/FP16(或 FP8)低精度浮点;master weights / 优化器状态 则常保留更高精度(如 FP32),避免更新过程数值漂掉。这不是把梯度做成整数量化,而是低精度浮点计算 + 高精度主状态。
3. ZeRO (Zero Redundancy Optimizer) 驱动的反向传播
微软 DeepSpeed 提出的 ZeRO 技术是分布式 LLM 训练的基石。在多卡训练时,它改变了反向传播的行为:
- ZeRO-1 (优化器状态切分):反向传播算完梯度后,每个 GPU 只更新自己负责的那部分优化器状态。
- ZeRO-2 (梯度切分):在反向传播过程中,某个参数的梯度一旦计算出来,立刻跨卡聚合(Reduce)并分发出去,然后在本卡销毁,不再留在显存里。
- ZeRO-3 (参数切分):前向和反向时,每层参数用完立刻释放,只在需要时从其他卡通信拉取。
当大模型太大了,一张显卡的显存装不下。我们必须用多张卡联合训练
每卡算一部分,算完通信共享一下,使用完自己的部分立刻销毁,此外模型参数也切分
用高频的显卡间网络通信,去换取更多的显存空间