第 2 课编程与作业说明
主题
Attention 与 Transformer:从注意力直觉到手写实现
对应材料
- 作业说明:
ai-model/2/2-prog/5-CSE447_517_Win24_A2.pdf
- Notebook 1:
ai-model/2/2-prog/5-A2S1-attention.ipynb
- Notebook 2:
ai-model/2/2-prog/5-A2S2-attention.ipynb
- 本地数据包:
ai-model/2/2-prog/N-gram.zip
- 本地代码包:
ai-model/2/2-prog/mingpt-cse447.zip
致谢
这组材料主要来自 Yejin Choi 老师课程 CSE 517/447 的 Assignment 2。
作业说明中也注明,这份作业由 Yegor Kuznetsov、Liwei Jiang、Jaehun Jung 设计,并得到多位助教和同学的反馈支持。这里一并致谢。
一、这组材料在做什么
如果说第 1 课的重点是“神经网络为什么能训练”,那么第 2 课这组编程材料的重点就是:
- 先真正建立对 attention 的直觉。
- 再从零实现 multi-head self-attention。
- 最后把 attention 放回一个最小 Transformer 实现中验证。
这组材料不是单一 notebook,而是一条递进路线:
- A2S1:理解 attention 的行为
- A2S2:手写 attention 与 mini Transformer
二、整体学习路线
第一步:先理解 Attention 在“做什么”
使用:5-A2S1-attention.ipynb
这份 notebook 不是在训练模型,而是在做一个非常重要的认知训练:
- attention 可以“选择”某个 value
- attention 可以“复制”输入中的某些信息
- attention 可以“平均”或“聚合”多个 value
- 改变 key,会如何改变输出
这部分的目标是让你不再把 attention 只看成一条公式,而是把它看成一种可控制的信息路由机制。
第二步:自己实现 Attention
使用:5-A2S2-attention.ipynb
这份 notebook 会让你一步一步补出:
QK^T 相似度计算
- attention scaling
- softmax
- 输出加权求和
- causal mask
- multi-head split / merge
- 最终的
self_attention() 函数
这部分的目标是把第 2 课 PPT 中的注意力公式真正落到代码实现。
补充说明:
A2S2 notebook 中原本会在线下载 N-gram.zip 和 mingpt-cse447。
- 在本课程目录中,这两个文件已经准备好本地副本,可直接使用:
ai-model/2/2-prog/N-gram.zip
ai-model/2/2-prog/mingpt-cse447.zip
- 如果网络不稳定,优先直接下载或解压本地文件,不必重复在线拉取。
三、各 notebook 应该怎样使用
1. A2S1:理解注意力
你会做什么
- 构造 query 向量 / query 矩阵
- 让 attention 精确“选中”某个 value
- 让 attention 得到恒等映射
- 让 attention 做平均
- 观察只改一个 key 向量会怎样改变结果
这份 notebook 最重要的收获
- attention 不是神秘黑箱,而是“基于相似度的加权取信息”。
- query / key 的关系决定“看谁”。
- value 决定“拿什么”。
- 输出既可以像检索,也可以像聚合。
建议课堂做法
- 先自己猜一个 query 应该长什么样
- 再跑
check_query
- 最后总结:这个 query 为什么有效
容易忽略的问题
- 这份题不是在考“背公式”,而是在考你是否理解 attention 内部机制
- query 的设计可以是 ad hoc 的,但解释必须体现 attention 的工作原理
2. A2S2:从零实现 Attention
你会做什么
你要补全的核心函数包括:
pairwise_similarities
attn_scaled
attn_softmax
compute_outputs
make_causal_mask
apply_causal_mask
split_heads
merge_heads
self_attention
这份 notebook 最重要的收获
- 你会真正理解 attention 的每一步 tensor 变换。
- 你会看到 causal mask 为什么是语言模型必需的。
- 你会弄清多头注意力不是“多做几次 attention”这么简单,而是和 shape 重排强相关。
- 你会第一次认真建立 multi-head attention 的实现直觉。
建议完成顺序
- 先实现最基本的 single-head attention
- 通过测试 1
- 再加 causal mask
- 通过测试 2
- 最后做 multi-head split / merge
- 通过测试 3
本部分重点注意
- 不要跳着写
- 每次只做一个 step,然后立刻跑测试
- 最重要的是搞清楚 shape
你要不断问自己:
- 现在
Q、K、V 的 shape 是什么?
- attention matrix 的 shape 是什么?
- split heads 之后多出来的 head 维度在哪里?
- merge 之后怎么回到原来的 embedding 维度?
容易出错的地方
transpose 的维度写错
- softmax 维度写错
- causal mask 方向反了
- split / merge head 时 reshape 顺序不对
四、建议学生的实际学习顺序
如果你是第一次学 attention / Transformer 编程,推荐按这个顺序:
- 先做 A2S1
- 再做 A2S2
- 在理解本课 attention 实现后,再去第 3 课看 Hugging Face 微调材料
五、建议学生重点记录的问题
- attention 为什么既像“检索”,又像“聚合”?
- causal mask 为什么是语言模型里不可缺少的一步?
- multi-head attention 到底比 single-head 多了什么能力?
- 为什么实现 attention 时最容易出错的是 shape,而不是公式本身?
- 当 A2S2 开始接入 mini Transformer 训练时,数据包、代码包和 notebook 分别扮演什么角色?
六、建议提交内容
如果你按课程作业方式来收,建议学生至少提交:
- 两份完成后的 notebook 或导出的
.py
- 一份简短 write-up
- 至少说明以下内容:
- A2S1 中 attention 的“选择 / 平均”是怎么实现的
- A2S2 中你对 causal mask 和 multi-head 的理解
七、这组材料真正希望你带走什么
- attention 不是一句公式,而是一种信息选择与聚合机制。
- Transformer 的关键实现细节,最终都落在 tensor shape、mask 和矩阵运算上。
- 从零实现 attention 能帮助你真正看懂研究代码和工程代码。
- 当你能把 A2S1、A2S2 连起来看时,才真正从“会背 attention”走向“会实现 attention”。