6.1 损失函数与优化器:为什么选择 Adam

6.1.1 交叉熵损失

Transformer 训练中最常用的损失函数是交叉熵损失(Cross-Entropy Loss)。对于一个分类问题(语言模型的每步预测本质上就是在词汇表中分类),交叉熵衡量的是模型预测分布 $\hat{p}$ 与真实分布 $p$ 之间的差异:

L=c=1Vp(c)logp^(c)\mathcal{L} = -\sum_{c=1}^{V} p(c) \log \hat{p}(c)

在语言建模中,真实分布是独热的(正确词元概率为 1,其余为 0),因此简化为:

L=logp^(xtrue)\mathcal{L} = -\log \hat{p}(x_{\text{true}})

直觉上,交叉熵惩罚的是**“对正确答案分配的概率太低”**——模型越不确定正确答案,损失越大。

标签平滑(Label Smoothing)是一种常用的正则化技巧。它将真实标签从硬性的 [0, 0, ..., 1, ..., 0] 软化为 [ε/V, ε/V, ..., 1-ε, ..., ε/V](原始论文中 $\epsilon = 0.1$)。这防止模型对预测过度自信,提升泛化能力。

6.1.2 SGD 的局限

随机梯度下降(SGD)是最基本的优化算法:$\theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L}$。但对于 Transformer 而言,SGD 有几个问题:

损失地形复杂:深度 Transformer 的损失函数包含大量鞍点和狭窄山谷,SGD 的固定学习率难以同时在不同方向上取得合适的步长。

梯度噪声大:大规模训练中使用的小批量梯度本身带有较大的噪声,SGD 直接使用这些嘈杂梯度容易导致训练不稳定。

6.1.3 Adam 优化器:自适应学习率

Adam(Adaptive Moment Estimation,Kingma & Ba,2015)通过维护梯度的一阶矩(均值)和二阶矩(未中心化方差)的指数移动平均来解决上述问题:

mt=β1mt1+(1β1)gt(一阶矩估计)m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \quad \text{(一阶矩估计)} vt=β2vt1+(1β2)gt2(二阶矩估计)v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \quad \text{(二阶矩估计)} θt=θt1ηm^tv^t+ϵ\theta_t = \theta_{t-1} - \eta \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

其中 $\hat{m}_t$ 和 $\hat{v}_t$ 是偏差校正后的估计。

Adam 的核心优势是每个参数有独立的自适应学习率:梯度变化大的参数($v_t$ 大)自动获得较小的学习率,梯度变化小的参数获得较大的学习率。这使得 Adam 在处理稀疏梯度和损失地形复杂的情况时特别有效。

原始 Transformer 使用了 $\beta_1 = 0.9$、$\beta_2 = 0.98$、$\epsilon = 10^{-9}$——这组参数后来成为了 Transformer 训练的经典配置。

6.1.4 AdamW:权重衰减的修正

在实践中,更常用的是 AdamW——它修正了 Adam 中权重衰减(L2 正则化)的实现方式。在原始 Adam 中,L2 正则化与自适应学习率交互后效果不够理想;AdamW 将权重衰减与梯度更新解耦,对每个参数直接施加固定比例的衰减。这种简单的修改在大模型训练中带来了可测量的改善。

现代大语言模型训练几乎都使用 AdamW(包括 DeepSeek-V3 等前沿模型),但也有一些新的优化器在特定场景下展示了优势,例如针对大批量训练优化的 LAMB(Layer-wise Adaptive Moments optimizer for Batch training),以及 T5 等模型采用的 Adafactor 等低内存优化器。

最后更新于