要理解 “q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力分數”,核心是抓住注意力機制的本質目標 ——量化 “查詢(q)” 與 “鍵(k)” 之間的關聯程度,而向量點積(矩陣相乘的元素本質)恰好是實現這一目標的天然工具。下面分三步拆解:
一、注意力分數的核心使命:找 “查詢與鍵” 的關聯度
注意力機制的核心邏輯是 “按需聚焦”:比如閱讀時,我們會根據當前 “想找的信息(查詢 q)”,去關注文本中 “相關的內容(鍵 k)”。為實現這一邏輯,第一步必須先回答:“每個查詢與每個鍵的相關性有多高?”
這個 “相關性數值”,就是注意力分數。
例如:
- 若查詢 q 是 “貓的顏色”,鍵 k1 是 “黑色貓咪”、k2 是 “紅色汽車”,則 q 與 k1 的分數應高,與 k2 的分數應低;
- 若有多個查詢(如 “貓的顏色”“狗的大小”)和多個鍵,則需要一個 “查詢 - 鍵關聯表”,記錄所有查詢對所有鍵的相關性 —— 這正是 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 矩陣的作用。
二、向量點積:天然的 “關聯度度量工具”
q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 矩陣中,每個元素的本質是 “單個查詢向量 **** **** 與單個鍵向量 **** **** 的點積”(即 qi?kj\mathbf{q}_i \cdot \mathbf{k}_jqi??kj?),而點積的幾何意義恰好能量化 “關聯度”。
回顧向量點積的數學定義與幾何意義:
對兩個維度為 dkd_kdk? 的向量 qi\mathbf{q}_iqi? 和 kj\mathbf{k}_jkj?,點積公式為:
qi?kj=∑t=1dkqi,t×kj,t\mathbf{q}_i \cdot \mathbf{k}_j = \sum_{t=1}^{d_k} q_{i,t} \times k_{j,t}qi??kj?=∑t=1dk??qi,t?×kj,t?
其幾何等價形式為:
qi?kj=∥qi∥×∥kj∥×cos?θ\mathbf{q}_i \cdot \mathbf{k}_j = \|\mathbf{q}_i\| \times \|\mathbf{k}_j\| \times \cos\thetaqi??kj?=∥qi?∥×∥kj?∥×cosθ
其中:
- ∥qi∥\|\mathbf{q}_i\|∥qi?∥、∥kj∥\|\mathbf{k}_j\|∥kj?∥ 是向量的模長(可理解為向量的 “信息量大小”);
- θ\thetaθ 是 qi\mathbf{q}_iqi? 與 kj\mathbf{k}_jkj? 的夾角,cos?θ\cos\thetacosθ 是 “方向相似度”——θ\thetaθ 越小(方向越接近),cos?θ\cos\thetacosθ 越接近 1,點積越大;θ\thetaθ 越大(方向越背離),cos?θ\cos\thetacosθ 越接近 - 1,點積越小。
這恰好完美匹配 “關聯度” 的需求:
- 當查詢 q 與鍵 k “方向相似”(比如 q 是 “貓”,k 是 “貓咪”),cos?θ\cos\thetacosθ 大,點積大→注意力分數高,說明兩者相關;
- 當查詢 q 與鍵 k “方向無關”(比如 q 是 “貓”,k 是 “汽車”),cos?θ\cos\thetacosθ 接近 0,點積小→注意力分數低,說明兩者無關。
此外,點積還有一個關鍵優勢:計算高效。相比歐氏距離(衡量 “差異”,需開平方)等其他度量方式,點積僅需加法和乘法,適合深度學習中大規模矩陣運算(這也是 Transformer 選擇點積作為分數度量的重要工程原因)。
三、q×kT\mathbf{q} \times \mathbf{k}^Tq×kT:批量計算所有 “查詢 - 鍵” 的關聯度
前面講的是 “單個查詢 vs 單個鍵” 的情況,而實際模型中,我們通常有多個查詢(m 個)和多個鍵(n 個),需要一次性計算 “所有查詢對所有鍵的分數”—— 這就需要通過矩陣相乘 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 實現,其維度變化和元素含義如下:
1. 明確向量 / 矩陣維度(結合文檔假設)
- 單個查詢向量 qi\mathbf{q}_iqi?:維度為 dkd_kdk?(如文檔中 dk=64d_k=64dk?=64),即形狀為 (1,dk)(1, d_k)(1,dk?);
- 多個查詢組成的矩陣 Q\mathbf{Q}Q:包含 mmm 個查詢,形狀為 (m,dk)(m, d_k)(m,dk?)(每行是一個查詢);
- 單個鍵向量 kj\mathbf{k}_jkj?:維度同樣為 dkd_kdk?,形狀為 (1,dk)(1, d_k)(1,dk?);
- 多個鍵組成的矩陣 K\mathbf{K}K:包含 nnn 個鍵,形狀為 (n,dk)(n, d_k)(n,dk?)(每行是一個鍵);
- 鍵矩陣的轉置 KT\mathbf{K}^TKT:將 K\mathbf{K}K 的行與列交換,形狀變為 (dk,n)(d_k, n)(dk?,n)(每列是一個鍵)。
2. 矩陣相乘的物理含義:生成 “注意力分數矩陣”
根據矩陣相乘的規則(前矩陣列數 = 后矩陣行數才能相乘),Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT 的計算過程如下:
- 輸入維度:Q(m,dk)×KT(dk,n)\mathbf{Q}(m, d_k) \times \mathbf{K}^T(d_k, n)Q(m,dk?)×KT(dk?,n);
- 輸出維度:(m,n)(m, n)(m,n)(前矩陣行數 × 后矩陣列數);
- 輸出矩陣的每個元素 (i,j)(i, j)(i,j):第 iii 個查詢向量 qi\mathbf{q}_iqi? 與第 jjj 個鍵向量 kj\mathbf{k}_jkj? 的點積(即 qi?kj\mathbf{q}_i \cdot \mathbf{k}_jqi??kj?)。
這個 (m,n)(m, n)(m,n) 的輸出矩陣,就是注意力分數矩陣—— 它本質是一張 “查詢 - 鍵關聯表”:
- 行:對應每個查詢(共 mmm 行);
- 列:對應每個鍵(共 nnn 列);
- 元素 (i,j)(i,j)(i,j):第 iii 個查詢對第 jjj 個鍵的 “關聯度分數”。
3. 與文檔邏輯的呼應:分數矩陣的后續處理
需要注意的是,Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT 得到的是 “原始注意力分數”,正如文檔中強調的,由于點積的方差會隨 dkd_kdk? 增長(Var(qi?kj)=dk\text{Var}(\mathbf{q}_i \cdot \mathbf{k}_j) = d_kVar(qi??kj?)=dk?),原始分數會出現數值極端化問題。因此,后續必須除以 dk\sqrt{d_k}dk?? 進行方差歸一化(將方差固定為 1),再通過 softmax 轉化為 “注意力權重”(表示每個鍵對查詢的貢獻占比)—— 這也印證了文檔中 “縮放點積注意力” 的完整流程:
Attention(Q,K,V)=softmax(Q×KTdk)×V\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left( \frac{\mathbf{Q} \times \mathbf{K}^T}{\sqrt{d_k}} \right) \times \mathbf{V}Attention(Q,K,V)=softmax(dk??Q×KT?)×V
其中 V\mathbf{V}V(值向量)是最終要 “聚焦” 的內容,而 Q×KTdk\frac{\mathbf{Q} \times \mathbf{K}^T}{\sqrt{d_k}}dk??Q×KT? 正是歸一化后的注意力分數矩陣。
四、舉個具體例子:讓抽象矩陣變直觀
假設:
- 查詢數量 m=2m=2m=2(比如查詢 1:“貓的顏色”,查詢 2:“狗的大小”);
- 鍵數量 n=3n=3n=3(比如鍵 1:“黑色貓咪”,鍵 2:“棕色小狗”,鍵 3:“紅色汽車”);
- 維度 dk=2d_k=2dk?=2(簡化計算,實際為 64)。
1. 設定具體向量(符合文檔初始化:均值 0、方差 1)
-
查詢矩陣 Q\mathbf{Q}Q(2×2):
Q=[0.80.20.10.9]\mathbf{Q} = \begin{bmatrix} 0.8 & 0.2 \\ 0.1 & 0.9 \end{bmatrix}Q=[0.80.1?0.20.9?]
(第 1 行:查詢 1 “貓的顏色”,第 2 行:查詢 2 “狗的大小”)
-
鍵矩陣 K\mathbf{K}K(3×2):
K=[0.70.30.20.80.4?0.5]\mathbf{K} = \begin{bmatrix} 0.7 & 0.3 \\ 0.2 & 0.8 \\ 0.4 & -0.5 \end{bmatrix}K=?0.70.20.4?0.30.8?0.5??
(第 1 行:鍵 1 “黑色貓咪”,第 2 行:鍵 2 “棕色小狗”,第 3 行:鍵 3 “紅色汽車”)
-
鍵轉置 KT\mathbf{K}^TKT(2×3):
KT=[0.70.20.40.30.8?0.5]\mathbf{K}^T = \begin{bmatrix} 0.7 & 0.2 & 0.4 \\ 0.3 & 0.8 & -0.5 \end{bmatrix}KT=[0.70.3?0.20.8?0.4?0.5?]
2. 計算 Q×KT\mathbf{Q} \times \mathbf{K}^TQ×KT(原始注意力分數矩陣)
根據矩陣相乘規則:
- 元素 (1,1)(1,1)(1,1)(查詢 1× 鍵 1):0.8×0.7+0.2×0.3=0.56+0.06=0.620.8×0.7 + 0.2×0.3 = 0.56 + 0.06 = 0.620.8×0.7+0.2×0.3=0.56+0.06=0.62(分數高,關聯強);
- 元素 (1,2)(1,2)(1,2)(查詢 1× 鍵 2):0.8×0.2+0.2×0.8=0.16+0.16=0.320.8×0.2 + 0.2×0.8 = 0.16 + 0.16 = 0.320.8×0.2+0.2×0.8=0.16+0.16=0.32(分數中,關聯弱);
- 元素 (1,3)(1,3)(1,3)(查詢 1× 鍵 3):0.8×0.4+0.2×(?0.5)=0.32?0.1=0.220.8×0.4 + 0.2×(-0.5) = 0.32 - 0.1 = 0.220.8×0.4+0.2×(?0.5)=0.32?0.1=0.22(分數低,關聯弱);
- 元素 (2,1)(2,1)(2,1)(查詢 2× 鍵 1):0.1×0.7+0.9×0.3=0.07+0.27=0.340.1×0.7 + 0.9×0.3 = 0.07 + 0.27 = 0.340.1×0.7+0.9×0.3=0.07+0.27=0.34(分數中,關聯弱);
- 元素 (2,2)(2,2)(2,2)(查詢 2× 鍵 2):0.1×0.2+0.9×0.8=0.02+0.72=0.740.1×0.2 + 0.9×0.8 = 0.02 + 0.72 = 0.740.1×0.2+0.9×0.8=0.02+0.72=0.74(分數高,關聯強);
- 元素 (2,3)(2,3)(2,3)(查詢 2× 鍵 3):0.1×0.4+0.9×(?0.5)=0.04?0.45=?0.410.1×0.4 + 0.9×(-0.5) = 0.04 - 0.45 = -0.410.1×0.4+0.9×(?0.5)=0.04?0.45=?0.41(分數低,關聯弱)。
最終原始分數矩陣為:
Q×KT=[0.620.320.220.340.74?0.41]\mathbf{Q} \times \mathbf{K}^T = \begin{bmatrix} 0.62 & 0.32 & 0.22 \\ 0.34 & 0.74 & -0.41 \end{bmatrix}Q×KT=[0.620.34?0.320.74?0.22?0.41?]
這個矩陣完全符合預期:
-
查詢 1(貓的顏色)對鍵 1(黑色貓咪)分數最高,對鍵 3(紅色汽車)分數最低;
-
查詢 2(狗的大小)對鍵 2(棕色小狗)分數最高,對鍵 3(紅色汽車)分數最低。
后續只需除以 dk=2≈1.414\sqrt{d_k} = \sqrt{2} \approx 1.414dk??=2?≈1.414 歸一化,再經 softmax 就能得到合理的注意力權重。
總結:q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力分數的本質原因
- 目標匹配:注意力需要 “關聯度”,點積的幾何意義(方向相似度 + 信息量)恰好量化了關聯度;
- 運算高效:點積計算簡單,適合大規模矩陣運算;
- 批量輸出:q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 能一次性生成 “所有查詢對所有鍵” 的關聯度,形成結構化的分數矩陣;
- 銜接后續流程:原始分數矩陣需經文檔中提到的 “除以 dk\sqrt{d_k}dk?? 歸一化” 和 “softmax 權重轉化”,最終實現 “按需聚焦”—— 這也說明 q×kT\mathbf{q} \times \mathbf{k}^Tq×kT 是注意力機制的核心 “分數來源”。