JackLee

专注,折腾,热爱生活,泳无止境

0%

Attention Is All You Need 中文精读

说明:本文不是论文全文翻译,而是基于原论文的中文精读、结构化转述和学习笔记。原论文可从 arXiv 和 NeurIPS Proceedings 阅读。

论文信息

一句话概括

这篇论文提出了 Transformer:一种完全基于注意力机制的序列到序列模型。它不再依赖循环神经网络或者卷积神经网络处理序列,而是通过自注意力机制直接建模序列中任意两个位置之间的关系。

这件事的影响非常大。以前处理句子时,模型常常按时间步一步一步读入词语;Transformer 则允许每个词同时“看见”句子中的其他词。这样不仅能捕捉长距离依赖,还更适合 GPU 并行计算。

摘要转述

在这篇论文之前,主流的序列转换模型大多是编码器-解码器结构,并且依赖复杂的循环网络或者卷积网络。表现较好的模型会额外加入注意力机制,把编码器和解码器连接起来。

论文作者提出了一个新的、更简单的网络架构:Transformer。它只依赖注意力机制,不再使用循环结构和卷积结构。实验显示,在机器翻译任务中,Transformer 不仅翻译质量更高,而且并行能力更强,训练时间也明显更短。

论文报告的关键结果包括:

  • WMT 2014 英译德任务达到 28.4 BLEU,超过当时已有最好结果。
  • WMT 2014 英译法任务达到 41.8 BLEU,使用 8 块 GPU 训练 3.5 天。
  • 模型还能迁移到英语成分句法分析任务,说明它不只是一个机器翻译专用结构。

论文要解决的问题

传统 RNN、LSTM、GRU 适合处理序列,因为它们天然按顺序读取输入。但这种顺序性也带来了两个问题。

第一,训练并行度差。第 t 个位置的计算依赖第 t-1 个位置的状态,很难把整句话完全并行起来。

第二,长距离依赖难。虽然 LSTM 和 GRU 缓解了梯度消失问题,但如果两个相关词隔得很远,信息仍然需要经过很多步传递。

CNN 可以通过卷积层堆叠扩大感受野,部分解决并行问题,但想覆盖长距离关系仍然需要多层网络,路径长度不会天然变短。

Transformer 的核心想法是:直接让序列中任意两个位置建立联系。也就是说,一个词不必等信息沿着时间线慢慢传过来,而是可以通过注意力机制一次性参考所有位置。

Transformer 的整体结构

Transformer 仍然采用编码器-解码器架构:

  • 编码器负责把输入序列转换成连续表示。
  • 解码器根据编码器输出和已经生成的目标序列,逐步预测下一个词。

论文中的基础模型使用 6 层编码器和 6 层解码器。每一层都不是单一模块,而是由注意力、前馈网络、残差连接和层归一化组成。

编码器层包含两个主要子层:

  • 多头自注意力层
  • 逐位置前馈网络

解码器层包含三个主要子层:

  • 带遮罩的多头自注意力层
  • 编码器-解码器注意力层
  • 逐位置前馈网络

这里的“遮罩”很关键。生成目标句子时,模型不能偷看未来位置,所以解码器自注意力只能关注当前位置和它之前的位置。

自注意力:让每个词自己找上下文

自注意力的目标是:对序列中的每个位置,计算它应该关注其他位置的程度,然后把这些位置的信息加权汇总。

论文使用 Query、Key、Value 来描述这个过程:

  • Query:当前位置发出的查询,表示“我想找什么信息”。
  • Key:每个位置提供的索引,表示“我有什么特征可供匹配”。
  • Value:每个位置真正被汇总的信息内容。

计算过程可以写成下面这样:

1
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V

理解这个公式时,可以分成三步:

  1. Q 和 K 做点积,得到每个位置之间的相关性分数。
  2. 除以 sqrt(d_k),避免维度较大时点积分数过大,导致 softmax 过于尖锐。
  3. 用 softmax 得到权重,再对 V 做加权求和。

这样,每个词的输出表示都不再只来自自己,而是来自整句话中所有相关位置的加权组合。

多头注意力:不是只从一个角度看句子

如果只做一次注意力,模型只能在一个表示空间里学习关系。论文提出多头注意力,把 Q、K、V 投影到多个子空间中,分别做注意力计算,再把结果拼接起来。

直观地看,不同注意力头可以学习不同类型的关系。例如:

  • 有的头关注主语和谓语之间的关系。
  • 有的头关注代词和它指代的名词。
  • 有的头关注相邻词的短距离组合。
  • 有的头关注远距离依赖。

论文中的基础模型使用 8 个注意力头。每个头的维度较小,多个头合在一起保持整体计算量可控。

位置编码:没有 RNN 后,模型怎么知道顺序

Transformer 不按顺序递归处理输入,因此模型本身并不知道词的位置。如果只把词向量送进去,“我喜欢你”和“你喜欢我”在词集合层面很像,但语义完全不同。

为了解决这个问题,论文加入了位置编码。位置编码会和词嵌入相加,让每个词向量同时包含词义信息和位置信息。

论文使用正弦和余弦函数构造位置编码。这样做有两个好处:

  • 不需要学习额外的位置参数。
  • 模型可能更容易外推到比训练时更长的序列。

可以把位置编码理解成给每个词贴上一个“坐标标签”。注意力机制负责找关系,位置编码负责告诉模型这些词在序列中的相对和绝对位置。

前馈网络、残差连接和层归一化

每个注意力子层之后,Transformer 都会接一个逐位置前馈网络。它对每个位置独立应用同一个两层全连接网络:

1
FFN(x) = max(0, xW1 + b1)W2 + b2

这个模块不在不同位置之间传递信息,它的作用是对每个位置的表示做非线性变换,提升模型表达能力。

此外,论文在每个子层周围使用残差连接和层归一化:

1
LayerNorm(x + Sublayer(x))

残差连接让深层网络更容易训练,层归一化让表示分布更稳定。这两个设计后来也成了大多数 Transformer 变体的基础组件。

为什么 Transformer 更快

论文比较了三类结构在三个维度上的差异:

  • 每层计算复杂度
  • 可并行计算的程度
  • 长距离依赖的路径长度

RNN 的问题是顺序依赖强,无法高效并行。CNN 的并行性更好,但远距离位置之间需要经过多层卷积才能建立联系。自注意力则可以在一层中直接连接任意两个位置。

自注意力的一个代价是序列长度上的二次复杂度。也就是说,长度为 n 的序列需要计算 n 乘 n 的注意力矩阵。对于机器翻译这类中等长度序列,这个代价是可以接受的;但对于超长上下文任务,后来的很多研究都在改进注意力的计算复杂度。

训练细节

论文中有几个后来被广泛沿用的训练细节。

学习率调度使用 warmup:训练初期逐步升高学习率,之后按步数的反平方根衰减。这样可以避免一开始参数还不稳定时学习率过大。

优化器使用 Adam,并设置了特定的 beta 参数和 epsilon。正则化方面,模型使用 dropout,并采用 label smoothing。label smoothing 会让目标分布不再是绝对的 one-hot,从而降低模型过度自信的问题。

这些细节不是 Transformer 思想本身,但对复现实验结果非常重要。

实验结果怎么看

论文的核心实验是机器翻译:

  • 英译德任务:Transformer base 达到 27.3 BLEU,Transformer big 达到 28.4 BLEU。
  • 英译法任务:Transformer big 达到 41.8 BLEU。

更重要的是训练成本。论文强调 Transformer 质量高、并行性强,训练所需时间显著少于当时一些强基线模型。

论文还把 Transformer 用到英语成分句法分析任务上,结果说明这个架构具有一定通用性,不只是为翻译任务做的专门工程。

这篇论文真正重要的地方

这篇论文的重要性不只在于拿到了更高的 BLEU 分数,而在于它改变了序列建模的默认范式。

过去,处理序列时很自然会想到 RNN:因为语言有顺序,所以模型也按顺序处理。Transformer 提出的观点更激进:顺序不一定要靠递归结构表达,可以把顺序作为位置编码,把依赖关系交给注意力机制。

这个设计带来几个长期影响:

  • 训练可以大规模并行,适合现代 GPU/TPU。
  • 模型更容易扩展到大参数量和大数据。
  • 自注意力提供了统一的序列建模接口。
  • 后续的 BERT、GPT、T5 等模型都可以看作 Transformer 架构的不同使用方式。

从今天回头看,Transformer 是大语言模型、代码模型、多模态模型的重要技术基础之一。

阅读这篇论文时容易卡住的点

第一,不要把 attention 理解成“模型真的在解释自己”。注意力权重可以帮助观察模型关注了哪些位置,但它不等同于严格因果解释。

第二,多头注意力不是简单重复计算。多个头通过不同线性投影进入不同表示空间,理论上能捕捉多种关系。

第三,位置编码不是可有可无。没有位置编码,自注意力本身对输入顺序不敏感,模型很难区分同一组词的不同排列。

第四,解码器里的 mask 是生成任务的基本约束。训练时目标句子已知,但模型预测第 t 个词时不能看到第 t+1 个词之后的内容。

第五,Transformer 的强大并不代表注意力没有成本。标准自注意力对序列长度是二次复杂度,所以长上下文仍然是工程和研究上的重点问题。

对我的学习启发

如果把这篇论文当成入门材料,最值得抓住的不是每个超参数,而是三个核心设计:

  • 用自注意力替代递归,把任意位置之间的依赖路径缩短到一步。
  • 用多头机制让模型从多个表示子空间理解序列关系。
  • 用位置编码补上非递归模型缺失的顺序信息。

理解了这三点,再看后来的 BERT、GPT、ViT、T5,就会发现它们虽然任务不同、训练目标不同、规模不同,但底层骨架有很强的连续性。

参考资料

欢迎关注我的其它发布渠道