Transformer 引擎

位置編碼(positional encoding)

注意力有個盲點:它本身把一句話當成一袋詞。「狗咬人」和「人咬狗」看起來會一模一樣,因為注意力是依內容、而非依位置來比較詞元。位置編碼解決了這點,它在每個詞元上蓋一個標記,記錄它在序列裡的位置,好讓模型能分辨先與後、近與遠。

早期的 Transformer 在詞元嵌入上加進固定的、不同頻率的正弦與餘弦模式,給每個位置一個獨特的指紋。如今大多數大型語言模型使用旋轉位置嵌入(RoPE),它把查詢與鍵向量依位置旋轉一個角度;於是兩個詞元之間的點積自然就編碼了它們相距多遠。另一些方案,例如 ALiBi,則改成把一個依距離而定的懲罰直接加到注意力分數上。

位置怎麼編碼,強烈地左右一個模型能推廣到多遠。依賴相對距離的方案,往往能更優雅地延伸到較長的脈絡;而重新縮放 RoPE 頻率的技巧,則是把模型視窗擴展到超過訓練長度的常見手法。位置處理,是大型語言模型工程裡安靜卻最活躍的領域之一。

PE_{(pos,2i)}=\sin\left(\frac{pos}{10000^{2i/d}}\right)

經典的正弦位置編碼,讓每個位置在各維度上有獨特的模式。