上一章你把神经网络看穿了:它不思考,只是个巨大的、可以调参的函数,输入一串数字,吐出一串数字。可这里有个大窟窿。假设我们要处理这句话:
"我把苹果放桌上,它还是热的。"
"它"指谁?苹果,还是桌子?你一眼就知道是苹果——因为"热"跟苹果搭得上(刚烤过的、烫手的苹果),跟桌子搭不上。你不是孤立地看"它"这个字,你是回头瞟了一眼前面的词,才确定它的意思。
但第三章里我们给每个词分配的那套坐标,是死的。"它"这个词的坐标,写在《说文解字》里就那样,管你前面放的是苹果还是冰块。一个只会查固定坐标的函数,永远搞不清"它"到底指谁。这就是那个大窟窿:词的意思是随上下文变的,而固定坐标给不了这个变化。
本章要登场的这块拼图,就是专门来补这个窟窿的。它叫注意力(Attention)——说白了,就是让每个词在算自己意思的时候,能回头看一眼句子里别的词,并决定该重点听谁的。这一个机制,是今天所有大模型的心脏。拆开它,你就拆开了整台机器最关键的那一下。
先看一场会议
想象一个开会的场景。轮到"它"这个词发言,它要搞清楚自己是谁。它不能瞎猜,得问问在座的其他词。于是它环视全场,心里揣着一个问题:"谁是可以'热'的东西?"
在座每个词——"苹果""桌上""放"——都举着一块牌子,上面写着自己"能提供什么信息"。"苹果"的牌子上写着"我是个能烤热的实物";"桌子"的牌子写着"我是个平面家具"。"它"拿着自己的问题,挨个对照这些牌子,发现"苹果"的牌子跟自己的问题最对得上。于是它主要听"苹果"的,几乎不理"桌子"。
就这么个动作。注意力干的事,从头到尾就是这场会议:一个词带着问题,去匹配别的词举的牌子,谁匹配得好就多听谁的。把这句话记住,下面所有术语都只是它的严格版本。
Q、K、V:三张从同一个词里长出来的东西
现在把会议里的三样东西起个正式名字。它们的英文缩写你到处都会见到,其实平平无奇:
- 查询(Query,Q):一个词要问的问题。上面例子里"它"心里那句"谁是可以热的东西?",就是它的 Q。
- 键(Key,K):一个词举出来招揽别人的牌子,用来被别人的问题匹配。"苹果"举的"我是能烤热的实物",就是它的 K。
- 值(Value,V):一个词真正要交出去的内容。别人决定听它之后,它实际递过去的那份信息,就是它的 V。
牌子(K)和内容(V)为什么要分成两个?打个比方:K 是商品的标签,V 是商品本身。你在货架上是靠标签找东西的(匹配),但你买回家用的是商品本身(信息)。用标签来搜、用商品来用——分开,才能"招牌写得好听"和"货真价实"各管各的。
关键的一点,别被三个名字唬住:Q、K、V 都是从同一个词的坐标里算出来的。还记得第四章的函数吗?拿"苹果"那串坐标,分别乘上三个不同的矩阵(就是三套可调的旋钮),就得到"苹果"的 Q、K、V 三串新数字。同一个词,戴上三顶不同的帽子:作为提问者时用 Q,作为被匹配的招牌时用 K,作为被取用的内容时用 V。
那三个矩阵里的数字从哪来?没人手写,全是训练时自己学出来的——怎么学,是第七章"下山"的活,这里先记住:这些旋钮不是设计的,是练出来的。
一个词的意思,是怎么被"重算"出来的
把会议拆成能在脑子里跑一遍的四步。就以"它"这个词为例,看它怎么算出自己的新意思:
- 打分(对牌子):拿"它"的 Q,去和句子里每一个词的 K 做一次点乘。点乘你可以理解成"方向对不对得上"的打分——两串数字越同向,分越高。于是"它"对"苹果"打了高分,对"桌子"打了低分。
- 归一(分蛋糕):把这些分数过一遍 Softmax——它的作用就是把一堆高低不齐的分数,压成一组加起来正好等于 1 的比例,像切蛋糕。比如变成"苹果 0.8、桌子 0.05、放 0.05……"。这组比例,就是"它"这一刻的注意力权重:注意力该往哪撒、撒多少。
- 加权求和(按比例拿货):按这组比例,去把每个词的 V 加起来。0.8 份"苹果"的 V,加 0.05 份"桌子"的 V……混成一串新数字。
- 这串新数字,就是"它"的新意思——一个被上下文重新算过、已经掺进了大量"苹果"信息的"它"。
看明白发生了什么吗?进去的时候,"它"还是那个谁都指的、空洞的"它";出来的时候,它已经变成"一个热乎乎、指向苹果的它"。固定坐标那个窟窿,就是这样被补上的:词的意思不再是查表查来的死值,而是每次都看着上下文现算的活值。这就是注意力这一下的全部魔力——其实一点都不魔法,就是打分、切蛋糕、按比例拿货。
它同时在替所有词做这件事
上面只跟着"它"走了一遍,但机器是并行地替句子里每个词都做一遍的。"苹果"也在提它的问题、"放"也在提它的问题——每个词都当一次提问者,环视全场,重算一遍自己。所以一句 n 个词的话进去,出来还是 n 个词,但每个词都吸收了它该吸收的上下文。
这也解释了一件你可能早就好奇的事:为什么大模型能"并行"训练、比老式逐字处理的网络快那么多?因为这一堆打分,本质就是一次大矩阵乘法——把所有词的 Q 排成一摞、所有词的 K 排成一摞,一乘,全部两两之间的分数一次算完。GPU 最擅长的就是这个。注意力之所以能撑起今天的大模型,一半是因为它聪明,另一半是因为它算得起。
当然也有代价:n 个词两两打分,是 n×n 张分数表。句子长一倍,这张表大四倍。这就是为什么"上下文能塞多长"是个真金白银的成本问题——这笔账,留到第十二章讲"记忆"时再算。
一个必须提的细节:不许偷看后面
还记得全书第一章那个核心动作吗——猜下一个词。模型是从左往右一个个往外蹦词的。那么当它在预测第 5 个词时,它只能看前 4 个词,绝不能偷看第 6、第 7 个——因为那些还没生成,现实里根本不存在。
所以在打分那一步,会人为地把"看向后面的词"那些分数,强行摁成负无穷(过完 Softmax 就变成 0,一点都分不到)。这个动作叫 掩码(Masking),就是拿张纸把后文盖住、只让每个词看到自己和左边。别小看这一盖:正是它逼着模型学会"只凭前文预测下一个词",而这恰恰是整本书从第一页起就在说的那件唯一的事。
所以本质上它就是……
注意力,剥到底,就是一句话:让每个词带着自己的问题(Q)去匹配所有词的招牌(K),按匹配度分配注意力,再按这个比例把大家的内容(V)搅拌成自己的新意思。没有理解、没有意图,只有打分、切蛋糕、按比例混合——三步小学算术,被并行地、成千上万次地叠加起来。
但你可能已经嗅到一点不对劲:一个词就只能带一个问题吗?"它"想问"谁是热的",可能同时还想问"谁是我指代的那个名词"——一个问题显然不够用。而且,光靠这么一层"互相看一眼",真能堆出会写代码、会讲笑话的庞然大物?
下一章,我们就让每个词同时问好几个问题(这叫多头注意力),再把这样的注意力层摞成几十层高的塔——那座塔,就是 Transformer。心脏已经在跳了,接下来是给它接上整副身体。