詞嵌入與位置編碼:模型如何理解語意與順序
從 Word2Vec 的靜態詞向量到 Transformer 的動態上下文嵌入,並解析位置編碼如何讓模型理解詞序。
詞嵌入與位置編碼:模型如何理解語意與順序
上一篇我們從文字出發,走過了詞袋法、TF-IDF、Word2Vec,最後看到 Token 如何變成向量。
但一個關鍵問題還沒完全解答:模型憑什麼知道「蘋果」和「香蕉」比較近,而「蘋果」和「手機」在另一個語境下又比較近?
還有,語言是有順序的,模型又怎麼知道「我愛你」不等於「你愛我」?
這一篇,我們要補齊兩個關鍵拼圖:詞嵌入(Word Embedding) 與 位置編碼(Positional Encoding)。
一、回顧:Token 如何變成向量?
在前一篇我們提到,文字進入模型前會先經過分詞,變成一個個 Token,再轉成整數 ID。
但整數 ID 本身沒有語意,例如 102 和 345 之間的大小關係,並不代表它們的語意距離。
所以我們需要一個嵌入矩陣(Embedding Matrix)。
假設詞彙表大小為 (V),嵌入維度為 (d),則嵌入矩陣的形狀是 (V \times d)。
每一個 Token ID 對應到矩陣中的某一列,那一列就是它的詞元向量(Token Embedding)。
具體操作可以想像成:
- 將 Token ID 轉成 One-Hot 向量(只有對應位置是 1,其餘是 0)
- 將 One-Hot 向量乘上嵌入矩陣
- 得到一個 (d) 維的稠密向量
這個過程本質上是「查表」,但因為是以矩陣乘法實現,所以它是可導的(Differentiable)。
這意味著模型可以透過反向傳播,不斷調整嵌入矩陣裡的數值,讓詞向量越來越能反映語意關係。
二、詞嵌入捕捉了什麼?
詞嵌入最迷人的地方,是它能把「語意」變成「空間中的距離」。
在訓練完成後,語意相近的詞,它們的向量會靠得比較近;語意無關的詞,向量就會離得比較遠。
我們可以用**餘弦相似度(Cosine Similarity)**來衡量兩個詞向量的接近程度:
[ \text{similarity} = \cos(\theta) = \frac{\mathbf{A}\cdot\mathbf{B}}{|\mathbf{A}||\mathbf{B}|} ]
如果兩個向量的方向越接近,餘弦相似度就越接近 1。
更經典的例子是詞向量的類比關係:
[ \text{國王} - \text{男人} + \text{女人} \approx \text{皇后} ]
這代表模型學到的不只是共現統計,而是某種語意結構。
它知道「國王」和「男人」的關係,類似於「皇后」和「女人」的關係。
這也是 Word2Vec 當年的重大突破:它讓詞彙不再是孤立的符號,而是活在一個有幾何結構的語意空間裡。
三、靜態詞向量的極限:一詞多義
不過,Word2Vec 這類方法有一個根本限制:
它產生的詞向量是靜態的。也就是說,同一個詞永遠對應同一個向量。
但語言的事實是:
- 「蘋果」在「我喜歡吃蘋果」中,是一種水果。
- 「蘋果」在「我買了蘋果手機」中,是一個品牌。
如果這兩個「蘋果」共用同一個向量,模型就無法區分它們的語意差異。
為了解決這個問題,後來的 Transformer 架構採用了動態上下文嵌入(Contextual Embedding)。
同一個 Token 會因為周圍的上下文不同,經過多層注意力計算後,得到不同的向量表示。
換句話說:
- 靜態詞嵌入:一個詞 → 一個固定向量
- 動態上下文嵌入:一個詞 + 上下文 → 一個動態向量
這正是 BERT、GPT 等現代大語言模型能夠理解一詞多義的關鍵。
四、順序不能消失:位置編碼的必要性
有了詞元向量之後,還有一個問題:
Transformer 內部的**自注意力機制(Self-Attention)**本身不具備順序概念。
如果我們只把詞向量丟進注意力層,模型會像一個沒有時間感的閱讀者,看到的是「一袋詞」,而不是「一句話」。
它分不清:
- 我愛你
- 你愛我
因為這兩句包含的詞完全一樣,只是順序不同。
所以我們必須在輸入中注入位置資訊。
最終輸入表徵通常由兩部分相加而成:
[ \text{Input} = \text{Token Embedding} + \text{Positional Embedding} ]
這樣模型才能同時知道「這個詞是什麼」以及「這個詞在第幾個位置」。
五、位置編碼的兩種主流做法
1. 透過模型訓練學習(Learned Positional Encoding)
最直覺的方法,是把位置索引(第 1 個位置、第 2 個位置……)也當成可訓練的參數。
模型在訓練過程中,會自己學出每個位置對應的向量。
優點:
- 簡單直觀
- 能靈活適應資料
缺點:
- 無法處理超過訓練時最大長度的序列
- 如果訓練時只看過 512 個位置,推論時遇到 1024 個位置就無法直接支援
2. 透過數學公式計算(Fixed Positional Encoding)
另一種做法是用預先定義的數學函數來生成位置向量,最著名的就是原始 Transformer 論文使用的正弦與餘弦波編碼(Sinusoidal Encoding)。
公式如下:
[ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right) ]
[ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right) ]
其中:
- (pos):位置索引
- (i):維度索引
- (d):嵌入維度
這個設計有幾個巧妙之處:
- 無需訓練:位置向量直接由公式計算,不佔用模型參數。
- 不同頻率:不同維度使用不同頻率,能捕捉不同尺度的位置關係。
- 可外推性:能處理比訓練時更長的序列。
- 相對位置可表達:因為正弦餘弦的性質,模型可以透過線性變換推導出相對位置。
六、絕對位置 vs 相對位置
位置編碼可以分成兩個層次:
絕對位置(Absolute Position)
為每個位置賦予一個獨特的編碼,代表它在序列中的絕對順序。
例如「這是第 5 個詞」。
這種方式簡單直接,但無法直接表達詞與詞之間的相對距離。
相對位置(Relative Position)
編碼的是詞與詞之間的相對距離,例如「這兩個詞相隔 2 個位置」。
許多研究指出,相對位置編碼更能有效捕捉語法與語意結構,因為人類語言的本質更依賴詞與詞之間的相對關係,而不是絕對順序。
近年來廣泛應用於 LLaMA 等現代大模型的 RoPE(Rotary Positional Embedding,旋轉位置編碼),就是結合了絕對位置與相對位置優點的創新設計。
它透過旋轉矩陣將位置資訊注入 Query 和 Key,讓注意力機制在計算時能自然感知相對距離。
其他常見的還有 ALiBi(Attention with Linear Biases),它不直接加在嵌入上,而是在注意力分數上加入與距離相關的偏差項。
七、可導性:嵌入不是死表,而是活的參數
最後要再強調一次:
詞嵌入矩陣和位置嵌入矩陣,都是可訓練的參數。
當模型預測錯誤時,損失函數會透過反向傳播,把誤差訊號傳回嵌入層,持續調整每個 Token 和每個位置的向量數值。
這確保了嵌入層能隨著訓練過程不斷進化,使詞與詞之間的向量距離能更精確地反映它們的語意相似性。
這也是為什麼嵌入層雖然看似只是「查表」,卻是整個大語言模型理解語言的入口。
八、總結:語意 + 順序 = 完整輸入
到這裡,我們已經把文字進入 Transformer 前的最後一哩路補齊了:
- 詞元向量:代表詞彙本身的語意內涵
- 位置向量:補充詞彙在句子中的順序資訊
- 兩者相加:形成最終的輸入表徵
我們也看到了從靜態詞向量到動態上下文嵌入的演進,以及從絕對位置到相對位置的技術發展。
這些設計共同確保了模型既能理解「詞的意思」,也能理解「詞的順序」。
接下來,這些向量就要進入 Transformer 的核心:注意力機制。
模型會開始計算:在處理某個詞時,它應該「關注」句子中的哪些其他詞?又該賦予它們多少權重?
下一篇預告
《注意力機制入門:QKV、Mask 與縮放點積》
我們會解釋 Query、Key、Value 如何運作,為什麼需要 Mask,以及為什麼要除以 (\sqrt{d_k})。