📚 本文是《Transformer 由浅入深》系列第 2 篇 · 阶段一「建立直觉」

上一篇我们说,Transformer 的核心是注意力(attention):让每个词直接环顾全场、自己决定关注谁。这一篇,我们就把"注意力"这个词拆开,看看它内部到底在干什么。

我保证:全程不出现一个公式。 我们只用一个比喻,把三个听起来很唬人的术语——Query、Key、Value——变成你的直觉。理解了它们,后面所有的数学都只是"把这套直觉写精确"而已。

打个底:很多人第一次看到 Q、K、V 这三个字母,会以为它们是三种高深莫测的算法。其实不然。它们更像是三种"角色分工"——就像一场招聘里,有人提需求(招聘方)、有人挂简历摘要(求职者的标题)、有人提供真本事(求职者的实际能力)。名字唬人,做的事却朴素得很。读完这篇你会发现,所谓注意力,无非是我们每天都在做的一件小事:带着问题,在一堆信息里挑出相关的,再综合成一个答案。

本篇目标

读完你应该能用大白话说清楚:

  • 注意力本质上在做一件什么事;
  • Query(查询)、Key(键)、Value(值)分别扮演什么角色;
  • 为什么这套机制能解决上一篇说的两个痛点。

阅读前提

读过第 1 篇就够了。记住那条主线:我们想让每个词"直接看到所有词"。

1. 一个生活类比:在图书馆找资料

假设你走进一座图书馆,心里揣着一个问题:“我想了解猫怎么照顾。”

馆里有成百上千本书。你会怎么找?

  • 你的问题,就是你带着的需求。我们叫它 Query(查询)
  • 每本书的书脊上贴着一个标签,简短概括这本书是讲什么的:《宠物护理》《唐诗三百首》《猫咪饲养手册》《量子力学》……这些标签,我们叫 Key(键)
  • 而每本书翻开后真正的内容,才是你最终想要的东西。这些内容,我们叫 Value(值)

这里有个细节值得多说一句:标签(Key)和内容(Value)是分开的两样东西。 标签是"用来被找到"的,内容是"被找到之后真正拿走的"。就像点外卖,菜单上的菜名(Key)负责吸引你下单,真正端上桌的那盘菜(Value)才是你吃进肚子的。你拿菜名和你的胃口(Query)做匹配,但匹配成功后,吃的是菜,不是菜名。注意力也是这个道理——用 Key 来比对,用 Value 来汇总。

你的找书过程是这样的:拿着你的问题(Query),挨个去和每本书的标签(Key)比对,看哪本最相关。

  • 《猫咪饲养手册》——和你的问题高度相关,给它打高分;
  • 《宠物护理》——也挺相关,打个中等分;
  • 《量子力学》——毫不相关,打个接近零的分

然后——这是关键一步——你并不是只挑分最高的那一本。你会按相关性,从每本书里各取一点内容:从《猫咪饲养手册》大量摘抄,从《宠物护理》摘一点,《量子力学》干脆不看。最后把这些摘录揉成一份属于你自己的笔记

为什么不只挑分最高的那一本?想想看,你写一份"如何照顾猫"的笔记,光靠饲养手册可能够用,但《宠物护理》里关于"通用驱虫常识"的一段也很有价值,漏掉就可惜了。只取第一名,等于把其他书的好东西全扔掉;按比例都取一点,信息才完整。 这就是为什么注意力是"加权汇总"而不是"赢家通吃"——它温柔地保留了所有相关来源,只是各自的分量不同。

这份笔记,就是"注意力"的输出。 整个过程,就是注意力机制的全部精髓:

拿着问题(Q)去和所有标签(K)比相关性,再按相关性把所有内容(V)加权汇总成一份答案。

记住这句话,剩下的全是细节。

再换一个你更熟悉的场景体会一下:用搜索引擎。 你在搜索框敲下的那行字,就是 Query;搜索引擎数据库里每个网页都有一套"特征"用来被匹配,那就是 Key;而每个网页真正的正文内容,就是 Value。区别只在于:普通搜索给你一个排好序的结果列表,让你自己点进去看;而注意力更进一步,它直接替你把前几名的内容按相关度揉成一段摘要,一步到位。如果你用过那种"AI 帮你总结搜索结果"的功能,那感觉就非常接近注意力了。

2. 从类比回到词向量

图书馆的例子里,角色是分开的:你是提问的人,书是被检索的对象。但在一个句子里,情况更妙——每个词同时是"提问者",也是"被检索的书"。

这事乍听有点绕,我们换个画面:想象一场小型圆桌会议,围坐着几位同事。轮到谁发言,谁就一边抛出自己的疑问(当提问者),一边也要回答别人的疑问(当被查的对象)。每个人都身兼两职,没有专职的"提问者"或"资料库"。句子里的词,就是这样一群"既提问又应答"的与会者。

我们再看这句话:

[它]  [是]  [一只]  [猫]

轮到处理"它"这个词时,模型想搞清楚:“它"到底指什么? 于是"它"就成了提问者,带着自己的 Query 出发:“我在找一个我所指代的对象。”

而句子里的每一个词(包括"它"自己),都摆出自己的 Key,像书脊标签一样,等着被比对:

  • “猫"的 Key 大概表达着"我是一个具体的动物名词”——和"它"的查询非常匹配,高分;
  • “一只"的 Key 表达"我是个量词”——有点关系,中分;
  • “是"的 Key——基本没关系,低分。

于是"它"就主要从"猫"那里取内容(Value),顺带从"一只"取一点,最后融合出一个新的"它”——这个新的"它”,已经悄悄把"猫"的含义吸收进来了。模型由此"知道"了:它 ≈ 猫。

这就是所谓 Self-Attention(自注意力):句子对自己做注意力,每个词都向全句提问、再从全句取答案,从而让每个词都吸收到与它相关的上下文。

为什么叫"自"注意力?因为提问的对象和被查的对象是同一句话——句子在"自己问自己"。这跟我们后面会遇到的另一种情况不同:有时提问的是一句话,被查的是另一句话(比如翻译时,中文句子去查英文句子),那叫"交叉注意力"。眼下你只要抓住一个画面:自注意力,就是一句话内部的众词互相打量、互相取经。

那 Q、K、V 这三样东西从哪来?它们其实都是同一个词向量,分别乘上三个不同的"变换"得到的——相当于让同一个词,准备好"提问用的样子"“被查用的样子"“被取用的内容"三副面孔。具体怎么变,下一篇用公式讲;现在只要知道:Q/K/V 同源,但各司其职。

这个"三副面孔"还可以这样理解:同一个人,在不同场合会拿出不同的"自我介绍”。相亲时你强调爱好性格(为了被人匹配),应聘时你强调技能经历(也是为了被匹配,但角度不同),而真正合作起来你交付的又是另一套实打实的产出。词也一样——同一个词,“用来提问的它"“用来被找的它"“被取走的它"是三个略有差别的版本,各自为不同的任务做了准备。

这里还藏着一个常被忽略的妙处:正因为提问的角度和被查的特征是分开学的,注意力才能表达"非对称"的关系。 什么意思呢?在真实语言里,“A 关注 B"不等于"B 关注 A”。比如"它"很想知道自己指代谁,所以它强烈关注"猫”;但反过来,“猫"未必同样强烈地关注"它”。如果 Q 和 K 是同一套东西,那"它看猫"和"猫看它"的分数就会一模一样,这显然不符合语言的真实情况。把 Q、K 拆成两副面孔,模型就能灵活地表达"我很在意你,你却未必在意我"这种单向关系——而这,正是理解代词、修饰、指代等语法现象的关键。

3. 相关性 → 权重

回到"打分"这一步。我们说"拿 Query 和每个 Key 比相关性,打一个分”。比完之后,“它"对全句会得到一串分数,比如:

对[它]   对[是]   对[一只]   对[猫]
 0.5      0.3      1.2       3.0     ← 原始分数(随便举的数)

但原始分数不好直接用——它们有高有低、范围不定。我们希望把它们归一化成一组"占比”:全部加起来正好等于 1,每个数代表"该往这个词上分配多少注意力”。处理后大概长这样:

对[它]   对[是]   对[一只]   对[猫]
 0.05     0.04     0.13       0.78    ← 归一化后,加起来 = 1

看,78% 的注意力给了"猫”,这正是我们想要的。

为什么非要"加起来等于 1"?打个比方:你手上只有 100 块钱预算,要分给四本书买复印。你不可能给每本都花一大笔——总额是固定的,给这本多了,给那本就得少。注意力也是如此:它的"关注力"是一份有限的预算,必须在所有词之间分配。 给"猫"分了 78%,留给其他三个词的就只剩 22%。这种"此消彼长"恰恰逼着模型学会取舍——它不能对所有词都说"很重要",必须真的挑出重点。

干这件"把一串分数压成一组总和为 1 的占比"的事的函数,叫 softmax。你现在完全不用管它怎么算,只要记住它的作用:把杂乱的分数,变成一组干净的、加起来等于 1 的权重。 顺带提一个它的小脾气:softmax 会放大差距——原始分数里"猫"只比"一只"高一截,归一化后却拉开成 0.78 对 0.13 的悬殊比例。这其实是好事:它让模型的关注更聚焦,而不是平均用力、谁也看不清。

如果把句子里每个词每个词的这种权重都画出来,就得到一张注意力热力图——颜色越深表示关注越多。它非常直观,后面几篇我们会反复见到这种图:

        它    是   一只   猫
  它  [ ░    ░    ▒    █ ]   ← "它" 主要看向 "猫"
  是  [ ▒    █    ░    ░ ]
 一只 [ ░    ░    █    ▒ ]
  猫  [ █    ░    ▒    ▒ ]

怎么读这张图?横着看一行就行。比如第一行是"它"的视角:它对四个词分别投了多少关注——格子越黑,关注越多。你能一眼看出"它"那行最黑的格子落在"猫"下面,这就对应了我们前面算出的 0.78。每个词都有自己的一行,合起来这张图就是整句话"谁在看谁"的全景快照。这种图在论文和可视化工具里随处可见,学会读它,你就拿到了观察注意力的"显微镜"。

4. 加权求和得到新表示

有了权重,最后一步水到渠成:按权重,把每个词的 Value 混合起来。

对"它"来说:

新的「它」 = 0.05×它的V + 0.04×是的V + 0.13×一只的V + 0.78×猫的V

因为"猫"占了 0.78,所以这个新的"它",绝大部分内容来自"猫"。换句话说,经过这一轮注意力,“它"这个词的表示已经融合进了它真正指代的对象

你可以把这一步想象成调一杯鸡尾酒:权重就是各种酒的配比,Value 就是各种酒本身。“猫"这味酒倒了一大半,其余几味各点几滴,摇匀之后,得到的就是一杯"以猫为主调"的新饮品——它尝起来主要是猫味,但又带着一丝句子里其他成分的余韵。注意力的输出,就是这样一杯为每个词量身调制的"上下文鸡尾酒”

句子里的每个词都同时做一遍这样的操作,于是整句话所有词,都被各自相关的上下文"更新"了一遍。这,就是一层注意力做的全部事情:

每个词 = 它从全句相关词那里,按相关性加权汇总来的一份新表示。

就这么简单。Transformer 里那些唬人的结构,核心就是这一步在反复堆叠。

值得停下来体会一个反直觉的点:经过这一步,“它"这个词的"身份"已经悄悄变了。 进来时它还是个含糊的代词,出去时它已经是一个"主要装着猫、还带一点上下文余味"的新向量。词还是那个词,占的位置没动,但它"内在的含义"被周围的伙伴重新塑造了一遍。这就是注意力最迷人的地方——它不搬动任何词,却能让每个词"入乡随俗”,根据所处的句子环境调整自己的意思。同一个"它”,在"它是一只猫"里吸收的是猫,在"它下雨了"里吸收的可能就是天气;词形没变,内涵却因上下文而流动。这种"随上下文变身"的能力,正是大模型能读懂歧义、消解指代的根基。

5. 为什么这能解决第 1 篇的痛点

现在回头看上一篇留下的两个痛点,你会发现它们被悄无声息地解决了:

痛点一:长距离依赖。 “它"要找"猫”,哪怕它俩在句子里隔了二十个词,在注意力里也只是一次直接的比对——距离永远是 1。不再有"沿接力棒一步步衰减"的问题,再远的关联也能一眼锁定。打个比方:老式的"一个传一个"像是排队传话,传到队尾早就走样;而注意力像是开视频会议,无论你坐得多远,发言时所有人都同时听见你——位置不再造成衰减。

痛点二:无法并行。 注意,句子里每个词的这套"提问—打分—汇总"操作,彼此互不依赖:算"它"的新表示,不需要等"猫"的算完。所以所有词可以同时计算——正好喂饱 GPU 的并行能力。还是用图书馆打比方:如果馆里只有一位读者排队找书,后面的人得干等;但注意力允许成百上千位读者同时进馆、各查各的,互不阻塞,效率自然天差地别。

一个机制,两个痛点,一并解决。这就是注意力的威力。

6. 常见误解澄清

在进入数学之前,先扫掉几个常见的误会:

  • “注意力"不是人类的注意力。 它没有意识、不会"专注”,只是一个"按相关性加权求和"的数学操作。借用这个词,纯粹因为效果上像"重点看某些部分"。
  • 权重不是写死的,是算出来的。 同一个模型,换一句话,注意力的分布就完全不同——它随输入动态变化。而"怎么打分才算相关"这件事,是模型在训练中自己学出来的。
  • Q、K、V 来自同一个输入。 别被三个名字唬住,它们是同一个词向量的三副面孔(下一篇揭晓怎么变出来的)。
  • 一层注意力往往不够。 真实模型会叠很多层注意力,让信息一轮轮地融合、提炼——就像反复读一篇文章,每读一遍理解都更深一层。

常见疑问与易错点

问:为什么要把 Key 和 Value 分成两样东西?用同一个不行吗? 答:分开是为了"找它"和"用它"互不干扰。Key 专门负责"被匹配",所以它可以打磨成最利于检索的样子;Value 专门负责"被取走的内容",可以保留最完整的信息。回到点外卖的比方:菜名(Key)要短、要勾人,方便你扫一眼就决定;真正端上桌的菜(Value)则要分量足、料给够。如果硬把两者合一,就等于逼着菜名既要好记又要管饱,两头都做不好。把它们拆开,各自优化,效果才最佳。

问:注意力是不是只挑分数最高的那个词,其他都不看? 答:不是。这是最常见的误会。注意力是加权汇总,不是"赢家通吃"。哪怕某个词只拿到 5% 的权重,它的内容也会按 5% 的比例混进结果里。只有当某个词的权重被压到几乎是 0 时,它才相当于被忽略。所以注意力的输出,通常是好几个相关词"按比例合成"的产物,而不是单独某一个词的复制。

问:“自注意力"里,一个词为什么要关注它自己? 答:因为词本身的信息也很重要,不该在更新中丢掉。你看热力图会发现,很多词在对角线上(也就是"自己看自己”)也有一定权重——这相当于在调鸡尾酒时,保留了一部分"原味"。如果一个词把 100% 的注意力都给了别人、一点不留给自己,它就可能在反复更新中"忘了自己原本是谁"。给自己留一份权重,是一种自然的信息保护。

问:Q、K、V 既然来自同一个词,那不就是同一个东西,折腾三遍有什么意义? 答:它们同源,但经过了三种不同的"加工",所以并不相等。就像同一块面粉,可以做成面条、面包、饺子皮——原料相同,成品却为不同用途服务。这三种加工方式(也就是那三个"变换")是模型在训练中学出来的,正是它们让"提问的角度"“被查的特征"“提供的内容"各自最优。如果不做区分、三者完全一样,注意力的表达能力会大打折扣。

问:权重加起来必须等于 1,这个规定是不是有点死板? 答:这恰恰是设计的精妙之处。总和为 1 意味着"关注力是一份有限预算,必须做分配”,这逼着模型学会取舍、突出重点,而不是对所有词都敷衍地说"还行”。同时,总和固定也让不同词、不同句子的注意力结果处在同一个"尺度"上,便于后续层稳定地接着处理。可以说,“加起来等于 1"是一条让整个机制既聚焦又稳定的纪律。

问:一句话很长时,每个词都要和所有词两两比对,会不会太慢? 答:你的直觉很准——这正是注意力的"软肋”。词数翻倍,两两比对的次数大约要翻四倍,句子越长代价涨得越快。这也是为什么超长文本会让大模型变慢、变贵。后来的研究者想了很多办法来给它"瘦身"(比如只让每个词关注一部分邻居,而非全场),这些优化我们会在系列后面的篇章里专门聊。眼下你只要知道:注意力的强大(每个词都能看到所有词)和它的代价(两两都要比)是一枚硬币的两面。

小结 & 下一篇预告

这一篇,我们用图书馆的比喻把注意力讲透了:

  • Query=你的问题,Key=书的标签,Value=书的内容;
  • 注意力 = 拿 Q 和所有 K 比相关性 → 归一化成权重 → 按权重把所有 V 加权汇总;
  • 在句子里,每个词同时提问又被查(自注意力),于是每个词都吸收了相关上下文;
  • 这套机制天然地消除了距离、释放了并行,正好解决上一篇的两大痛点。

直觉已经建好。下一篇,我们把这套"图书馆流程"翻译成精确的数学语言——你会看到大名鼎鼎的那个公式 softmax(QKᵀ/√dₖ)V。别紧张,有了今天的直觉打底,你会发现它读起来出奇地顺。


📖 系列目录

第 1 篇 文末完整目录。上一篇:① 为什么需要 Transformer → 下一篇:③ Self-Attention 的数学。