ARCHITECTURAL INSIGHTS
从 Token 到 QKV:大模型注意力与矩阵运算几何图解
严谨厘清概念:输入 Token 嵌入向量($x_i$) vs 模型静态权重矩阵($W_Q, W_K, W_V$) vs 投影后的查询/键向量($q_i, k_j$)。看清为什么注意力打分的本质是“输入 Token 借助静态度量矩阵与输入 Token 相乘”。
Foundation 0
从零看懂 QKV:它们是谁?从哪来?到哪去?
🔍 Q (Query 矩阵 / 向量 q_i)
Token i 投影后的“查询意图”
公式:$q_i = x_i \cdot W_Q$。
它是输入 Token $x_i$ 换了个视角(找什么),本质仍是输入数据的表征!
公式:$q_i = x_i \cdot W_Q$。
它是输入 Token $x_i$ 换了个视角(找什么),本质仍是输入数据的表征!
🏷️ K (Key 矩阵 / 向量 k_j)
Token j 投影后的“索引标签”
公式:$k_j = x_j \cdot W_K$。
它是输入 Token $x_j$ 对外展示的特征(我是谁),同样由输入数据决定!
公式:$k_j = x_j \cdot W_K$。
它是输入 Token $x_j$ 对外展示的特征(我是谁),同样由输入数据决定!
📦 V (Value 矩阵 / 向量 v_j)
Token j 投影后的“内容载荷”
公式:$v_j = x_j \cdot W_V$。
它是输入 Token $x_j$ 实际携带的信息包,准备被加权提取带走。
公式:$v_j = x_j \cdot W_V$。
它是输入 Token $x_j$ 实际携带的信息包,准备被加权提取带走。
Deep Dive · 概念厘清与数学本质
自点积的数学真相:到底是权重在相乘,还是输入 Tokens 在相乘?
⚠️ 彻底厘清三类对象的本质区别:
- 1. 输入 Tokens($X$ / 向量 $x_i$):用户输入的真实文本(如“河边”、“银行”),是动态的输入数据。
- 2. 模型权重矩阵($W_Q, W_K, W_V$):模型保存在显存里的参数,是静态的参数度量衡。
- 3. $Q, K, V$(向量 $q_i, k_j, v_j$):是输入 Token $x$ 乘以静态权重 $W$ 之后产出的特征向量!$Q$ 和 $K$ 的主体依然是输入 Token!
📐 自点积的完整数学展开(看清谁在和谁乘):
$$\text{Attention}(i, j) = q_i \cdot k_j^T = \underbrace{x_i}_{\text{输入 Token } i} \cdot \underbrace{(W_Q \cdot W_K^T)}_{\text{全局静态度量矩阵 } M} \cdot \underbrace{x_j^T}_{\text{输入 Token } j}$$
结论:本质就是「输入 Token $x_i$」和「输入 Token $x_j$」在直接做矩阵乘积!
静态权重 $(W_Q W_K^T)$ 只是在中间充当一个固定的度量裁判尺(Bilinear Form)。最终点积算出来的分数是高还是低,完全由当前的输入词 $x_i$ 和 $x_j$ 决定!
交互体验:输入 Token 的改变如何瞬间颠覆注意力打分
权重矩阵 $W_Q, W_K$ 保持绝对静止,仅切换输入 Tokens:2 梯度下降方式:静态权重矩阵 $W_Q, W_K, W_V$ 必须捆绑训练吗?
根据链式法则,三个权重矩阵的梯度完全解耦,工业界常通过冻结 K/V 或 LoRA 旁路实现高效训练:
3 为什么理论是 3 个矩阵,而实际大模型 Block 包含 7 个矩阵?
自注意力层 (Attention):共 4 个矩阵
4 Matrices
- • W_Q:输入 Token 向量 $x \to$ 检索意图向量 $q$
- • W_K:输入 Token 向量 $x \to$ 特征索引向量 $k$
- • W_V:输入 Token 向量 $x \to$ 真实内容向量 $v$
- • W_O:多头注意力算完拼接后的跨头输出融合矩阵!
前馈网络层 (SwiGLU FFN):共 3 个矩阵
3 Matrices
- • W_gate:Swish 门控通道激活
- • W_up:隐层升维(放大 3.5~4 倍)
- • W_down:融合后降维回主模型维度
现代大模型单个 Block 核心矩阵全景:
4 (Attention: W_Q, W_K, W_V, W_O) + 3 (SwiGLU: W_gate, W_up, W_down) = 7 个权重矩阵!
Interactive Demo 1
Prefill 阶段是谁和谁在相乘?(GEMM vs GEMV 访存本质)
输入激活矩阵 X [4 × 4]
4 个 Token 向量并行
×
模型权重矩阵 W [4 × 4]
从显存只读入 1 次
=
输出特征矩阵 Y [4 × 4]
生成 16 个点积结果
正在计算: X 的第 1 行 · W 的第 1 列 ➔ Y(1,1)
Prefill 到底是谁在相乘?
• 一方是:Prompt 激活矩阵 $X$($[N \times d]$),包含所有 $N$ 个 Prompt Token(每行一个词向量);
• 另一方是:模型权重矩阵 $W$($[d \times d]$),如保存在显存里的 $W_Q, W_K, W_V$ 或 MLP 权重。
权重 $W$ 从显存读入 1 次,被 $N$ 行词向量重复复用 $N$ 次,计算强度大,Tensor Core 跑满(Compute-Bound)。
• 另一方是:模型权重矩阵 $W$($[d \times d]$),如保存在显存里的 $W_Q, W_K, W_V$ 或 MLP 权重。
权重 $W$ 从显存读入 1 次,被 $N$ 行词向量重复复用 $N$ 次,计算强度大,Tensor Core 跑满(Compute-Bound)。
Decode 为什么变成向量乘(GEMV)?
自回归每吐一个词,输入矩阵 $X$ 缩水为只有 1 行的瘦向量 $x_t \in [1 \times d]$。
为了算这 1 行,GPU 依然要把整整上百 GB 的全量权重 $W$ 完整搬进显存一次!权重复用率为 0,显存总线塞满(Memory-Bound)。
为了算这 1 行,GPU 依然要把整整上百 GB 的全量权重 $W$ 完整搬进显存一次!权重复用率为 0,显存总线塞满(Memory-Bound)。
Interactive Demo 2
$Q \times K^T$ 为什么是 $O(n^2)$?(因果方阵行列点积展开)
调整序列长度 n:
n = 5
👇 鼠标悬停下方 Attention 矩阵中的任一单元格,观察对应的 Query 行向量与 Key 列向量内积:
Query 矩阵 Q [n × d]
每行是 Token i 的 Query 向量 q_i
×
Key 转置矩阵 Kᵀ [d × n]
每列是 Token j 的 Key 向量 k_j
=
注意力方阵 A [n × n]
有效点积数: 15 / 25
悬停在单元格上查看:$q_i \cdot k_j$ 的对应行列投影
Interactive Demo 3