Transformer 的正弦余弦位置编码:模型如何理解顺序与距离
解释正弦余弦位置编码的构造方式、相对距离信息以及它为什么能够扩展到更长序列。
相关工具
注意力知道谁相关,却不知道谁在前面
Self-Attention 可以同时查看序列中的多个位置,但它本身并不带有天然的先后顺序。把一句话中的词元重新排列,若只看词向量和注意力计算,模型未必能分辨原来的排列。对于翻译、摘要和问答来说,这个缺口很关键:同样的词放在不同位置,意思可能完全不同。
因此,Transformer 需要额外给每个位置加入一个位置向量。文中介绍的做法是正弦、余弦位置编码:位置 0、位置 1、位置 2 各自得到一个固定向量,再与对应的词嵌入相加。这样,进入编码器或解码器的向量同时包含词的内容和词所处的位置。

词嵌入和对应位置向量相加后,作为编码器或解码器底层的输入。
为什么选择相加,而不是把位置向量拼在后面
位置编码通常和词嵌入逐元素相加,而不是简单地把两个向量拼接起来。相加可以保持模型维度不变:如果词嵌入是 d_model 维,那么加入位置编码后仍然是 d_model 维,残差连接和后续层不需要额外改变宽度。
相加并不意味着内容信息会被位置覆盖。词嵌入和位置编码使用不同的数值模式,注意力层可以从各个维度的组合中区分是什么词和在什么位置。编码器和解码器后续层继续加工已经包含顺序信息的表示。
解码器输入也需要位置编码。它虽然按从左到右的方式生成,但在一次计算中仍然要知道目标前缀中每个词元的位置,否则两个内容相同、位置不同的词元很难被区别对待。
正弦和余弦怎样组成位置向量
正弦余弦位置编码并不是给每个位置只放一个数字,而是为每个位置构造一个与模型维度相同的向量。不同维度使用不同频率的波形:一部分维度采用正弦函数,另一部分采用余弦函数,正弦和余弦在维度上交织排列。
低频维度变化得慢,适合表达较长范围的位置变化;高频维度变化得快,可以区分相邻位置。多个频率放在同一个向量里,就像同时使用几把刻度不同的尺子:一把尺子看近处,一把尺子看远处,组合起来才能覆盖不同尺度的距离。
公式中的位置 p 和维度 i 决定了当前数值。正弦、余弦的取值始终落在 -1 到 1 之间,位置编码因此具有规则的周期变化,而不是为每个训练位置单独保存一个任意参数。

不同维度使用不同变化速度的波形,共同组成每个位置的编码向量。
模型为什么能从编码中读出相对距离
位置编码真正有用的地方,不只是让位置 3 和位置 8 的向量不同,还在于位置之间的差异具有规律。正弦和余弦满足角度相加公式,位置 p+k 的编码可以由位置 p 的正弦、余弦经过一个与 k 有关的线性变换得到。固定的相对位移会在不同绝对位置上留下相似的变化模式。
注意力层可以利用这些规律判断两个词相距多远、某个词在另一个词之前还是之后。模型不需要为每一对位置单独记忆一条规则,位置编码的波形已经把相对变化铺在了向量空间中。
这也是正弦和余弦比单一递增编号更适合模型的原因。单一编号只表达一个绝对刻度,而多频率波形同时保留了近距离变化和较远范围的变化。
为什么这种编码可以扩展到更长的序列
如果位置编码是一个只为训练位置保存的可学习表,那么模型训练到长度 512 时,超过 512 的位置没有现成向量可用。正弦余弦编码则由公式直接计算,位置 513、位置 1000 甚至更长的位置都可以继续得到编码。
资料 资料特别强调了这一点:当训练后的模型遇到比训练集中最长句子更长的输入时,规则化的位置编码仍然可以向外延伸。当然,能够生成位置向量不等于模型一定能完美理解任意长度文本,注意力计算成本、训练分布和模型本身的上下文能力仍会限制实际效果。

固定公式可以继续为训练范围之外的位置生成编码,但模型实际能力仍受上下文和计算成本限制。
正弦余弦位置编码有哪些边界
位置编码解决的是顺序表示问题,不会自动解决所有长文本问题。序列变长后,自注意力的计算量会快速增加;如果训练数据几乎没有长文本,模型对很长距离的理解也可能不稳定。位置公式具备外推能力,只说明编码可以继续计算,不代表语义能力无限延长。
还要区分绝对位置和相对位置。正弦余弦编码首先为每个绝对位置生成向量,模型再从这些规律中学习相对关系。其他位置表示方法可能直接建模相对距离或把位置信息放进注意力分数,原理和取舍不同,不能简单认为某一种方法在所有场景中都更好。
用一条线索记住它
理解这套位置编码,可以抓住四个连续动作:先给每个位置生成一个固定的多维波形,再与词嵌入相加;不同维度使用不同频率,近处和远处都能留下变化;正弦余弦的周期规律让相对位移具有可学习的结构;最后,公式可以继续计算训练范围之外的位置。
所以,位置编码不是给每个词贴一个简单编号,而是把顺序变成一组有规律的数值信号。注意力层在处理词义关系的同时,也能从这组信号中辨认先后和距离。词嵌入回答这是什么,位置编码补上它在哪里,两者合在一起才构成完整的序列输入。
常见问题
位置编码为什么不直接使用 1、2、3 这样的编号?
单一编号只能提供一个绝对刻度,难以同时表达近距离和远距离关系。正弦、余弦在多个维度使用不同频率,让相邻位置和较远位置都能留下可区分的规律。
能生成更长位置的编码,就代表模型能处理任意长度吗?
不代表。正弦余弦公式可以继续计算编码,但注意力计算成本、训练数据长度和模型上下文能力仍会限制实际效果。
位置编码是加在每一层注意力前面吗?
经典 Transformer 通常在最底层把位置编码加到词嵌入上,后续编码器和解码器层传递并加工已经包含位置信息的表示。具体模型可能采用其他位置表示方式。