Self-Attention中Q/K/V是怎么工作的

Self-Attention中Q/K/V是怎么工作的

_

Self-Attention(自注意力)是Transformer的核心,理解Q(Query查询)、K(Key键)、V(Value值)这三个矩阵的分工,是掌握这类模型的关键一步。

Q/K/V是什么

先从代码说起。PyTorch里定义Self-Attention时,通常会创建三个线性变换层——query、key、value。以BERT为例,输入是一句话,每个token是768维向量,形状为(L, 768)。三个线性层的输入输出都是768维,所以它们本质上是对768维特征的「三次重新组合」。

这里的query、key、value只是操作名称,实际的Q、K、V是这三个层各自的输出。以「我想吃酸菜鱼」为例:输入矩阵(L, 768)分别经过三次线性变换后,得到形状仍为(L, 768)的Q、K、V。

注意力权重怎么算

拿到Q、K、V之后,分三步计算注意力:

第一步:Q和K^T做矩阵乘法

(L, 768) × (L, 768)的转置 = (L, L)。结果矩阵中,第i行第j列的数值,代表「第i个字对第j个字的关注程度」。用「我」字为例,它与句子中每个字的点积结果,构成了第一行的所有注意力分数。

第二步:缩放与Softmax

除以√768(约28.4)是为了防止点积结果过大导致Softmax梯度消失——维度越高,点积累积的数值越大,不缩放会导致Softmax输出的概率分布过于极端。这是工程上常见的处理方式。

Softmax则把注意力分数转化为概率分布,确保所有权重的和为1,同时保证非负性,让模型能学习到「关注什么、不关注什么」。

第三步:注意力权重乘以V

(L, L) × (L, 768) = (L, 768)。这一步本质上是「加权求和」:用每个字对其他字的注意力权重,对V中对应字的特征向量做加权平均。最终输出形状与输入一致,信息在字与字之间流动了一遍。

为什么叫「自」注意力

因为Q、K、V都来自同一个输入序列——这就是「自」(self)的含义。相比之下,机器翻译中的Cross-Attention,Query来自目标语言,Key和Value来自源语言。

还有一个容易被忽略的细节:Attention本身不包含位置信息。调换句子中两个字的顺序,注意力矩阵只是相应地交换了两行/两列,数值本身不变。所以Transformer必须额外加入位置编码(Positional Encoding)来让模型感知词语的前后顺序。

编注:材料为知乎技术帖,侧重代码实现与矩阵运算的对应关系;已涵盖softmax与根号dim缩放的解释;未涉及多头注意力、位置编码设计或Cross-Attention对比。


美国急踩刹车:石油储备告急逼出中东停火 2026-06-19
DARPA悬赏650万:挑战载荷超自重四倍的垂直起降无人机 2026-06-19