《Attention Is All You Need》:为什么去掉循环,Transformer 仍能处理顺序

《Attention Is All You Need》:为什么去掉循环,Transformer 仍能处理顺序

从 Q/K/V、位置编码、decoder mask 到 BLEU 表格,读懂 Transformer 用全局注意力换取并行训练时付出的计算代价。

翻译一句话时,句首的名词可能要等到句尾的动词或代词出现,模型才知道两者是什么关系。RNN 的做法是按位置一步步传递状态;卷积能并行,但远处的两个位置要经过多层卷积才能互相影响。Transformer 把这条计算路径改成了一次全局检索:每个位置都可以直接给整句中的其他位置分配权重,再把有用的信息加回来。
这就是 Vaswani 等八位作者在 2017 年 6 月 12 日提交的论文 Attention Is All You Need 的核心问题与答案。论文提出的 Transformer 完全去掉序列对齐的循环层和卷积层,仍用 encoder-decoder 结构完成机器翻译。1
读这篇论文,最值得抓住的不是「注意力很强」这句口号,而是它做了一笔明确的交换:用全局、可并行的内容路由换掉循环计算的串行约束,同时用显式的位置表示补回顺序信息;代价是每层要计算位置两两之间的关系。

旧问题:序列模型为什么难以并行

在 RNN 中,第 t 个隐藏状态依赖第 t-1 个隐藏状态。训练一个样本时,即使整句话已经放进显存,位置之间的计算仍被串成一条链;序列越长,这条链越长。卷积把同一层的多个位置并行算出来,但一个小卷积核只能看局部邻域,远距离信息必须沿多层网络传递。论文用三个字段比较这些层:每层复杂度、必须串行执行的最少操作数、任意两个位置之间的最长路径。2
层类型每层复杂度最少串行操作最长路径
RNNO(n·d²)O(n)O(n)
卷积O(k·n·d²)O(1)O(log_k n)(扩张卷积)
全局自注意力O(n²·d)O(1)O(1)
这里的 n 是序列长度,d 是表示维度,k 是卷积核宽度。表格不表示自注意力在任何长度上都更便宜:当 n 小于 d 时,论文认为它在句子级表示上可能比 RNN 更快;当 n 变得很大, 反而会成为主要负担。自注意力真正消掉的是串行路径,而不是所有计算成本。2

一次全局检索:Q、K、V 分别在算什么

把每个 token 的向量记作一个位置的表示。对同一组输入做三次不同的线性投影,就得到 QKV
  • Q(query,查询)表示「我现在想找什么」;
  • K(key,键)表示「我能被什么样的查询找到」;
  • V(value,值)表示「找到我之后,真正取走什么信息」。
对一个查询 q,模型把它与每个键 k_j 做点积。点积越大,说明两者在当前表示空间里越匹配。把所有匹配分数送进 softmax,就得到一组和为 1 的权重;最后用这组权重对所有 v_j 加权求和:
Attention(Q, K, V) = softmax(QKᵀ / √d_k)V
这行公式可以按四个动作读:
  1. QKᵀ:计算每个位置对所有位置的匹配分数,得到一个位置到位置的矩阵;
  2. / √d_k:把分数缩小到合适的尺度;
  3. softmax:把分数变成注意力权重;
  4. ...V:按权重混合信息,生成新的位置表示。
为什么要除以 √d_k?如果 qk 的各个分量独立、均值为 0、方差为 1,那么它们的点积方差会随 d_k 增长。分数过大时,softmax 容易挤到接近 one-hot 的区域,梯度变得很小;缩放是在训练稳定性和匹配分辨率之间做的数值处理。2
在 self-attention 里,QKV 都来自同一个序列。于是每个词都能直接读取同一序列中其他位置的信息。比如某个位置需要判断一个代词指向谁,它不必等待一个隐藏状态从句首传过来,而是可以在这一层直接给候选位置分配权重。
不过,一次注意力并不会自动懂得顺序。把同一批向量任意重排,只要相似度关系也随之重排,单独的 self-attention 没有内置的「第几个位置」概念。Transformer 在输入 embedding 上加上与其同维度的位置向量。论文采用不同频率的正弦和余弦:
PE(pos, 2i) = sin(pos / 10000^(2i / d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i / d_model))
作者选择固定的正弦形式,是因为他们假设固定偏移后的编码可以由原编码的线性变换表达,从而方便模型利用相对位置。论文也用学习式位置嵌入做了对照,在英德开发集上的结果几乎相同;因此,正弦编码是一个可行设计,不是 Transformer 成功的唯一原因。2

为什么要多头,而不是只做一次注意力

如果只在完整的 d_model 维空间里做一次注意力,不同关系会被迫共用同一套匹配与混合方式。多头注意力先把 QKV 分别投影到多个较小的子空间,在每个子空间独立计算注意力,再把结果拼接并投影回原维度:
MultiHead(Q, K, V) = Concat(head₁, ..., head_h)Wᴼ
head_i = Attention(QWᵢQ, KWᵢK, VWᵢV)
原论文的 base 模型使用 h = 8 个 head,d_model = 512,每个 head 的 d_k = d_v = 64。多个 head 不是把同一张注意力图复制八遍,而是允许不同投影空间学习不同的关系;论文的消融实验也显示,单头设置比最佳多头设置低 0.9 BLEU,但 head 过多同样会让质量下降。2

把一个 Transformer 层走一遍

Transformer 原论文架构图:左侧为 encoder,右侧为 decoder,图中标出多头注意力、位置编码、前馈网络、残差连接与输出 softmax
图中左侧的 encoder 先把输入序列变成一组上下文表示;右侧的 decoder 一边读取 encoder 输出,一边用 masked attention 逐词生成目标序列。图为原论文 Figure 1。2
先只看 encoder 的一层。输入 embedding 加上位置编码后,依次经过:
  1. 多头 self-attention:每个位置读取上一层所有位置的信息,得到同长度的新表示;
  2. 残差连接与 LayerNorm:把子层输入加回子层输出,再做层归一化,帮助深层堆叠保持稳定;
  3. 逐位置前馈网络:对每个位置独立应用同一个两层网络 FFN(x) = max(0, xW₁ + b₁)W₂ + b₂
  4. 再次残差连接与 LayerNorm:得到这一层的输出。
这解释了一个容易被忽略的事实:Transformer 不是只有 attention。attention 负责位置之间的信息交换,FFN 负责在每个位置上做非线性变换。原论文的 encoder 和 decoder 都各堆叠 6 层;d_model 为 512,FFN 的中间维度为 2048。2
decoder 多两件事。第一,它的 self-attention 要遮住未来位置:在 softmax 之前,把不允许连接的分数设为负无穷,当前位置就不会读取尚未生成的目标词。第二,它有一层 encoder-decoder attention:查询来自 decoder 当前层,键和值来自 encoder 输出,所以生成目标词时可以检索整句输入。输出 embedding 右移一位,配合这个 mask,训练时第 i 个预测只能依赖已知的目标前缀。2
生成阶段仍然是自回归的:模型先预测第一个目标词,再把它放回输入,继续预测下一个词。于是「训练时可以对整条序列并行做 attention」与「推理时目标词要一个个生成」同时成立。论文解决的是训练中的序列依赖,尚未把生成过程本身改成完全并行。2

实验表怎么读:质量、成本、组件不能混为一谈

论文主要在 WMT 2014 英德和英法翻译上测试 Transformer。英德数据约有 450 万句对,英法数据约有 3600 万句;模型在 8 块 NVIDIA P100 GPU 上训练。base 模型训练 100,000 步、约 12 小时,big 模型训练 300,000 步、约 3.5 天。2
先看主结果。BLEU 是把模型译文与参考译文进行 n-gram 层面的重合比较,表中的数值适合用来比较同一测试集上的系统,不应被直接当作完整的语言质量。论文表 2 给出的 Transformer big 结果是:
任务Transformer big 的 BLEU读法
WMT 2014 英译德28.4论文称其超过此前包括集成模型在内的最佳结果 2 BLEU 以上。
WMT 2014 英译法41.8摘要和表 2 把它列为单模型结果;论文同一小节的叙述段落另写成 41.0,阅读原文时应保留这个版本内部不一致。
这些数字支持一个有限但有分量的判断:在论文选定的两个翻译基准上,Transformer 同时取得了更高的 BLEU 和更强的并行训练特性。它们不能单独证明 Transformer 在所有序列任务、所有长度和所有硬件上都更优。2
再看消融实验,因为主结果只能告诉我们「整套设计有效」,不能告诉我们「哪一个零件有效」。表 3 的信息可以按问题来读:
  • head 数量:单头比最佳设置低 0.9 BLEU,head 太多也会下降,说明多头不是越多越好;
  • 键的维度 d_k:减小它会伤害质量,说明匹配本身需要足够的表示维度;
  • 模型规模:更大的模型在这组开发集上通常更好,但也需要更多训练资源;
  • dropout:去掉 dropout 后开发集质量下降,论文据此认为它有助于避免过拟合;
  • 位置编码:学习式位置嵌入和正弦编码结果近似,说明位置注入是必要接口,但具体采用哪一种并未在这组实验中拉开明显差距。
最后看迁移到别的任务。作者用 4 层 Transformer 做英语成分句法分析:只用 WSJ 训练集时 F1 为 91.3,半监督设置下为 92.7。这个结果不是语言理解能力的总证明,却说明这套层结构不只服务于机器翻译。2

局限:短路径换来了平方成本

全局 self-attention 的关键代价写在表 1 里:序列长度为 n 时,每层要形成一个 n × n 的位置关系矩阵,复杂度是 O(n²·d)。序列越长,显存和计算增长越快。论文已经提出把 attention 限制在局部邻域,以降低长输入的成本,但把它作为未来工作,并没有在这篇论文里解决全局 attention 的长序列瓶颈。2
还要区分两种「并行」。训练时,已知的目标序列可以整体送进 masked decoder,矩阵运算能并行;生成时,下一个 token 依赖上一个 token,decoder 仍按步运行。Transformer 把瓶颈从「每层读取上一个位置」移到了「每步生成下一个词」和「每层处理所有位置对」。这不是缺陷被隐藏了,而是计算瓶颈换了地方。
论文附录展示了若干 attention head 似乎在跟踪动词与远处成分、代词指代等关系。这些图能帮助我们观察模型可能使用了哪些线索,但一张注意力图只显示权重分布,不能单独证明某个 head 是产生预测的因果原因。把可视化当作诊断线索,比把它当作完整解释更稳妥。2

影响:同一接口如何离开机器翻译

Transformer 的可迁移之处,不是「所有数据都像文本」,而是它提供了一个清楚的接口:把对象表示成一组向量,给它们注入位置或结构信息,再让各位置通过 attention 交换信息。
BERT 取用了 Transformer 的 encoder,把无标注文本中的左、右上下文一起用于预训练,再用一个额外输出层适配问答、语言推理等任务。它把 Transformer 从 encoder-decoder 翻译模型改造成了通用语言表示模型。3
Vision Transformer(ViT)则把图像切成固定大小的 patch 序列,把 patch 当作类似 token 的输入,再直接用 Transformer 做图像分类。这样,attention 的输入对象从词片段换成了图像块;论文报告它在大规模数据预训练后能迁移到多个图像识别基准。4
这两个例子支持的结论很具体:Transformer 的模块边界足够通用,能把不同对象都组织成「可交互的序列」。它们不支持另一个更强的结论:只要把数据切成序列,Transformer 就必然优于带有局部结构先验的模型。

读完后,怎样自己检查一篇 Transformer 论文

遇到一个新模型,可以按下面五个问题检查,而不是先背它新增了多少模块:
  1. 输入对象是什么,顺序或空间结构通过什么方式进入表示?
  2. QKV 分别来自哪里,attention 允许哪些位置互相读取?
  3. 计算是否为所有位置构造 n × n 关系矩阵,长序列时成本如何变化?
  4. 训练并行和推理并行分别成立到哪一步,decoder 是否仍然自回归?
  5. 实验是否同时报告任务指标、模型规模、训练成本和关键消融,结果能否支持作者声称的那一层结论?
把这五个问题带回原论文,Transformer 就不再是一张模块方框图。它是一种可检查的计算安排:QKᵀ 决定信息从哪里来,用位置编码告诉模型这些信息处在什么顺序,用 FFN 在每个位置加工结果,再用残差与归一化把这套操作堆叠起来。

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content