Transformer位置编码:为什么非得用sin和cos配对?

为什么需要位置编码?

Transformer 的核心是自注意力机制,它把句子中的所有词同时计算,天然没有顺序概念(“我打你”和“你打我”在模型看来最初是一样的)。为了让模型知道词的先后顺序,必须额外给每个位置注入一个“位置标签”——这就是位置编码

原论文《Attention Is All You Need》选择的是正弦和余弦函数的固定编码,而不是学出来的编码。为什么偏偏是 sin 和 cos 配对?评论区经常提到“用两个 sin”,这到底行不行?下面我们从数学角度讲一下


一、核心原因:为了完美的“相对位置线性关系”

Transformer 作者选择交替使用 sin 和 cos 的最核心动机,是希望模型能轻松学到相对位置信息——也就是任意两个位置的距离

具体来说:对于任意固定的位移 k,位置 t+k 的编码向量,可以通过一个线性变换直接从位置 t 的编码向量推导出来,而这个变换只依赖于 k,与绝对位置 t 无关

数学推导

根据三角函数的两角和公式

sin(ω(t+k))=sin(ωt)cos(ωk)+cos(ωt)sin(ωk)cos(ω(t+k))=cos(ωt)cos(ωk)sin(ωt)sin(ωk)

写成矩阵乘法的形式就是:

[sin(ω(t+k))cos(ω(t+k))]=[cos(ωk)sin(ωk)sin(ωk)cos(ωk)][sin(ωt)cos(ωt)]

💡 关键点:变换矩阵(旋转矩阵)里只包含 k,与当前绝对位置 t 无关。这意味着无论词在句子的哪里,只要它们距离为 k,位置编码之间的线性映射是恒定、可复用的。能让模型轻松学到相对位置关系(如“前一个词”“后两个词”)。


二、为什么“只用两个纯 sin”不行?

很多同学疑惑:为什么不能用两个不同频率的 sin?或者同一个频率但带相位差的 sin?

情况 A:使用不同频率的纯 sin(如 sin(ω1t)sin(ω2t)

假设位置编码只包含 sin(ω1t)sin(ω2t),没有对应的 cos。展开 sin(ω1(t+k))

sin(ω1(t+k))=sin(ω1t)cos(ω1k)+cos(ω1t)sin(ω1k)

这里出现了一个 cos(ω1t)!但如果你的编码向量里根本没有 cos(ω1t),模型在当前维度下就无法通过简单的线性变换直接得到位移 k。它必须跨到其他频率的维度去寻找替代组合,这会让相对位置的学习变得非常困难(甚至不可行)。

打个比方:你想用红绿蓝三原色调出黄色,结果只给了红和蓝,没有绿——那就永远调不出纯黄色。

情况 B:同一频率但带相位差的两个 sin(如 sin(ωt)sin(ωt+ϕ)

如果两个 sin 是同一频率,但人为加上相位差 ϕ(且 ϕnπ),从数学上看是可以构建出旋转关系的,技术上可行

但是:当 ϕ=π2 时,sin(ωt+π2) 恰好等于 cos(ωt)。所以,原论文选择 sin 和 cos,本质上就是选取了最直观、正交、数学形式最简单的一组基(两个相位相差 90° 的 sin/ cos 对)。不交替使用,就会丢失同一频率下线性变换对相对位置的感知能力。


三、总结

方案 可以表示相对位置吗? 简洁度
sin和cos配对 ✅ 完美,线性变换只含 k ⭐⭐⭐⭐⭐
两个不同频率 sin ❌ 无法直接线性推导 ⭐⭐
同一频率带相位差的两个 sin ✅ 可行,但本质就是sin/cos ⭐⭐⭐

所以,Transformer 最终选用 sin 和 cos 交替,是为了让模型能以最简洁、最直接的方式捕捉到相对位置信息,这是数学上的最优解。


思考题与答案

思考题:
为什么固定位置编码(sin/cos)有时比可学习的位置编码效果更好?什么场景下可学习编码可能更优?

答案:

  1. 固定编码的优势

    • 外推能力强:sin/cos 编码可以处理比训练时更长的序列(因为公式能计算任意位置)。
    • 无需额外参数:减少模型参数量,降低过拟合风险。
    • 理论保证:相对位置线性关系使模型能自然泛化到不同长度的句子。
  2. 可学习编码的优势场景

    • 当训练数据量非常大且序列长度固定时,可学习编码能更灵活地适应数据分布。
    • 某些特定任务中,位置本身有语义含义(如代码中的缩进),可学习编码可能更好。

总的来说,固定编码更像“通用底座”,可学习编码是“定制优化”。现代很多模型(如BERT)使用可学习编码,但长度受限;而GPT等生成模型更多采用改进版的相对位置编码(如RoPE、ALiBi),它们本质上都是在 sin/cos 思想上的扩展。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇