注意力机制有一个容易被忽略的性质:它对输入顺序不敏感。把所有词打乱,每个词算出来的新表示只是跟着挪了位置,内容不变——模型眼里,「猫追狗」和「狗追猫」几乎一样。可语序明明决定意思,所以必须想办法把位置补进去,这就是位置编码的任务。
有哪些做法
- 正弦余弦编码:用一组不同频率的三角函数,给每个位置生成一个独一无二的向量,直接加到词向量上。好处是不需要训练,并且相对位移的模式比较规律,方便外推到更长的序列。
- 可学习位置向量:给每个位置准备一个可训练向量,让模型自己学出「第几个位置」该怎么表示。简单直接,但超出训练时见过的最大长度就不太好办。
- 相对位置思路:不标记「你是第 5 个」,而是让注意力在计算时感知「我跟你隔了几个词」。更符合语言里「相近的词关系更紧」的直觉。
- 旋转类方法:把位置信息以旋转的方式作用在查询和键上,使注意力分数天然携带相对距离信息。这是当前长上下文模型里常见的一类方案。
为什么重要
它决定了模型能不能区分语序、能不能处理训练时没见过的长度。上下文窗口能扩到多长、长文检索是否稳定,很大程度取决于位置编码的设计。
常见误区
- 它不只是一个标签:加进去的方式会影响外推能力和训练稳定性,不是随便塞进去就行。
- 扩窗口不只是改个数字:把最大长度调大而缺少相应训练或方法适配,模型在超长位置上的表现往往明显退化。