Skip to content

02 · 注意力与 Transformer:模型怎么「看上下文」 ​

学完你能说出:

  • 注意力就是「处理每个词时,决定该重点看句子里的哪些词」。
  • Q、K、V 分别是什么(用「图书馆查书」讲清楚)。
  • Transformer 为什么取代了 RNN:能并行、看得远。

先看地图 ​

上一篇说模型「看完前文再猜下一个字」。这一篇讲怎么看。

本篇讲 4 个点:① 注意力在解决什么问题 → ② Q/K/V 怎么算出「看谁」 → ③ 多头注意力和位置编码 → ④ 为什么 Transformer 取代了 RNN。

一句话本质 ​

注意力(Attention)= 给句子里每个词打一个「我该多关注你」的分数,再按分数把大家的信息加权混合。

生活类比:开会时听谁的 ​

你在会上想搞清楚「这个方案谁负责」:

  • 你不会平均听每个人说话,而是重点听项目经理和你的直属领导,其他人的话权重很低;
  • 换个问题,比如「预算多少」,你会转而重点听财务。

注意力也是这样:同一个词,问的问题不同,关注的对象就不同。

一步步看:「它」指的是谁? ​

句子:「小猫没吃鱼,因为它饱了。」模型处理到「它」时,要搞清楚「它」指谁。

← 左右滑动看完整图 →处理「它」这个词时,它去「看」句子里每个词的程度(权重加起来 = 1)小猫0.62没0.02吃0.06鱼0.18,0.00因为0.03它0.05饱0.03了0.01「它」最关注「小猫」(0.62),所以模型知道「它」= 小猫,而不是鱼。数字是示意,真实模型里有很多个注意力头,各自关注不同关系。
注意力(Attention)就是「看重谁」:处理每个词时,给句子里所有词打一个权重,按权重把它们的信息加起来。所以同一个「它」在不同句子里能指向不同的东西——上下文决定意思。

注意力给每个词打的权重(示意数字):小猫 0.62、鱼 0.18、吃 0.06……加起来等于 1。于是「它」的新表示里,大部分信息来自「小猫」。模型因此「理解」了它 = 小猫。

如果句子改成「小猫没吃鱼,因为它臭了」,权重就会偏向「鱼」。上下文决定意思,这正是注意力的价值。

分数是怎么算出来的:Q、K、V ​

用图书馆查书来理解。每个词都会生成三样东西:

名字类比作用
Q(Query,查询)你手里的「借书需求」我现在想找什么信息
K(Key,键)每本书的「标签」我能提供什么信息
V(Value,值)书的「内容」真正被取走的信息

计算分三步(用 2 个词的小例子):

  1. 算匹配度:拿「它」的 Q 和每个词的 K 做点积(对应位置相乘再相加)。假设「它·小猫」= 4,「它·鱼」= 1。
  2. 变成权重:用 softmax(把一组分数变成「都为正、加起来为 1」的比例)换算:4 和 1 → 约 0.95 和 0.05。
  3. 加权混合:新的「它」= 0.95 × 小猫的 V + 0.05 × 鱼的 V。

公式写出来就是:

Attention(Q, K, V) = softmax( Q·Kᵀ / √d ) · V

√d(d 是向量长度)用来把分数缩小一点,原因见下面「为什么」。

为什么这么设计 ​

为什么要注意力,而不是平均看所有词? ​

  • 问题:平均混合会把关键信息稀释掉。「它」要靠「小猫」来定义,跟「因为」「了」关系不大。
  • 方案:让模型自己学会给每个词打分,相关的分高、无关的分低。
  • 好处:同一个词在不同上下文里能得到不同的含义;而且离得很远的词也能直接关注到。

一句话答法

因为不同词对理解当前词的贡献不同,注意力让模型按相关程度加权混合信息,所以能处理指代、歧义这种依赖上下文的问题。

为什么要除以 √d? ​

  • 问题:向量越长,点积的数值越大。数值太大时,softmax 会变得「一家独大」(比如 0.999 和 0.001),梯度几乎为 0,模型就学不动了。
  • 方案:除以 √d,把分数拉回到合适的范围。
  • 好处:训练更稳定。

一句话答法

防止向量维度大时点积过大,导致 softmax 饱和、梯度消失,起到稳定训练的作用。

为什么要「多头」注意力? ​

  • 问题:一组 Q/K/V 只能学一种「关注方式」。但理解句子需要同时看多种关系:指代、语法、语义……
  • 方案:同时开很多组(比如 8 组、32 组),每组叫一个头(head),各学各的关注方式,最后拼起来。
  • 好处:一个头专门找指代,另一个头专门看搭配,信息更全面。

一句话答法

多头让模型在不同的子空间里同时学习多种关注关系,比单一的注意力表达能力更强。

为什么需要位置编码? ​

  • 问题:注意力本身只看「谁和谁相关」,不管顺序。「狗咬人」和「人咬狗」在它眼里是同一堆词。
  • 方案:给每个位置加一个位置编码(Positional Encoding),把「我是第几个词」的信息加进去。
  • 好处:模型能区分词序。

一句话答法

因为注意力计算对顺序不敏感,必须额外注入位置信息,模型才能区分「狗咬人」和「人咬狗」。

为什么 Transformer 取代了 RNN? ​

RNN(循环神经网络) 是之前的主流做法:一个词一个词地顺序读,前面的信息靠一个「记忆」往后传。

RNNTransformer
怎么读一个一个按顺序读所有词同时看
能不能并行不能,必须等前一个算完能,GPU 一次算完
远距离关系要传很多步,信息会衰减任意两个词一步直达

一句话答法

RNN 必须顺序计算、远距离信息容易丢;Transformer 用注意力让任意两个词直接交互,并且可以并行训练,所以能把模型做大。

英文术语拆解 ​

术语拆开看一句话意思
Attention注意、关注按相关程度给其他词打分并加权混合
Self-Attentionself 自己 + attention自注意力:一句话内部的词互相关注
Query / Key / Value查询 / 钥匙、键 / 值「我要找什么」/「我有什么标签」/「我的内容」
softmaxsoft 柔和的 + max 最大值把一组分数变成加起来为 1 的概率
Multi-Headmulti 多 + head 头多组注意力并行,各学一种关系
Positional Encodingpositional 位置的 + encoding 编码把「第几个词」的信息加进去
Transformertransform 变换 + -er 「…的东西」以注意力为核心的模型结构,2017 年提出
RNNRecurrent 循环的 + Neural Network 神经网络按顺序逐个处理词的旧结构

面试怎么问 ​

Q:讲一下自注意力的计算过程。

每个 Token 通过三个矩阵得到 Q、K、V;用 Q 和所有 K 做点积得到相关性分数,除以 √d 缩放后过 softmax 得到权重,再用权重对 V 加权求和,得到这个 Token 融合了上下文的新表示。

Q:为什么要除以 √d?

维度大时点积方差大,softmax 会进入饱和区,梯度很小、训练不稳定。除以 √d 让分数的尺度和维度无关。

Q:Transformer 相比 RNN 的优势是什么?

一是可以并行计算,训练效率高;二是任意两个位置之间的路径长度为 1,长距离依赖更容易建模。代价是注意力的计算量随序列长度平方增长,所以上下文窗口有上限。

容易混的地方 ​

  • 注意力权重 ≠ 模型的「理解」:它是一种信息混合方式。说「模型关注了小猫」是方便理解的说法。
  • Q、K、V 不是三份不同的输入:它们都由同一个词的向量,乘以三个不同的(训练出来的)矩阵得到。
  • 上下文窗口有上限:注意力要算「每个词 × 每个词」,长度翻倍,计算量约变成 4 倍。

和其他知识的连接 ​

  • ← 来自 大模型在做什么:「看完前文再猜」靠的就是这里的注意力。
  • → 影响 Embedding:每个词进注意力之前,先要变成向量。
  • → 影响 Prompt 与采样参数:上下文窗口为什么有上限,源头在注意力的平方计算量。

自测 3 问 ​

Q1:用「开会听谁的」类比,解释注意力在做什么。

点开看答案

开会时你不会平均听所有人,而是根据当前问题重点听相关的人。注意力也一样:处理每个词时,给句子里每个词打分,相关的权重高,再按权重把信息混合起来。问题不同,关注的对象就不同。

Q2:Q、K、V 分别是什么?用图书馆类比说一下。

点开看答案

Q 是「借书需求」(我想找什么),K 是每本书的「标签」(我能提供什么),V 是书的「内容」。用 Q 和每个 K 算匹配度 → softmax 变成权重 → 按权重把各本书的 V 加起来。

Q3:为什么注意力需要位置编码?

点开看答案

注意力只看词和词之间的相关性,对顺序不敏感,「狗咬人」和「人咬狗」算出来一样。加入位置编码,模型才知道每个词排在第几个。

✅ 验收清单 ​

  • 能用「它指谁」的例子,讲清注意力权重的作用
  • 能用图书馆类比说出 Q、K、V 各自是什么
  • 能说出注意力计算的三步:点积 → softmax → 加权求和
  • 能讲清除以 √d、多头、位置编码各自解决什么问题(问题 → 方案 → 好处)
  • 能对比 RNN 和 Transformer 的两个关键区别

下一步该懂什么 ​

  • 词是怎么变成向量的?向量之间怎么算「像不像」?→ Embedding:把文字变成坐标
  • 想看原论文:Attention Is All You Need(2017),只读摘要和图 1 就够了。