位置編碼(positional encoding)
位置編碼是 Transformer 用來得知每個詞元位在哪裡的方法。自注意力有個奇特的性質:它把輸入當成一個「袋子」,而不是一條「線」。如果你把詞元的順序打亂,注意力會產生同一組輸出,只是以同樣的方式被打亂——它分不出哪個圖塊在左上、哪個在右下。對語言來說這會打亂語序;對影像來說這會打亂版面配置。位置編碼的解法是:在注意力開跑之前,先在每個詞元上蓋一個代表其位置的「簽章」。
機制就是單純的加法。對每個詞元的嵌入,你加上一個同樣是 D 維的位置向量,於是位於位置 i 的詞元帶的是「嵌入 + pos(i)」。主要有兩種風味。正弦式編碼(出自原始 Transformer)用解析方式把 pos(i) 定義為 i 的正弦與餘弦、頻率呈幾何級數分佈;它不需訓練,且能平滑地外推到更長的序列。學習式位置嵌入(原始 ViT 採用)則讓每個位置的 pos(i) 是一個自由參數向量、由反向傳播訓練;它很靈活,但綁死在訓練時看過的序列長度。
對影像來說,「位置」是二維的,於是衍生出幾種改良。你可以分別給「列」與「行」各自的學習式嵌入再相加(因式分解的二維編碼),或使用二維正弦。更重要的是,現代視覺 Transformer 愈來愈偏好相對位置資訊:不去編碼絕對座標,而是用兩個詞元之間「位移」的一個學到的函數,去對每個注意力分數施加偏置(Swin 的相對位置偏置),或依位置以一個角度旋轉查詢與鍵(旋轉位置嵌入,RoPE)。相對方案捕捉了一個直覺:「相隔三步的兩個圖塊」不論落在影像何處,行為都該相同。
在實務上為什麼重要:因為樸素 ViT 用的是依圖塊位置索引的學習式絕對嵌入,餵入不同的影像解析度會改變圖塊數,使這張查表失效。標準解法是在較高解析度微調時,對位置嵌入做內插(把它們當成一個小小的二維格、再縮放它)——這一步你務必記得,否則準確率會崩盤。
完全沒有位置編碼時,ViT 仍出人意料地能運作,因為類別詞元與圖塊內容提供了微弱的線索,但它無法可靠地推理空間排列。反過來說,卷積的位置資訊可能透過填補(padding)洩漏——有些「無位置編碼」的結果,其實是靠這種意外訊號撐起來的。