Transformer 为什么抛弃循环网络
摘要《Attention Is All You Need》中文浓缩译读:Transformer 用自注意力替代循环与卷积,把序列建模改造成可并行的矩阵计算。
2017 年以前,机器翻译的主流方案是循环神经网络。一个词处理完,隐藏状态传给下一个词;LSTM 和 GRU 缓解了长期依赖,计算仍然必须沿序列逐步推进。句子越长,训练越难并行,任意两个远距离位置之间也要经过更长的计算路径。
《Attention Is All You Need》做了一个很直接的选择:拿掉循环,也拿掉卷积,只用注意力连接序列中的不同位置。作者把这套架构命名为 Transformer。
本文按主题压缩原论文,保留决定 Transformer 结构的部分。原文为 Ashish Vaswani 等人在 NIPS 2017 发表的 《Attention Is All You Need》,本文依据 arXiv v7 整理。
序列计算的瓶颈
循环网络的问题首先是计算结构。第 t 个位置依赖第 t-1 个位置,同一个样本内部至少需要 O(n) 次顺序操作。即使 GPU 很擅长矩阵计算,也必须等前一个时间步完成。
卷积可以并行,但一个卷积核只能看到局部区域。要让两个相距很远的词交换信息,需要堆叠多层卷积。普通卷积的最长路径随序列长度增加,空洞卷积也只能把它降到对数级。
自注意力让每个位置直接查看所有位置。任意两个词之间的最长路径变成 O(1),所有位置也可以同时计算。代价是注意力矩阵需要比较每一对位置,单层复杂度包含 O(n²·d);序列很长时,这个平方项会成为新的瓶颈。
| 层类型 | 单层复杂度 | 顺序操作 | 最长信息路径 |
|---|---|---|---|
| 自注意力 | O(n²·d) | O(1) | O(1) |
| 循环层 | O(n·d²) | O(n) | O(n) |
| 卷积层 | O(k·n·d²) | O(1) | O(logₖ n) |
当论文中的句子长度 n 小于表示维度 d 时,自注意力通常比循环层更合算。Transformer 把难以并行的时间依赖换成了 GPU 更擅长的密集矩阵运算。
一次注意力计算在做什么
输入中的每个位置都会产生三个向量:
- Query:当前位置正在寻找什么;
- Key:当前位置可以用什么特征被匹配;
- Value:匹配成功后用于聚合的信息。
查询向量与所有键向量做点积,得到相关性分数;经过 softmax 后变成权重,再对 Value 加权求和:
Attention(Q, K, V) = softmax(QKᵀ / √dₖ) V
除以 √dₖ 是这个公式里容易被忽略的关键。维度变大后,点积的绝对值也会变大,softmax 容易进入梯度极小的饱和区域。缩放把分数拉回更适合训练的范围。
模型可以借助这套匹配机制学习主语、指代关系和词义关联,具体关系由训练数据和损失函数塑造。
为什么需要多头注意力
只做一次注意力,相当于把多种关系平均进同一个表示空间。Transformer 先把 Q、K、V 投影到多个较小的子空间,让多个注意力头并行工作,最后拼接结果:
MultiHead(Q, K, V) = Concat(head₁, …, headₕ) Wᴼ
headᵢ = Attention(QWᵢQ, KWᵢK, VWᵢV)
原论文的基础模型使用 8 个头,模型维度为 512,每个头的 Key 和 Value 维度为 64。拆成多个低维头后,总计算量与一次完整维度的注意力接近,但不同头可以学习不同位置和不同表示子空间中的关系。
论文附录中的可视化显示,一些头会追踪长距离依赖,一些头表现出指代消解或句法结构相关的模式。这些图提供了观察模型分工的线索,单靠注意力分布还无法得到完整、可靠的解释。
编码器和解码器
原始 Transformer 仍然沿用机器翻译的编码器—解码器结构。
编码器堆叠 6 层,每层包含:
- 多头自注意力;
- 对每个位置独立应用的前馈网络;
- 每个子层外的残差连接和 LayerNorm。
前馈网络在每个位置上使用相同参数,基础模型把 512 维表示扩展到 2048 维,经过 ReLU 后再压回 512 维:
FFN(x) = max(0, xW₁ + b₁) W₂ + b₂
解码器同样堆叠 6 层,但多出一层连接编码器输出的交叉注意力:Query 来自解码器,Key 和 Value 来自编码器。这样,生成目标词时可以读取完整输入句子。
解码器内部的自注意力还要使用因果遮罩。当前位置之后的注意力分数被设为负无穷,经过 softmax 后权重变成零,保证预测第 i 个词时只能看到它之前已经生成的内容。
输入 → 编码器自注意力 → 输入表示
↓ Key / Value
已生成文本 → 遮罩自注意力 → 交叉注意力 → 下一个词
因此,Transformer 消除了训练时编码器和已知目标序列内部的循环依赖,但原始解码过程仍然是自回归的:生成下一个词依赖前面已经生成的词。论文最后也把“让生成减少顺序计算”列为后续目标。
没有循环,顺序从哪里来
自注意力本身不区分词序。交换两个输入向量的位置,如果不补充位置信息,模型无法知道谁在前、谁在后。
论文把位置编码直接加到词向量上,使用不同频率的正弦和余弦函数:
PE(pos, 2i) = sin(pos / 10000^(2i/dmodel))
PE(pos, 2i + 1) = cos(pos / 10000^(2i/dmodel))
每个维度对应一个不同波长。作者希望模型能通过这些周期信号学习相对位置,并有机会外推到训练时没有见过的更长序列。实验中,可学习的位置向量与正弦位置编码结果接近,论文最终选择后者主要是出于长度外推的考虑。
训练配置与结果
基础模型约有 6500 万参数,在 8 张 NVIDIA P100 上训练 10 万步,用时约 12 小时。大模型约有 2.13 亿参数,训练 30 万步,用时 3.5 天。训练使用 Adam、4000 步 warmup、dropout 和 label smoothing。
在 WMT 2014 英译德任务中,大模型取得 28.4 BLEU,比当时已报告的最佳结果高出 2 BLEU 以上;英译法取得 41.8 BLEU。更重要的是,它以显著低于此前强模型的训练成本达到或超过当时的最好结果。
论文还把一个 4 层 Transformer 用于英语成分句法分析。在只有约 4 万句训练数据、没有大量任务特定调参的情况下,模型仍取得 91.3 F1;半监督设置达到 92.7 F1。这部分实验用来说明架构并不只适用于机器翻译。
2017 年这篇论文留下的变化
注意力机制在这篇论文之前已经存在,也常与循环网络一起使用。这篇论文完成了一次架构替换:序列转导可以完全依靠注意力,按位置递归的隐藏状态和承担跨位置交换的卷积都可以移除。
这次替换带来了三个后果:
- 训练中的序列位置可以大规模并行;
- 远距离位置之间只需经过常数长度的路径;
- 模型主体变成规则、可扩展的矩阵计算,更适合当时以及后来的加速硬件。
这套架构保留了三个代价:全局注意力对序列长度是平方复杂度,自回归生成仍需逐词进行,注意力图也无法自动成为可信解释。它同时移走了序列模型按时间步递归的主要瓶颈,为后来扩大数据、参数和计算规模提供了结构基础。
原文
- Ashish Vaswani 等:Attention Is All You Need,NIPS 2017,本文依据 arXiv v7 整理。
- 原论文训练代码:Tensor2Tensor。