核心要点

  • Q(Query)代表「我在找什么」:当前 token 主动发出的查询向量,用来匹配别人

  • K(Key)代表「我能提供什么」:每个 token 暴露给外界的索引向量,用来被匹配

  • Q 与 K 做点积得到相关性分数,softmax 归一化成权重,再去加权求和 V(Value)

  • Q、K 用不同投影矩阵 → 处于不同子空间 → 注意力矩阵不对称(i 关注 j ≠ j 关注 i),表达更灵活

  • Q=K 共享同一矩阵 → 注意力近似对称、对自身得分过高(对角占优),表达能力被削弱

标准回答

Q 和 K 各自的角色

在 self-attention 里,每个输入 token 的表示会分别经过三个独立的线性投影,得到 Query、Key、Value 三组向量。可以用「检索」来类比:Q(Query)是「我在找什么」,是当前 token 主动发出的查询;K(Key)是「我能提供什么」,是每个 token 对外暴露的索引标签。两者点积衡量「查询」和「标签」的匹配程度。

计算流程

对位置 i,用它的 Q 去和所有位置 j 的 K 做点积,得到一组打分;这些分数经过缩放和 softmax,变成一组和为 1 的权重,表示 i 该从各个 j 那里「吸取」多少信息;最后用这组权重对各位置的 V(Value,真正承载内容的向量) 加权求和,得到 i 的输出。一句话:Q·K 决定「看谁、看多少」,V 决定「看到的具体内容」

为什么 Q、K 要用不同的投影矩阵

关键在于让注意力具备非对称性。Q 和 K 来自两个不同的权重矩阵,被映射到不同的子空间,于是「i 看 j 的强度」和「j 看 i 的强度」可以完全不同。例如代词「它」需要强烈关注前文的名词,但那个名词未必要同等强烈地回看「它」。这种不对称恰恰是语言、依存关系所需要的,让模型能表达「单向、定向」的关注。

如果 Q=K 共享同一矩阵会怎样

若强行让 Q 和 K 用同一个投影矩阵,注意力分数矩阵就会变得近似对称(i 对 j 的分数和 j 对 i 的分数相等或高度相关),模型再也无法表达定向关注。更糟的是,每个 token 的 Q 和自己的 K 完全一致,自身点积(向量与自身的内积)天然偏大,导致 softmax 后对角线权重占优——人人都过度关注自己,跨位置的信息交互被压低。整体结果是注意力的表达自由度大幅下降,等于白白丢掉了一半的参数容量。

常见误区

⚠️ 常见踩坑

别把 Q 和 K「能不能相等」和「是不是同一个 token 的向量」搞混。self-attention 里 Q、K、V 都来自同一序列没错,但它们走的是三套独立投影;共享 Q/K 矩阵破坏的是注意力的非对称性,而不是「自注意力」这个性质本身。也不要以为对称注意力一定更稳——对角占优反而会抑制有效的跨位置交互。

追问

追问 1那 V 为什么也要单独一个投影矩阵,不能直接用原始输入吗?

可以但不好。V 单独投影让「用来打分的表示」和「用来传递的内容」解耦:Q/K 负责决定权重,V 专注承载要被加权聚合的信息,两者优化目标不同。如果直接用原始输入当 V,内容空间就被锁死,模型无法把信息变换到更适合下游聚合的子空间,表达力受限。

追问 2注意力矩阵的非对称性在因果(decoder)注意力里还重要吗?

仍然重要。因果掩码只是禁止看未来位置,把矩阵变成下三角,但在允许看的范围内,i 看不同历史 token 的强度依旧由 Q·K 决定,需要定向区分「重点回看哪个前文」。掩码限制的是「能看谁」,Q/K 的非对称投影决定的是「在能看的范围里看多重」,两者解决的是不同维度的问题。

追问 3既然共享 Q/K 有害,为什么有些工作会做 K=V 共享或 Q/K 低秩共享?

那是出于效率而非表达力的权衡。比如 MQA/GQA 让多个 head 共享 K、V 以省 KV Cache 显存,共享的是「跨 head」而非「Q 与 K 之间」,不破坏单个注意力的非对称性。低秩共享则是用参数换显存/速度,在可接受的精度损失下压缩模型,属于工程取舍,和「Q=K 同矩阵」破坏对称性是两回事。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习