注意力:模型怎么"看"上下文

先给结论: 模型猜下一个词时,靠的是让前文里每个词互相"看一眼",再按相关程度加权取用。这套机制叫注意力。它的好处是精准,代价是文章变长时开销按平方爆炸——后面所有的省算力技术,几乎都在跟这笔账搏斗。

一、问题:猜词的时候,该听谁的

先回到上一篇的结论:模型做的事是"猜下一个词"。

现在看这句话:

小明把球扔给小红,然后 ___ 又把它扔了回来。

要猜对空,模型必须知道:主语应该是小红(不是小明),“它"指的是球。这些信息都在前面——但前文可能很长,模型怎么知道该重点看哪几个词?

如果它对前面每个词都一视同仁地平均处理,就会把"扔"“球"“小明"“小红"混在一起,猜不出谁是主语。

答案:让每个词提出一个"我想找什么”,再跟前文每个词的"我能提供什么"逐一比对,按相关程度加权。 这就是注意力。

二、三个角色:Q、K、V

Q、K、V 与共享机制第一步:每个词提出「我在找什么」并比对当前词的词元向量Q 查询我在找什么K / V别人能提供什么相关度分数Q 与前文每个 K 比对归一成权重该听谁的百分比加权取 V混合出结果省钱关键:多个提问者共用一份资料MHA:各配一套64 份笔记 · 最贵GQA:一组共用8 份笔记 · 省下 7/8MQA:全部共用1 份 · 最省但最弱DeepSeek 67B:64 个查询头共享 8 份笔记(每 8 个 Q 共用一份)

注意力的三步:打分 → 归一 → 加权;GQA 让多个查询头共用笔记

注意力给每个词准备了三样东西,用开会打比方最直观:

角色通俗说法开会比喻
Q(查询)我在找什么你举手问:“有没有人知道预算的事?”
K(键)我能提供什么每个人桌上的名牌,写着"我负责预算 / 我负责排期”
V(值)我实际的内容真正开口说的那段话

流程分三步:

  1. 拿你的 Q,去和在场每个词的 K 比一比,算出一个相关度分数(越匹配分越高)。
  2. 把这些分数变成一组"权重”——就像把分数折算成"我该听谁的百分比”。
  3. 按权重把所有人的 V 取出来、加权混合,得到这一轮的结果。

关键点:权重是"按相关度分配注意力",不是"取平均"。 一个词如果和前文所有词都无关,它就什么都取不到;如果只和某一个词强相关,它几乎就只取那一个词的内容。

一个小小的技术细节:算完相关度分数后会做一个"缩放"处理,目的是防止数字太大导致比较失真(就像考试分数太集中时无法区分优劣)。这里不必记公式,知道目的是防失真就够了。

三、多头:不是只看一种关系,而是同时看很多种

一次"看"往往不够。句子里的关系有很多种:

  • 谁指代谁(“它”→“球”)
  • 谁是动作的主语(“扔”→“小明”)
  • 前后照应、并列、转折……

所以模型不只做一套注意力,而是并行做很多套,每套自己学一种关系,这叫多头(multi-head)。就像开完大会之后,还分成语法组、指代组、语气组分别对一遍,最后汇总。

四、省钱的关键设计:让多个"提问者"共用一份"资料"

这里出现了第一个真正影响成本的取舍。

  • MHA(多头注意力):每个 Q 都配一套自己的 K、V——最灵活,也最占地方。
  • MQA:所有 Q 共用一套 K、V。
  • GQA:折中——一组 Q 共用一套 K、V。

DeepSeek 67B 用的是 64 个查询头共享 8 个 KV 头(也就是每 8 个 Q 共用一份 K、V)。可以想象成:8 位老师各自提问(Q 不同),但共用同一本教材(K、V 相同)。

为什么这能省?因为在使用(推理)阶段,模型必须把 K、V 存下来备查——这份存储叫 KV cache(键值缓存),就是上一篇提到的"读书笔记"。

关键对比是这样的:如果每个查询头都各配一套 K、V(也就是 MHA),67B 要存 64 份;改成每 8 个查询头共用一份后,只要存 8 份。 在层数、长度、每头维度都不变的前提下,这份笔记本身的存储降到原来的八分之一。

(注意边界:只是笔记本身降到 1/8,不等于整个显存降到 1/8,更不等于速度快 8 倍——权重、临时数据都还占着地方。)

五、代价:每个词都要看前面所有词

注意力的强大来自"全局审视",但它同时带来一笔很贵的账。

第 1 个词看 0 个、第 2 个词看 1 个……第 n 个词要看前面 n−1 个。 全部加起来,复杂度大致随长度的平方增长。

具体一点:长度 1024 时约有 52 万对;长度 128K(约 13 万个词元)时,配对数达到约 172 亿。长度翻倍,这个数字约变成 4 倍。

同时 KV cache 也在涨,但它是线性的——每读进一个词元,就要多存一份笔记。所以长文本有两笔账:

增长方式什么时候最要命
注意力计算量长度的平方极长上下文
KV cache 存储长度的线性长对话、长文档、并发多

两笔账都要还,而它们的最优解法不一样——这正好引出后面的两条主线。

六、一个直接后果:笔记的条数是有公式的

KV cache 的大小由四件事决定:层数 × KV 头数 × 序列长度 × 每头维度,再乘以每个数字占的字节数。

这就是为什么它随长度线性增长、为什么减少 KV 头能省、以及为什么"压缩笔记"(下一段故事)永远有生意可做。

提醒一个容易混的坑:这个算式里的"2"来自 K 和 V 是两个张量,不是“16 位精度占 2 字节"的意思。两个 2 是不同的 2。

七、这条路还没走完

注意力让模型能精准取用前文,但它太认真了:每个词都要看前面所有词。

于是自然的问题是:真的每个词都需要看所有词吗? 大部分时候答案是不需要——远距离的绝大多数内容跟当前词毫无关系。

这就是"稀疏化"的起点,也是 DeepSeek 后面几年最重要的一条线:不是减少笔记的宽度(把每条笔记压窄),而是减少要看的条数(只挑相关的看)。第九篇会完整讲这条线从 2024 年走到 2026 年的四代方案。


一句话总结: 注意力让每个词用 Q、K、V 互相打分并按相关度加权取用,效果精准,代价是计算量随长度平方增长、笔记随长度线性增长。

记住这个数字: 64 个查询头共用 8 份笔记——DeepSeek 67B 的配比,笔记本身因此降到八分之一。

下一篇: 参数、数据、算力:三个"大小"千万别混——同一个数字换个单位,能让你把论文读反。