返回首页

Post

Attention Is All You Need:为什么序列建模可以把循环拿掉

基于论文原文重建 Transformer 的核心论证:作者为何要摆脱 recurrence,self-attention 与 multi-head 分别解决了什么问题,以及训练与实验究竟支撑了哪些结论。

分类
标签
合集

论文信息

项目 内容
论文标题 Attention Is All You Need
作者 Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin
年份 2017
会议 NeurIPS 2017
版本依据 arXiv:1706.03762v7
DOI
主要任务 Sequence transduction,重点是机器翻译
核心主张 用完全基于 attention 的 encoder-decoder 替代 recurrent / convolutional 主干
主要证据 WMT 2014 英德、英法翻译结果;结构变体实验;英语 constituency parsing

这篇论文最重要的问题很具体:在序列到序列建模里,能不能把沿时间步展开的主干计算拿掉,只保留 attention,并且仍然得到强结果与更好的并行性。 论文的价值不只在于提出了一个新名字,而在于它把这个问题拆成了可验证的几个部分:为什么 recurrence 会成为瓶颈,self-attention 如何承担序列内部的信息交换,multi-head 为什么能缓解单头平均化带来的表达损失,以及实验是否真的支撑这些设计。

为什么作者要去掉 recurrence

论文开头首先针对的是当时主流的 encoder-decoder 路线。无论是 RNN、LSTM 还是 GRU,它们都把序列位置和计算时间绑定在一起。若第 tt 个隐藏状态写成

ht=f(ht1,xt),h_t = f(h_{t-1}, x_t),

那么同一个样本内部的计算天然带有顺序依赖:第 tt 步要等第 t1t-1 步完成。这会直接限制训练并行化。随着序列变长,显存又限制了 batch 大小,这个问题会更明显。

作者在背景部分还比较了卷积路线,例如 ByteNet 和 ConvS2S。卷积能把不同位置的表示并行算出来,但如果两个位置相隔很远,它们之间的交互通常仍要经过多层传播。论文把这个差别讲得很清楚:对于长距离依赖,网络中信号要跨过的路径长度很重要。路径越短,学习越容易。

这正是 Transformer 的切入点。作者不是先宣称 attention “更先进”,而是先指出两个目标:

  1. 减少顺序操作数,提高并行性;
  2. 缩短远距离位置之间的交互路径。

在这个意义上,去掉 recurrence 是一项围绕计算组织方式展开的结构性决策。Transformer 仍然保留 encoder-decoder 框架,也仍然做自回归生成,但序列内部信息流动的主要载体换成了 attention。

self-attention 如何承担序列内部的计算

Transformer 的整体形式仍是标准 seq2seq:编码器把输入序列 (x1,,xn)(x_1,\dots,x_n) 映射成表示序列 z=(z1,,zn)z=(z_1,\dots,z_n),解码器再基于这些表示逐步生成输出 (y1,,ym)(y_1,\dots,y_m)。变化集中在每一层内部。

编码器每层包含两个子层:

  1. multi-head self-attention
  2. position-wise feed-forward network

解码器每层则包含三个子层:

  1. masked multi-head self-attention
  2. encoder-decoder attention
  3. position-wise feed-forward network

每个子层外都有 residual connection 和 layer normalization。论文 base 模型取 N=6N=6dmodel=512d_{model}=512dff=2048d_{ff}=2048、头数 h=8h=8

graph TD A[输入 token embedding + positional encoding] --> B[Encoder stack] B --> C[编码后的序列表示] D[目标端已生成 token] --> E[Masked self-attention] E --> F[Encoder-decoder attention] C --> F F --> G[FFN + Linear + Softmax] G --> H[下一个 token 概率]

真正的核心公式是 scaled dot-product attention:

Attention(Q,K,V)=softmax(QKTdk)V.\mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V.

这里:

  • QQ 是 query matrix;
  • KK 是 key matrix;
  • VV 是 value matrix;
  • dkd_k 是 key 的维度。

它的含义可以按步骤理解。先用 QKTQK^T 计算当前位置与所有候选位置之间的相关性分数,再经过 softmax 变成权重,最后对 VV 做加权求和。若 Q,K,VQ,K,V 都来自同一序列,这就是 self-attention:一个位置可以直接根据整段序列的内容汇总自己所需的信息。

论文对缩放项 dk\sqrt{d_k} 也给了明确理由。作者指出,当 dkd_k 较大时,点积数值会变大,使 softmax 进入梯度很小的区域,训练变难。脚注里进一步说明:如果 qqkk 的各分量独立、均值为 0、方差为 1,那么 qkq\cdot k 的方差与 dkd_k 成正比。所以这项缩放服务于训练稳定性。

self-attention 相比 recurrence 的优势,论文在 Table 1 中总结得非常直接:

层类型 每层复杂度 最少顺序操作数 最大路径长度
Self-Attention O(n2d)O(n^2 d) O(1)O(1) O(1)O(1)
Recurrent O(nd2)O(n d^2) O(n)O(n) O(n)O(n)
Convolutional O(knd2)O(k n d^2) O(1)O(1) O(logkn)O(\log_k n)
Restricted Self-Attention O(rnd)O(r n d) O(1)O(1) O(n/r)O(n/r)

这张表最值得记住的是最后一列。self-attention 让任意两个位置可以在一层内直接发生交互,因此路径长度是常数级。对 recurrent 网络,信息要沿时间步连续传递,路径长度随序列长度增长。作者因此认为 self-attention 更适合学习长距离依赖。

论文也没有回避代价。self-attention 的复杂度中有 n2n^2 项,所以当序列极长时,attention matrix 会变得昂贵。原文明确提到:在机器翻译这类句子级任务中,序列长度 nn 往往小于表示维度 dd,self-attention 更有优势;若面对更长序列,可以考虑 restricted self-attention。这说明论文的结论是带条件的。

multi-head、FFN 与位置编码分别补上了什么

如果只有一个 attention 头,模型会在同一个表示空间里完成一次加权汇总。作者认为这会带来一个问题:不同类型的依赖关系会被平均化,表达能力受限。因此他们把 attention 扩展成 multi-head:

MultiHead(Q,K,V)=Concat(head1,,headh)WO,\mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(head_1,\dots,head_h)W^O,

其中

headi=Attention(QWiQ,KWiK,VWiV).head_i=\mathrm{Attention}(QW_i^Q,KW_i^K,VW_i^V).

也就是说,模型先把 Q,K,VQ,K,V 线性投影到多个子空间,在每个子空间里并行做 attention,再把结果拼接回来。论文对它的解释非常明确:multi-head attention 允许模型在不同表示子空间、不同位置上联合关注信息;若只有单头,这种能力会被 averaging 抑制。

base 模型里 h=8h=8,并设置

dk=dv=dmodel/h=64.d_k=d_v=d_{model}/h=64.

这样每个 head 的维度变小了,总计算量仍与全维单头 attention 处在相近量级。multi-head 的作用因此不只是“多几个通道”,更是让模型把不同依赖模式拆开学习。

在 attention 之外,每层还接一个 position-wise feed-forward network:

FFN(x)=max(0,xW1+b1)W2+b2.\mathrm{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2.

它对每个位置独立作用,所以 attention 与 FFN 的分工很清楚:

  • attention 负责跨位置的信息交换;
  • FFN 负责单位置上的非线性变换。

剩下还有一个关键问题:既然没有 recurrence,也没有 convolution,模型从哪里知道顺序?论文的答案是 positional encoding。作者把位置编码直接加到 input embedding 上,并采用正弦余弦形式:

PE(pos,2i)=sin(pos/100002i/dmodel),PE(pos,2i)=\sin\left(pos/10000^{2i/d_{model}}\right), PE(pos,2i+1)=cos(pos/100002i/dmodel).PE(pos,2i+1)=\cos\left(pos/10000^{2i/d_{model}}\right).

其中 pospos 表示位置,ii 表示维度下标。原文给出的动机有两点。第一,这种编码与 embedding 同维,可以直接相加。第二,对于任意固定偏移 kkPEpos+kPE_{pos+k} 可以表示成 PEposPE_{pos} 的线性函数,作者据此推测模型可能更容易学习相对位置信息。

值得注意的是,论文还做了 learned positional embeddings 的对比实验,结果与正弦位置编码“nearly identical”。因此,原文并没有证明正弦编码在当时实验里明显更强;它更像是一个兼顾外推性的设计选择。

训练设置与实验如何支撑论文结论

论文的核心证据来自两类实验:机器翻译主结果,以及结构变体实验。

训练数据方面:

  • WMT 2014 English-German:约 450 万句对,共享 BPE 词表约 37000;
  • WMT 2014 English-French:约 3600 万句对,32000 word-piece 词表。

batch 按近似序列长度组织,每个 batch 约含 25000 source tokens 和 25000 target tokens。硬件为 8 张 NVIDIA P100 GPU。base 模型训练 100,000 steps,约 12 小时;big 模型训练 300,000 steps,约 3.5 天。

优化器是 Adam,参数为:

  • β1=0.9\beta_1=0.9
  • β2=0.98\beta_2=0.98
  • ϵ=109\epsilon=10^{-9}

学习率 schedule 写成

lrate=dmodel0.5min(step_num0.5, step_numwarmup_steps1.5),lrate=d_{model}^{-0.5}\cdot \min(step\_num^{-0.5},\ step\_num\cdot warmup\_steps^{-1.5}),

其中 warmup_steps=4000warmup\_steps=4000。这意味着前期线性升高,之后按 step0.5step^{-0.5} 衰减。论文还使用 dropout 和 label smoothing,且明确指出 label smoothing 会损害 perplexity,但会提升 accuracy 和 BLEU。这一细节很重要,因为它说明作者关心的是最终任务指标,而不是单一训练损失。

机器翻译主结果

在 Table 2 中,Transformer 同时报告了 BLEU 和训练成本(FLOPs 估计):

模型 EN-DE BLEU EN-FR BLEU EN-DE 训练成本 EN-FR 训练成本
ConvS2S 25.16 40.46 9.6×10189.6\times10^{18} 1.5×10201.5\times10^{20}
MoE 26.03 40.56 2.0×10192.0\times10^{19} 1.2×10201.2\times10^{20}
Transformer (base) 27.3 38.1 3.3×10183.3\times10^{18}
Transformer (big) 28.4 41.8 2.3×10192.3\times10^{19}

作者据此声称两件事:

  1. 翻译质量具有竞争力,英德任务上超过此前最佳结果,英法任务上达到当时单模型最优;
  2. 训练成本明显更低,尤其是 base 模型。

这正好对应论文一开始的目标:不仅要证明“attention-only 模型能工作”,还要证明它在并行化和训练效率上是有现实收益的。

结构变体实验

Table 3 的意义在于检查关键设计是否真的重要,而不是靠主结果“顺便成功”。论文在英德开发集上改变模型配置,得到几条很清楚的结论:

  • 单头 attention 比最佳多头设置低 0.9 BLEU,说明 multi-head 本身有贡献;
  • head 数继续增多也会掉点,表明头数并非越多越好;
  • 减小 dkd_k 会损害效果,作者据此认为 compatibility 的判断并不轻松;
  • 更大的模型通常效果更好;
  • dropout 对避免过拟合同样重要;
  • learned positional embeddings 与 sinusoidal encoding 结果几乎相同。

这些实验没有把每个机制都“严格隔离”到因果证明的程度,但足以说明 Transformer 的主要部件并非任意拼接。论文中的设计选择与观测到的性能变化之间是有对应关系的。

跨任务泛化

作者还把 Transformer 用在英语 constituency parsing。4-layer Transformer 在 WSJ only 设定上得到 91.3 F1,在 semi-supervised 设定上达到 92.7 F1。原文对这个结果的措辞相对谨慎:它说明 attention-only 的 transduction 架构不只适用于翻译,也能迁移到结构约束更强、输出更长的任务。

这里最稳妥的解读是:论文为 Transformer 的泛化能力提供了初步证据。它没有由此证明 Transformer 已经在所有结构化预测任务上占优,但足以说明这套架构不是翻译场景里的偶然特例。

这篇论文真正证明了什么

如果只保留论文本身能够支撑的结论,可以归纳为四点。

第一,作者提出了第一个完全依赖 self-attention 来计算输入与输出表示、同时去掉 sequence-aligned RNN 和 convolution 的 sequence transduction 模型。这一点是明确的方法主张。

第二,self-attention 之所以能承担主干计算,不只是因为它“能聚合上下文”,更因为它降低了顺序操作数,并把任意两位置之间的交互路径压缩到常数级。这是论文替换 recurrence 的理论动机。

第三,multi-head attention 的作用是让模型在不同表示子空间、不同位置上并行建立关系,从而减轻单头平均化带来的表达损失。Table 3 给了经验支持。

第四,在 2017 年的机器翻译设定下,这套架构同时展现了强性能与较优训练效率。WMT 2014 英德、英法实验构成了论文最核心的证据链。

同样需要保留边界。论文没有证明 attention 在任何长度、任何任务、任何资源条件下都优于 recurrence 或 convolution;也没有解决长序列下的 O(n2)O(n^2) 成本问题。作者自己在第四节和结论里都承认,restricted attention 是未来方向之一。正因为这个边界存在,后来一系列稀疏注意力、局部注意力和线性化注意力工作才会继续出现。

从今天回看,《Attention Is All You Need》的关键贡献可以概括为:它把 sequence transduction 的核心计算从“沿时间步推进”改写成了“通过 attention 在全局范围内直接路由信息”,并用训练配方与实验结果证明这件事在当时已经足够可行。

较新文章Linnainmaa 1976:从累计舍入误差到反向累积思想2026年4月23日

相关文章