注意力,就是你所需要的一切
Vaswani, Shazeer, Parmar, Uszkoreit, Jones, Gomez, Kaiser, Polosukhin · NIPS 2017 · arXiv:1706.03762
这篇论文里有很多吓人的符号——Query、Key、Value、softmax、√dk。你一个都不用记。我们只需要你会做一件事:读句子。因为你读这句话的方式,就是 Transformer 读这句话的方式。哦对了,这篇论文的标题狂得很:注意力,就是你所需要的一切。真的吗?读完这一篇,你自己判断。
你已经会注意力了
先做个小实验。下面是论文作者自己举的句子:
The animal didn't cross the street because it was too tired.
(那只动物没有过马路,因为它太累了。)
句子里有个 it(它)。它指的是谁?在下面的图里,点一下你认为「it」指的那个词——没什么大不了的,凭直觉点就行。
机器以前是怎么读的:传话游戏
Transformer 之前,读句子的主流机器叫 RNN(循环神经网络)。它读句子像玩传话游戏:第一个词把自己的意思告诉第二个词,第二个词加上自己的理解传给第三个……一路传到句尾。你小时候玩过传话游戏就知道会发生什么——传到第八个人,"animal" 已经变成 "an apple" 了。
拖动滑块,把句子拉长。看句首那条消息传到句尾时,还剩下多少:
注意右端那个百分比:句子每长一个词,"animal" 的信息就被压缩转述一次。拉到 11 个词时,轮到「it」想知道自己指谁,它手里关于 animal 的记忆已经淡得快看不见了。顺序阅读的代价:距离就是遗忘。
然而,你在第一节里连线的时候,根本没有从左往右传话——你是同时看到了所有词。如果让每个词都能这样,直接向全场喊话呢?
喊话大厅:Q、K、V 其实是三句人话
论文的核心发明叫「自注意力」(Self-Attention)。别被名字吓到,它就是把传话游戏改成了喊话大厅。每个词随身带三样东西,翻译成人话是:
Query:我在找什么 · Key:我是干嘛的 · Value:我真正要说的话
轮到「it」的时候,它向全场喊:"谁是那个需要休息的家伙?"每个词都亮出自己的 Key 应答,匹配度越高,举手举得越高。先别看答案——你猜,谁举手最高?
想看这次喊话的真实算术?(可跳过,不影响后面)
喊话匹配就是把「it」的 Query 向量和每个词的 Key 向量做点积——两个向量越像,点积越大。假设向量只有 2 维:
| Key·animal | Key·street | Key·tired | |
|---|---|---|---|
| Query·it = [2, 1] | [2,1]→ 5.0 | [0,1]→ 1.0 | [1,1]→ 3.0 |
| softmax 之后 | 0.85 | 0.02 | 0.13 |
softmax 把一排分数变成一排加起来等于 1 的比例——就是图里柱子的高度。最后「it」的新含义 = 0.85 × animal 的 Value + 0.13 × tired 的 Value + …——按举手高度,把大家"真正要说的话"加权混合。这就是论文里那个公式的全部:Attention(Q,K,V) = softmax(QKᵀ/√dk)·V。√dk 是什么?下一节你亲手拧它。
公式里唯一的"玄学":√dk
公式里那个除以 √dk,是论文被问得最多的细节。它其实是个稳压器。拖动下面的旋钮,把它拧到两个极端,看注意力会变成什么样子:
拧到最左:全场平摊,每个词分到的注意力一样多——什么都听,等于什么都没听。拧到最右:一根筋,全部注意力砸在一个词上,其他信息全丢,而且训练时梯度会在这种极端里"冻住"。√dk 的作用就是把注意力钉在中间的甜区:有主次,但不偏执。不是玄学,是工程师在拧稳压阀。
好,现在「it」会喊话了,力度也调好了。但一个大厅只能听清一种关系——如果一句话里同时藏着好几种关系呢?
八副眼镜,各看各的
论文的第二个设计:与其开一个大厅,不如开八个小厅,每个厅用 1/8 的精力,各自学会盯一种关系。这叫多头注意力(Multi-Head Attention)。听起来浪费,其实是分工——就像你读侦探小说,一遍留意人物关系,一遍留意时间线,一遍留意谁在撒谎。点下面四副"眼镜",看同一句话在不同头里长什么样:
指代头把「it」连向 animal;邻接头只盯左邻右舍的搭配;语法头追踪"didn't…cross"这种动词骨架;语义头把"animal、tired"这类意思相近的词聚成一group。一个头一种关系,八个头拼在一起,才是一句话的完整理解。论文用了 8 个头,每个 64 维,拼起来正好 512 维——不多花一分计算,却多了八种视角。
然而这个喊话大厅有个谁都没发现的大漏洞。来,我们戳破它。
戳破漏洞:它根本不知道词的顺序
传话游戏再糟糕,至少天生知道谁先谁后。喊话大厅是同时喊的——先来后到根本不存在。不信?点「打乱词序」,看注意力有什么反应:
看到了吗?词序被打得稀烂,每条注意力连线却纹丝不动——对纯注意力来说,句子只是一袋词,"狗咬人"和"人咬狗"没有区别。这当然不行。
论文的补丁优雅得像个乐谱:给每个词发一个"座位号",但座位号不是 1、2、3,而是一组不同频率的正弦波——就像每个座位有自己独特的和弦。点「加上位置编码」,看每个词脚下亮起的波纹:现在再打乱词序,波纹跟着词走,模型立刻就能察觉谁被挪动了。注意力天生不识词序;位置编码是发给每个词的、可计算的座位号。
组装时刻:六层楼的大厅
零件齐了:喊话(自注意力)、稳压器(√dk)、八副眼镜(多头)、座位号(位置编码)。现在当着你的面组装。Transformer 把这套喊话大厅盖了六层——每一层都在上一层理解的基础上,再喊一轮。拖动滑块加盖楼层,盯住「it」的连线怎么变:
第一层,「it」只敢看左邻右舍;第三层,它开始顺着语法骨架摸到动词;到第六层,它笃定地指向了 animal——和你在第一节里连的那条线重合了。每一层都是"在上一次理解的基础上再看一遍",六遍之后,「it」知道了自己是谁。
完整的 Transformer 还有一个对称的"生成侧"(解码器):理解侧读原文,生成侧一边写译文一边随时回头查阅理解侧的全部笔记——不用传话,直接查。残差连接、层归一化这些扎实的工程细节,论文里都有,但骨架你已经全部亲手摸过了。
那么,标题吹牛了吗
回到开头的问题。"注意力就是你所需要的一切"——言下之意,循环可以全扔。2017 年这话相当狂:RNN 统治翻译已近十年。空口无凭,拖动滑块,让当年的英德翻译榜单一个个登场(纵轴是翻译质量 BLEU 分,气泡大小是烧掉的算力):
看最后登场的两个绿点:Transformer base 用最小的气泡胜过了之前所有单模型;Transformer big 拿下 28.4 的新纪录,训练只用了 8 块 GPU、3.5 天——左边那些大气泡是烧了几周算力的集成模型。它不只是赢了,它用更少的钱赢了更多。把循环全部扔掉,不但没有塌,反而更快、更好、更便宜。标题没有吹牛。
最后,试试能不能骗过它
你已经懂了注意力。最后这个游乐场留给你:下面几个句子都藏着一个狡猾的「它」。先自己想答案,再点开看模型怎么连——能找到让它连错的句子,才说明你真的懂了它的原理,以及它的软肋:
第三句是语言学里著名的 Winograd 难题:「议员们拒绝给示威者发许可证,因为他们害怕暴力」。"他们"指谁,取决于你懂不懂政治里谁怕谁——纯靠词与词的统计关系,我们的玩具模型连向了错误的一方,而早年的真模型也在这类句子上大面积翻车。注意力给了机器"看全场"的眼睛,但看见不等于看懂——剩下的路,靠的是更深的层、更多的数据,和此后八年的一切。
回想一下你这一路亲手做过的事:你替「it」连了一次线,看着传话游戏把消息磨碎,押注了举手最高的词又看它因为一个词的变化而反转,拧过稳压器的两个极端,换过八副眼镜,戳穿过词序漏洞,然后亲眼看着六层楼把你最初连的那条线一层层长出来。这篇论文之后,BERT、GPT、Claude、Gemini——你今天用的几乎所有 AI,底层都是这套你刚刚拨弄过的机制。此刻你的手机里,每秒都在发生几十亿次你在第一节里做的那个连线动作。