同樣的字,只換順序,模型 (Model) 怎麼分辨?
前面的向量章說過:一段文字切成 token 後,模型 (Model) 用編號查表,取得它的嵌入向量 (Embedding Vector),也就是供後續計算的一串數值。
接著有個問題:「我喜歡你」和「你喜歡我」用的是相同文字,意思卻不同。若同一個 token 每次都查到同一串數值,順序要怎麼進入計算?
先追兩件事:這是哪一段文字?它在第幾個位置? 查表取得的向量提供第一份材料;位置資訊提供另一份材料。
只看查表:「我」移到後面,取出的值會變嗎?
這張表固定不改:
| token | 查表得到的向量 |
|---|---|
| 我 | [1, 0] |
| 喜歡 | [0, 1] |
| 你 | [2, 0] |
把它們按兩句話的順序排出來:
| 位置 | 我喜歡你 | 你喜歡我 |
|---|---|---|
| 1 | 我 → [1, 0] | 你 → [2, 0] |
| 2 | 喜歡 → [0, 1] | 喜歡 → [0, 1] |
| 3 | 你 → [2, 0] | 我 → [1, 0] |
「我」從第一個位置移到第三個位置,查表仍得到 [1, 0]。 查表根據的是 token 編號 (Token ID),不是它這次出現在句子的哪裡。
程式並沒有把兩句話的排列弄丟:上表仍是兩份不同順序的資料。這裡要分清的是,單看「我」取出的 [1, 0],這串數值本身沒有附上「我這次在第一個位置」的資訊。
把位置變成能一起計算的數值
一種做法是:每個位置也準備一串數值,讓它和查表向量逐欄相加。本例讓兩者都只有兩個數值:
| 這次在第幾個位置? | 位置用的數值 |
|---|---|
| 1 | [0, 1] |
| 2 | [0, 2] |
| 3 | [0, 3] |
這些值按位置選取,不按文字選取。所以第一句的「我」加 [0, 1],第二句的「我」加 [0, 3]:
| 追同一個「我」 | 逐欄相加 | 結果 |
|---|---|---|
| 在位置 1 | [1, 0] + [0, 1] | [1, 1] |
| 在位置 3 | [1, 0] + [0, 3] | [1, 3] |
第一欄是 1 + 0;第二欄分別是 0 + 1、0 + 3。查表值一樣,加入的位置值不同,這次交給後續計算的數值就不同。
把位置表示成計算能用的資訊,稱為位置編碼 (Positional Encoding)。它提供的是位置關係,不是替每個位置直接指定「主詞」或「受詞」。
親手交換:哪一份數值跟著文字,哪一份跟著位置?
先選「只看查表」,交換「我」與「你」,追「我」所在的列。接著選「加入位置」,在相同的兩種排列之間切換。
交換「我」與「你」,再開關位置資訊;同時看查表值、位置值與加總結果。手機可切到「看數值」與「看差別」。練習只屬於本章,全在瀏覽器本機計算。
只看查表時,「我」的結果一直是 [1, 0];加入位置後,它在第一個位置得到 [1, 1],在第三個位置得到 [1, 3]。跟著文字的是查表值;跟著所在位置的是位置資訊。
這次沒有改寫嵌入表 (Embedding Table),也沒有訓練 (Training)。我們只是把同一張表與同一套位置規則,用在不同排列的輸入上。
有了位置,就知道「誰喜歡誰」了嗎?
還不能這樣說。剛剛只展示了順序資訊如何成為計算材料,沒有做完整句子的理解或答案預測。
後續的計算還要把各位置的資訊結合起來;模型也要經過訓練,才可能學到如何利用文字與位置的關係。位置 1 不是永遠代表主詞,位置 3 也不是永遠代表受詞,更長的句子還有其他語法與關係。
先取得每段文字的初始向量,再帶入位置資訊,接著讓各位置的數值一起參與計算。 下一章〈同一個 token,為什麼換了前文,預測就不同?〉就拆第三步。
每個模型都用剛才的加法嗎?
不一定。原始 Transformer 採用把位置向量與初始向量相加的方式;位置數值可以按固定規則產生,也可以由訓練調整。另有做法把位置關係加入後續配對計算,而不是在查表後直接相加。
所以本章的重點是計算需要有使用順序資訊的途徑,不是背一張位置表,也不是宣稱拿掉這個示意加法,任何模型都一定失去順序資訊。後面談不同架構時,再追它們在哪一步帶入位置。
參考:Attention Is All You Need §3.5:位置資訊與嵌入向量相加、RoFormer:在後續計算中帶入位置關係(2026-10-06 查核)。本章的三段、兩維與固定位置表只示範材料的來源與逐欄相加,不是完整模型或位置編碼演算法的實作。