训练与生成为什么不是同一个过程
同一个 Decoder、同一组参数,在训练和生成阶段的执行方式不同。关键差别不是“是否使用 Transformer”,而是下一位置的真实 token 是否已经存在于输入数据中。
训练:答案已在数据里,但不能被当前位置读取
text
input : <BOS> 我 喜欢 猫
label : 我 喜欢 猫 <EOS>GPU 可以并行计算四个位置,但 causal mask 保证位置 t 的隐藏表示不能读取更晚的 input。并行指计算调度,因果指信息边界,两者不冲突。
生成:未来 token 尚不存在
给定 Prompt <BOS> 我 喜欢:
text
第 1 轮:<BOS> 我 喜欢 → 选出 猫
第 2 轮:<BOS> 我 喜欢 猫 → 选出 <EOS>每轮选出的 token 必须接到上下文末尾,才能计算下一轮分布。不同生成轮次存在真实数据依赖,不能一次知道所有未来 token。
对照表
| 问题 | 训练 | 生成 |
|---|---|---|
| 后续真实 token 是否在数据中 | 是 | 否 |
| 一次处理多少目标位置 | 通常全部有效位置 | 通常当前最后位置 |
| 前缀来自哪里 | 数据中的真实 token | Prompt + 模型已生成 token |
| 输出之后做什么 | 计算 loss、反向传播、更新参数 | 选 token、追加上下文、继续前向 |
| 是否更新参数 | 是 | 通常否 |
| 何时停止 | 一个 batch 完成 | EOS、长度上限或外部停止规则 |
Teacher Forcing 指什么
训练时,每个位置看到的前缀来自真实训练序列,而不是模型上一位置刚生成的结果。这常被称为 teacher forcing。它提高训练并行度和稳定性,但意味着训练前缀分布与自由生成时可能不同。
这不等于模型在训练中偷看未来。是否泄漏由 label 对齐和 causal mask 决定,而不是由“整段是否同时放进 GPU”决定。
KV Cache 只优化重复计算
生成时可以缓存历史层的 K/V,避免每轮重新计算所有历史 token 的 K/V 投影。它不改变新 token 必须依赖上一轮选择,也不把生成变成训练。具体缓存布局和性能留到推理章节。
常见故障
- labels 没右移:模型学习复制当前 token。
- causal mask 方向错误:训练 loss 异常好,逐步生成崩溃。
- 生成时每轮仍读取真实后续文本:评测发生答案泄漏。
- 忘记把新 token 接回上下文:每轮重复同一个分布。
- 没有 EOS 或长度上限:生成无法可靠终止。
本节自测
静态答案与检查点
- 错误。2. 追加 token。3. 至少覆盖 label、mask 和实际生成上下文。
小结与下一步
训练使用真实序列右移后的密集目标并更新参数;生成使用自己的输出扩展上下文,通常不更新参数。下一步学习Prefill、Decode 与 KV Cache,观察真实增量推理怎样避免重复计算。