本文目录
Q、K、V 是实时计算结果
矩阵流水线
让三个 Token 真正走完一次自注意力
这里不是随机填表:每个数字都由上一步矩阵真实计算而来。
X(3×4)
列 = 特征维X ∈ R^{3×4}
输入矩阵 X 有 3 个 Token、每行 4 维,形状是 3×4。模型训练后保存的是三个权重矩阵 W_Q、W_K、W_V;这里把它们设为 4×2。当前输入到来时才实时计算:
所以 Q、K、V 都是 3×2 矩阵,每一行属于一个 Token。它们不是为某个词提前存好的固定表。
行是 Query,列是 Key
计算 QK^T 时,结果是 3×3。第 i 行第 j 列表示 Q_i 与 K_j 的兼容分数:当前第 i 个位置,应该从第 j 个位置读取多少信息。
这个分数存在于训练学出的投影空间中,不宜简单说成“两个词天然有多像”。负数也不等于绝对无关;真正的注意力大小取决于同一行所有分数的相对差距。
为什么还要除以 √d
维度增大时,点积的绝对值容易变大,使 Softmax 过早饱和。因此分数要除以 √d_k。随后对每一行做 Softmax,把这一行转成和为 1 的注意力权重。
稳定 Softmax 会先减去行最大值:
最后用权重矩阵乘 V。Q 与 K 决定“读谁、读多少”,V 携带被汇总的内容。得到的仍是一行对应一个 Token 的上下文表示。
从第一个 Token 的一行开始验算
交互中不要一上来盯着整张矩阵。先选择第一行:Q₁ 要依次与 K₁、K₂、K₃ 做点积,所以得到三个分数。它们正好排在注意力得分矩阵的第一行。
如果 Q₁ = [a,b],K₂ = [c,d],对应格子的计算就是:
这里的下标 12 不是第 12 个数,而是“第 1 个 Query 查看第 2 个 Key”。把 K 转置的目的,就是让 K 的每个 Token 向量从一行变成一列,使 Q 的每一行都能与所有 K 列做点积。三个 Token 因而产生九个两两匹配分数。
接下来只对这一行做 Softmax。假设三个缩放分数是 [1.2, 0.1, −0.4],减去最大值后变成 [0, −1.1, −1.6]。指数函数将它们全部变成正数,再除以总和,得到和为 1 的三个权重。负分数不会生成负注意力,只会得到相对较小的正权重。
Q、K、V 为什么不能只用同一个 X
如果直接用 X 与 X 做点积,比较依据和被读取内容都被固定在同一种表示里。三个不同投影给模型更多学习空间:
W_Q把当前 Token 变换成适合提出匹配需求的方向;W_K把每个 Token 变换成适合被比较的方向;W_V决定真正被汇总的信息表示。
“需求、索引、内容”只是理解职责的辅助说法,并不表示矩阵里存在人类写好的问题文本或标签。训练开始时三个权重矩阵通常是随机初始化;经过许多样本的损失反馈,它们才逐渐形成能帮助预测的投影。
同一个 Token 会同时产生自己的 Q、K、V 行。它用 Q 去匹配所有位置的 K,同时也用自己的 K 接受其他 Query 的匹配;自己的 V 则可能被自己或其他位置读取。一个 Token 并不是固定扮演“提问者”或“被查询者”,而是在矩阵的行列关系中同时承担这些计算角色。
注意力矩阵的数字不是固定词义关系
某一层某一头中,“猫”对“爱”的权重较高,不代表模型永久保存了一条“猫和爱相关 0.6”的规则。换一句话、换一个位置、换一层或换一个注意力头,输入隐藏表示都会变化,算出的 Q/K/V 和注意力权重也随之改变。
注意力权重还只是中间计算,不能单独等同于模型的完整解释。最终输出经过多个头、输出投影、残差连接、归一化、FFN 和更多 Block。某个头的一张注意力图能展示它从哪里读取信息,却不能独立证明模型作出最终答案的全部原因。
输出为何仍是一行对应一个 Token
权重矩阵形状是 n×n,V 的形状是 n×d_v,相乘后得到 n×d_v。结果第 i 行等于第 i 行注意力权重对所有 V 行的加权和:
因此 Token 数量 n 没有改变,只是每个位置的向量内容发生了变化。它不再只来自自己的初始表示,而是按当前 Query 的权重混入可见位置的信息。后续多头注意力会把各头结果拼接,再通过 W_O 投影回模型主维度。
用形状排查计算是否正确
假设 X 是 4×6,希望每个头的 Q/K 维度为 3,那么 W_Q 和 W_K 必须是 6×3,得到 Q/K 为 4×3。随后:
Q Kᵀ scores V output
4×3 × 3×4 = 4×4 × 4×3 = 4×3如果把权重写成 3×6,第一步 4×6 × 3×6 的中间维度不相等,矩阵乘法根本无法进行。每次先写 shape,再写数值,是理解 Attention 最稳妥的方法。
这段流程中哪些是参数
W_Q/W_K/W_V 以及多头合并后的 W_O 是训练参数;X、Q、K、V、分数矩阵、Softmax 权重和输出都是当前输入产生的临时结果。训练时反向传播会计算损失对权重矩阵的梯度,推理时权重固定,但每次输入仍会重新计算所有中间矩阵。
这一区分回答了一个常见问题:模型训练完后“已经有 QKV”吗?训练完后有的是生成 QKV 的规则;具体 Q/K/V 必须等当前句子进入这一层后才能得到。
按交互中的五步顺序反复验算一次,注意力的核心数据流就完整闭合了。