大模型读懂一句话,靠的是注意力机制,而注意力每一步都在动用三套变换:查询、键、值,合称 QKV。通义千问、Kimi 的底层都跑着同一套流程,本文按出题、对号、取货三步拆解它怎么工作。
第一步:Query 出题
每个字的向量会分别乘上三套学习得来的权重矩阵,得到三份新向量。Query 是这份向量带着的问题——「我需要谁的信息」。类比查资料:你手里的检索词就是 Query,它不存内容,只负责描述想找什么。这一步进来的原文向量,出去的就是问题描述向量,中间没有别的事发生,纯粹是一次线性变换。别看它简单,后两步的对号与取货全靠这份问题描述牵头。
第二步:Key 打分、第三步:Value 取货
Key 是每个字对外挂牌的索引——「我能提供什么」。拿 Query 和句中所有 Key 两两算相似度,得到一组打分,再归一化成权重,权重越大说明这个字越值得参考。注意力掩码是什么那篇讲过,生成时这些打分只许落在当前字之前的位置。权重就位后,第三步是把每个字的 Value——真正装着内容信息的向量——按权重加权求和。查、对、取三步走完,每个字都换上了一份融合了上下文的新向量,进来的分散信息,出去的是按需汇总的结果。
| 环节 | 计算内容 | 产出 |
|---|---|---|
| 投影 | 原文向量分别乘三套权重矩阵 | 查询、键、值各一份 |
| 打分 | 查询与句中所有键两两算相似度再归一化 | 一组权重 |
| 取货 | 按权重把各字的 Value 加权求和 | 融合上下文的新向量 |
多头并行:为什么一套机制开多路
一套 QKV 只能盯一种关系,有的头盯语法、有的头盯指代,所以实际模型把向量切成若干份并行跑多组 QKV,最后拼回来。注意力的计算量为什么随长度平方涨那笔平方账,就来自第二步的两两打分;多查询注意力是怎么省缓存的讲的省显存思路,省的也是这里的 Key 和 Value。三个环节环环相扣,动一个就牵动全局,读模型结构图时先把这三步对上号。
QKV 对照表
- Query:我想要什么,相当于检索词
- Key:我能提供什么,相当于索引标签
- Value:实际内容,相当于货架上的货
- 打分等于 Query 乘 Key,取货等于权重乘 Value
- 忘了顺序就回来背这句:Query 出题、Key 对号、Value 给货
关于QKV的三个常问问题
- 为什么需要三套向量,一套不行吗?:一套向量既要当检索词又要存内容,角色会打架。拆开后各司其职,打分和取货互不干扰,表达力也更强。
- 打分为什么要除以一个缩放系数?:向量维度高时点积数值偏大,直接归一化会挤成非黑即白的分布,除以维度的平方根能让权重平滑一些。
- 多头是不是越多越好?:头多了覆盖的关系面广,但每份向量变窄、显存与耗时也涨。各家按实验定头数,具体以官方技术报告为准。
下次看到注意力这个词,直接想成一场大型查字典:出题、对号、取货,三步循环。再往深走一层:这三组向量并不是三套独立参数各算各的,实际实现里查询、键、值通常由同一种线性变换从同一个输入投影出来,只是权重矩阵不同,所以参数量按维度成倍增加。缩放那一步也在这条链上,目的是把点积的方差压回合适区间,防止数值过大把归一化推向一端。理解到这一层,再看多头拆分就顺理成章:每头各算各的账,最后再合起来。顺带说一句复杂度:这套三步的代价与序列长度近似成平方关系,长度涨四倍,计算量涨十六倍,长文本场景下的成本压力正来源于此,各类缓存与压缩优化也都在和这笔账较劲。


