Transformer 总结与训练
1. 全链路回顾
经过前四章的拆解,我们已经看过了 Transformer 的每一个零件。现在把它们组装回来,做一次完整的端到端梳理。
各组件速查表
| 组件 | 作用 | 关键公式 | 详细笔记 |
|---|---|---|---|
| Token Embedding | 词 ID → 稠密向量 | Token Embedding | |
| 位置编码 | 注入序列顺序 | 位置编码 | |
| Self-Attention | 序列内自我关联 | Self Attention 计算 | |
| 多头注意力 | 多角度并行关注 | 多头注意力 | |
| FFN | 逐位置非线性变换 | Encoder Block | |
| 因果掩码 | 防止看到未来 | 下三角掩码矩阵 | Masked Self Attention |
| 输出层 | 隐藏状态 → 词概率 | 终端输出 |
2. 训练目标
2.1 交叉熵损失
Transformer 的训练目标是最小化交叉熵损失——让模型预测的概率分布尽量接近真实的 one-hot 分布:
- :位置 的真实目标词
- :模型给出的概率
类比:模型在每个位置做一道”选择题”,答案是词表中的某个词。交叉熵损失 = “答错的程度”,越小越好。
2.2 Teacher Forcing
训练时,解码器的输入不是模型自己上一步的预测,而是真实的目标序列(右移一位):
目标序列: <BOS> I love learning <EOS>解码器输入: <BOS> I love learning ← 右移解码器目标: I love learning <EOS> ← 需要预测的| Teacher Forcing | 自回归 | |
|---|---|---|
| 解码器输入 | 真实目标 | 自己上一步的预测 |
| 用于 | 训练 | 推理 |
| 优点 | 训练稳定、收敛快 | 真实使用场景 |
| 缺点 | 训练/推理分布不一致1 | 错误会滚雪球 |
Exposure BiasTeacher Forcing 导致模型训练时总是看到”正确的”前文,推理时却要面对自己可能出错的前文。一旦某步预测错了,后续全部偏离。缓解方法包括 Scheduled Sampling(训练中逐步增加使用自己预测的比例)。
3. 学习率策略:Warmup + Decay
原论文使用了一个经典的学习率调度策略:
为什么需要 Warmup?
类比:刚开始训练时,模型参数是随机的,梯度方向不可靠。如果一上来就用大学习率,模型会”乱跑”。Warmup 就像汽车先怠速热车,等引擎稳定了再加速。
| 阶段 | 步数 | 学习率变化 | 原因 |
|---|---|---|---|
| Warmup | 0 → 4000 | 线性增长 | 参数未稳定,小步试探 |
| Decay | 4000 → ∞ | 逐步衰减 | 精细调整,避免震荡 |
import subprocesssubprocess.check_call(["pip", "install", "numpy"])import numpy as np
def transformer_lr(step, d_model=512, warmup_steps=4000): """原论文的学习率调度""" step = max(step, 1) # 避免除零 return d_model ** (-0.5) * min(step ** (-0.5), step * warmup_steps ** (-1.5))
# 打印关键节点的学习率for step in [1, 1000, 4000, 10000, 50000, 100000]: lr = transformer_lr(step) print(f"Step {step:>6d}: lr = {lr:.6f}")4. Label Smoothing
不使用硬 one-hot 目标(真实词=1,其他=0),而是给真实词分配 ,剩余概率均匀分配给其他词:
原论文使用 。
为什么要 Label Smoothing?硬 one-hot 让模型拼命把正确答案的概率推向 1.0,导致输出过度自信、泛化能力差。Label Smoothing 相当于告诉模型”正确答案大概率是这个,但也别太绝对”,实验表明能提升 BLEU 分数约 0.5-1.0。
5. 其他训练技巧
5.1 Dropout
原论文在以下位置使用 Dropout():
- 每个子层的输出(残差连接之前)
- Attention 权重矩阵
- Embedding 之后
5.2 梯度裁剪 (Gradient Clipping)
限制梯度范数不超过阈值,防止梯度爆炸:
5.3 优化器:Adam
原论文使用 Adam 优化器,参数 。
现代大模型通常使用 AdamW(Adam with Weight Decay),将权重衰减从梯度更新中解耦。
6. 训练流水线总结
原论文训练配置
| 配置项 | 值 |
|---|---|
| 数据集 | WMT 2014 英德翻译(450 万句对) |
| batch 大小 | ~25,000 tokens |
| 训练步数 | 100,000 步(base)/ 300,000 步(big) |
| 训练时间 | 3.5 天 / 8×P100 GPU(base) |
| Warmup 步数 | 4,000 |
| Dropout | 0.1(base)/ 0.3(big) |
| Label Smoothing |
现代大模型训练规模GPT-3 (175B) 训练使用了约 3000 亿 token,耗时数周在数千张 GPU 上。LLaMA-2 (70B) 训练使用了 2 万亿 token。训练成本从原论文的几天、几张卡,膨胀到了数百万美元量级——但核心架构和训练技巧本质上没有变。
相关笔记
- 终端输出 — 上一篇:解码策略
- Transformer 代码实现 — 下一篇:从零实现完整 Transformer
- 什么是语言模型 — 回顾:训练的最终目标
Footnotes
-
Exposure Bias(曝光偏差):训练时模型只见过真实数据,推理时却要面对自己的预测(可能有错)。这种训练/推理分布的不一致会导致错误累积。Scheduled Sampling、Minimum Risk Training 等技术试图缓解这个问题。 ↩