§ 7.1 · Section

Attention 注意力

Attention Mechanism

2017 年那篇改变世界的论文,标题就叫《Attention is All You Need》——你只需要注意力,别的都可以不要。这句话听起来像玄学,但它背后是一个非常朴素的直觉:读一句话时,我们的眼睛并不是均匀地扫过每一个字,而是会本能地"跳回去"关注某几个关键的词。Transformer 把这个动作变成了数学。

生活场景
👀 你读句子时眼睛在做什么

请慢慢读下面这句话,感受一下自己的视线:"那只在门口打盹了整整一下午的橘猫,追着一只不小心从窗台上滚下来的蓝色小球跑,最后它抓到了。"
读到""这个字的时候,你的眼睛会不由自主地跳回去看——"它"到底指谁?是猫,还是球?
这一次"跳回去,看一眼前文,再回来"的动作,就是注意力。它极其自然,你甚至没意识到自己在做。
Transformer 做的事,就是让机器也学会这个"跳回去看一眼"的能力——而且是同时看全句话所有的其他词

先说清楚:Attention 到底解决了什么问题

要理解 Attention 为什么震撼,得先看看它之前的世界——那个由 RNN(循环神经网络)统治的时代。RNN 是 2017 年之前处理文本、语音这种"序列数据"的绝对主力。它的思路很直觉:一个词一个词地读,读完一个就把"上下文记忆"更新一下,再读下一个。就像你一边听老师讲课,一边在脑子里滚动地记笔记。

这个思路听起来没毛病,但一到实战就暴露出两个致命缺点——正是这两个缺点,把整个自然语言处理领域逼到了墙角,才有了 2017 年的那次革命。

先把 RNN 这条技术线的家谱摆清楚,你才知道 2017 年被推翻的是多厚的一堵墙。RNN 的原型可以追溯到 1986 年 Jordan 网络和 1990 年 Elman 网络;1997 年 Hochreiter 和 Schmidhuber 提出 LSTM(长短期记忆网络),用输入门、遗忘门、输出门三道闸门把"该记的记住、该忘的忘掉"变成可学习的操作;2014 年 Cho 等人提出更精简的 GRU,把三门压成两门。2014 年 Sutskever、Vinyals、Le 的《Sequence to Sequence Learning with Neural Networks》把两个 LSTM 拼成"编码器 + 解码器",第一次让神经网络端到端做机器翻译,这就是 seq2seq 范式。到 2016 年,Google 翻译(GNMT)上线的正是一个 8 层编码器 + 8 层解码器的 LSTM 系统,比统计机器翻译的错误率降低了约 60%。也就是说,RNN 家族并不是废物——它统治了 NLP 将近三十年,而且在 2016 年刚刚拿下了工业界最重要的一场胜利。正是在这个如日中天的时刻,Transformer 出现了。

RNN 的致命缺点一 · 必须"一个一个来"

RNN 的核心是"下一步依赖上一步"——要算第 100 个词的表示,必须先把前面 99 个词依次算完。这就像流水线上的工人:第二个人必须等第一个人做完才能开工,第三个必须等第二个……
在 GPU 时代,这是灾难。GPU 有上万个核心,本来可以"一次算一千个词",但 RNN 的顺序结构强行把它们锁在单车道上,只能一个接一个走。训练一个大模型的时间被拉长十倍、百倍。你花一个月能训练完的 Transformer,用 RNN 得跑一年——这已经不是慢一点的问题,而是"根本没法做"的问题。

用一个术语说清这件事:衡量一个网络结构好不好并行,看的是"顺序操作数"(Sequential Operations),也就是那些必须严格排队、无法同时进行的步骤有多少个。原论文里有一张表,把三种结构并排比较,这张表是整篇论文最有说服力的一页:

三种序列建模结构的复杂度对比(n=序列长度, d=向量维度, k=卷积核宽度)

结构类型                 每层计算复杂度        顺序操作数     最大路径长度
────────────────────────────────────────────────────────────────────
RNN / LSTM              O(n · d²)            O(n)  ← 灾难    O(n)  ← 灾难
CNN(卷积)              O(k · n · d²)        O(1)          O(log_k n)
Self-Attention          O(n² · d)            O(1)  ← 关键    O(1)  ← 关键
────────────────────────────────────────────────────────────────────

读法:
  「顺序操作数 O(n)」= 序列有 1000 个词,就必须排 1000 步队,
                     GPU 上万个核心有 9999 个在等着,利用率惨不忍睹。
  「顺序操作数 O(1)」= 无论序列多长,都只需要「一步」矩阵乘法,
                     整个序列一次性铺到 GPU 上算完。

  「最大路径长度」= 任意两个位置之间的信息要走几步才能相遇。
                  RNN 里第 1 个词和第 1000 个词隔着 999 步;
                  Self-Attention 里任何两个词都是 1 步直达。

代价:Self-Attention 用 O(n²) 的计算量,换掉了 O(n) 的排队时间。
     在 GPU 上,「算得多」远比「排队久」划算 ——
     因为矩阵乘法是 GPU 最擅长的事,而等待是它最浪费的事。

这张表解释了一个反直觉的事实:Transformer 的计算量其实比 RNN 更大,但它跑得快得多。原因在于现代硬件的性质——A100 GPU 的算力约 312 TFLOPS(FP16),但显存带宽只有约 2 TB/s。也就是说,GPU 的"算"极其便宜,"等"和"搬数据"极其昂贵。RNN 恰好把所有时间花在最贵的那一项上:每一步只做一小块矩阵乘法(吃不满算力),然后必须等结果出来才能做下一步(纯浪费)。Transformer 反过来——把整个序列的 Q、K、V 一次算完,得到的是几个巨大的矩阵乘法,正中 GPU 的舒适区。这不是算法上的胜利,而是"算法适配硬件"的胜利。原论文里那句被反复引用的数据是:Transformer 在 8 张 P100 上训练 12 小时(base 版)就达到了当时英德翻译的最好成绩,而被它超越的那些 RNN 系统往往要训练好几天甚至几周。

Analogy · 传声筒游戏

RNN 就像小时候玩的"传声筒"游戏——一个人对下一个人耳语一句话,一路传到最后一个人。
只要队伍够长,传到最后的话基本就变形了:"下午三点在图书馆碰面" 最后可能变成 "下午想吃冰淇淋"
RNN 处理长句子时也是这样——句首的信息传到句尾,早就被中间几十步"稀释"得七零八落了。

RNN 的致命缺点二 · 长距离依赖差

第二个问题更本质。想象一句话:"我小时候在东北长大,那里的冬天冷得能把水龙头冻住,我最想念的就是妈妈煮的那锅热腾腾的酸菜白肉——所以每次冬天回家,我都会特意去菜市场买一颗最大的酸菜"
句尾的"酸菜",其实是被句子中间提过的"酸菜白肉"锚定的。这两个词之间隔了 40 多个字。RNN 处理时,"酸菜白肉"的信息要一路传到句尾——中间经过几十次矩阵乘法、几十次激活函数——信息早就被稀释、扭曲、遗忘了。这就是所谓的"长距离依赖问题"。

后来人们发明了 LSTM、GRU 这些"带记忆闸门"的改良版,能缓解一部分,但没有从根本上解决——只要还是"顺序传递"这套逻辑,信息就注定会随距离衰减。这个瓶颈卡了整个 NLP 领域十几年。

Attention 的核心思想 · 直接跳到源头

2017 年 Transformer 的作者们做了一件极其大胆的事:干脆不要"顺序传递"了。既然信息在传递中会衰减,那就让每个词直接访问句子里所有其他词,不再经过中间人。

具体怎么做?简单说三步:

这样一来,处理"它"这个词时,句子里的"猫"如果得了 0.7 分、"球"得了 0.2 分、其他词共 0.1 分——那"它"的新表示里,70% 是"猫"的信息、20% 是"球"的信息。这就是"跳回去看一眼"在数学上的实现。而且更妙的是——这个"跳"是模型学出来的,不用人教它"'它'应该看'猫'",训练几百万句话后,它自己就学会了。

Analogy · 会议里的举手投票

把一句话想成一场会议,每个词是一个与会者。当"它"这个人举手发言时,他环顾四周问:"你们谁跟我有关?"
"猫"举手:"我有关,权重 0.7";"球"举手:"我有关,权重 0.2";其他人手举得很低。
"它"最后的观点,就是把所有举手的人的意见按举手高度加权综合起来。
Attention 就是这场会议——每个词都能同时问全场所有人的意见,一步到位,绝不传声筒。

Attention vs Self-Attention · 别搞混

你听过两个词:AttentionSelf-Attention——它们不完全是一回事,但今天大家常常混着用,需要一次说清。

名字Query 来自Key/Value 来自典型场景
普通 AttentionA 句B 句翻译:中文(Q)看英文(K/V)
Self-Attention同一句 A同一句 A理解:句子内部词与词的关系
Cross-AttentionDecoder 当前词Encoder 输出Encoder-Decoder 中的桥梁

Transformer 里真正撑起大梁的,是 Self-Attention(自注意力)——一句话内部,每个词都对其他每个词做 Attention。这是它最核心的创新。Attention 概念其实 2014 年就有了,但真正把它推到"只用它就够了"这种极端的,是 2017 年的 Transformer。

Attention 带来的三个改变

这三条翻译成人话各是一句话。一、能同时开工。好比一沓一百份的表格要盖章,从"一个人挨着盖"变成"雇一百个人同时盖"。二、远近不再有区别。好比办公室里从"话要经过五级转达"变成"所有人在一个群里,谁跟谁说话都是一步"。三、能看出它在想什么。说白了就是每个词看了谁、看得多重,都能画成一张亮度图——你能亲眼看见"它"这个字和"猫"之间那条线亮起来。

一个直观的例子 · 消解歧义

"The animal didn't cross the street because it was too tired."——这里的 it 指谁?
英语母语者一看便知:"it"指 animal(因为疲倦不过街)。
但如果把句子改成:"The animal didn't cross the street because it was too wide."——it 就变成了 street(因为街太宽)。
同一个"it",指代不同——判断依据是句尾的"tired"还是"wide"。Transformer 在处理"it"时,通过 Self-Attention 会同时看向"animal"、"street"、"tired/wide"这几个词,并根据学到的模式给它们打分。这就是"注意力"最直观的用途——让语言里那些微妙的、需要跨越距离才能理解的东西,被机器捕捉到。

为什么"Attention is All You Need"

论文标题这句话,其实是在挑衅——挑衅当时所有主流方案。作者的意思是:不需要 RNN,不需要 CNN,不需要复杂结构,光靠 Attention 一件武器,就能把整个序列建模的活儿全干了
这话在 2017 年是极其大胆的宣言。但接下来五年发生的事情证明了它——BERT 用 Encoder 堆叠出了 SOTA,GPT 用 Decoder 堆叠出了 ChatGPT,Vision Transformer 甚至把图像也变成了"一串词"来处理。Attention 真的就是全部所需

从"读一句话"到"读一整本书"

先把那串"8K、128K、100 万 Token"翻译成人话100 万 Token 大约相当于 150 万个汉字——差不多是《红楼梦》全本再加上两本长篇小说,一口气全塞进去。而 2017 年之前的模型,能记住的量大概只有一条微博那么长

那个"平方成本"也得换成大白话说清。打个比方,这是一场规定"每位客人必须和每位客人都握一次手"的开会10 个人握 45 次还行;1000 个人就是近 50 万次握手;10 万个人是 50 亿次——会场直接瘫了。这就是为什么"上下文越长越贵"不是厂商在收智商税,而是数学上躲不掉的账。后来那一堆优化技术(稀疏、滑动窗口之类),本质上就是在想办法"别让每个人都跟每个人握手,只跟邻座和几位关键人物握"。

Attention 的威力,在句子级别就已经很明显了;但真正把它推到极致的,是长上下文时代——如今 GPT-4、Claude、Gemini、Kimi、DeepSeek 都在拼谁能塞下更长的输入:8K、32K、128K、200K、100 万 Token。
这些让人眼花的数字背后,是同一件事:Attention 让每个词都能一步跳到任何位置。你把一整本《红楼梦》喂给模型,它读到第 80 回"贾母去世"这四个字时,可以直接一步跳回第 3 回去看贾母第一次出场的描写——中间隔了几十万字,都不掉信息。这在 RNN 时代是完全不可能的事:几十步的传声筒里,早就把贾母忘光了。

当然,长上下文也带来新的问题——Attention 的计算量是序列长度的平方(O(n²))。1000 个词要算 100 万次匹配、10 万个词要算 100 亿次——所以后来又衍生出稀疏 Attention、Flash Attention、滑动窗口 Attention 等等一大批优化技术。但底层的思想没变:让每个位置都能任意跳跃

Attention 是通用的——不止用在语言上

它能跨这么多领域,原因说白了就是一句:只要你能把一样东西切成一串小块,Attention 就能干活。它压根不在乎那些小块原来是字、是像素、是声音还是氨基酸。

好比一位图书馆的老管理员:他不需要懂化学、懂音乐、懂医学,他只需要会一件事——把任何东西编号、归类、建立索引,然后回答"这一项跟哪几项关系最近"。正因为他只掌握这一项通用技能,所以化学书、乐谱、病历、地图他都能管。Attention 的通用性就来自这里:它学的不是"语言的规律",而是"一串东西里谁跟谁有关系"这件更底层的事。

你可能以为 Attention 只是为文字设计的,其实它已经彻底征服了 AI 的其他领域:

"Attention is All You Need"这句话在 2017 年是宣言,如今回头看更像是预言——这一个机制,重塑了整个 AI 的技术栈。

Attention 是怎么"出生"的:2014 年的那场翻译

很多人以为注意力是 2017 年凭空冒出来的,其实它的第一声啼哭早在 2014 年就出现了。当时的机器翻译还是 seq2seq 的天下:一个 LSTM 把整句中文读进去,"压缩"成一个固定大小的记忆向量,另一个 LSTM 再把这份记忆"展开"成英文。这个思路的病灶就在"压缩"两个字上——一句话再长,最后都得硬塞进一个固定大小的向量里。打个比方,就像一家餐厅后厨只有一块很小的黑板,午市高峰十几桌的订单全挤在同一块黑板上写,早先写的菜名很快就被后面的订单盖得看不清,厨师照着出菜自然频频出错——句子越长,前面的信息被挤丢得越凶。

2014 年,Bahdanau 等人提出一个打破常规的想法:别再整句压缩了,让译者在每一个时刻"回头"去原句里自己找当前要用的词。他们给原句里每个词都保留一份"小黑板"(也就是每个源语言词的隐状态),译到 blue 时,模型通过一个小的对齐网络,自动算出原句里哪个词此刻最相关,再按这份权重把各词的表示加权抓取过来。这就是"注意力(Attention)"这个词第一次正式登上学术舞台的瞬间——不过它当时叫"软注意力",还只能和 LSTM 搭配着用,远没有后来那种"光靠它就够了"的嚣张气势。可以说,2017 年的 Transformer 并不是发明了注意力,而是把它从配角捧成了绝对主角。

这个出生背景很值得记住:注意力诞生的初衷,就是专门对付"长句"、"远距离"、"信息被压缩丢"这三件 RNN 搞不定的事。理解了这个动机,后面所有看似炫技的细节,本质上都是在回答同一个问题——怎样让一个词又快又准地拿到它真正需要的信息

一个手把手算例:注意力分数到底怎么落地

注意力不是黑箱魔法,它的每一步都是可见的加减乘除。我们拿一个能心算重演的最小例子来演一遍——句子只有三个 Token,我们叫它们 A、B、C,现在轮到处理 A。

第一步,模型给每个 Token 都换算出三样东西:Query(A 此刻想问的问题)、Key(我是谁)、Value(我手里握着什么信息)。注意,这三样不是同一个东西,它们是从同一个词身上"长出"的三个不同视角,下一篇拆 QKV 时会细说,这里你只需要记一个动词组合:拿 Q 去"找",拿 K 去"认",拿 V 去"取"

第二步,A 拿着自己的 Query,去和 A、B、C 三个的 Key 各"点乘"一次,得到三个原始分数。这几个分数通常要除以"向量维度的开方"把数字压一压(以免后面积分数量级爆掉,这一步叫缩放),再丢进 softmax,变成三个加起来正好等于 1 的权重。

第三步,假设算出来 A 和自己得 0.5、和 B 得 0.3、和 C 得 0.2——那么 A 的新表示,就是把 A 自己的 Value 乘一半、B 的 Value 乘三成、C 的 Value 乘两成,然后相加。仅此而已。你会发现这和 § 5.1 里那颗神经元的"加权求和"是同一种动作——只不过这里的权重不是训练完就固定的,而是随着当前问的是谁,实时现场算出来的。这就是注意力和普通神经网络那个"静态权重"最根本的分野:注意力的加权重,是动态的、见人下菜碟的

想象一下你站在一家银行大堂,问前台"我该去哪办理",前台会根据你手里拿的是存折、是身份证还是大额现金,现场对号给你指不同的窗口——同一个问题,因为"你是谁、带了什么"不同,答案的侧重点就不同。Attention 里那份"现场算出来的权重",干的就是前台眼前这一刻的动态判断这一件事。

机器注意力 vs 人眼注意力:名字像,骨子里不一样

正因为大家都叫"注意力",很多人会顺理成章地以为 AI 就像人一样"专心盯着某个地方看"。这里值得翻译成人话,明确泼一盆冷水:机器的注意力和人眼的注意力,只是名字相似,骨子里差得极远。

人眼的注意力是稀缺资源。你同一瞬间只能真正集中在一处,还随时被情绪、疲劳、兴趣摆布——今天回消息时眼睛盯着屏幕,脑子却根本没进几个字,这种"假装在听"的走神,人人都有。而机器的 Attention 恰恰相反,它是全覆盖加权的:它同时看一眼全句所有词,每个词都有份量,只是有大有小,不存在"真的没在看"这回事。

相当于你走进一家菜市场,要求你同一秒里听清五个摊位老板都在报什么价,还要按可信度给每句话加权——人脑当场死机;而 Attention 一秒能做几亿次这样的加权。所以再看到"AI 注意力"这个词,别当成"AI 在专心看",它更接近"把整句话一遍遍翻来覆去地对照,对每一个词都批量打分"这种毫无感情的普通计算。它不累,不困,也不会因为"后两句更重要"就走了神。

理解了这层差别,还有一个常识性的好处:你就不容易被那些"AI 也有注意力,所以它也会分心"的说法带偏。机器的"注意力"高到离谱是一种负担(因为全是计算成本),而不是一种人性化的体验。打个比方,就像地铁调度室里那几个监控屏——每块屏都在"同时盯着"整个站台的每个角落,谈不上哪块屏"更专心",它们只是在做不计成本的全量广播。Attention 的真相,是这种没有中心的"全量对照",而不是人眼那种有中心、有聚焦、有边界的"东看看西看看"。

一个容易忽略的细节:掩码,或者"不许偷看"

注意力让每个词都能"看全句",可有些时候,我们恰恰要禁止它看某些词——这就是掩码(Mask)机制真正在做的事。最典型的是生成式语言模型(比如 ChatGPT 这类的 decoder-only 模型):它生成"下一个字"的时候,绝对不能让它看到答案本身,否则就成了作弊

这一点翻译成人话特别有意思。想象一下一场考试:考生要按顺序一题一题往下写,写第一题时绝对看不到第三题的答案。可普通 Attention 是"全覆盖"的,天生就是开卷——它能一步看到整卷内容。所以训练时必须给模型戴上一个强制"遮遮挡挡"的眼罩:算第 i 个位置的时候,把第 i 个位置之后所有位置的注意力分数统统设成负无穷,经过 softmax 之后就等于 0。这样,模型在算"今天的天气很好"里"很好"这个词时,看到的就只有它自己以及它前面的词,绝看不到未来。这么一套"只许看左边、不许看右边"的注意力,就叫因果掩码(Causal Mask),也叫自回归掩码

你可能会问:那为什么训练和真正使用时,行为是一致的?因为从头到尾都用这套掩码,模型就永远只能依赖它"已经看到的那一行"来预测下一个字——这就和真实对话时的处境一模一样:现实中你也是只能根据"已经说出来的话"来接下一句,未来还没发生。这个"训练时怎么遮、使用时怎么遮、全程保持一致"的设计,是生成式模型能把"预测下一个字"顺滑变成长篇大论的秘密之一

还有个顺带的小知识:Transformer 里其实不止这一种掩码。做机器翻译时,源语言的编码器用的是"看全句"的掩码(对应 Self-Attention 无掩码),而真正逐字生成翻译的部分才用因果掩码;有时填词任务用的又是"随机挖掉几个词,让它看到剩下的去填空"的掩码(比如 BERT 的掩码语言模型)。掩码本质上就是一句"看得见 / 看不见"的开关列表,一点也不神秘——就像考试里发的那张"哪些题可以翻回去改、哪些不许"的指令单,不同的任务发不同的指令单而已。

到这里,你手里已经握住了 Attention 最核心的几块拼图:它解决什么、怎么落地算、和 RNN 比强在哪、有哪些"不许看"的变体。至于那个让无数新手在公式里晕头转向的 Q、K、V,其实只是一层更细的"怎么换算权重"的皮——下一篇,图书馆查资料的比喻会把这张皮一次掀开。

三个新手最常见的认知误区

到这里,再帮你把注意力这个话题上最容易踩的三个坑一次踩平,省得日后翻车。

误区一:以为"注意力分数高就代表意义最关键"。注意力的权重反映的是"这个位置的表示其中有多少来自另一个位置",它是一种运算上的相关,不保证是"语义上最重要"。高权重可能是真相关,也可能是模型偷懒形成的捷径。所以做可解释性时,看热力图可以当线索,但别把它当成铁证。就像一位快递仓库的分拣员,他路线里最常经过的那个货架高不一定代表那货架最重要,只是因为它碰巧顺路。

误区二:以为"只要上下文够长,模型就什么都能记住"。长上下文不等于强记忆。哪怕 Attention 能让每个词一步直达任意位置,也不意味着模型真的"读懂了",它依然可能在一本很快的书里漏掉关键细节,出现所谓"大海捞针"失败的尴尬。上下文是给你更多材料,而不是帮你更会阅读——这就像给一个走神的人一张更大的地图,他照样会迷路。

误区三:以为"注意力是免费的"。恰恰相反,它的 O(n²) 平方成本是当下业界最头疼的账单之一。所谓 Flash Attention、稀疏注意力、滑动窗口,全都是为了把这张账单改小。记住一句话:注意力给了模型"全能视野"的超能力,但这份超能力的代价是平方级增长的算力账单。理解了这一点,你再看到"上下文长度▲"的营销海报,就能冷静地问一句:"那这张账单,是算到用户头上了,还是厂商默默消化了?"

这三个误区一句话合起来就是:注意力既不是语义的保险箱,也不是记忆的万能药,更不是免费的午餐。它是一件强大而昂贵的工具,用得好,能把"这是我需要的那个词"这件事做得又快又准。把它和前面讲的因果掩码放在一起,你其实已经掌握了 Transformer 里"每个词怎么看别人、每个词又不能看谁"这两条主线的全部要点——剩下的,就是把这些抽象动作翻译成 Q、K、V 这套具体的运算工具了。所以毫不夸张地说,看到这里,你已经拆掉了 Attention 这座大楼最承重的两道墙。

Recap · 收束

Attention 之所以是革命,是因为它一次解决了 RNN 的两个死结:顺序处理慢长距离依赖差。它的核心思想只有一句话——让每个词都能同时看到句子里所有其他词,并动态决定关注谁。这个机制不仅统治了自然语言,也悄悄征服了视觉、语音、生物、视频等所有序列建模场景。
下一篇,我们把这个"看谁、看多重"的动作,翻译成三个字母:Q、K、V——图书馆查资料的比喻会让你一辈子记住这个公式。

☰ 主页
Xue Hai Wu Ya · § 7.1 · Attention