把核心讲清楚
混合精度训练的核心其实非常朴素:做运算时用低精度,记总账时用高精度。
传统深度学习默认用 FP32(单精度浮点数,占 32 位、4 个字节)。在做语音特征提取(如梅尔频谱过卷积)或大模型自注意力机制时,大量的矩阵乘法占满了显存和带宽。如果我们换成 FP16(半精度,占 16 位、2 个字节),不仅数据体积减半,GPU 上的专用计算单元(Tensor Core)跑起来速度还能翻倍。
那为什么不全程只用 FP16? 因为会出问题。FP16 能表示的最小正数太有限(约 6e-5)。在模型反向传播时,很多层的梯度非常微小,如果直接用 FP16 存储,这些梯度会直接变成 0,这叫“下溢”(Underflow),导致网络根本学不动;同时,如果权重更新步长太小,加在 FP16 权重上会因为有效位不够而被舍入掉。
为了解决这个问题,混合精度训练(AMP, Automatic Mixed Precision)采取了“兼顾”的策略: 1. 算草稿(计算密集):网络的前向传播和反向传播中,矩阵乘法、卷积等大计算量算子自动降级成 FP16,显存占用大减,算得飞快。 2. 记大账(主权重更新):后台始终保留一份 FP32 的“主权重(Master Weights)”。梯度回传后,转换回 FP32 再去更新主权重,保证步进精度不丢失。 3. 梯度防丢失(Loss Scaling): 反向传播前,先将损失放大: $\mathcal{L}_{\text{scaled}} = \mathcal{L} \times S$ 其中 $\mathcal{L}$ 是损失值,$S$ 是放大倍数(Scale 因子)。这样根据链式法则算出来的梯度也会放大 $S$ 倍,脱离下溢危险区;在真正更新权重前,再将梯度除以 $S$ 还原回去。
边界需要注意:并非所有计算都适合转低精度。像 Softmax、LayerNorm 以及大向量求和,因为对极端值敏感或需要频繁累加,混精框架会自动让它们留在 FP32 中计算,保证数值稳定。
本课给出的出处:[1]