文章目录
摘要
Transformer 到底是怎么做到的:在当前位置,先看完整句话,再决定自己该变成什么样?
这件事主要靠两样东西:
- Q / K / V + s o f t m a x Q / K / V + \mathrm{softmax} Q/K/V+softmax:把整句话的信息汇总成当前位置的新表示。
- 因果掩码(causal mask):让同一套注意力公式在 GPT 里变成"只能看过去"。
本文会顺着这条线讲清楚自注意力的直觉、QKV 的分工、缩放因子 d k \sqrt{d_k} dk 的作用,以及为什么多头注意力和掩码会让 Transformer 既能理解语言,也能生成语言。
1. 为什么需要自注意力
先看一个最经典的现象:
bank在"河岸"语境里是河边的岸,在"银行"语境里是金融机构。
同一个词,放进不同句子里,意思完全不同。
这说明一个词的表示,不能只看它自己,还得看上下文。
早期 RNN 的思路是把信息按顺序往后传,但句子一长,前面的信息很容易在传递中变弱、变形。Transformer 选择了另一条路:
让每个位置直接和所有位置交互,由模型自己决定该重点关注谁。
这就是自注意力的出发点。
2. Q、K、V 到底是什么
自注意力里常见的三个字母,看起来抽象,其实可以理解得很直白。
- Query( Q Q Q):当前位置"在问什么"
- Key( K K K):每个位置"是什么类型的信息"
- Value( V V V):每个位置"真正提供的内容"
你可以把它想成一个匹配过程:
我现在这个词,想从整句话里借一点信息回来,但我得先判断谁最相关。
一个具体例子
看这句话:
The animal didn't cross the street because it was too tired.
这里我们关心的是:it 指的是谁?
对于当前位置的 it 来说:
- Q u e r y Query Query 表示:我在找一个能解释"too tired"的对象。
- 句子里每个词都有自己的 K e y Key Key。
- 每个词真正带来的语义内容,是它自己的 V a l u e Value Value。
it 的 Q u e r y Query Query 去和所有 K e y Key Key 做匹配后,会发现:
- 和
animal的匹配度高 - 和
street的匹配度低
于是 s o f t m a x \mathrm{softmax} softmax 之后,animal 对应的权重更大。
最后 it 会主要吸收 animal 的 V a l u e Value Value 信息,于是它的表示里就带上了"它指的是 animal"这层上下文。
一句话概括:
Q Q Q 在问问题, K K K 决定谁该被关注, V V V 提供真正要拿走的信息。
3. Attention 公式在干什么
标准的缩放点积注意力公式是:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K ⊤ d k ) V \mathrm{Attention}(Q, K, V) = \mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V Attention(Q,K,V)=softmax(dk QK⊤)V
这条式子看起来长,其实只有四步:
第一步:计算相似度
Q K ⊤ QK^\top QK⊤
意思是:当前位置和所有位置分别有多相关。
第二步:做缩放
Q K ⊤ d k \frac{QK^\top}{\sqrt{d_k}} dk QK⊤
这里的 d k d_k dk 是 K e y Key Key 向量的维度。
为什么要除以 d k \sqrt{d_k} dk ?
因为维度越大,点积的数值通常越容易变大, s o f t m a x \mathrm{softmax} softmax 就会变得特别尖锐,注意力几乎只押在一个位置上,训练会更不稳定。
所以这个缩放因子本质上是在:
给 s o f t m a x \mathrm{softmax} softmax 降温,让注意力分布别太极端。
第三步: s o f t m a x \mathrm{softmax} softmax 归一化
s o f t m a x \mathrm{softmax} softmax 会把相似度变成权重,保证所有权重加起来等于 1 1 1。
这一步之后,你得到的不再是"分数",而是"我到底该听谁多少"。
第四步:对 V a l u e Value Value 做加权平均
最后把这些权重乘到 V V V 上,得到当前位置的新表示。
也就是说:
自注意力本质上是在做一次"按相关性加权的信息汇聚"。
4. 为什么 GPT 需要因果掩码
这里是很多人第一次真正理解"生成式模型"和"理解式模型"区别的地方。
BERT 和 GPT 的差别
- BERT 做的是理解任务,允许一个位置看到整句话的左右上下文。
- GPT 做的是生成任务,要建模的是:
p ( x t ∣ x < t ) p(x_t \mid x_{<t}) p(xt∣x<t)
也就是:只能根据前面的词预测下一个词。
如果在训练时,当前位置还能看到未来词,那就等于把答案泄露给模型了。
这当然不行。
因果掩码怎么做
做法很简单:
- 在注意力分数矩阵里
- 把未来位置,也就是 j > t j > t j>t 的部分,填成 − ∞ -\infty −∞
- s o f t m a x \mathrm{softmax} softmax 之后,这些位置的权重就会变成 0 0 0
这样一来,模型虽然"看得见"整个矩阵结构,但实际上:
未来的信息在计算上被彻底屏蔽了。
最重要的一点是:
Attention 的公式没变,变的是"允许谁参与计算"。
所以,BERT 和 GPT 可以共享同一类注意力机制,但因为掩码不同,最终学到的是完全不同的建模方式。
5. 多头注意力为什么有用
如果只有一个注意力头,模型每次只能用一种方式看问题。
但语言里的关系不止一种:
- 有的关注语法
- 有的关注指代
- 有的关注语义
- 有的关注长距离依赖
多头注意力的做法是:
- 把隐藏维度切成几份
- 每一份独立做一套注意力
- 最后把结果拼接起来
这样模型就可以同时从多个角度理解同一句话。
可以把它理解成
不是一个人独自判断"谁重要",而是几位专家各看一遍:
- 一个专家看语法
- 一个专家看语义
- 一个专家看指代关系
最后把大家的意见综合起来。
多头注意力的价值就在这里:
它让模型不只学一种相关性,而是并行学习多种关系模式。
6. 看注意力权重要注意什么
很多工具都能把注意力权重画成热力图,看起来很直观。
但这里有一个常见误区:
注意力权重不是语法树,也不等于人类可解释的最终答案。
它只是模型内部的一种统计信号,说明某些位置在当前计算中更受关注。
它可以帮助我们观察模型,但不能简单地把它当成"模型真正理解了什么"的唯一证据。
7. 一张图就能记住的核心逻辑
如果把整篇内容压缩成一句话,那就是:
自注意力是在全句范围内按相关性重新分配信息,而因果掩码决定模型能不能看未来。
再展开一点,就是:
- Q Q Q:当前位置在问什么
- K K K:谁和这个问题更匹配
- V V V:匹配成功后拿走什么信息
- s o f t m a x \mathrm{softmax} softmax:把匹配分数变成权重
- d k \sqrt{d_k} dk:防止注意力过于尖锐
- m a s k \mathrm{mask} mask:决定能看过去、还是能看全句
- 多头:让模型同时用多种视角理解句子
Transformer 的聪明之处,不在于它"记住了句子",而在于它学会了:
在每个位置上,重新判断整句话里谁最重要。
而 GPT 和 BERT 之所以走向不同方向,只是因为它们在同一套注意力公式上,分别加上了不同的"观看权限"。