位置編碼:為什麼 AI 知道字的順序
相對位置編碼的思路是:與其告訴模型「這個字在第 10 位」,不如告訴它「這兩個字相距 3 個位置」。這種設計更貼近語言的本質——語意關係通常取決於詞與詞的相對距離,而不是它們在句子中的絕對座標。
實作上,相對位置編碼通常會做成一個可學習的偏置矩陣(bias),在注意力分數計算時根據 query 與 key 的距離查表加上去。這樣做的好處是模型能泛化到沒見過的序列長度,因為「距離 3」這個概念在訓練與推論時是一致的。但缺點是需要額外的參數,而且對於非常長的距離,查表會變得昂貴或不切實際。
RoPE 旋轉位置編碼:現代大模型的標配
近年來最受歡迎的位置編碼方案,非旋轉位置編碼(Rotary Position Embedding, RoPE)莫屬。它由蘇劍林等人於 2021 年提出,目前已被 LLaMA、Qwen、Mistral 等主流開源模型廣泛採用。RoPE 的核心思想非常優雅:用旋轉矩陣來編碼位置。
具體來說,RoPE 把 query 與 key 的向量兩兩分組,對每一組套用一個旋轉角度,而旋轉角度與位置成正比。當我們計算 query 與 key 的內積時,旋轉矩陣的性質會讓結果只依賴於兩個位置的相對距離,而與絕對位置無關。這正是我們想要的:注意力分數自然具備相對位置感知。
RoPE 的優勢在於:它不需要額外參數、不改變注意力機制的結構、數值穩定性好,而且透過調整旋轉頻率(例如 NTK 縮放、YaRN 等方法),可以有效地把模型的外推長度延長好幾倍。這也是為什麼現代幾乎所有強調長上下文(long context)的模型,都會在 RoPE 的頻率設計上做文章。
ALiBi 與其他變體
除了上述三種主流方案,還有一些值得認識的變體。ALiBi(Attention with Linear Biases)的做法非常簡單粗暴:直接在注意力分數上加上一個與距離成正比的線性懲罰項。距離越遠,分數扣越多。這個設計不需要位置嵌入,也不需要額外參數,外推能力相當不錯,但表達能力相對受限。
另外還有 T5 使用的相對位置偏置桶(relative position bias buckets)、DeBERTa 的離散化相對位置編碼等。每一種設計都是在「表達能力」、「外推能力」與「計算成本」之間做取捨,沒有絕對的贏家。
三、主流技術比較與長上下文延伸
把上述技術放在一起比較,可以更清楚地看出各自的定位。以下用一個簡表整理:
方法
核心思路
優點
缺點
代表模型
正弦絕對位置編碼
用 sin/cos 產生固定位置向量
無參數、理論上可表達相對位置
外推差、需加法混合
原始 Transformer
可學習絕對位置編碼
每個位置一個可訓練向量
簡單、表達力強
無法外推、參數量隨長度增長
BERT、GPT-2
相對位置偏置
依距離查表加偏置
外推較好、貼近語言本質
長距離查表成本高
T5、DeBERTa
RoPE
旋轉矩陣編碼相對位置
無參數、外推可調、數值穩定
實作較複雜、需頻率設計
LLaMA、Qwen、Mistral
ALiBi
線性距離懲罰
極簡、外推好
表達力受限
BLOOM
外推與內插:上下文長度延伸的關鍵戰場
近年來大模型軍備競賽的一大主軸,就是「上下文長度」。從早期的 2K、4K,到現在的 128K、1M,模型能讀的文件越來越長。但這裡有個現實問題:模型在訓練時的序列長度是固定的,如果推論時丟進更長的序列,位置編碼就會遇到沒見過的位置,導致表現崩潰。這稱為外推(extrapolation)問題。
解決方案大致分兩類。第一類是位置內插(position interpolation):把超出訓練範圍的位置索引,按比例壓縮回訓練範圍內,讓模型「以為」自己還在熟悉的長度。第二類是頻率調整:例如 NTK-aware 縮放會改變 RoPE 的基底頻率,YaRN 則進一步結合溫度縮放與頻率分段處理。這些方法的核心目標都是一致的——在不重新訓練(或只做少量微調)的前提下,讓模型能穩定處理更長的序列。
值得提醒的是,長上下文的效能不是「能塞進去」就好。就算位置編碼撐住了,模型在長距離檢索(needle in a haystack)任務上的表現仍可能不如預期。這說明位置編碼只是基礎設施,真正的長文本理解能力還涉及注意力稀疏化、記憶機制、訓練資料分布等諸多因素。
四、位置編碼在實務中的影響與常見誤解
談完原理,回到實務。位置編碼雖然是模型內部的機制,但它對應用層的影響其實比想像中更直接。
長文本處理與文件問答
當你要做長文件問答、合約審閱、論文摘要時,位置編碼的設計會直接影響模型能不能正確定位資訊。如果位置編碼的外推能力不足,模型在處理超過訓練長度的文件時,可能會出現「前面記得、後面遺忘」或「檢索到錯誤段落」的現象。這也是為什麼企業在選型長上下文模型時,不能只看官方宣稱的 token 數,還要實測模型在長文件中的檢索準確率。
程式碼與結構化資料
程式碼是一種對順序極度敏感的資料。一個縮排、一個括號的位置錯了,語意就完全改變。位置編碼在這裡的角色格外重要。研究顯示,採用相對位置編碼或 RoPE 的模型,在程式碼補全與除錯任務上通常表現更好,因為它們能更穩定地捕捉「這個變數在幾行前宣告」這類相對距離資訊。
中文與多語言的特別考量
中文的詞序雖然比英文有彈性,但仍有嚴格的語法結構。例如「他昨天在圖書館看書」與「昨天他在圖書館看書」,副詞位置的移動會影響語感與強調重點。位置編碼讓模型能區分這些細微差異。另外,中文沒有明顯的詞邊界,分詞方式會影響位置索引的對齊;使用 BPE 或 SentencePiece 等子詞切分時,一個中文字可能被切成多個 token,位置編碼的粒度也會跟著改變。這些都是中文 NLP 實務上需要留意的細節。
常見誤解與除錯技巧
最後整理幾個開發者常遇到的誤區:
五、未來展望:位置編碼還會怎麼進化?
位置編碼的研究並沒有停下來。目前有幾個值得關注的方向。第一是與注意力機制更深度整合,例如把位置資訊直接編進注意力權重的計算流程,而不是額外加上去。第二是針對超長上下文的頻率設計,YaRN、LongRoPE 等方法持續在推進外推極限。第三是多模態場景下的位置編碼——當模型同時處理文字、圖像、音訊時,「位置」的定義會變得更加複雜,需要跨模態的統一表示。
更長遠來看,有些研究開始質疑「顯式位置編碼」是否必要,轉而探索讓模型從資料中自動學到順序感知的架構。不過在可見的未來,位置編碼仍會是 Transformer 生態系裡不可或缺的一環。
六、結語:那一小段數學,撐起了整個語意世界
回頭看,位置編碼只是模型輸入端的一個小步驟,卻默默承擔了「讓 AI 理解語序」這個關鍵任務。從原始 Transformer 的正弦波,到今日大模型標配的 RoPE 旋轉矩陣,這條技術演進路線反映的是研究社群對「順序」這件事越來越細膩的理解。對開發者來說,理解位置編碼不只是為了看懂論文,更是為了在除錯、選型、延伸上下文時,知道自己到底在跟什麼東西打交道。
下次當你看到 AI 準確地回答「第三段提到的合約期限是什麼」,或是在一萬字的程式碼裡正確補全變數名稱時,不妨想想:這背後有一小段關於位置的數學,正安靜地運作著。它不顯眼,卻讓「順序」重新有了意義。