LLM:Transformer 架构中Q/K/V计算步骤示例
用假的小数字(比如 2 维向量)手算一遍 \(QK^\top\) → softmax → 乘 V,把矩阵乘法也摊开。
用假数字、2 维向量、3 个词手算一遍。句子缩成:
「小猫 / 吃 / 它」
(只为把矩阵算清楚;真实模型是几百~几千维、上万词表。)
设定
维度 \(d_k = 2\),缩放因子 \(\sqrt{d_k} = \sqrt{2} \approx 1.414\)。
假造的 Q、K、V(每个词一行):
Query \(Q\)
| 词 | \(Q\) |
|---|---|
| 小猫 | \([1.0,\ 0.0]\) |
| 吃 | \([0.0,\ 1.0]\) |
| 它 | \([0.9,\ 0.1]\) |
Key \(K\)
| 词 | \(K\) |
|---|---|
| 小猫 | \([1.0,\ 0.2]\) |
| 吃 | \([0.1,\ 1.0]\) |
| 它 | \([0.8,\ 0.3]\) |
Value \(V\)
| 词 | \(V\)(想象成「语义内容」) |
|---|---|
| 小猫 | \([10,\ 0]\) ← 主体信息 |
| 吃 | \([0,\ 10]\) ← 动作信息 |
| 它 | \([1,\ 1]\) ← 代词本身很空 |
写成矩阵(行 = 词):
\[ Q=\begin{bmatrix}1.0&0.0\\0.0&1.0\\0.9&0.1\end{bmatrix},\; K=\begin{bmatrix}1.0&0.2\\0.1&1.0\\0.8&0.3\end{bmatrix},\; V=\begin{bmatrix}10&0\\0&10\\1&1\end{bmatrix} \]
步骤 1:算 \(QK^\top\)(每个 Q 和每个 K 的点积)
\(K^\top\) 是 \(K\) 的转置:
\[ K^\top=\begin{bmatrix}1.0&0.1&0.8\\0.2&1.0&0.3\end{bmatrix} \]
「它」那一行(第 3 行)先手算:
\[
\begin{aligned}
Q_{\text{它}}\cdot K_{\text{小猫}} &= 0.9\times1.0 + 0.1\times0.2 = 0.92 \\
Q_{\text{它}}\cdot K_{\text{吃}} &= 0.9\times0.1 + 0.1\times1.0 = 0.19 \\
Q_{\text{它}}\cdot K_{\text{它}} &= 0.9\times0.8 + 0.1\times0.3 = 0.75
\end{aligned}
\]
完整分数矩阵 \(S = QK^\top\):
\[ S=\begin{bmatrix} 1.00 & 0.10 & 0.80 \\ 0.20 & 1.00 & 0.30 \\ 0.92 & 0.19 & 0.75 \end{bmatrix} \begin{matrix} \leftarrow\text{小猫看三人}\\ \leftarrow\text{吃看三人}\\ \leftarrow\text{它看三人} \end{matrix} \]
行 = 谁在问(Query),列 = 被看谁(Key)。
步骤 2:缩放 \(S / \sqrt{d_k}\)
\[ \frac{S}{\sqrt{2}}\approx\begin{bmatrix} 0.707 & 0.071 & 0.566 \\ 0.141 & 0.707 & 0.212 \\ 0.650 & 0.134 & 0.530 \end{bmatrix} \]
只盯 「它」 那一行:\([0.650,\ 0.134,\ 0.530]\)
步骤 3:对该行做 Softmax(变成权重)
Softmax:
\[ \alpha_j = \frac{e^{z_j}}{\sum_k e^{z_k}} \]
对「它」:
\[ \begin{aligned} e^{0.650} &\approx 1.916 \\ e^{0.134} &\approx 1.143 \\ e^{0.530} &\approx 1.699 \\ \text{和} &\approx 4.758 \end{aligned} \]
\[ \alpha_{\text{它}} \approx \begin{bmatrix} \frac{1.916}{4.758} & \frac{1.143}{4.758} & \frac{1.699}{4.758} \end{bmatrix} \approx \begin{bmatrix}0.403 & 0.240 & 0.357\end{bmatrix} \]
| 被看的词 | 小猫 | 吃 | 它 |
|---|---|---|---|
| 注意力权重 | 40.3% | 24.0% | 35.7% |
「它」最关注「小猫」,也看一点自己和「吃」——和前面指代故事一致(数字是假的,方向对就行)。
步骤 4:权重 × Value,得到「它」的新向量
\[ \begin{aligned} \text{输出}_{\text{它}} &= 0.403\cdot[10,\ 0] + 0.240\cdot[0,\ 10] + 0.357\cdot[1,\ 1] \\ &= [4.03,\ 0] + [0,\ 2.40] + [0.357,\ 0.357] \\ &= [4.387,\ 2.757] \end{aligned} \]
对比更新前后:
| 向量 | 含义 | |
|---|---|---|
| 原来的 \(V_{\text{它}}\) | \([1,\ 1]\) | 几乎没信息 |
| 注意力后的输出 | \([4.39,\ 2.76]\) | 大量掺进了「小猫」的 10,也带一点「吃」 |
也就是说:代词位置的表示,被「小猫」的 Value 填实了。
步骤 5:整句一次算完(矩阵形式)
对每一行 Softmax 后,假设得到权重矩阵 \(A\)(示意,前两行我也算完):
\[ A\approx\begin{bmatrix} 0.40 & 0.21 & 0.39 \\ 0.24 & 0.43 & 0.33 \\ 0.40 & 0.24 & 0.36 \end{bmatrix} \]
然后:
\[ \text{Output} = A V \]
每一行都是「该词看完全句后」的新表示。这就是公式
\[ \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V \]
的全部内容——没有别的魔法。
对照记忆(对着刚才的数字)
- \(QK^\top\):它·小猫 = 0.92 最高 →「问得对」
- \(\sqrt{d_k}\):只是降温,防止分数太大
- softmax:0.92 变成约 40% 权重
- ×V:40% × \([10,0]\) → 输出里出现「小猫」的语义成分
和真实 Transformer 差在哪(心里有数即可)
| 玩具例子 | 真实模型 |
|---|---|
| 手写 Q/K/V | 由 \(XW_Q, XW_K, XW_V\) 学出来 |
| 2 维、3 个词 | 常是 64~128 维/头,序列很长 |
| 1 个头 | 多头并行再拼接 |
| 一层 | 堆很多层,层层 refined |
LLM:Transformer 架构中Q/K/V计算步骤示例

