标准回答
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 的非对称投影决定的是「在能看的范围里看多重」,两者解决的是不同维度的问题。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习