编程与 AI15 分钟阅读更新于 2026-08-03

Transformer 为什么训练时能并行,推理时却要逐词生成

围绕编码解码流程,解释右移目标、因果掩码和自回归推理如何共同造成训练与推理阶段的计算差异。

相关工具

同一个模型,为什么有两种计算节奏

Transformer 训练时可以把目标序列的多个位置一起送入解码器,推理时却通常只能从起始标记开始,一个词一个词地生成。看起来像是同一套模型前后采用了两种矛盾的方式,其实差别来自一个事实:训练时知道真实目标,推理时不知道下一词的答案。

文中的解码阶段是逐时间步输出的。训练为了提高效率,会把右移后的目标序列一次性输入,并用掩码保证每个位置只能看到允许的前缀。推理则只能把已经生成的结果作为下一轮输入,不能提前准备未知的未来词。

Transformer 训练时并行计算与推理时逐词生成的对比图
训练并行与推理串行

训练阶段多个目标位置可以同时计算,推理阶段每一步依赖上一轮生成结果。

训练时为什么可以同时预测多个位置

假设目标句子是“我 喜欢 学习”,训练输入使用起始标记、“我”和“我 喜欢”,标签则分别是“我”“喜欢”“学习”。三个位置的输入都已经准备好,模型可以在一次矩阵计算中同时产生三组词表分布。

同时计算不等于允许位置互相偷看。解码器自注意力使用因果掩码,第一位置只能看起始标记,第二位置可以看前一个词,第三位置可以看前两个词。每个位置的可见范围不同,但这些范围可以提前组成一张掩码矩阵。

Teacher Forcing 也发挥作用:训练时给模型的前缀通常是真实目标前缀,而不是模型刚刚猜出来的词。稳定的输入让多个位置能够一起学习自己的下一词预测。

推理时为什么不能直接并行预测整句

推理开始时,模型只有起始标记或用户给出的提示。它不知道第一个目标词是什么,更不知道第二个词应该接在什么上下文之后。如果把所有目标位置同时预测,后面的位置就缺少前面刚生成的内容。

因此,推理先得到第一个词元,追加到前缀;再用更新后的前缀预测第二个词元。这个依赖关系会一直延续到 EOS 或长度上限。虽然单轮内部仍然使用矩阵计算,但轮次之间存在不可跳过的顺序。

Transformer 训练路径和推理路径对比示意图
推理中的逐词依赖

每一步的输出会成为下一步输入,未知的目标前缀使推理天然具有自回归顺序。

右移目标把两种阶段连接起来

目标序列右移让训练位置和推理位置使用同一种预测关系:输入是已有前缀,标签是下一个词。训练时,整段已有前缀可以同时准备;推理时,已有前缀只能随着生成逐步变长。

如果不右移,训练输入可能包含当前位置本来要预测的答案,模型会学到一个推理阶段无法提供的捷径。右移和因果掩码一起确保训练看到的条件,和真正生成时的条件在逻辑上保持一致。

Transformer 右移目标序列与因果预测关系图
右移目标与因果预测

训练输入使用已有前缀,标签向后错一位,和推理时的下一词预测保持一致。

源序列为什么可以重复使用

在 Encoder-Decoder 模型中,源序列可以先经过编码器形成记忆。推理时,解码器每轮改变的是目标端 Query,源端的 Key 和 Value 通常可以继续复用。这样,推理的顺序依赖主要集中在目标前缀,而不是每次都重新理解源句。

目标序列越长,需要进行的解码轮次越多。缓存已经计算过的目标 Key 和 Value,可以减少重复工作,但不能完全消除“必须知道上一词才能继续”的依赖。计算优化可以降低每轮成本,却不能把未知的未来目标变成已知输入。

训练速度快,不代表推理一定快

训练时的并行性非常适合大批量矩阵计算,多个位置可以一起产生损失并更新参数。推理则受输出长度影响,哪怕每轮计算很快,也要等待前一轮决定下一个输入。生成十个词和生成一百个词,所需的循环次数不同。

实际速度还受到批次大小、序列长度、缓存、输出投影和选词策略影响。理解并行与串行的根本差异后,就能看出为什么模型训练效率很高,而长文本生成仍然需要较长时间。

推理中的并行空间仍然存在

推理不是所有计算都逐个数字完成。每一轮中,当前前缀的嵌入、注意力、FFN 和输出投影仍然可以用矩阵并行计算;多个请求之间也可以组成批次。真正无法完全并行的是不同生成轮次之间的依赖。

所以更准确的说法是:训练可以并行计算多个目标位置,推理通常不能并行决定同一条序列中未知的多个未来位置。局部计算依然并行,整体生成仍然按时间步推进。

把训练和推理放在同一条链路上

训练链路是:源序列编码、右移目标输入、因果掩码、多个位置并行预测、逐位置计算损失。推理链路是:源序列编码、起始标记输入、预测一个词元、追加到前缀、检查停止条件,再进入下一轮。

两条链路使用相同的解码器模块和输出层,差异只在目标前缀是否已经完整可用。理解这一点,就不会把训练并行误认为模型能够提前知道答案,也不会把推理串行误解为 Transformer 放弃了矩阵计算。

常见问题

训练时并行预测会不会破坏从左到右的生成逻辑?

不会。右移目标和因果掩码保证每个位置只能使用允许的前缀,只是多个位置的矩阵运算可以同时完成。

推理时使用缓存能不能完全变成并行?

缓存可以减少已经计算过的内容,降低每轮成本,但下一词仍然依赖上一轮生成结果,整条序列的轮次依赖仍然存在。

为什么源序列可以先编码一次?

源序列在推理过程中通常保持不变,编码器输出可以作为固定源记忆重复供解码器交叉注意力查询,变化的是目标端前缀。