30u30 中文导读 / 30 天目录 / 第 13 天

第 13 天 · 去掉循环,只留注意力:大模型的底座

第 3 单元Attention Is All You NeedAshish Vaswani, Noam Shazeer, Niki Parmar et al.NeurIPS 2017 · 2017
这是导读,不是翻译。先用 10 分钟拿到这篇论文的思想地图,再去读 原论文 →,去原仓库的 13_attention/ 目录 → 动手写代码。
给孩子讲:这一天有 10 岁孩子能听懂的讲义,带猜字游戏和动手活动,可打印。打开儿童讲义 → · PDF 简体 · PDF 繁體

一句话

论文提出 Transformer:编码器和解码器只用注意力层和前馈层,不用循环,也不用卷积。它在 WMT 2014 英德、英法翻译上超过当时最好的模型,训练时间短得多。今天几乎所有大语言模型都建在这个结构上。

论文讲了什么

问题。2017 年,机器翻译的主流是 RNN 编码器-解码器加注意力。RNN 必须逐词计算,第 t 步要等第 t-1 步算完,GPU 的并行能力用不上。两个相距很远的词,信息要穿过很多步才能相遇,路上容易衰减。

方法。作者拿掉全部循环,只保留注意力。模型由 4 类部件组成:

编码器和解码器各堆叠 6 层。解码器的自注意力带掩码:第 i 个位置只能看第 1 到第 i 个位置,生成时不能偷看后面的答案。解码器还多一层编码器-解码器注意力,用来读取源句子。

结果。大模型在 WMT 2014 英德翻译上得到 28.4 BLEU,比此前最好的结果(包括集成模型)高 2 BLEU 以上。英法翻译得到 41.8 BLEU,用 8 块 P100 GPU 训练 3.5 天。基础模型约 6500 万参数,在同样 8 块 GPU 上只训练 12 小时。作者还把模型用于英语句法分析,结果同样有竞争力。这说明结构不只适用于翻译。

直觉例子。句子"小明把书还给小红,因为她明天考试"。模型处理"她"时,一层注意力就能把权重放到"小红"上。RNN 要把"小红"的信息携带好几步,才能在"她"这里用上。

关键概念

自注意力(Self-Attention)
同一个序列里,每个位置都对所有位置算权重,再加权汇总。任意两个位置之间只隔 1 步,适合捕捉远距离依赖。
缩放点积注意力(Scaled Dot-Product Attention)
用 Q 和 K 的点积当相似度,除以 sqrt(d_k) 后过 softmax,再乘 V。整个计算是几次矩阵乘法,GPU 上很快。
多头注意力(Multi-Head Attention)
把向量切成 h 份,每份各做一次注意力,再拼接并线性变换。论文用 h = 8。多个头可以同时关注不同类型的关系。
位置编码(Positional Encoding)
给词向量加上随位置变化的正弦、余弦信号。没有它,打乱词序后注意力的输出只是跟着重新排列,模型分不出语序。
因果掩码(Causal Mask)
解码器中把未来位置的分数设成负无穷,softmax 后权重为 0。训练时可以并行算所有位置,又不泄露答案。
学习率预热(Warmup)
前 4000 步学习率线性上升,之后按步数的平方根倒数下降。没有预热时,这种结构的训练早期容易发散。

历史位置:为什么值得读

2014 年的 Bahdanau 注意力(第 15 天)让 RNN 解码器能回看源句,但主干仍是 RNN。本文把注意力从配角变成全部。它还用到了清单里的其他工具:残差连接来自 ResNet(第 9 天),dropout 来自第 12 天。

这篇论文的影响几乎覆盖了之后的整个深度学习:

值得读原文的理由:论文篇幅不长,结构清楚。很多今天习以为常的细节都在这里成套出现:多头、缩放、预热和标签平滑。第 14 天的 The Annotated Transformer 是本文的代码版,建议两天连着读。

学前准备

在原仓库怎么学

  1. 先读 README.md,看清整体结构和超参数表的位置。
  2. 打开原论文,对照 paper_notes.md 读第 3 节模型结构。
  3. 读 implementation.py。这是纯 numpy 实现,包含 ScaledDotProductAttention、MultiHeadAttention、PositionalEncoding、EncoderBlock、DecoderBlock 和两个掩码函数。
  4. 按顺序做 exercises/ 里的 5 个练习:exercise_01_scaled_dot_product.py 写缩放点积注意力,exercise_02_multi_head_attention.py 写多头注意力,exercise_03_positional_encoding.py 写正弦位置编码,exercise_04_encoder_block.py 组装编码器块,exercise_05_full_transformer.py 组装完整模型。卡住时再看 exercises/solutions/。
  5. 运行 train_minimal.py,用 --task copy 或 --task reverse 训练一个小模型,观察损失下降。
  6. 在浏览器打开 visualizations/transformer_interactive.html,再用 visualization.py 画注意力热力图。
  7. 最后用 notebook.ipynb 串一遍,用 CHEATSHEET.md 复习公式。

今天再看

2026 年回头看,核心结构几乎原样保留:Q/K/V 注意力、多头、残差、逐位置前馈层。变化主要在细节:

读这篇论文,等于读懂今天每个大语言模型的骨架。后来的改进都是在这个骨架上换零件。

容易卡住的地方

延伸阅读