| 章节 | 状态 | 主题 |
|---|---|---|
| Title & Authors | ✅ | 标题即宣言;作者线与路线图坐标 |
| Abstract | ✅ | 纯 Attention 架构、翻译 SOTA |
| 1 Introduction | ✅ | RNN 顺序瓶颈、提出 Transformer |
| 2 Background | ✅ | CNN 序列模型、Self-Attention 先驱 |
| 3 Model Architecture | ✅ | Encoder-Decoder、Attention、FFN、位置编码 |
| 4 Why Self-Attention | ✅ | 复杂度 / 并行 / 路径长度(Table 1) |
| 5 Training | ✅ | 数据、硬件、Adam lr、正则 |
| 6 Results | ✅ | 翻译 BLEU、消融、句法分析 |
| 7 Conclusion | ✅ | 总结与未来方向 |
| 延伸讨论 | ✅ | 编者延伸问答 |
要点:标题即宣言——「注意力就是你所需要的一切」:做翻译,RNN、CNN 统统不要,只用 attention。8 位作者来自 Google Brain / Google Research 与多伦多大学,这篇 2017 年 NeurIPS 论文是整个大模型时代的起点。
精读
标题解读:「all you need」的底气来自实验——把序列建模里的两大主角(recurrence 与 convolution)彻底开除,翻译质量反而更好、训练还快一个数量级。严格说标题是修辞:真正起作用的还有残差连接、FFN、位置编码这一整套组合,但 attention 是唯一的新主角,其余都是「让它站得住」的配套。读这篇时要一直带着一个问题:作者凭什么敢把 RNN 开掉?
作者线:论文首页给 8 位作者都标了星号,并明确说明「equal contribution;listing order is random」,因此不能把署名顺序理解成贡献排序。多位作者后来持续塑造这个领域——Noam Shazeer 推动了 MoE、SwiGLU 等架构创新;Łukasz Kaiser 也长期参与 Transformer 工程与研究生态。团队在 Google Brain,具备把新架构做成大规模翻译实验的工程条件。
路线图坐标:这是全部 43 篇的地基,后面 42 篇几乎都在给这个架构「打补丁、扩容量、换零件」:BERT 只拿走它的 encoder、GPT 系只拿走它的 decoder——今天主流 LLM 是它 decoder 半边的直系后代;阶段六的 RoPE 是对它 3.5 节正弦位置编码的改良;阶段五的 FlashAttention 一行数学都没改、只改数据的搬运方式就让它快了数倍。读懂这一篇,后面所有的「改进」才有参照物。
The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two machine translation tasks show these models to be superior in quality while being more parallelizable and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task, improving over the existing best results, including ensembles, by over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training costs of the best models from the literature. We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data.
一句话:提出 Transformer——完全基于 attention 的 encoder-decoder 架构,WMT14 英德 28.4 BLEU 刷新 SOTA(超此前最佳 ensemble 2+ BLEU),训练时间却是同行的一小部分,且能直接泛化到句法分析任务。
精读
主流 sequence transduction 模型基于复杂的 RNN 或 CNN(encoder-decoder),最佳模型还通过 attention 连接编解码器。本文提出 Transformer:完全基于 attention,摒弃 recurrence 和 convolution。
优势:质量更好、更易并行、训练时间更短。WMT14 En-De 28.4 BLEU(超此前最佳 ensemble 2+ BLEU);En-Fr 单模型 41.8 BLEU,8 GPU 训练 3.5 天。还成功泛化到英语成分句法分析。
读 Abstract 要抓住「组合拳」结构:质量更好(架构表达力)+ 更易并行(训练经济学)+ 泛化(通用表示)——三条腿各自对应后文的一个部分:第 3 节讲架构、第 4 节讲为什么快、6.3 节证明泛化。数字本身放今天已不耀眼(28.4 BLEU 的英德翻译早被大幅超越),让它封神的是这套架构本身——数十年后读这篇,BLEU 只是有趣,架构才是全部。
要点: RNN/LSTM/GRU 是序列建模 SOTA;但按位置逐步计算,无法并行,长序列 batch 受限。
精读
RNN 将计算沿输入/输出符号位置分解:ht = f(ht−1, xt)。这种固有顺序性阻碍训练样本内并行;序列越长,memory 限制 batch 越大问题。虽有 factorization / conditional computation 改进,顺序计算的根本约束仍在。
「顺序瓶颈」的直觉:你可以把 RNN 想成一个逐字朗读的人——必须读完第 100 个字才能开始读第 101 个,1000 个字就是 1000 步,谁也替不了谁。而 GPU 是一个能同时算一万道题的车间:只派一个人线性干活,等于让整条流水线停摆。所以 RNN 的问题不是「算得不对」而是「喂不饱硬件」——算法的串行结构与并行硬件的根本错配,才是换架构的真正动机。
一个容易被略过的细节:「memory 限制 batch」说的是训练时没法把「不同长度的很多句子」打包进一个 batch——句子长短不齐还要按顺序算,工程上处处别扭。这解释了为什么后文 5.1 要按句长分 batch。
要点:Attention 早就是序列模型的标配配件,但几乎总在给 RNN 打辅助;本文把主仆倒置——开除 recurrence,让 attention 独挑大梁。
精读
Attention 已成为序列模型关键组件(Bahdanau 2014 等),可无视输入输出距离建模依赖。但除极少数工作外,attention 仍与 RNN 结合。
本文 Transformer 完全抛弃 recurrence,仅用 attention 建立输入输出全局依赖 → 显著更多并行化;8 块 P100 上训练 12 小时即达翻译 SOTA 质量。
这一段的言外之意值得点破:attention 不是本文发明的(1990s 就有雏形,Bahdanau 2014 用出名),前人的想象力止步于「给 RNN 配个助手」。本文的贡献是把主仆关系倒过来——RNN 被开除,attention 自己扛起全部序列建模。这是典型的「组合已有组件 + 换一个别人没敢试的架构决策」式创新:单个零件都不新,新的是敢拆发动机。
要点:CNN 路线(ConvS2S、ByteNet)也能并行,但远距离依赖要靠层层传话(路径线性/对数增长);Transformer 把路径砍到常数,代价用多头补偿。
精读
减少顺序计算也是 CNN 序列模型的动机(ConvS2S、ByteNet 等):所有位置并行算 hidden state。但两位置间操作数随距离增长——ConvS2S 线性、ByteNet 对数——远距离依赖难学。Transformer 将路径长度降为常数,代价是 attention 加权平均降低有效分辨率,用 Multi-Head Attention 补偿。
「路径长度」的人话版:CNN 像传话游戏——第 1 个词要经过十几层卷积才能「传」到第 100 个词,每传一层信息就稀释一点,所以要记住远处的关键信息很难。Transformer 里任意两个词直接连线、一层到位,不存在「传话衰减」。「远距离依赖好不好学」取决于信息要走几步,这个视角是理解 4 节复杂度表的钥匙。
要点:Self-attention 并非本文发明,此前只在单序列内部做关联;本文是第一个让它不靠 RNN/卷积、独撑 transduction 全场的。
精读
Self-attention(intra-attention):在同一序列的不同位置间做 attention,用于阅读理解、摘要、蕴含、句子表示等。Memory networks 用循环 attention 替代序列对齐的 recurrence。
Transformer 是首个完全依赖 self-attention、不用序列对齐 RNN 或卷积的 transduction 模型。
要点:标准 encoder-decoder:encoder 把整句读成表示 z,decoder 拿着 z 自回归逐字生成——两条流水线怎么接线,看下方「全屋电路图」。
精读
Encoder:输入 (x1, …, xn) → 连续表示 z = (z1, …, zn)。Decoder:给定 z,逐步生成输出 (y1, …, ym),每步自回归——已生成符号作为下一步输入。
一个贯穿全书的心智模型:encoder 是「精读理解题干」,decoder 是「逐字写作文」——写作文的每一步都能回头看理解结果,且已写出的每个字都成为下一步的上下文(自回归)。这个「读与写分离」的结构在后面会反复变形:BERT 把 encoder 半边拿去做了理解专家(阶段一),GPT 系把 decoder 半边养成了生成专家,机器翻译本身反而不再是主要战场。
先上全屋电路图(数据流总览,后文 3.1–3.5 都是往这张图里填细节):
| Encoder——精读理解题干 | Decoder——逐字写作文 | |
|---|---|---|
| 入口 | 输入序列 x1…xn | 已生成的 y1…yt−1 |
| 先注入位置 | Embedding ⊕ 位置编码(3.4/3.5) | Embedding ⊕ 位置编码(同左) |
| 每层 ×6 | Self-Attention(3.2)→ FFN(3.3) | Masked Self-Attention → Cross-Attention → FFN(3.1) |
| 两摞怎么接 | 输出 z 供作 K/V | Cross-Attention:Q 自己出,K/V 接 encoder 的 z |
| 出口 | — | Linear + Softmax → 预测下一个词 yt |
读图的要点只有一句:两条流水线只在 Cross-Attention 这一个路口交汇——其余部分左右对称、互不通信。括号里的节号就是下文的行进路线,看完 3.1–3.5 回来再看一眼这张表,整个架构就装进脑子里了。
要点:N=6 层、每层只做两件事(attention + FFN),靠残差与 LayerNorm 保命;decoder 多一层 cross-attention,且戴 causal mask 不许偷看未来。
精读
Encoder(N=6): 每层两个 sub-layer:
每个 sub-layer 外有残差 + LayerNorm:LayerNorm(x + Sublayer(x))。所有 sub-layer 和 embedding 输出维度 dmodel = 512。
两个「保命」设计的白话:残差连接是给信号留一条原样通过的直道——哪怕某个子层学废了,信息照样往下走,几十层深也不会「层层失联」(没有它,深网络训练信号会指数衰减,这是 2015 年 ResNet 之前的深网之痛);LayerNorm 是每层输出做一次「音量归一」,防止数值忽大忽小把训练带偏。而全篇统一 dmodel=512 不是巧合:残差相加要求两侧同宽,512 就是全模型统一的「通道宽度」。
Decoder(N=6): 三个 sub-layer:
Mask:softmax 输入中将非法连接设为 −∞,保证位置 i 只依赖 < i 的输出,保持自回归。
要点:输出 = V 的加权和,权重来自 Q·K 相似度过 softmax;除以 √dk 是防止点积过大把 softmax 推进梯度饱和区。
精读
Attention 将 query 和 key-value 对映射为输出:输出 = values 的加权和,权重 = query 与 key 的 compatibility。
Attention(Q, K, V) = softmax(QKT / √dk) V
矩阵形式:Q/K/V 分别为 query/key/value 矩阵。
Q/K/V 的图书馆类比(全篇最重要的直觉,值得停下来想 10 秒):把每个 token 想成图书馆里的一本书——query 是你检索时输入的问题,key 是每本书书脊上的标签,value 是书的实际内容。检索流程:拿问题逐一比对标签(点积算相似度)→ 相似度过 softmax 变成一组总和为 1 的权重 → 按权重把所有书的内容加权混合,得到「针对你这个问题的定制摘要」。每个 token 都做一遍这件事,于是每个位置的表示都吸收了全句的相关信息。
为何 scale: 当 dk 大时,点积方差 ≈ dk,值过大使 softmax 进入梯度极小区。除以 √dk 抵消此效应。additive attention 用 FFN 算 compatibility,大 dk 时无 scale 的点积 attention 不如 additive。
要点:8 个头、每头 64 维:各看一个低维子空间再拼接——总计算量与单头全维相当,观察视角翻倍。
精读
单头 attention 对所有 key/value/query 用同一 dmodel 维空间;多头将 Q/K/V 线性投影 h 次到更低维(dk, dv),分别做 attention,concat 后再投影:
MultiHead(Q,K,V) = Concat(head1, …, headh) WO
headi = Attention(QWQi, KWKi, VWVi)
本文 h=8,dk = dv = dmodel/h = 64。多头让模型在不同表示子空间、不同位置联合 attend;单头平均会抑制这种能力。每头仍 attend 所有 token,只是子空间不同(分头分工)。总计算量与单头全维相近。
「分工」有多实感?附录的注意力可视化显示:有的头盯住句法结构(并列成分互相对齐),有的头追踪指代关系(代词看向它指代的名词),有的头几乎只在相邻词间活动。8 个头不是 8 份重复劳动,而是 8 个不同视角的观察员。顺带留个伏笔:推理时每头都要存自己的 K/V(KV cache),8 头 × 64 维就是推理显存的大头——后来 MQA/GQA 等推理优化专门在这个「头」的结构上做文章,vLLM 等推理引擎的省显存技巧源头都在这。
要点:attention 模块只有一种,全靠 Q/K/V 的接线方式分出三种角色——对照表见下。
精读
同一个 attention 模块,接上不同的 Q/K/V 来源,就变成三种角色——「自己读自己」「自己读自己但只许看过去」「写作文时翻题干」:
| 用法 | Q 来自 | K/V 来自 | 每个位置能看到谁 |
|---|---|---|---|
| Encoder Self-Attention | encoder 上一层 | encoder 上一层 | 输入句全部位置(双向,精读题干用) |
| Decoder Masked Self-Attention | decoder 上一层 | decoder 上一层 | 已生成的位置(causal mask 挡住未来) |
| Encoder-Decoder Attention | decoder 上一层 | encoder 最终输出 | 输入句全部位置(写作时随时回头查题干) |
初学者最容易晕的就是这张表:三者的 attention 公式一字不差,差别只在 Q/K/V 的接线方式——前两种是「自己读自己」(区别只在能不能看未来),而「Decoder 写作时能不能查到输入句」靠的是第三种 Encoder-Decoder Attention,K/V 接的是 encoder 的输出。记住「接线决定角色」,三种用法就不用背了。
要点:FFN 对每个位置独立「深加工」,是参数与知识的仓库(512→2048→512);等价于 kernel=1 的两层卷积。
精读
FFN(x) = max(0, xW1 + b1)W2 + b2
「Position-wise」= 对每个位置分别做相同结构的 FFN;不同层参数不同(层间不共享),同一层内所有位置共享参数——即「共享参数」指同一层各 token 用同一组 W/b。输入输出 dmodel=512,中间层 dff=2048。
Attention 与 FFN 的分工(记住这对CP):attention 负责「跨 token 混合信息」(横向交流),FFN 负责「每个 token 自己深加工」(纵向消化),两者交替堆叠。容易被忽略的事实:Transformer 的参数大头在 FFN 不在 attention(512×2048×2 ≈ 2M/层 vs attention 的 4×512² ≈ 1M/层)——后来 LoRA 微调、MoE 稀疏化的主战场都选在 FFN,就是因为它才是参数和知识的仓库。
要点:读入与写出共享同一张「词↔向量」对照表;embedding 乘 √dmodel 后再与位置编码相加,防止被位置信号淹没。
精读
输入/输出 token embedding 维度 dmodel;decoder 输出经线性层 + softmax 得下一 token 概率。三个矩阵共享权重(类似 Press & Wolf 2016),embedding 权重乘以 √dmodel 平衡与 positional encoding 相加后的量级。
「共享权重」的白话:读入文字和写出文字用同一张「词 ↔ 向量」对照表——省下几十 M 参数,更重要的是让「读」和「写」处在同一套语义坐标系里(「猫」读进来是什么向量,写出去就往什么向量靠)。乘 √dmodel 则是量级配平:embedding 通常是小的随机数,位置编码是 ±1 量级的正弦值,直接相加会被位置信号淹没——先放大再相加,两种信号才能平起平坐。
要点:attention 对顺序天生无感,位置信息必须额外注入;正弦/余弦固定编码自带可外推的潜力——这颗种子在阶段六长成 RoPE。
精读
PE(pos,2i) = sin(pos / 100002i/dmodel)
PE(pos,2i+1) = cos(pos / 100002i/dmodel)
与 token embedding 相加(同维 dmodel)。波长从 2π 到 10000·2π 几何递增。对固定偏移 k,PEpos+k 是 PEpos 的线性函数 → 模型易学相对位置。学习式 positional embedding 效果几乎相同(Table 3-E),但正弦版可能外推到更长序列。
正弦编码的表针类比:把每对 (sin, cos) 想成一根在表盘上匀速转动的表针,dmodel 维向量就是 d/2 根转速各异的表针——波长越短转得越快(秒针,负责区分相邻位置的细微差别),波长越长转得越慢(时针,负责区分远近大格局)。每个位置 pos 的「时刻」,由全部表针的读数组唯一确定;而「从 pos 走到 pos+k」意味着每根表针都转过固定的同一角度——这正是上文「线性函数」性质的画面版:相对位移成了一组规整的旋转,模型学「隔了多远」就不必死记每个绝对位置。记住这组表针,阶段六的 RoPE 会把「读表针」直接升级成「转表盘」。
为什么必须有它:attention 对顺序天生无感——把句子词序打乱,self-attention 算出的结果一模一样(它只看「有哪些词、两两相似度」)。但语言显然依赖顺序,所以位置信息必须额外注入。「可外推」这颗种子值得划重点:正弦编码是解析函数、位置 10001 也能直接算出来,学习式编码没见过 10001 就是废的——本文一笔带过的这句话,是整个阶段六(RoPE 改良、YaRN 插值、长上下文之争)的起点。阶段六读 RoPE 时记得回来对照:那是把「相加注入」改成「旋转注入」的升级版。
要点:一张三列表回答「凭什么开除 RNN」:self-attention 串行步数与路径长度都是 O(1),代价是 O(n²·d)——后 12 篇效率/长上下文论文共同的靶子。
精读
| Layer Type | 每层复杂度 | 顺序操作 | 最大路径长度 |
|---|---|---|---|
| Self-Attention | O(n²·d) | O(1) | O(1) |
| Recurrent | O(n·d²) | O(n) | O(n) |
| Convolutional | O(k·n·d²) | O(1) | O(logk(n)) |
Self-attention:任意两位置连接只需常数层顺序操作;长程依赖路径长度 O(1)。当 n < d(翻译中常见)时,self-attention 比 RNN 更快。副作用:attention 权重可视化可解释(附录 Figure 3–5 展示句法/指代模式)。
这张表的读法与隐藏代价:三列各回答一个问题——「一层算多少」(复杂度)、「必须串行几步」(能否并行)、「信息最远要走几步」(长程依赖)。self-attention 在后两列完胜 RNN,这是它敢开除 recurrence 的理论底气。但别漏了第一列的 O(n²·d):序列翻倍、计算量翻四倍。这是 Transformer 立下的最大一张账单——阶段五 FlashAttention 用「少搬运」把它提速数倍,阶段六整个长上下文领域(Ring Attention、YaRN、稀疏注意力)都在给这张账单打折。读完全书回头看,本节的 O(n²) 就是那 12 篇效率/长上下文论文共同的靶子。
为何 N=6 层: 论文 base/big 均用 6 层 encoder + 6 层 decoder;Table 3(C) 消融显示 2/4/8 层,6 层在 dev 上较优——非理论推导,是实验选择;多层目的是分层抽象(浅层局部、深层全局),每层结构相同但参数独立。
要点: WMT14 En-De/En-Fr;BPE 37K/WordPiece 32K;按近似句长组成约 25K source tokens 与 25K target tokens 的 batch。
精读
数据: En-De 450 万句对(BPE 共享词表 ~37K);En-Fr 3600 万句(WordPiece 32K)。按近似句长 batch,每 batch ~25000 source + 25000 target tokens。
「按句长分 batch」接住了 1.1 的伏笔:1.1 说过「句子长短不齐还要按顺序算,工程上处处别扭」——解法就是按长度分桶:让同一个 batch 里的句子长度接近,padding(凑长度的空白占位)浪费最少,每个 batch 也才能塞下 25K+25K 这么大的 token 量。句子长度悬殊的大 batch 会把算力烧在算空白上,这个细节今天仍在 DataLoader 工程里沿用。
要点: Base 模型用 8 块 P100 训练 100K steps,约 12 小时;Big 模型训练 300K steps,约 3.5 天。
精读
硬件: Base:8 P100,100K steps ≈ 12 小时;Big:300K steps ≈ 3.5 天。
要点: 使用 Adam,并采用 4000-step warmup 后按步数平方根衰减的学习率计划。
精读
学习率(公式 3):
lr = dmodel−0.5 · min(step−0.5, step · warmup−1.5)
warmup_steps = 4000;Adam β1=0.9, β2=0.98, ε=10−9。
warmup 的白话:训练开始时权重还是「随机噪声」,此时用大步长学习率等于蒙着眼猛冲,容易一脚踩飞(loss 直接发散)。所以前 4000 步让学习率从零线性爬到峰值——先热身;之后再按 step 的平方根缓慢降温——先冲刺、再匀速、后减速。这套「warmup + 退火」节奏被几乎所有后续 LLM 沿用,是训练配方里最长寿的遗产之一。
要点: 对残差与 embedding 使用 dropout 0.1,并采用 label smoothing 0.1。
精读
正则: Residual Dropout Pdrop=0.1(sub-layer 输出 + embedding 和);Label Smoothing εls=0.1(提升 BLEU 略损 perplexity)。
label smoothing 的白话与 trade-off:正常训练告诉模型「正确答案就是 100%」,它会把概率疯狂押向单一选项;label smoothing 把硬标签「泡软」成 90% 正确类 + 10% 平摊给其他类,逼模型保持一点谦虚。结果生成质量更好(BLEU ↑)但语言建模指标变差(perplexity ↑)——第一次在本笔记系列里出现「两个指标打架」的经典 trade-off,记住这种「指标间不一致」的感觉,阶段十读评测论文时它是主角。
要点:Big 28.4/41.8 BLEU 双双刷新 SOTA,训练 FLOPs 却不到竞品 ensemble 的十分之一——「同质量更省钱」比「刷更高分」更有分量。
精读
| Model | EN-DE | EN-FR | 训练 FLOPs (En-DE) |
|---|---|---|---|
| GNMT+RL Ensemble | 26.30 | 41.16 | 1.8×1020 |
| Transformer (base) | 27.3 | 38.1 | 3.3×1018 |
| Transformer (big) | 28.4 | 41.8 | 2.3×1019 |
推理:beam size=4,length penalty α=0.6;base 平均最后 5 个 checkpoint,big 平均最后 20 个。
两个值得停留的读法:① BLEU(0–100)是机器翻译标准评分,数「译文与参考译文 n-gram 的重合度」——它是个代理指标,衡量重合不衡量「通顺忠实」,所以 6.1 之后作者补了人工评估、6.3 换了个完全不同的任务。「单一自动指标不可全信」这个习惯从这里就该建立。② 右列 FLOPs 是本文最实用主义的卖点:big 的质量提升背后是 base 约 7 倍的算力,但仍是竞品 ensemble 的十分之一以下——「同质量更省钱」在工程上往往比「刷更高分」更有分量。
要点:五组消融逐个验收零件:头数有甜点、6 层最优、dropout 0.1 不可省、两种位置编码打平——结论:这套架构没有明显冗余。
精读
消融的读法:每一行都在回答「这个设计是必要的吗」——头数有甜点(单头掉 0.9,头太多也掉)、层数 6 层最优、dropout 0.1 不可省、两种位置编码打平。结论是这套架构没有明显冗余,每个零件都在出力;这正是它能作为「标准件」被后续论文直接继承的原因——BERT/GPT/LLaMA 改的始终是零件(位置编码、归一化、激活函数),从不推翻装配图。
Big 模型: L=6, dmodel=1024, dff=4096, h=16, Pdrop=0.3, 300K steps, 213M params。
要点:4 层小模型几乎不调参,句法分析就达 91.3/92.7 F1 超过专职选手——「学到的表示是通用的」第一次被验证。
精读
输出比输入长得多、结构约束强;仅少量超参调整(4 层、dmodel=1024)。WSJ-only 91.3 F1 已超多数 prior;半监督 92.7 F1。说明 Transformer 不限于翻译。
人话版:句法分析就是给句子画语法树——「The cat sat」要标出主语、谓语,嵌套结构层层相套,和翻译完全是两种任务。拿 4 层小模型、几乎不调参就超掉专攻此任务的模型,这一节的存在意义就是堵住「你这只是翻译特调」的质疑:学到的表示是通用的,不是任务特产。这个「通用表示」的论断,正是后来「预训练一个模型、处处微调」范式的第一块试金石。
要点: 首个纯 attention 的 sequence transduction 模型;翻译 SOTA + 更快训练;计划扩展到多模态与局部 attention。
精读
Transformer 用 multi-head self-attention 替代 RNN encoder-decoder 中的 recurrent 层。翻译任务上训练显著更快,En-De/En-FR 均 SOTA。代码:tensor2tensor。
别跳过结尾的预告——它兑现得惊人:作者说计划把架构扩展到「图像等多模态输入」与「局部 attention 限制计算量」。前者在阶段九兑现(CLIP/GPT-4V 的视觉 Transformer 就是同一个架构喂图片),后者在阶段五/六兑现(FlashAttention、稀疏注意力、Ring Attention 全是「限制计算量」的答案)。一篇 2017 年的架构论文,是后面九个阶段全部故事的序章——它留下的两个预言,恰好是本书两条支线的起点。
以下为编者基于本篇笔记内容的延伸问答。
回想 3.0 的心智模型——encoder「精读理解题干」、decoder「逐字写作文」。翻译这种「先读完整句再动笔」的任务天然需要两半接力,所以本文是 encoder-decoder 全家桶。但后来的任务不需要全家桶:理解类任务(分类、检索、句向量)只要「读懂」不要「动笔」,BERT 把 encoder 半边养成了理解专家(见下一篇);生成类任务则发现「读题干」这件事 decoder 自己就能干——它每写一个字都会回看已写的全部内容,干脆砍掉 encoder,GPT 系由此只剩 decoder。
真正的分水岭是双向 vs 单向:encoder 每个位置一次看到全句(双向),理解高效但「写」别扭;decoder 戴着 causal mask(单向),天生为「从左到右」生成设计。今天的 ChatGPT 式模型用单向结构把理解也一并做了,理论上略有浪费,但换来「理解与生成共享同一套权重」——这是架构决策史上「够用的通用件打败专用的精密件」的经典案例。至于 attention 给 RNN「当助手」的旧方案(Bahdanau 2014:encoder 仍顺序读全句,decoder 每步加权回看),它的 encoder 还是串行瓶颈,如今只留在教科书里。
4 节立下的 O(n²·d) 账单,序列一长就爆炸(长度翻倍、计算翻四倍)。后续工作分三条路线还债:①少搬运——FlashAttention 一行数学不改,只重排「数据在显存里怎么搬」就把注意力提速数倍(阶段五);②少算——滑动窗口、稀疏/线性 attention 只算「值得看」的位置,代价是牺牲一部分全局视野(阶段六的 LongLoRA 等);③分着算——Ring Attention 把序列切开到多张卡上接力计算,把可训练上下文推到百万 token(阶段六)。
还有一笔隐形账在推理侧:每个头都要缓存自己算过的 K/V(KV cache),8 头 × 64 维 × 每层每 token,是长对话显存的大头——后来的 MQA/GQA 专门用「多头合并值日」省这笔缓存。这条线最值得记的教训是:赢家大多没有动 softmax(QKT/√dk)V 这个数学本身,动的是「数据怎么搬、活儿怎么分」——好数学不值得为了性能换掉,这也反向印证了本文架构的稳固。
本文的方案是把位置编码「加」进词向量(3.5)。可用性没问题,缺陷也不难想到:位置信号和词义信号从此搅在同一个向量里,模型想用相对位置,得自己从「两个混合向量的相似度」里悟出规律。正弦编码自带一个好性质(PEpos+k 是 PEpos 的线性函数)、论文也点了「可能外推到更长序列」,但「如何优雅地表达相对位置」它没给答案。
阶段六的 RoPE 补上了:不把位置加进向量,而是让每个位置的 query/key 在平面上转过正比于位置的角度——两个位置做点积时,「转过的角度差」直接等于相对距离,相对位置不再需要学,外推性也更好(后来的 YaRN 再解决外推时的尺度问题)。回头看,本文那句一笔带过的「可能外推到更长序列」,正是整条长上下文技术线的第一颗种子——3.5 节的表针类比在读 RoPE 时会直接续上。