05.3 位置編碼與 RoPE#
本章導讀#
注意力有個天生的盲點:它對「順序」視而不見。 把「貓追狗」和「狗追貓」的字序打亂,注意力算出的關聯完全一樣——因為它對輸入是置換等變的。 但語言的順序有意義。怎麼把「位置」塞進無序的注意力?答案是一個優雅的幾何技巧:旋轉。
淺顯說明#
最直覺的做法是給每個詞發一個「座位號碼牌」(加到詞向量上)。 2017 年 Transformer 用正弦號碼牌;2021 年 RoPE 改用更聰明的辦法:
- 不加號碼牌,而是把每個詞的向量在平面上旋轉一個與位置成正比的角度。
- 位置 \(m\) 的詞旋轉 \(m\theta\) 度。
- 神奇之處:兩個詞做內積時,旋轉角自動相減——內積只依賴「相對位置 \(m - n\) 」, 而不是絕對位置。
就像兩隻手錶各自快慢不同,比對時間時只需看時差。
正規理論#
問題:置換等變性#
自注意力對輸入序列的置換等變:打亂詞序,注意力輸出同樣打亂,語義結構不變。 因此必須顯式注入位置資訊。
正弦位置編碼(Transformer, 2017)#
位置 \(m\) 、維度偶數位 \(2i\) :
低維振盪快(編碼精細位置)、高維振盪慢(編碼粗位置)——像二進位計數器的連續版。 用法: \(\mathbf{x}_m \leftarrow \mathbf{x}_m + PE(m)\) (加法注入)。
RoPE:旋轉位置編碼#
把 \(d\) 維向量看成 \(d/2\) 個二維平面上的複數。位置 \(m\) 的詞,每個平面旋轉 \(m\theta_i\) :
其中 \(\theta_i = 10000^{-2i/d}\) 。應用: \(q_m = R_{\Theta,m}\,q\) , \(k_n = R_{\Theta,n}\,k\) 。
核心性質:相對位置偏置#
定理:旋轉後的內積只依賴相對位置 \(m - n\) :
證明(複數形式):每個平面是一個複數 \(q_j \in \mathbb{C}\) ,旋轉即乘 \(e^{i\theta_j m}\) :
實數部分正是二維旋轉下的內積。旋轉矩陣的正交性( \(R^\top R = I\) )保證: \(\blacksquare\)
意義: - 內積天生攜帶相對位置資訊——「誰離誰近」自動進入注意力 logits。 - 絕對位置不出現——模型可直接外推到更長的序列(配合尺度調整)。 - 正交旋轉不改變向量長度——不擾動詞向量的範數,只改方向。
簡易範例:二維旋轉#
\(d = 2\) , \(\theta = 30°\) 。詞 A 在位置 \(m = 1\) ,詞 B 在位置 \(n = 3\) ,都是向量 \((1, 0)\) :
- A 旋轉 \(30°\) : \((\cos 30°, \sin 30°) \approx (0.866, 0.5)\)
- B 旋轉 \(90°\) : \((\cos 90°, \sin 90°) = (0, 1)\)
內積: \(0.866 \times 0 + 0.5 \times 1 = 0.5\) 。
驗證定理:相對位置 \(n - m = 2\) ,即旋轉 \(60°\) , \(q^\top R(60°) k = \cos 60° = 0.5\) 。一致!
內積 \(= \cos(\text{角度差})\) ——旋轉位置編碼的本質就是:位置差變成角度差,內積變成餘弦。
歷史典故#
- 2017 年 Transformer 的正弦編碼:見卷宗 ../2017-Transformer注意力機制.md。
- 2018 年 BERT 用「學出來的」位置嵌入:見 ../2018-BERT與GPT預訓練典範.md——可學但無法外推。
- 2023 年 LLaMA:見 ../2023-LLaMA開源大模型.md——RoPE 成為開源大模型的標配。
- 2025 年 DeepSeek-R1:見 ../2025-DeepSeek-R1.md——RoPE 的長序列外推能力支撐長鏈推理。
習題#
- 證明二維旋轉矩陣 \(R(\phi)\) 的正交性: \(R^\top R = I\) 。
- 對 \(d=2, \theta=45°\) ,詞在位置 0 與 2(向量 \((1,0)\) ),用兩種方式計算內積(直接旋轉 vs 相對位置),驗證一致。
- 討論:為什麼「相對位置」比「絕對位置」更適合語言?(提示:語法關係多是相對的,且需長度外推。)
補充#
1. 數學推導證明#
證明(習題 1):二維旋轉矩陣的正交性。
逐元素計算:
(用到畢氏恆等式 \(\cos^2\phi + \sin^2\phi = 1\) 。)故 \(R(\phi)\) 是正交矩陣: \(R^\top = R^{-1}\) ,且 \(\det R = \cos^2\phi + \sin^2\phi = 1\) ——旋轉屬於 \(SO(2)\) 。正交性保證旋轉不改變向量長度: \(\|R v\|^2 = v^\top R^\top R v = \|v\|^2\) 。 \(\blacksquare\)
證明(習題 2):直接旋轉法與相對位置法一致(矩陣形式)。
對 \(d = 2\) 、 \(\theta = 45°\) ,詞在位置 0 與 2(向量 \((1,0)\) )。直接旋轉法:
即 \(q^\top R(90°)\, k\) 。代入 \(q = k = (1, 0)\) :
相對位置法: \(n - m = 2\) ,角度差 \(2 \times 45° = 90°\) ,內積 \(= \cos 90° = 0\) 。兩法一致——這正是本節定理 \(R_{\Theta,m}^\top R_{\Theta,n} = R_{\Theta, n-m}\) 在 \(d=2\) 的具體驗證。 \(\blacksquare\)
2. 簡易範例#
高頻與低維的分工:正弦編碼 \(PE(m, 2i) = \sin(m / 10000^{2i/d})\) 。取 \(d = 4\) 、 \(m = 1\) 與 \(m = 2\) :最低維( \(i=0\) ) \(\sin(1) \approx 0.841\) 與 \(\sin(2) \approx 0.909\) 差異明顯(精細位置可辨);最高維( \(i=1\) ) \(\cos(1/100) \approx 0.99995\) 與 \(\cos(2/100) \approx 0.9998\) 幾乎相同(粗粒度、變化慢)——像二進位計數器的連續版,低維快速振盪編碼精細位置,高維慢速振盪編碼粗位置。
程式驗證:_code/05.3-rope-rotation.py 用 numpy 實作二維 RoPE 旋轉。程式輸出:(1) 三個角度下 \(R^\top R\) 與單位矩陣的最大偏差都在 \(10^{-16}\) 量級——驗證正交性;(2) 同一對詞(相對位置固定為 2)放在 \(m = 0, 1, 5, 10\) 等不同絕對位置,旋轉後內積全部等於 0.5——驗證內積只依賴相對位置;(3) \(m=1, n=3\) 時直接旋轉法與相對位置法( \(\cos 60°\) )數值一致。