🔍 从「他指谁」到注意力机制:Transformer最核心的动作是什么(QKV/Softmax/Multi-head/Causal Mask 全拆解)
> 你读完一句话,知道「他」指的是谁。这个动作在Transformer里叫Attention。它不是魔法,只是让模型在做选择时,能看到所有选项。
---
📋 核心速览
| 概念 | 一句话解释 |
|---|---|
| 指代消解 | 确定代词/名词短语指向的实体(「他」= 员工?老板?) |
| 注意力 | 让模型在理解每个词时,能动态地「参考」句子中其他词 |
| Q/K/V | 查询(Query)→ 钥匙(Key)→ 价值(Value),「找钥匙→开锁→搬内容」 |
| Softmax | 把「路宽」分数变成「注意力预算」(概率分布) |
| √d_k | 缩放因子,防止点积过大导致Softmax梯度消失 |
| Multi-head | 多个注意力头并行,每个头关注不同的语义关系 |
| Causal Mask | 训练时遮住未来信息,让模型只能「从左往右」看 |
🧠 第一部分:为什么「他指谁」这么难
语言学的千年难题
"老板告诉员工他必须加班。"
这个「他」指向谁?
对人类来说,答案是直觉性的:员工。因为老板不太可能对自己说"你必须加班"。但计算机面对这个句子时,它看到的是:
[老板] [告诉] [员工] [他] [必须] [加班]
没有箭头,没有标注,没有先验知识。只有六个词。
这就是指代消解(Coreference Resolution)——NLP中最古老、最顽固的问题之一。
传统方法的困境
规则方法(1980s-2000s):
- 霍布斯朴素算法:代词通常指代最近的主语
- 但 "老板告诉员工他必须加班" 中,最近的主语是"员工",碰巧对了。但换一句:"员工告诉老板他不想干了"——最近主语是"老板",但"他"应该指员工。
- 手工设计特征:词性、距离、句法结构、语义角色
- 需要大量标注数据,且特征工程永无止境
- 序列模型,理论上可以学习长距离依赖
- 但实践上,超过10-15个词的依赖就衰减了
- "老板告诉员工……(中间20个词)……他必须加班"——LSTM可能早就忘了"员工"是谁
Transformer的破局
2017年,Vaswani等人发表《Attention Is All You Need》。他们提出的不是"更好的序列模型",而是彻底抛弃序列假设。
核心思想:
> 每个词在理解自己时,直接「看到」句子中所有其他词。不是通过记忆,而是通过计算。
---
🎯 第二部分:注意力机制的三步动作
物理比喻:找钥匙→开锁→搬东西
想象你在一个巨大的图书馆里,要找一本书。你的动作是:
1. Query(查询):你问自己"我要找什么?"——比如"我要找关于'加班'的书" 2. Key(钥匙):你查看每个书架上的标签——"管理"、"劳动法"、"员工权益"…… 3. Value(价值):你打开最匹配的书架,取出里面的书
Attention的Q/K/V就是这个过程的数学实现。
第一步:Q·K^T —— 计算「路宽」
Attention(Q, K, V) = softmax(QK^T / √d_k) V
↑
这一步
每个词在进入模型时,会被转换成三个向量:
- Q(Query):"我关心什么?"
- K(Key):"我是什么?"
- V(Value):"我携带什么信息?"
当模型理解「他」时:
- 「他」的Q向量 ≈ "我在找一个男性人名/名词"
- 「老板」的K向量 ≈ "我是一个男性人名,表示雇主"
- 「员工」的K向量 ≈ "我是一个男性人名,表示雇员"
- 「他」·「老板」= 高(都是男性人名)
- 「他」·「员工」= 更高(都是男性人名,且"员工"在句法上更可能是"他"的指代对象)
为什么除以√d_k?
当Q和K的维度d_k很大时(比如64、128),点积结果的方差会随d_k线性增长。这意味着有些点积会变得非常大。
Softmax函数对大的输入值很敏感:
- 如果某个点积是100,其他是1,Softmax会把几乎所有概率分给100的那个
- 结果是「注意力」变成了「独注」——只看一个词,忽略其他
第二步:Softmax —— 把「路宽」变成「预算」
Softmax做两件事: 1. 指数化:放大差异(路宽10倍的词,得到的注意力是e^10倍) 2. 归一化:所有注意力权重加起来 = 1
结果是:每个词获得了一个「注意力预算」——百分比形式的相关度。
在 "老板告诉员工他必须加班" 中:
- 「他」对「员工」的注意力 ≈ 70%
- 「他」对「老板」的注意力 ≈ 20%
- 「他」对「告诉」的注意力 ≈ 5%
- 其他词 ≈ 5%
第三步:V —— 真正「搬」内容的那一步
这一步是最被低估的。
很多人理解注意力时停在Softmax:"模型给每个词打了分"。
但打分本身不产生输出。V才是真正搬运内容的那一步。
Attention(Q, K, V) = softmax(QK^T / √d_k) V
↑
这一步
Softmax输出的是一组权重(比如[0.7, 0.2, 0.05, 0.05])。V是每个词的「价值向量」。
最终的输出 = 0.7 × V_员工 + 0.2 × V_老板 + 0.05 × V_告诉 + 0.05 × V_其他
这是什么?这是加权平均——但不是原始词的加权平均,而是词语义内容的加权平均。
> 注意力不是「看」,而是「搬」——把其他词的语义内容,搬到当前词的理解里。
---
🎭 第三部分:为什么一个头不够——Multi-Head Attention
一个注意力头的局限
单个注意力头只能学到一种「关注模式」。
比如在一个头里,模型可能学到:
- 「他」主要关注「员工」
- 这是句法层面的指代关系
- 语义层面:「加班」和「劳动法」相关
- 情感层面:「不想」和「拒绝」相关
- 逻辑层面:「因为」和「所以」相关
Multi-Head:并行视角
Transformer把Q/K/V分成h组(比如8组、12组、96组),每组独立计算注意力,最后拼接。
| 头 | 可能学到的模式 |
|---|---|
| 头1 | 句法指代(「他」→「员工」) |
| 头2 | 语义关联(「加班」→「劳动法」) |
| 头3 | 情感极性(「不想」→「负面」) |
| 头4 | 逻辑连接(「因为」→「所以」) |
| 头5-8 | 更抽象的模式(如位置编码、语法角色) |
GPT-3有96层 × 96头 = 9216个注意力头。每一层处理后的表示都更丰富。
96层里的「他」怎么走
在深层Transformer中,一个词的语义不是一步到位的,而是层层迭代的:
- Layer 1-6:句法关系(谁做了什么)
- Layer 7-24:语义关系(词与词的主题关联)
- Layer 25-48:语境关系(段落级别的指代、指称)
- Layer 49-72:抽象关系(概念、推理、隐喻)
- Layer 73-96:全局关系(文档结构、作者意图、风格)
---
🚧 第四部分:Causal Mask——为什么右上角是负无穷
语言模型的本质问题
GPT不是双向理解(像BERT),而是单向生成(从左到右)。
当你预测下一个词时,你不能「偷看」后面的词。否则:
- 训练时:模型作弊,记住了未来信息
- 推理时:没有未来信息可用,模型无法工作
Causal Mask的实现
在训练时,注意力矩阵的右上角被填成负无穷(或非常大的负数):
老 板 告 诉 员 工 他 必 须 加 班
老 [0 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞]
板 [0 0 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞]
告 [0 0 0 -∞ -∞ -∞ -∞ -∞ -∞ -∞ -∞]
... [...]
班 [0 0 0 0 0 0 0 0 0 0 0]
负无穷经过Softmax后变成0,意味着:每个词只能「关注」它自己和它左边的词,不能关注右边的词。
这是「因果」的含义:未来的信息不能因果地影响现在。
为什么叫"mask"?
因为这个操作像给注意力矩阵「戴面具」——遮住一半。左上角(过去)可见,右上角(未来)被遮。
代码实现(来自nanoGPT):
mask = torch.triu(torch.ones(T, T), diagonal=1).bool()
attn = attn.masked_fill(mask, float('-inf'))
torch.triu 生成上三角矩阵, diagonal=1 不包括对角线(自己可以看自己)。
---
⚠️ 第五部分:注意力不是全部
用户的素材在最后强调了一句话:
> 没有词向量表 / 没有前馈网络 / 没有训练数据,那几个W矩阵永远学不出来。
这是最重要的提醒。注意力机制只是Transformer的一个组件,不是全部。
完整的Transformer块
输入 → [词嵌入 + 位置编码] → [层归一化]
→ [Multi-Head Attention] → [残差连接]
→ [层归一化]
→ [前馈网络(FFN)] → [残差连接]
→ 输出(下一层的输入)
每个组件的作用
| 组件 | 作用 | 如果没有它 |
|---|---|---|
| 词嵌入表 | 把离散词映射到连续向量 | 模型无法处理文字,只能处理数字 |
| 位置编码 | 告诉模型词的位置 | 模型不知道"老板"在"员工"前面还是后面 |
| Attention | 让词之间建立动态关系 | 每个词孤立理解,无法做指代消解 |
| FFN | 对每个词独立做非线性变换 | 模型无法学习复杂的局部模式(如语法规则) |
| 残差连接 | 让信息可以绕过某些层直接传递 | 深层模型训练时梯度消失 |
| 层归一化 | 稳定训练,防止数值爆炸 | 训练不稳定,模型学不到东西 |
| 训练数据 | 提供学习材料 | 所有参数都是随机初始化,没有任何语言能力 |
一个常见的误解
很多人以为GPT是" Attention 在理解语言"。实际上:
- Attention 只是选择看哪里
- FFN 才是真正做理解的(把词向量从一种表示变换到另一种表示)
- 训练数据决定了理解什么
---
🌌 结语:注意力是「选择」的数学
回到开头的句子:
"老板告诉员工他必须加班。"
当你理解这个句子时,你的大脑做了一件Transformer用数学模拟的事:
1. 你看到了「他」 2. 你自动「扫描」了句子中所有其他词 3. 你给每个词打了一个「相关性分数」 4. 你把分数最高的那个词(员工)的语义内容,「搬」到了「他」的理解里 5. 于是你知道「他」= 员工
Transformer的注意力机制,不是魔法。它只是把人类语言理解中最核心的一步——选择性地关注相关信息——用矩阵运算实现了。
> Attention Is All You Need 的标题不是夸张。它说的是:只要你能让模型「选择性地关注」,你就解决了语言理解的核心问题。其他组件(FFN、残差、层归一化)都是让这个过程「能训练」「能工作」的工程手段。
但注意力本身不是智能。它只是让智能有了「聚焦」的能力。
真正的智能,来自那些W矩阵在数十亿数据中学到的模式。注意力只是让这些模式能够被动态地、上下文地调用。
所以,当你下次看到那个公式:
Attention(Q, K, V) = softmax(QK^T / √d_k) V
不要只把它当作数学。把它看作一个问题的答案:
> 「在这个句子中,我应该关注谁?」
而答案,就是注意力权重。
---
参考论文/来源:
- [1] Vaswani et al. (2017). Attention Is All You Need. NeurIPS. arXiv:1706.03762
- [2] Devlin et al. (2019). BERT: Pre-training of Deep Bidirectional Transformers. NAACL. arXiv:1810.04805
- [3] OpenAI (2020). Language Models are Few-Shot Learners (GPT-3). NeurIPS. arXiv:2005.14165
- [4] Anthropic (2021). A Mathematical Framework for Transformer Circuits. https://transformer-circuits.pub/2021/framework/
- [5] Karpathy (2022). nanoGPT. https://github.com/karpathy/nanoGPT
- [6] Hobbs (1978). Resolving Pronoun References. Lingua.
- [7] Stanford CS224n (2022). Coreference Resolution. https://web.stanford.edu/class/cs224n/
🌟 智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
🎁 领取 2000万 Tokens