05.2 注意力機制與 Transformer#
本章導讀#
CNN 靠「局部掃描」看圖;語言的結構卻是「全圖關聯」——一個代詞可能指向二十句之前的主語。 2017 年,Transformer 用一個公式解決了這個問題:注意力。 它讓每個詞直接「看」所有其他詞,並動態決定該看誰多一點。
淺顯說明#
想像一群人在開會,每人發言前要先「聽」其他人:
- 每人有一個提問(Query):「我想知道什麼?」
- 每人有一個名片(Key):「我能回答什麼?」
- 每人有一個內容(Value):「我實際能提供的訊息。」
提問和名片做點積(「我們相關嗎?」),經 softmax 歸一化成權重,再加權匯總大家的內容。 沒有固定連線、沒有掃描順序——關聯是動態計算出來的。
正規理論#
Scaled Dot-Product Attention#
給定查詢 \(Q\) 、鍵 \(K\) 、值 \(V\) (皆為矩陣,列是各詞的向量):
分解成三步:
- 相似度: \(QK^\top\) 的 \((i,j)\) 元素是第 \(i\) 個查詢與第 \(j\) 個鍵的內積—— 內積是高維空間的相似度: \(q^\top k = \|q\|\|k\|\cos\theta\) 。
- 歸一化:除以 \(\sqrt{d_k}\) 。因為 \(d_k\) 維隨機向量的內積方差為 \(d_k\) : 若 \(q, k\) 的分量獨立、均值 0、方差 1,則 \(q^\top k = \sum_{m=1}^{d_k} q_m k_m\) 的方差是 \(d_k\) 。 不除的話 logits 太大,softmax 飽和、梯度消失。
- 加權匯總:softmax 給出非負、和為 1 的權重行 \(\mathbf{a}_i\) ,輸出 \(\mathbf{o}_i = \sum_j a_{ij} v_j\) —— 每個輸出是所有值的凸組合。
投影與多頭#
\(Q, K, V\) 由輸入 \(\mathbf{x}\) 經線性投影得到:
多頭注意力:並行做 \(h\) 次不同投影,讓網路同時關注不同類型的關聯:
數學本質:動態權重圖#
把 \(A = \mathrm{softmax}(QK^\top/\sqrt{d_k})\) 看成一個有向圖的權重矩陣: \(A_{ij}\) 是「詞 \(i\) 對詞 \(j\) 的注意力」。與摺積(固定權重、局部連線)對比:
| 摺積 | 注意力 | |
|---|---|---|
| 連線範圍 | 局部(感受野) | 全局(所有詞對) |
| 權重 | 固定(學出後不變) | 動態(依輸入即時計算) |
| 對稱群 | 平移群 | 置換(permutation,配合位置編碼) |
自注意力與序列建模#
自注意力(self-attention)中 \(Q, K, V\) 都來自同一序列。因果(causal)版本把未來遮掉:
配合位置編碼(05.3 節),Transformer 變成語言模型的骨幹:
簡易範例:兩詞注意力#
兩詞向量( \(d_k = 2\) ):
- 相似度: \(QK^\top = \begin{pmatrix} 2 & 0 \\ 0 & 2 \end{pmatrix}\) ,除以 \(\sqrt{2}\) 得 \(\begin{pmatrix} 1.414 & 0 \\ 0 & 1.414 \end{pmatrix}\) 。
- 歸一化: \(\mathrm{softmax}\) 按行 \(\Rightarrow A = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}\) (各詞只看自己——相似度懸殊)。
- 匯總: \(AV = V\) 。
若把 \(K\) 的第二行改成 \((0, 2)\) 換成 \((2, 2)\) ,注意力權重就會重新分配——關聯是動態的。
歷史典故#
- 2014 年 Seq2Seq 與注意力:見卷宗 ../2014-Seq2Seq與注意力.md——注意力最初是翻譯模型的「對齊」機制。
- 2017 年 Transformer:見 ../2017-Transformer注意力機制.md——「Attention Is All You Need」:丟掉循環,只剩注意力。
- 2018 年 BERT 與 GPT:見 ../2018-BERT與GPT預訓練典範.md——同一個注意力架構,兩種訓練哲學。
- 2021 年 ViT:見 ../2021-ViT視覺Transformer.md——注意力也統一了視覺,圖塊即詞元。
習題#
- 證明:若 \(q, k\) 的分量獨立標準常態,則 \(\mathrm{Var}(q^\top k) = d_k\) ,說明為何要除以 \(\sqrt{d_k}\) 。
- 對本節例題改 \(K\) 第二行為 \((2,2)\) ,重算 \(A\) 與 \(AV\) 。
- 證明 softmax 的行和為 1,且每個輸出 \(o_i = \sum_j a_{ij}v_j\) 是 \(V\) 各行的凸組合。
補充#
1. 數學推導證明#
證明(習題 3):softmax 的行和為 1,輸出是凸組合。
softmax 按行定義: \(a_{ij} = \dfrac{\exp(s_{ij})}{\sum_{j'} \exp(s_{ij'})}\) 。對固定的行 \(i\) ,分子分母同為正數,故 \(a_{ij} > 0\) ;且
因此輸出 \(\mathbf{o}_i = \sum_j a_{ij} \mathbf{v}_j\) 的係數非負且和為 1—— \(\mathbf{o}_i\) 落在所有 \(\mathbf{v}_j\) 的凸包(convex hull)內。 \(\blacksquare\)
證明(習題 1):分量獨立標準常態時 \(\mathrm{Var}(q^\top k) = d_k\) 。
設 \(q_m, k_m \overset{\text{iid}}{\sim} \mathcal{N}(0, 1)\) ,相互獨立。 \(q^\top k = \sum_{m=1}^{d_k} q_m k_m\) ,各項獨立,且
(第二項因 \(\mathbb{E}[q_m k_m] = \mathbb{E}[q_m]\mathbb{E}[k_m] = 0\) 。)獨立和的方差相加:
所以 logits 的尺度隨 \(d_k\) 增長;除以 \(\sqrt{d_k}\) 把方差歸一回 1,softmax 不會飽和、梯度不會消失。 \(\blacksquare\)
2. 簡易範例#
重算例題(習題 2):把本節例題 \(K\) 的第二行 \((0, 2)\) 改為 \((2, 2)\) ,則 \(QK^\top = \begin{pmatrix} 2 & 2 \\ 0 & 2 \end{pmatrix}\) ,除以 \(\sqrt{2}\) 後按行 softmax:
- 第一行 logits \((1.414, 1.414)\) :均勻 → \(A_{1\cdot} = (0.5, 0.5)\)
- 第二行 logits \((0, 1.414)\) : \(A_{2\cdot} = (0.2, 0.8)\)
\(A\) 從單位矩陣變成混合權重——改一個鍵向量,注意力就重新分配,輸出 \(AV\) 隨之改變:關聯是動態計算的。
程式驗證:_code/05.2-scaled-dot-attention.py 用 numpy 實作 scaled dot-product attention(含因果遮罩版本)。程式輸出:(1) 隨機 \(Q, K, V\) 的注意力權重矩陣,每行行和印出全為 1、權重全非負——驗證凸組合性質;(2) 蒙地卡羅(20 萬次)實測 \(q^\top k\) 的方差 \(\approx 15.97 \approx d_k = 16\) ,除以 \(\sqrt{d_k}\) 後方差 \(\approx 0.998\) ——驗證縮放因子的理論依據;(3) 因果注意力的上三角權重全為 0。