詞嵌入與位置編碼:模型如何理解語意與順序

從 Word2Vec 的靜態詞向量到 Transformer 的動態上下文嵌入,並解析位置編碼如何讓模型理解詞序。

詞嵌入與位置編碼:模型如何理解語意與順序

上一篇我們從文字出發,走過了詞袋法、TF-IDF、Word2Vec,最後看到 Token 如何變成向量。
但一個關鍵問題還沒完全解答:模型憑什麼知道「蘋果」和「香蕉」比較近,而「蘋果」和「手機」在另一個語境下又比較近?
還有,語言是有順序的,模型又怎麼知道「我愛你」不等於「你愛我」?

這一篇,我們要補齊兩個關鍵拼圖:詞嵌入(Word Embedding)位置編碼(Positional Encoding)

Token Embedding + Positional Encoding → Input Representation

一、回顧:Token 如何變成向量?

在前一篇我們提到,文字進入模型前會先經過分詞,變成一個個 Token,再轉成整數 ID。
但整數 ID 本身沒有語意,例如 102345 之間的大小關係,並不代表它們的語意距離。

所以我們需要一個嵌入矩陣(Embedding Matrix)

假設詞彙表大小為 (V),嵌入維度為 (d),則嵌入矩陣的形狀是 (V \times d)。
每一個 Token ID 對應到矩陣中的某一列,那一列就是它的詞元向量(Token Embedding)

具體操作可以想像成:

  1. 將 Token ID 轉成 One-Hot 向量(只有對應位置是 1,其餘是 0)
  2. 將 One-Hot 向量乘上嵌入矩陣
  3. 得到一個 (d) 維的稠密向量

這個過程本質上是「查表」,但因為是以矩陣乘法實現,所以它是可導的(Differentiable)。
這意味著模型可以透過反向傳播,不斷調整嵌入矩陣裡的數值,讓詞向量越來越能反映語意關係。

One-Hot × Embedding Matrix → Vector

二、詞嵌入捕捉了什麼?

詞嵌入最迷人的地方,是它能把「語意」變成「空間中的距離」。

在訓練完成後,語意相近的詞,它們的向量會靠得比較近;語意無關的詞,向量就會離得比較遠。
我們可以用**餘弦相似度(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 等現代大語言模型能夠理解一詞多義的關鍵。

Static Embedding vs. Contextual Embedding

四、順序不能消失:位置編碼的必要性

有了詞元向量之後,還有一個問題:
Transformer 內部的**自注意力機制(Self-Attention)**本身不具備順序概念。

如果我們只把詞向量丟進注意力層,模型會像一個沒有時間感的閱讀者,看到的是「一袋詞」,而不是「一句話」。
它分不清:

  • 我愛你
  • 你愛我

因為這兩句包含的詞完全一樣,只是順序不同。

所以我們必須在輸入中注入位置資訊。
最終輸入表徵通常由兩部分相加而成:

[ \text{Input} = \text{Token Embedding} + \text{Positional Embedding} ]

這樣模型才能同時知道「這個詞是什麼」以及「這個詞在第幾個位置」。

Token Embedding + Positional Embedding → Input Representation

五、位置編碼的兩種主流做法

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):嵌入維度

這個設計有幾個巧妙之處:

  • 無需訓練:位置向量直接由公式計算,不佔用模型參數。
  • 不同頻率:不同維度使用不同頻率,能捕捉不同尺度的位置關係。
  • 可外推性:能處理比訓練時更長的序列。
  • 相對位置可表達:因為正弦餘弦的性質,模型可以透過線性變換推導出相對位置。

Learned vs. Sinusoidal Positional Encoding

六、絕對位置 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})。