每個 token vector 會被轉成 Q、K、V 三種向量。
Q 可以理解成「我想找什麼」。
K 是「我有什麼特徵可以被匹配」。
V 是「我真正提供的內容」。
那 attention 的下一步,就是讓每個 token 的 Q,去跟其他 token 的 K 算關聯分數。
例如「放進」這個 token,可能會去看整句話裡的「蘋果」、「冰箱」、「我」、「把」等等。它不是用中文文法規則去判斷誰重要,而是拿「放進」的 Q 向量,去跟每個 token 的 K 向量做內積。
如果一次只看兩個 token,這件事就是向量內積。
例如:
Q_放進 · K_蘋果 = 關聯分數
Q_放進 · K_冰箱 = 關聯分數
分數越高,代表模型判斷「放進」處理自己時,越應該注意那個 token。
但實際模型不會一組一組慢慢算。它會把整句話所有 token 的 Q 疊成一個 Q matrix,把所有 token 的 K 疊成一個 K matrix,然後直接做矩陣相乘:
Q × Kᵀ
這個矩陣相乘會得到一張 attention score table。表格裡的每一格,就是「某個 token 的 Q」跟「另一個 token 的 K」算出來的關聯分數。
例如:
「放進」→「蘋果」:4.0
「放進」→「冰箱」:6.0
「放進」→「我」:0.1
這些數字還不是最後的注意力比例,只是原始分數。接著模型會把它們丟進 softmax。
softmax 的功能很直覺:把一堆分數轉成加總為 100% 的比例。分數越高,比例越大;分數低,比例就接近 0。
所以原本:
「蘋果」:4.0
「冰箱」:6.0
「我」:0.1
經過 softmax 後,可能變成:
「蘋果」:12%
「冰箱」:88%
「我」:幾乎 0%
這時候模型就知道:處理「放進」這個 token 時,應該主要吸收「冰箱」的資訊,也要吸收一些「蘋果」的資訊。
最後一步,就是用這些比例去加權混合每個 token 的 V。
也就是:
新的「放進」向量
= 12% × V_蘋果
88% × V_冰箱
很小比例 × 其他 token 的 V
所以 attention 之後,「放進」就不再只是孤立的 token,而是帶有上下文資訊的新向量。它會知道自己比較像是一個「把某個東西放到某個地方」的動作。
這讓我覺得 attention 其實沒那麼神秘。它的核心流程就是:
所謂「token 彼此互看」,其實就是這件事。
它不是人類意義上的理解,而是一套大規模的數學資訊交換機制。每一層 transformer block 都會讓 token 重新互相參考一次。模型疊很多層後,token 的向量就會越來越有上下文、越來越有語意。