在训练和推理阶段,Transformer Decoder的工作模式有什么不同?
Transformer Decoder(解码器)在训练(Training)和推理(Inference/Generation)阶段的工作模式有着本质的区别。
最核心的差异可以用一句话概括:训练阶段是“并行”的且使用了“教师强制(Teacher Forcing)”,而推理阶段是“串行(自回归)”的。
以下是两个阶段具体工作模式的详细对比:
一、 训练阶段 (Training Phase)
在训练时,我们拥有完整的标准答案(Ground Truth),这使得 Decoder 可以进行高效的并行计算。
- 输入方式与教师强制 (Teacher Forcing):
- Decoder 的输入是完整的标准目标序列(Target Sequence),但会整体向右平移一位(Shifted Right),并在最前面加上起始符
<BOS>。 - Teacher Forcing: 无论模型在前一个时间步预测出了什么错字,在预测下一个字时,输入的依然是标准的正确答案。这防止了早期预测错误带来的雪崩效应(误差累积),使模型能更快收敛。
- Decoder 的输入是完整的标准目标序列(Target Sequence),但会整体向右平移一位(Shifted Right),并在最前面加上起始符
- 并行计算 (Parallel Computation):
- 因为已经知道了所有的目标 token,不需要等第一个字生成完再生成第二个字。所有的 token 会被一次性喂给 Decoder,所有的矩阵乘法同时发生。这使得训练速度极快,能充分利用 GPU 的算力。
- 因果掩码 (Causal Mask / Look-ahead Mask):
- 既然是一次性输入全部序列,如何防止模型在预测第 个词时“偷看”到第 个词?
- 答案是掩码机制。在自注意力(Self-Attention)计算时,会应用一个下三角矩阵(上三角部分设为负无穷大)。这样在计算注意力权重(Softmax)后,当前 token 就只能看到自己及之前的 token,强制模型学习“根据过去预测未来”。
二、 推理阶段 (Inference Phase)
在推理(测试或实际应用)时,我们没有标准答案,模型必须完全依靠自己生成的内容进行下一步预测。
- 自回归生成 (Autoregressive Generation):
- 模型只能串行(一步一步)工作。
- Step 1: 输入
<BOS>(或用户的 Prompt),模型预测出第一个 token(例如 "天")。 - Step 2: 将预测出的 "天" 拼接到输入中,现在的输入变成
<BOS> 天,模型预测出第二个 token(例如 "气")。 - Step 3: 输入变成
<BOS> 天 气,继续预测下一个 token。 - 如此循环,直到模型预测出结束符
<EOS>,或者达到了预设的最大长度限制。
- 误差累积 (Exposure Bias):
- 由于没有 Teacher Forcing,如果模型在某一步预测错了,这个错误的 token 会作为下一步的输入,导致后面的预测可能一错再错。这是训练和推理不一致带来的固有问题(称为 Exposure Bias)。
- KV Cache (键值缓存) 加速:
- 在串行生成时,随着序列越来越长,每次计算 Attention 都要重新计算前面所有 token 的 Key 和 Value,这会造成大量的重复计算,非常低效。
- 优化: 实际推理时会使用 KV Cache 技术。模型会把之前已经生成过的 token 的 Key 向量和 Value 向量缓存到显存中。每次生成新 token 时,只计算当前这一个 token 的 Q、K、V,然后拿当前的 Q 去和缓存好的 K、V 做注意力计算。这极大降低了推理的时间复杂度。
- 解码策略 (Decoding Strategies):
- 训练时只计算交叉熵损失。而推理时,面对模型输出的概率分布,需要采取策略来选择最终的词,例如:
- 贪婪搜索 (Greedy Search): 每次直接选概率最大的词。
- 束搜索 (Beam Search): 每次保留概率最高的 条路径,适合机器翻译。
- 采样 (Sampling): 引入随机性(如 Top-K, Top-p, Temperature),适合闲聊和创意写作。
- 训练时只计算交叉熵损失。而推理时,面对模型输出的概率分布,需要采取策略来选择最终的词,例如:
三、 总结与对比表
| 特性 | 训练阶段 (Training) | 推理阶段 (Inference) |
|---|---|---|
| 工作方式 | 并行 (Parallel) | 串行 / 自回归 (Autoregressive) |
| 输入来源 | 真实的目标序列 (Ground Truth) | 模型自己上一步预测出的序列 |
| 指导机制 | 教师强制 (Teacher Forcing) | 无 (完全依赖自身预测) |
| 掩码 (Mask) | 必须使用下三角掩码防止“偷看未来” | 通常不需要显式掩码 (因为未来token还没生成),但若使用 KV cache,逻辑上等同于只关注过去 |
| 计算效率 | 极高 (矩阵并行计算) | 较低 (需等待上一步结果,即使有 KV Cache 依然受显存带宽限制) |
| KV Cache | 不使用 (一次性计算全量 Attention) | 必须使用 (避免重复计算之前的 Attention) |
| 结束条件 | 计算完整个序列的 Loss | 预测出 <EOS> 或达到最大长度 |
简单来说,训练时 Decoder 像是在做“开卷完形填空”,一次性看到整个残缺的句子并平行填入所有答案;而推理时 Decoder 像是在“蒙眼走盲道”,只能凭着前一步踩出的路,一步一步往前摸索。
右滑查看面试常问