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

为什么解码器的目标前缀也要加位置编码

围绕位置编码、解码器输入和逐步输出的描述,解释目标端为什么也需要顺序信息,以及位置编码如何进入每一轮解码。

相关工具

位置编码不只服务于编码器

Transformer 相关概念 在介绍位置编码时先讨论输入词嵌入,随后在解码器部分再次强调:像处理编码器输入一样,解码器输入也需要加入位置编码,用来指示目标词在序列中的位置。

这不是重复配置,而是因为编码器和解码器处理的是两套不同的序列。源序列有自己的位置,目标前缀也有自己的位置。交叉注意力连接两侧时,双方都需要先在各自序列内部保留顺序。

Transformer 编码器源序列和解码器目标前缀分别加入位置编码的结构图
编码器和解码器分别加入位置编码

源序列和目标前缀各自在本侧加入位置编码,再分别进入编码器和解码器。

目标前缀如果没有位置会变成什么

解码器自注意力接收目标前缀中的多个向量。如果这些向量只有词元内容,没有目标位置标记,模型很难区分同一批词元的先后排列。即使因果掩码限制了可见范围,当前位置仍需要知道自己处在目标序列的哪一格。

位置编码让目标端的第一个、第二个和后续词元拥有不同的位置特征。自注意力可以在内容关系之外,学习目标序列中的顺序和距离,之后交叉注意力再根据当前目标位置查询源序列。

BOS 也有自己的位置

推理开始时,目标端通常只有 BOS。它不是没有位置的控制标记,而是目标前缀中的第一个位置,需要经过 Embedding 并加入对应的位置编码。这样,第一轮解码形成的 Query 带有明确的目标起点。

当第一个普通词元生成后,它会追加到 BOS 后面,并得到下一个位置的编码。目标前缀逐步增长,位置编码也按照目标端的序列位置继续加入。BOS 和后续词元共享目标侧的位置体系。

训练右移输入中的每个位置都要编码

训练时,右移后的目标序列可能是 BOS、词一、词二,标签是词一、词二、词三。解码器输入中的每个位置都需要词嵌入和对应的位置编码,模型才能同时处理内容和顺序。

因果掩码负责规定每个位置能看到哪些目标输入,位置编码负责告诉当前位置和其他可见位置处于什么顺序关系。两者一个限制可见范围,一个提供位置信息,不能互相替代。

Transformer 训练右移目标序列与解码器位置编码结合的示意图
右移目标与位置编码

训练输入中的 BOS 和目标前缀词元分别加入目标位置编码,再进行掩码自注意力。

目标位置和源位置不是同一套编号

源句和目标句的长度通常不同,语序也可能不同。编码器位置编码描述源序列内部的先后,解码器位置编码描述目标序列内部的先后。它们各自在本侧从位置 0 或第一个位置开始计算,不要求源句第一个词和目标句第一个词共享同一个语义位置。

交叉注意力通过 Query 与源 Key 匹配两侧信息,而不是直接把两个位置编号相加。目标位置告诉解码器当前生成到哪里,源位置帮助它区分源记忆中的各个位置。

交叉注意力需要两侧的位置信息

编码器输出的源记忆保留源端位置化表示,解码器当前状态保留目标端位置化表示。交叉注意力用目标 Query 查询源 Key 和 Value,当前 Query 的目标位置与源端各位置的关系共同影响注意力分布。

如果只有源端位置而没有目标端位置,解码器难以判断当前状态处于目标序列的哪个阶段;如果只有目标端位置而没有源端位置,源记忆中的词序信息会被削弱。两侧位置编码为交叉注意力提供完整的顺序背景。

Transformer 目标前缀位置编码与源序列位置编码通过交叉注意力建立关系的示意图
目标位置查询源位置

目标端位置化 Query 查询源端位置化 Key 和 Value,交叉注意力建立两侧关系。

每一轮生成时位置如何变化

第一轮输入只有 BOS,它占据目标起始位置;第二轮输入包含 BOS 和第一个生成词元,当前新位置向右移动;之后每一轮都在前缀末尾增加一个新位置。缓存可以减少过去状态的重复计算,但新词元仍需要得到自己的位置表示。

这也是为什么位置编码和自回归生成一起理解很重要。生成循环不只是不断追加词元,还在不断扩展目标序列的位置范围。模型需要同时知道新增内容是什么,以及它位于目标前缀的第几个位置。

目标位置编码和 EOS 一起形成边界

EOS 作为目标序列中的特殊词元,也会出现在一个具体位置上。模型根据当前目标前缀和位置化表示预测 EOS,系统检测到后结束生成。位置编码帮助模型理解 EOS 出现在序列中的当前位置,但真正的停止动作由生成控制逻辑完成。

如果没有 EOS,最大长度仍可以作为外部边界;如果没有位置编码,目标前缀中的顺序关系会变得不清晰。输入内容、位置表示和停止标记共同组成目标端的生成结构。

用四步检查解码器位置编码

第一,确认目标词元是否经过 Embedding;第二,确认 BOS、普通词元和 EOS 是否都拥有目标位置;第三,确认位置编码是否在掩码自注意力前进入目标表示;第四,确认交叉注意力使用的是位置化的目标 Query 和源 Key/Value。

这样可以把编码器和解码器的位置编码放在同一条主线上理解:两侧各自保留顺序,目标端随前缀逐步扩展,交叉注意力再让当前目标位置查询源序列记忆。

常见问题

解码器为什么不能只给 BOS 加位置编码?

后续目标词元也处在不同位置,掩码自注意力和交叉注意力都需要知道完整目标前缀中各位置的顺序。

源序列和目标序列可以使用同一套位置编码公式吗?

可以采用相同的生成规则,但它们描述的是各自序列内部的位置,不能把源位置和目标位置直接当成同一套语义编号。

缓存后新生成的词还需要位置编码吗?

需要。缓存减少过去状态的重复计算,但当前新增词元仍要使用它在目标前缀中的位置表示。