Self-Attention 中 Q、K、V 分别是什么意思?

Self-Attention 里的 Q、K、V,到底是个啥?
上回我们聊完 Transformer 为什么比 RNN、CNN 强,你还记得那个核心原因吗?
——它能让任意两个词直接"对话",不用排队等。
那么问题来了:这个"直接对话"的机制,到底是怎么实现的?
答案就藏在 Q、K、V 这三个矩阵里。它们听起来像三个字母,但配合起来,就像一个图书馆的智能检索系统。
先把这三兄弟的关系搞明白。
1. Q、K、V 就是三个"角色"
想象你走进一个图书馆,想找一本关于机器学习的书。
你站在门口,手里拿着一张纸条:"我需要机器学习入门书籍"。
这张纸条就是 Query——问题。
图书馆里每本书的背脊上都有一个标签:"机器学习"、"深度学习"、"Python编程"……这些标签就是 Key——索引。
书的内容本身——章节、文字、知识——就是 Value——值。
你拿着问题(Q),跟每个标签(K)做对比,发现"机器学习"这个标签跟你的需求最匹配,于是你拿起这本书,拿到了里面的内容(V)。
Attention 机制,就是这个过程在向量空间里的数学实现。
所以 Q、K、V 不是三个数字,而是三个角色:
- Q 是"问"
- K 是"匹配条件"
- V 是"答案本身"
2. 它们在 Transformer 里怎么诞生的?
刚才说的是比喻,现在看看真实计算。
Transformer 的输入是一串词向量,假设叫 X。
X 经过 embedding 之后,还是 X,但它的含义变了——从"词的符号"变成了"词的语义向量"。
然后,X 要分三次"变身":
Q = X × Wq
K = X × Wk
V = X × Wv这里 Wq、Wk、Wv 是三个可学习的权重矩阵。
同一张图,用三个不同的滤镜照了一遍。
同一个场景,用普通相机拍一张、用红外相机拍一张、用紫外线相机拍一张——拍出来的东西都不一样,但拍的都是同一个场景。
X 就是那个场景,Wq、Wk、Wv 就是三台不同的相机。
为什么要分三个?因为问的人、被问的人、要传递的信息,本质上不是一回事。
你问"深度学习是什么",这是一回事。被问的书标签是"人工智能-神经网络-深度学习",这是另一回事。书里面真正写的内容——激活函数、反向传播——又是另一回事。
用同一套表示?不够用。
在 BERT 里,Wq 和 Wk 学到的东西完全不同:Q 学会了"什么样的问题需要什么样的信息",K 学会了"这个词包含了什么关键信息"。
3. Attention 分数到底怎么算出来的?
我们手里有了 Q、K、V,下一步是算相似度。
分数 = Q × K^TQ 和 K^T 做矩阵乘法,出来的是每个位置对每个位置的"相关度打分"。
你问的问题和每本书的标签对比,出来一个相似度分数。
接着用 Softmax 把分数归一化成概率分布,加起来等于 1。
为什么?打分高低只是相对的,直接拿来用会让某些值太大、某些值太小。Softmax 就像评委打分后做"标准化",确保总分合理、梯度稳定。
最后,用这个概率分布去"加权" V:
输出 = Softmax(Q × K^T / √d_k) × V注意那个 ÷ √d_k,这是做缩放,防止点积值过大导致 Softmax 梯度消失。
整个过程就是:"问"和"标签"对比 → 算相似度 → 归一化 → 按权重提取"内容"
拿翻译举个例子:中译英时,Q 是"爱",K 是英文词 tags,模型发现"love"和"爱"的 QK 相似度最高,就把"love"对应的 V(语义内容)取出来。
4. 为什么非要三个?两个不够吗?
Q 和 K 看起来挺像的,合并成一个行不行?
还真不行。
Q 和 K 分开,是为了让"问"和"被问"用不同的表示。
这就好比医院的分诊台。
病人进门会说"我头疼"——这是 Query。护士翻看病历本,上面写着"高血压病史、近期失眠"——这是 Key。病历本里记录的血糖血压具体数值——这是 Value。
你让病人自己对着病历本看病历?不行,信息太杂。你让护士直接替病人描述症状?也不对,护士没经历过头疼。
只有问的人(Q)和被问的东西(K)用不同的方式表达,才能精准匹配。
在神经网络里,Wq 和 Wk 是两个独立的参数矩阵。它们可以学到:
- Q 更关注"当前词需要什么信息"
- K 更关注"这个位置包含什么信息"
这种关注点的分离,是注意力机制灵活性的来源。
5. Multi-Head Attention:多个头一起看
单个 Q、K、V 算一路 Attention,叫单头(Single Head)。
但 Transformer 实际用的是多头(Multi-Head)。
你把一个问题交给多个专家,每个专家用自己的一套 Q、K、V 独立分析一遍。
专家 A 关注语法关系:"主谓宾搭不搭"
专家 B 关注语义相似:"词义是不是相近"
专家 C 关注位置关系:"上下文有没有逻辑"
每个人给出一个结果,最后拼接(Concat)在一起,再做一个线性变换。
不同头关注的东西不一样,单独一个头的输出信息不完整。拼接后所有维度的信息都保留,模型再决定怎么整合。
GPT 生成句子时,每个词要考虑前面所有词的关系。多头让模型同时从语法、语义、上下文多个角度判断该关注什么。
BERT-base 用了 12 个头,BERT-large 用了 16 个头。每个头负责不同的语义关系,有的看语法结构,有的看指代关系,有的看同义词。
6. 回到本质:为什么这个设计这么成功?
Q、K、V 这个设计,有几个精妙之处:
第一,问和答解耦了。
同一个内容可以被不同的问题检索到。不是"你有什么"就返回什么,而是"你需要什么"就给你什么。
第二,可学习。
Wq、Wk、Wv 都是参数,模型自己学会什么样的"问法"最有效、什么样的"标签"最有用。
第三,并行计算。
不像 RNN 那样必须等前一个算完才能算后一个,Q、K、V 的计算可以一次性全算出来。这让 Transformer 的速度远超 RNN。
第四,灵活扩展。
从文本到图片到音频,只要能做成向量,就能套用这套框架。
理解了三个角色的分工,你会发现整个 Transformer 其实就是一个精心设计的智能检索系统。
无论是 ChatGPT 写文章,还是 BERT 做语义分析,底层都是 Q 去 K 里找相关的东西,然后把 V 拿出来。
下一节我们来聊一个细节:QK^T 之后为什么要"除以根号 dk"?这个问题看起来很小,但它直接决定了 Attention 能不能正常训练——梯度消失就藏在这里。
