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

Transformer 为什么需要源序列和目标序列两套输入

围绕Encoder-Decoder 架构和机器翻译流程,解释源句、目标前缀、训练标签与推理输入之间的区别。

相关工具

源序列和目标序列分别回答什么问题

在机器翻译场景中,源序列是需要被理解的输入句子,目标序列是模型希望生成的另一种语言的句子。Encoder 负责整理源序列,Decoder 负责根据目标前缀生成目标序列。两套序列不是同一句话的两份拷贝,而是输入和输出的两种角色。

资料 先用黑盒方式描述 Transformer:给定一种语言的句子,模型输出另一种语言的句子。打开黑盒后,会看到源序列进入编码组件,目标序列进入解码组件,两侧通过 Encoder-Decoder Attention 交换信息。

Transformer 源序列和目标序列分别进入编码器解码器的结构图
源序列与目标序列

源序列进入编码器形成记忆,目标序列由解码器根据前缀逐步生成。

源序列是完整给定的输入

源序列通常在生成开始前就已经完整存在。它经过词元化、Embedding、位置编码和编码器层,形成每个源位置的上下文表示。编码器可以在自注意力中查看源句前后文,因为这些内容都是任务输入的一部分。

源序列不等于目标答案。翻译时它可能是中文句子,目标序列可能是英文句子;摘要时源序列是长文,目标序列是摘要。编码器的职责是把源信息整理成解码器能够查询的记忆,而不是直接替用户写出最终文本。

目标序列在训练和推理时的形态不同

训练时,目标句子通常已经在数据集中存在。模型把右移后的目标序列作为解码器输入,把原目标序列作为标签。这样,输入位置包含已有前缀,标签位置是需要预测的下一个词。

推理时没有完整目标句子可供输入,只有起始标记或用户给出的前缀。模型先预测一个词元,再把它追加到目标输入,下一轮继续预测。训练时的目标输入可以一次准备好,推理时的目标输入会逐步变长。

Transformer 训练阶段目标输入和标签错位对齐示意图
训练时的目标输入与标签

右移目标作为解码器输入,原目标序列作为逐位置预测标签。

为什么不能只把源序列送进一个编码器

编码器擅长把输入变成上下文表示,但它本身没有逐词生成目标的结构。它可以理解源句,却不知道应该在什么时候输出目标词,也没有解码器的因果前缀来组织生成顺序。

解码器提供了目标端的生成状态:它知道已经生成了什么,并通过掩码自注意力保持从左到右的顺序。交叉注意力再让这个目标状态查询源记忆。源序列负责提供内容,目标序列负责提供生成轨迹。

两套序列如何在交叉注意力中相遇

目标前缀经过解码器自注意力后,形成 Query;源序列经过编码器后,形成 Key 和 Value。交叉注意力让目标端的每个位置查询源端的各个位置,返回与当前生成状态相关的内容。

因此,两套序列并不是在输入阶段直接拼成一条长序列。它们各自保留自己的位置和掩码规则,到了交叉注意力子层才通过 Query、Key、Value 建立关系。目标端未来位置仍然被限制,源端已给定内容则可以被完整读取。

Transformer 源序列和目标序列通过交叉注意力连接的信息流图
源目标信息在交叉注意力中连接

目标前缀生成 Query,编码器源记忆提供 Key 和 Value,两套序列在交叉注意力中相遇。

源序列和目标序列的长度也不同

源句长度和目标句长度通常不一样,甚至目标序列可能比源序列更长或更短。编码器自注意力形成源长度对应的记忆,解码器自注意力处理目标前缀长度,交叉注意力则建立两个不同长度集合之间的关系。

因此,不能把源长度和目标长度混成一个固定维度。词嵌入、位置编码和掩码分别作用在各自序列上,交叉注意力只需要让 Query 和 Key 的投影空间能够比较,并不要求两边原始序列长度相同。

训练时为什么可以同时使用两套信息

训练阶段,源序列完整存在,目标序列也有真实答案。源序列进入编码器,右移目标进入解码器,因果掩码限制目标可见范围,交叉注意力读取源记忆。多个目标位置可以并行计算,但每个位置都只使用自己的目标前缀。

交叉熵再把每个目标位置的预测与真实标签比较。训练并不是把真实目标直接当成输出,而是用右移目标提供条件,用原目标提供监督。源输入、目标输入和目标标签三者位置不同,职责也不同。

推理时只保留源输入和已生成目标前缀

推理时,源序列仍然完整保留,目标端则从起始标记开始。每一轮使用已经生成的目标前缀查询源记忆,得到下一个词元后继续追加。完整目标答案不会提前出现在输入中。

这就是 Encoder-Decoder 的核心分工:源序列给模型可参考的内容,目标前缀告诉模型当前生成到哪里,输出层给出下一词概率,EOS 或长度上限决定何时停止。

把三种序列角色分清楚

源序列是要理解的输入,目标输入是解码器当前能看到的前缀,目标标签是训练时用来比较的正确答案。源序列进入编码器,目标输入进入解码器,目标标签只在训练时参与损失计算。

把这三个角色分开后,很多 Transformer 结构问题会变得清楚:为什么需要右移、为什么有因果掩码、为什么交叉注意力连接两侧、为什么推理时不能直接把完整答案送进模型。

常见问题

目标序列和目标标签是同一份数据吗?

内容来源相同,但位置通常错开一位。右移后的目标序列作为解码器输入,原目标序列作为下一词预测的标签。

源序列会在每个生成步骤改变吗?

通常不会。源序列可以先编码成固定记忆,后续变化的是不断增长的目标前缀。

为什么不把源序列和目标序列直接拼接?

两侧承担不同角色,也有不同的可见范围和位置关系。Encoder-Decoder 结构让它们分别处理,再通过交叉注意力建立信息连接。