Skip to content

第 2 章:Q、K、V 从哪里来,WQ 又是什么 ​

返回目录

你问“这一步是在算WQ还是算q”,说明必须先分清规则与本次结果。下面保留原回答中三个阶段的拆分,但先补上Q/K/V为什么分成三个角色。

2.1 同一个输入,经过三个不同的变换 ​

Transformer 不会直接使用原始 x_i 计算所有关系,而是先进行三个线性变换:

\boxed{
\begin{aligned}
Q&=XW_Q\\
K&=XW_K\\
V&=XW_V
\end{aligned}
}

其中 W_Q,W_K,W_V 都是训练得到的参数矩阵。

你可以把它理解为:同一个向量经过三种不同的线性变换,得到三种不同用途的表示。

向量英文可以怎么理解
QQuery(查询)我需要寻找什么信息?
KKey(键)我具有什么信息可供匹配?
VValue(值)我实际可以传递什么信息?

举个医学语言的例子。

当模型处理「黑便」时,可能需要关注「华法林」这个词,因为两者之间存在与出血相关的联系。

那么:

  • 「黑便」的 Query 可能与「华法林」的 Key 高度匹配。
  • 这种匹配会产生较大的注意力权重。
  • 「华法林」的 Value 就会更多地参与「黑便」的新向量的构造。

这是机制上的示意,并不意味着模型内部真的有一个人为设定的「出血维度」。

这里用“黑便”读取“华法林”,说的是黑便已经作为输入出现之后的表示更新;若要在它尚未出现时预测它,应使用前一个“出现”位置的最终表示。这两个时刻不要混淆。

2.2 第一阶段:计算本次的 q、k、v ​

假设某个 Token 的原始向量是 x_i。

首先通过矩阵变换:

\boxed{
\begin{aligned}
q_i&=x_iW_Q\\
k_i&=x_iW_K\\
v_i&=x_iW_V
\end{aligned}
}

这里有两类不同的东西:

  • W_Q,W_K,W_V:模型通过训练学到的参数矩阵,在一次普通推理过程中保持不变。
  • q_i,k_i,v_i:根据当前输入计算出来的向量,会随着输入的 Token 及其表示改变。

因此,W_Q 是用于计算 q_i 的矩阵,二者不是同一个东西。

同一个输入向量 x经过 WQ得到 q:用于寻找经过 WK得到 k:接受匹配经过 WV得到 v:传递内容q 与各处 k 点积 → 决定比例用比例混合各处 v
图2:参数矩阵是规则,q/k/v是本次输入经过规则算出的结果。

2.3 一个小计算,看清 WQ 与 q 的区别 ​

假设某行输入为:

x_i=(2,1),\qquad W_Q=\begin{bmatrix}1&0\\0&3\end{bmatrix}.

则 q_i=x_iW_Q=(2,3)。如果输入变为(1,4),WQ不变,q就变成(1,12)。

所以WQ是一套可训练的数值规则;q是这次输入按规则算出的结果。训练更新的是WQ;下一次前向传播再用更新后的WQ算新的q。不是先单独“训练出一份固定Q”给所有输入使用。

2.4 第二阶段:使用 q、k 计算分数 ​

这才是你选中的「Q 与 K 如何确定权重」那一步。

我们已经有了:

q_i=x_iW_Q,\qquad k_j=x_jW_K

现在计算:

\boxed{s_{ij}=\frac{q_i\cdot k_j}{\sqrt{d_k}}}

它表示第 i 个 Token 的 Query 与第 j 个 Token 的 Key 的匹配分数。

这里没有计算新的 W_Q,也没有计算新的 q_i,只是使用第一阶段得到的向量进行点积。

2.5 第三阶段:把分数变成比例 ​

将分数 s_{ij} 转换为:

\boxed{a_{ij}=\frac{e^{s_{ij}}}{\sum_{l}e^{s_{il}}}}

得到真正的注意力权重 a_{ij},然后计算:

z_i=\sum_j a_{ij}v_j

2.6 遇到下标时,按谁在读、从哪里读来理解 ​

s_{ij}中,i是当前需要读取信息的位置,j是候选提供信息的位置。q_i属于i,k_j属于j,a_{ij}表示i分给j的比例。

例如a_{5,3}是“出现”位置从“华法林”位置读回信息时所用的系数。它不是WQ里的第5行第3列,也不是“黑便”的输出概率。

下面先只看一个位置面对几个候选的情况,暂时不让整张矩阵掩盖每一步。

保留每一次追问,认真走完每一步证明。