第22讲 · EECS 189:Transformer(下)
UC Berkeley EECS 189/289A《机器学习导论》2026 春季 · 课堂实录重构
| 原始标题 | Transformers and Attention (Part 2) — Self-Attention, Multi-Head Attention, Positional Encoding |
| 课堂进度提示 | 本讲从幻灯片 60(Content-based attention) 继续,讲到位置编码;幻灯片 117–119 未讲完,置于文末附录。 |
| 视频 | https://www.youtube.com/watch?v=syp1pSf_DYY |
| 课程主页 | https://eecs189.org/sp26/ |
| 官方讲义/笔记(Lecture 22) | Google Drive PDF |
| 图片来源 | 书中幻灯片插图为官方 PDF 高清渲染图 |
对应讲次:第22讲(UC Berkeley EECS 189 机器学习导论)
制作模型:deepseek-flash(coding-agent / pi;据 ~/.pi/agent/settings.json)
说明:课程材料版权归 UC Berkeley 及授课教师所有,本书仅供学习
本讲路线图
(参考时间: 00:00)
本讲是注意力与 Transformer 的核心。我们从基于内容的注意力出发,逐步构建 Self-Attention → 多头注意力 → Transformer 层 → 位置编码:
- 内容寻址注意力:Query / Key / Value、内积检索、softmax 行归一化;
- 自注意力:每个 token 同时充当 Q/K/V;矩阵形式
softmax(QKᵀ/√d)·V;PyTorch 实现; - 上下文化:
it指代谁、bank指河岸还是银行; - 复杂度:参数 $\mathcal{O}(d^2)$ 与上下文无关,但计算 $\mathcal{O}(n^2)$;
- 软查找表:注意力 ≈ 可微的字典 / hashmap;
- 多头注意力、Transformer 层(残差 + LayerNorm + MLP);
- 位置编码:注意力本身对顺序不变,必须显式注入位置。
📷 标题页
回到原视频 (01:12:07)
📷 (概述)
回到原视频 (01:13:20)
📷 基于内容的寻址注意力
回到原视频 (01:14:33)
📷 Hard max 与 Softmax
回到原视频 (01:15:46)
📷 基于内容的寻址注意力
回到原视频 (01:16:59)
📷 经典的 IR 内积检索
回到原视频 (01:18:12)
📷 基于内容的寻址注意力
回到原视频 (01:19:25)
📷 基于内容的寻址注意力
回到原视频 (01:20:38)
📷 基于内容的寻址注意力:Keys 与 Values
回到原视频 (01:21:51)
📷 注意力是一个层:$W_f,W_g$ 是参数
回到原视频 (01:23:04)
📷 $x_1$(一)
回到原视频 (01:24:17)
📷 $x_1$(二)
回到原视频 (01:25:30)
📷 计算 $z_1$
回到原视频 (01:26:43)
📷 $x_1$(三)
回到原视频 (01:27:56)
📷 加入 Values:矩阵把 $x_i$ 映到 $v_i$
回到原视频 (01:29:09)
📷 终于完成:矩阵形式的自注意力
回到原视频 (01:30:22)
📷 自注意力总结
回到原视频 (01:31:35)
一、内容寻址注意力
(参考时间: 00:00)
信息检索(IR)的经典工具 = 内积检索:把每篇文档编码成 key 向量,把问题编码成 query 向量,算 $Q\cdot K_i$。由三角恒等式,$Q\cdot K_i=\lVert Q\rVert\lVert K_i\rVert\cos\theta$——所以(归一化后)内积 = 余弦相似度。
- 内积 = 一个向量在另一个上的投影长度;
- 可以为 0(正交)甚至为负:负内积意味着更不相似;
- 重要警告:不归一化时,模长大的向量会对所有 query 都"更相似"——所以要小心尺度。
注意力 = 软检索:
$$ \text{score}_i = Q^\top x_i,\qquad p_i=\mathrm{softmax}(\text{score})_i,\qquad z=\sum_i p_i\,x_i $$
软 vs 硬:hard max 是 one-hot(argmax),softmax 是"软化版"——把大值放大、小值压小($e^{-50}$ 几乎为 0)。为什么一切都要"软"?因为软的操作可微、能反向传播。
对矩阵做 softmax = 逐行 softmax(这是后面自注意力的关键操作)。
📷 Softmax 的作用
回到原视频 (01:32:48)
📷 翻译中的挑战(一)
回到原视频 (01:34:01)
📷 翻译中的挑战(二)
回到原视频 (01:35:14)
📷 通过自注意力解决该挑战
回到原视频 (01:36:27)
二、自注意力(Self-Attention)
2.1 基本思想
(参考时间: 00:17)
自注意力 = 把每个输入 token 同时当作 Query、Key 和 Value。对第 $i$ 个 token:
- Query $q_i=W_Q x_i$;
- Keys $k_j=W_K x_j$(对所有 $j$,包括 $j=i$);
- Values $v_j=W_V x_j$;
- $p_{ij}=\mathrm{softmax}_j(q_i^\top k_j)$,$y_i=\sum_j p_{ij} v_j$。
所以 $y_1$ 是所有输入向量的线性组合,权重由 $x_1$ 与各 key 的相似度决定($x_1$ 既是 query 又是 key 之一 ⇒ "self-attention")。
关键性质:
- 支持任意数量的 token(5 个、5 万个都行)——对 GPT 来说,你写 5 个字或 50 个字用的是同一套机制;
- 对 token 顺序不变(permutation-invariant)——这是优点(集合任务)也是缺点(文本/图像顺序有意义)⇒ 后面必须加位置编码。
三个可学习矩阵:$W_Q, W_K, W_V$(每个 $d\times d$)。在 Qwen/GPT 等模型里,每个 transformer block 的每个注意力层都有这些矩阵,可以直接下载查看。
📷 需要包含上下文
回到原视频 (01:37:40)
📷 从 Token 嵌入开始
回到原视频 (01:38:53)
📷 Transformer 层的基本设置
回到原视频 (01:40:06)
📷 融入其他 Token 的上下文
回到原视频 (01:41:19)
📷 并非所有上下文都相关
回到原视频 (01:42:32)
📷 构造 Keys 与 Queries
回到原视频 (01:43:45)
📷 $V_1$
回到原视频 (01:44:58)
📷 为什么需要分开的 Key 与 Query?
回到原视频 (01:46:11)
📷 $Q_2$
回到原视频 (01:47:24)
📷 $K_3$(一)
回到原视频 (01:48:37)
📷 $K_3$(二)
回到原视频 (01:49:50)
📷 $K_3$(三)
回到原视频 (01:51:03)
📷 自注意力层
回到原视频 (01:52:16)
2.2 矩阵形式与实现
把 $n$ 个 token 堆成矩阵 $X\in\mathbb{R}^{n\times d}$(每一行是一个 token),则
$$ Q=XW_Q,\quad K=XW_K,\quad V=XW_V,\qquad \mathrm{Attn}(X)=\mathrm{softmax}\!\Big(\frac{QK^\top}{\sqrt d}\Big)V $$
- $QK^\top$ 一次性给出所有 token 两两的内积($n\times n$);
- 逐行 softmax 得到注意力矩阵 $A$($A_{ij}$ = token $i$ 对 token $j$ 的注意力);
- $A V$ 是对 value 行的线性组合,输出仍为 $n\times d$(token 数不变、维度不变)。
- $\sqrt d$ 是尺度缩放:避免内积方差过大导致 softmax 饱和(实践中重要)。
PyTorch 实现极简(面试常考):
def self_attention(q, k, v):
d = q.shape[-1]
scores = q @ k.transpose(-2, -1) / d**0.5 # n×n
attn = torch.softmax(scores, dim=-1) # 逐行 softmax
return attn @ v
为什么 Key 和 Query 要分开? 因为检索是非对称的:「swam 有多关注 river」和「river 有多关注 swam」不应是同一个关系。两套矩阵让网络学到更丰富的关联。
📷 参数与计算复杂度
回到原视频 (01:53:29)
2.3 上下文化(contextualization)
例子 1:The animal didn't cross the street because it was too tired. —— it 指 animal;换成 ...because it was too wide. —— it 指 street。只有看完整个句子才知道。自注意力后,it 的向量不再是"通用的 it",而是混合了 animal / street 的上下文嵌入。可视化注意力矩阵 $A$($n\times n$)就能看到 it 把大权重放在 animal 上。
例子 2:I swam across the river to get to the other bank. —— bank 初始可能联想到银行,上下文后变成"约 0.9 倍的河岸 + 0.1 倍的银行"。
图像同理:把图像切块作为 token,上下文化后每个块能"知道"这是孩子脸、消防员制服等。
📷 注意力作为软查找表(一)
回到原视频 (01:54:42)
📷 注意力作为软查找表(二)
回到原视频 (01:55:55)
📷 注意力作为软查找表(三)
回到原视频 (01:57:08)
📷 注意力作为软查找表(四)
回到原视频 (01:58:21)
2.4 注意力 = 软查找表
把 Python 字典 {A: 51, B: 42, C: ...} 一般化:
- 字典要求精确匹配(hashmap 平均常数查询);
- 软字典:key 变成向量,匹配用内积相似度,返回的是多个 value 的加权组合;
- 例:key 向量 $[1,0,0],[0,1,0],[0,0,1]$,query $[0,1,0]$ ⇒ 输出恰好是第二个 value(42);query $[1,1,0]$ ⇒ 50% 的 value1 + 50% 的 value2。
- "软"保证可微 ⇒ 可反向传播。注意力 = 先经 $W_Q/W_K/W_V$ 变换,再做软查找。
📷 多头注意力
回到原视频 (01:59:34)
三、多头注意力与 Transformer 层
3.1 多头注意力(Multi-Head Attention)
做法:并行复制 $h$ 套 $(W_Q,W_K,W_V)$(称为 $h$ 个 head),各自做一次自注意力,得到 $h$ 个输出,拼接后再过一个线性层。
- 参数从 $3d^2$ 变为 $3h\,d^2$;
- 不同 head 可以关注不同方面(如一个关注运动、一个关注颜色),但可解释性不强,没人完全弄清 GPT 各 head 在干什么;
- 输出仍是每个 token 一个 $d$ 维向量。
📷 多头注意力的替代方案
回到原视频 (02:00:47)
📷 Transformer 层
回到原视频 (02:02:00)
📷 展开 Transformer 层
回到原视频 (02:03:13)
📷 残差连接 +
回到原视频 (02:04:26)
3.2 Transformer 层(block)
一个 Transformer 层 = 多头自注意力 + MLP,每部分都带残差连接 + LayerNorm:
x ← x + MultiHeadAttention(LayerNorm(x))
x ← x + MLP(LayerNorm(x)) # MLP = 两层线性 + ReLU
要点:
- MLP 是唯一的非线性来源——否则整个注意力只是线性混合;MLP 是 $d\times d$,对每个 token 独立作用;
- 参数共享:同一套 MLP 作用于所有 token(如 32000 个 token 各自独立过同一个 MLP);
- 唯一的跨 token 交互就是自注意力,且它只做线性混合;
- GPT 等模型就是几十上百个这样的 block 堆起来;
- 注意力参数不依赖 token 数 ⇒ 可以把 16K 上下文的模型外推到 100 万上下文(但计算量随之爆炸)。
提问中提到的 post-LN vs pre-LN:残差 + LayerNorm 的位置(层后还是层前)会影响训练稳定性;原始 Transformer 用 post-LN,现代大模型多用 pre-LN。
📷 读取 Transformer 的输出(一)
回到原视频 (02:05:39)
📷 读取 Transformer 的输出(二)
回到原视频 (02:06:52)
📷 读取 Transformer 的输出(三)
回到原视频 (02:08:05)
📷 读取 Transformer 的输出(四)
回到原视频 (02:09:18)
📷 Transformer 与 Token 顺序
回到原视频 (02:10:31)
📷 图像与文本中的 Token 位置
回到原视频 (02:11:44)
📷 「The」
回到原视频 (02:12:57)
📷 「The food was」
回到原视频 (02:14:10)
四、位置编码(Positional Encoding)
(参考时间: 01:07)
问题:自注意力对顺序不变——交换 token 顺序,输出完全一样。但 the food was good not bad at all 换序就变意义;图像里"右边的机器人是什么颜色"也需要"左/右"的概念。
解决:把位置信息注入输入特征——给每个 token 的嵌入加上(或拼接)位置编码。
好位置编码的要求:
- 唯一性:每个位置有独特表示;
- 相对位置可查询:模型能方便地推断"相距 $k$"的关系。
两种主流方案:
- 学习式位置嵌入(learned positional embedding):每个位置一个可训练向量(如 GPT 常用);
- 正弦位置编码(sinusoidal):用不同频率的 $\sin/\cos$ 生成,可外推到训练时没见过的更长序列(原始 Transformer 用)。
简单的"位置 = 1,2,3..."直接加进一个坐标往往效果不好;如何设计位置编码仍是研究话题。
📷 位置编码
回到原视频 (02:15:23)
📷 设计位置嵌入
回到原视频 (02:16:36)
📷 学习式位置嵌入
回到原视频 (02:17:49)
📷 正弦位置编码
回到原视频 (02:19:02)
📷 查询相对位置
回到原视频 (02:20:15)
附录 A:本讲未讲完的幻灯片(幻灯片 117–119)
因课堂时间结束,以下幻灯片未讲到,按惯例置于附录。
🖼️ 编码器 Transformer
🖼️ 编码器
🖼️ 第二十一讲
附录 B:上一讲内容回顾(幻灯片 1–59)
本讲课件的前 59 页与第二十一讲相同(Transformer 背景、MLP/CNN、RNN 与注意力动机),课堂上未重复展示,此处按惯例列出。
🖼️ EECS 189/289
🖼️ (概述)
🖼️ (概述)
🖼️ NeurIPS 2017(一)
🖼️ NeurIPS 2017(二)
🖼️ 谁发明了注意力?
🖼️ 变革性的架构思想
🖼️ 深度学习就是特征变换
🖼️ MLP 网络
🖼️ 用于像素的 MLP(一)
🖼️ 用于像素的 MLP(二)
🖼️ 用于像素的 MLP(三)
🖼️ 用于像素的 MLP(四)
🖼️ 用于像素的 MLP(五)
🖼️ 卷积网络(一)
🖼️ 卷积网络(二)
🖼️ 卷积网络(三)
🖼️ 卷积网络(四)
🖼️ 卷积网络(五)
🖼️ 卷积网络(六)
🖼️ 卷积网络(七)
🖼️ 卷积网络(八)
🖼️ 卷积网络(九)
🖼️ 卷积网络(十)
🖼️ 卷积网络(十一)
🖼️ 卷积网络(十二)
🖼️ 这张图里是什么?
🖼️ 消防员(蜘蛛侠)
🖼️ 卷积感受野(一)
🖼️ 卷积感受野(二)
🖼️ 卷积网络(十三)
🖼️ 解决方案:Transformer 架构
🖼️ 路线图
🖼️ 把文档表示为向量
🖼️ 文档到向量
🖼️ 路线图
🖼️ 用词袋表示文档
🖼️ TF-IDF
🖼️ 什么是 RNN(一)
🖼️ 什么是 RNN(二)
🖼️ 什么是 RNN(三)
🖼️ 基线:用于描述的 RNN(一)
🖼️ 基线:用于描述的 RNN(二)
🖼️ CNN 产生特征表示
🖼️ 基线:用于描述的 RNN(三)
🖼️ 基线:用于描述的 RNN(四)
🖼️ 基线:用于描述的 RNN(五)
🖼️ 加入软注意力(一)
🖼️ 加入软注意力(二)
🖼️ 软注意力 vs 硬注意力(一)
🖼️ 软注意力 vs 硬注意力(二)
🖼️ 软注意力 vs 硬注意力(三)
🖼️ 软注意力 vs 硬注意力(四)
🖼️ 可解释的注意力(一)
🖼️ 可解释的注意力(二)
🖼️ 用于翻译的软注意力
🖼️ 软注意力用于一切
🖼️ 基于位置的寻址注意力
🖼️ (上一讲讲到此处)
总结(Takeaways)
- 内容寻址注意力:用 Query/Key 内积 算相似度,softmax 转分布,加权组合 Value。
- 自注意力:每个 token 同时充当 Q/K/V;矩阵形式 $\mathrm{softmax}(QK^\top/\sqrt d)V$;输出同维度、同 token 数,且是输入的线性组合。
- 三个可学习矩阵 $W_Q,W_K,W_V$;Key 与 Query 分开是为了表达非对称的检索关系。
- 复杂度:参数 $\mathcal{O}(d^2)$(与 token 数无关),计算 $\mathcal{O}(n^2)$(与上下文长度平方相关)——催生 FlashAttention 等加速。
- 注意力 = 可微的软查找表 / hashmap。
- 多头注意力 并行多套 Q/K/V 关注不同方面;Transformer 层 = 多头注意力 + MLP(+ 残差 + LayerNorm),MLP 是唯一非线性、逐 token 独立。
- 位置编码 弥补注意力的顺序不变性(学习式 / 正弦式)。
附:参考与延伸阅读
| 主题 | 链接 |
|---|---|
| 本讲视频 | https://www.youtube.com/watch?v=syp1pSf_DYY |
| 课程主页 | https://eecs189.org/sp26/ |
| 官方讲义/笔记(Lecture 22) | Google Drive PDF |
| Vaswani et al., Attention Is All You Need (2017) | https://arxiv.org/abs/1706.03762 |
| Dao et al., FlashAttention | 注意力加速 · https://arxiv.org/abs/2205.14135 |
版权说明:本讲视频、幻灯片与课程材料版权归 UC Berkeley EECS 189/289A 课程团队所有。本书为课堂内容的学习性中文重构,仅供学习交流。