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

为什么位置编码通常与词嵌入相加,而不是直接拼接

围绕词嵌入、位置编码和统一模型宽度,解释位置向量为什么通常与词向量逐元素相加。

相关工具

词嵌入和位置编码分别提供什么

Transformer 处理的不是浏览器里看到的文字,而是一组按位置排列的向量。词嵌入把词元编号转换成连续向量,主要表达“当前位置是什么”;位置编码则补上“这个位置处在序列哪里”。资料 在介绍输入时,将这两部分作为进入编码器前的共同表示。

两者作用不同,却服务于同一个位置。当前位置的词向量需要带着自己的顺序信息进入 Self-Attention,后续层才能在交换上下文时同时利用内容和位置。位置编码不是另一段独立文本,而是附着在词向量上的顺序信号。

Transformer 词嵌入与位置编码分别提供内容和顺序信息的示意图
词嵌入与位置编码的分工

词嵌入提供词元内容,位置编码提供位置与距离信息,两者共同形成模型输入。

文中的做法是逐元素相加

经典 Transformer 会把位置编码加入词嵌入,而不是把两组向量沿最后一维拼成长向量。假设词嵌入和位置编码都是 512 维,那么同一位置的两个向量按对应维度相加,结果仍然是 512 维,可以直接送入底层编码器。

逐元素相加并不意味着两种信息被简单抹平。词嵌入和位置编码都是可学习处理链路中的数值表示,后续注意力投影会在混合后的向量上重新形成 Query、Key 和 Value。模型学习的是如何利用这些维度中的内容与顺序线索。

Transformer 词嵌入与位置编码逐元素相加并保持 d_model 维度的示意图
相加保持模型宽度

同一位置的词嵌入和位置编码按对应维度相加,结果仍保持 d_model 宽度。

直接拼接会改变输入接口

如果把词嵌入和位置编码拼接起来,两个 512 维向量会变成 1024 维向量。这样做并非数学上不可能,但底层编码器的输入宽度就发生了变化,注意力投影矩阵、FFN 输入层以及残差路径都需要按照新的宽度重新设计。

而经典结构希望编码器各子层围绕统一的 d_model 工作。词嵌入、注意力输出、FFN 输出和残差连接可以沿同一条主干传递,输入接口越稳定,层与层之间越容易堆叠。相加让位置编码进入表示,却不额外扩大主干宽度。

相加与拼接表达的是不同设计取舍

拼接会把内容特征和位置特征放在不同的维度区域,信息边界比较直观,但也会扩大后续层的输入宽度。模型需要额外学习如何把两部分重新混合,参数量和计算量也会随接口变化。

相加则要求模型在同一组特征维度中共同解释内容与顺序,输入宽度保持不变,结构更紧凑。它并不是证明拼接永远不好,而是经典 Transformer 在统一维度、残差连接和层堆叠之间做出的整体选择。

为什么相加后仍然能区分位置

有人会担心:如果不同位置的词嵌入和位置编码相加,模型怎么知道一个数值来自词义还是位置。关键在于位置编码不是任意噪声,而是按位置和维度生成的规律性向量;不同位置会形成不同模式,多个维度共同携带顺序信息。

进入注意力层后,模型还会使用不同的线性投影分别生成 Q、K、V。投影矩阵可以从混合后的表示中学习对内容和位置敏感的组合。换句话说,输入阶段先把两种信号放进同一表示空间,注意力阶段再根据任务需要重新组织它们。

位置编码与残差连接为什么适合放在同一宽度

Transformer 的残差连接要求子层输入和输出形状一致。词嵌入与位置编码相加后仍保持 d_model,底层编码器可以在这个宽度上完成注意力和 FFN,再把更新结果加回输入。上层编码器继续接收相同宽度的隐藏表示。

如果位置编码采用拼接而导致主干宽度扩大,就必须在进入残差路径前增加投影,或者让所有子层改用新的宽度。额外投影当然可以设计,但它会让结构多出一个形状转换。相加使顺序信息在输入处加入,同时不打断主干接口。

编码器和解码器都要在自己的序列一侧加入位置编码

编码器处理源序列,解码器处理目标前缀,它们不是同一组位置。源句中的第一个词和目标句中的第一个词虽然都可能使用位置索引 0,但属于两套不同的序列表示。资料 在介绍解码器时也强调,解码器输入和编码器输入一样需要加入位置编码。

训练时,右移后的目标输入中每个位置都要与对应的位置编码相加,再经过掩码自注意力。交叉注意力连接两侧时,源记忆保留源端顺序,目标状态保留目标端顺序。两侧各自带有位置背景,才能建立更可靠的源目标关系。

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

编码器在源端加入位置编码,解码器在目标前缀一侧加入自己的位置编码,两侧随后通过交叉注意力连接。

不同位置编码实现不必改变这个接口

正弦余弦位置编码、可学习位置向量以及其他位置表示方法,在具体生成方式上可以不同,但只要最终得到与模型主干对齐的向量,就可以在输入处与词嵌入组合。资料 重点说明的是位置编码如何提供顺序信息,以及它如何进入 Transformer。

因此,阅读某个实现时,先检查位置编码的最后一维是否等于 d_model,再看它是相加、拼接还是经过投影后组合。不要仅凭函数名判断结构,真正重要的是:词元内容和位置信息何时合并,合并后张量形状是否能接入后续编码器或解码器。

用四个问题检查输入表示

第一,词嵌入和位置编码的最后一维是否一致;第二,组合后序列长度和 d_model 是否符合编码器输入要求;第三,编码器和解码器是否分别处理自己的位置索引;第四,组合后的表示能否沿着注意力、FFN 和残差路径继续保持稳定形状。

把这四点连起来,就能理解为什么经典 Transformer 通常选择相加。相加不是孤立的运算偏好,而是同时满足了顺序信息注入、主干宽度稳定、子层接口统一和残差连接可用这几项要求。

常见问题

位置编码和词嵌入相加后,信息不会互相覆盖吗?

两者在同一向量空间中组合,后续的注意力投影会继续学习如何利用内容和位置特征。相加并不等于只保留其中一种信息。

位置编码可以和词嵌入拼接吗?

可以作为一种结构设计,但拼接会扩大输入宽度,后续投影、FFN 和残差接口需要同步调整。经典 Transformer 采用相加来保持 d_model 稳定。

编码器和解码器可以共用同一组位置编码吗?

两侧可以采用相同的生成规则,但源序列和目标序列拥有各自的位置索引和输入表示,不能把两套序列的位置直接混成一套。