文章目录
前言
本文对Ashish Vaswani等人在2017年发表的经典论文《Attention Is All You Need》及代码进行解析,并记录自己的理解与体会,形成一篇论文及代码阅读笔记。
作者:张硕 中国科学院大学人工智能学院 自动化研究所
课程:自然语言处理
时间:2026.3.28
摘要
1. 论文试图解决什么问题?
论文试图解决序列转换任务(如机器翻译)中,主流模型(基于循环或卷积神经网络)存在的两个核心问题:一是顺序计算的固有限制导致训练难以并行化,尤其在处理长序列时效率低下;二是长距离依赖的学习困难,因为信号需要经过较长的路径才能建立联系。论文希望提出一种新架构,在保证甚至提升性能的同时,大幅提高训练效率。
2. 论文提出的核心思想是什么?
核心思想是完全抛弃循环和卷积结构,提出一种名为 Transformer 的新架构,仅依赖注意力机制来捕捉输入与输出之间的全局依赖关系。通过这种方式,模型可以同时计算序列中所有位置的信息,从而极大提升并行化能力。
3. 为什么这种模型能够取得更好的泛化效果?
Transformer 通过自注意力机制让每个位置可以直接与序列中任意位置建立联系,避免了传统 RNN 中信息必须沿时间步传递的路径限制,从而更容易学习长距离依赖。同时,多头注意力机制允许模型从多个子空间中关注不同的语义关系,增强了表示能力。实验也证明,它在翻译和句法分析等任务上均能取得优异表现,说明其泛化能力良好。
4. 训练这种模型面临的主要挑战是什么?
虽然 Transformer 在并行性上具有天然优势,但在设计之初仍需解决:
- 位置信息的缺失:由于没有循环或卷积,模型需要额外引入位置编码来利用序列顺序。
- 注意力计算的复杂度:标准的自注意力机制对序列长度的平方级复杂度在处理超长序列时可能成为瓶颈。
- 训练稳定性:需要合理设计缩放点积注意力、残差连接和层归一化等措施,以避免梯度消失或训练不稳定。
5. 论文的实验结果如何?相比当时的先进模型有什么提升?
论文在 WMT 2014 英德翻译任务上,Transformer 大型模型取得了 28.4 BLEU,比此前最佳结果(包括集成模型)提升了超过 2 BLEU;在英法翻译任务上,单模型达到 41.8 BLEU,成为新的最优结果。更重要的是,训练时间显著缩短:基础模型在 8 块 P100 GPU 上仅用 12 小时 完成训练,而此前最佳模型需要数天甚至更长。此外,Transformer 在英语句法分析任务上也表现优异,说明其具有良好的任务泛化能力。
一、 引言与背景
1.1 现有序列转换模型的根本局限:顺序计算与并行化困难
序列转换任务(如机器翻译、文本生成)的主流解决方案长期以循环神经网络为核心,尤其是LSTM和GRU等变体。这类模型按时间步顺序处理序列,每个时刻的隐藏状态依赖于前一时刻的输出和当前输入,形成内在的顺序计算链条。这种设计使得训练样本内部的计算无法并行化,随着序列长度增加,内存限制进一步制约了批次规模,训练效率受到严重影响。尽管后续研究通过分解技巧和条件计算在一定程度上提升了计算效率,但顺序依赖这一本质约束始终未被打破。
1.2 注意力机制的作用及其局限
注意力机制能够使模型在计算当前位置的表示时,直接关注输入或输出序列中的任意其他位置,从而有效建模长距离依赖。它已成为序列模型中不可或缺的组件。然而,在几乎所有已有工作中,注意力机制都只是作为循环网络的辅助模块出现,并未改变模型整体的顺序计算结构。
1.3 Transformer的核心理念:完全依赖注意力
本文提出的Transformer模型彻底抛弃了循环和卷积结构,将注意力机制作为唯一的计算单元。模型在编码器和解码器中均采用自注意力来捕获序列内部的依赖关系,同时通过编码器-解码器注意力建立输入与输出之间的全局联系。这种设计使得序列中所有位置的计算可以同时进行,大幅提升了并行化能力,显著缩短了训练时间。
1.4 基于卷积的并行化尝试及其不足
为了减少顺序计算,已有研究尝试使用卷积神经网络作为基础构建块,例如Extended Neural GPU、ByteNet和ConvS2S。这些模型能够并行计算所有位置的表示,但不同位置之间的信息传递仍受限于网络深度。具体而言,两个位置之间的路径长度随着距离增加而增长:ConvS2S中为线性关系,ByteNet中为对数关系。这使得远距离依赖的学习变得困难。相比之下,Transformer将任意两点之间的路径长度压缩为常数(一次注意力计算即可建立连接),尽管平均注意力会带来一定的分辨率损失,但通过多头注意力机制得到了有效补偿。
1.5 自注意力机制与相关工作的定位
自注意力是指在同一个序列内部不同位置之间建立关联的机制,已在阅读理解、摘要生成、文本蕴含和句子表示学习等任务中得到成功应用。端到端记忆网络也采用了类似的循环注意力结构,而非传统序列对齐的循环网络。然而,这些工作并未将自注意力作为序列转换模型的核心构建单元。本文提出的Transformer是第一个完全依靠自注意力来同时表示输入和输出的序列转换模型,既不使用RNN,也不使用卷积,实现了架构上的根本性创新。
1.6 本文主要贡献与实验概述
提出Transformer模型,实现完全基于注意力的序列转换,大幅提升并行训练能力。
在WMT 2014英德和英法翻译任务上达到新的最佳BLEU分数,同时训练时间仅为先前最佳模型的零头(基础模型在8块P100 GPU上训练12小时)。
证明模型能够推广到其他任务(如英语句法分析),即使在小数据条件下也表现优异。
为后续基于注意力机制的模型研究奠定了基础。
二、模型架构
2.1 整体结构
Transformer 采用经典的编码器-解码器结构,但彻底抛弃了循环与卷积,完全基于注意力机制和全连接层构建。整体架构如图所示,左右两半分别对应编码器与解码器。
- 编码器:将输入序列 ( x 1 , … , x n ) (x_1,\dots,x_n) (x1,…,xn) 映射为连续表示序列 z = ( z 1 , … , z n ) \mathbf{z}=(z_1,\dots,z_n) z=(z1,…,zn)。
- 解码器:自回归地生成输出序列 ( y 1 , … , y m ) (y_1,\dots,y_m) (y1,…,ym),每一步将之前生成的符号作为额外输入。
- 堆叠层数:编码器和解码器均由 N = 6 N=6 N=6 个相同结构的层堆叠而成。
- 维度统一:所有子层及嵌入层输出维度均为 d model = 512 d_{\text{model}}=512 dmodel=512,便于残差连接。

2.2 编码器与解码器堆栈
编码器层的每一层包含两个子层:
- 多头自注意力子层:允许每个位置关注编码器前一层的所有位置。
- 逐位置全连接前馈网络:独立处理每个位置的表示。
每个子层周围使用残差连接,后接层归一化。形式上,每个子层的输出为: LayerNorm ( x + Sublayer ( x ) ) \text{LayerNorm}(x + \text{Sublayer}(x)) LayerNorm(x+Sublayer(x))其中 Sublayer ( x ) \text{Sublayer}(x) Sublayer(x) 是子层自身的函数。
解码器在编码器层的基础上插入第三个子层:编码器-解码器注意力子层。该子层对编码器输出执行多头注意力,其中查询来自解码器上一层的输出,键和值来自编码器输出。这使解码器能够关注输入序列的所有位置。
此外,解码器的自注意力子层经过掩码修改,防止当前位置关注到后续位置(左向信息流)。结合输出序列右移一位的机制,确保位置 i i i 的预测只依赖于 i i i 之前已知的输出,维持自回归性质。
2.3 注意力机制
注意力函数本质上是将查询与一组键-值对映射为输出的过程。输出为值的加权和,权重由查询与对应键的兼容性决定。
2.3.1 缩放点积注意力
论文采用“缩放点积注意力”,结构如左图所示。计算公式为: Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V其中 Q Q Q(查询)、 K K K(键)、 V V V(值)分别为矩阵形式,维度为 d k d_k dk 和 d v d_v dv。
为何缩放:当 d k d_k dk 较大时,点积值会变得很大,将 softmax 函数推入梯度极小的饱和区域。除以 d k \sqrt{d_k} dk 可以抵消这种影响,维持梯度稳定性。
效率优势:相比加性注意力,点积注意力可利用高度优化的矩阵乘法实现,在计算和空间上更高效。
2.3.2 多头注意力
单头注意力会因平均而抑制从不同子空间联合关注信息的能力。因此,论文引入多头注意力,结构如右图所示。数学表达为: MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1,\dots,\text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,…,headh)WO其中 head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)。
具体做法:
- 将 Q Q Q、 K K K、 V V V 分别通过不同的线性投影 h h h 次,投影到 d k d_k dk、 d k d_k dk、 d v d_v dv 维空间。
- 对每组投影并行执行缩放点积注意力,得到 h h h 个 d v d_v dv 维输出。
- 将这些输出拼接,再通过一次线性投影得到最终结果。
论文中采用 h = 8 h=8 h=8 个注意力头,每个头的维度 d k = d v = d model / h = 64 d_k = d_v = d_{\text{model}} / h = 64 dk=dv=dmodel/h=64。总计算量与单头全维度注意力相近,但表达能力更强。
2.3.3 注意力在模型中的三种应用
- 编码器自注意力:查询、键、值均来自编码器前一层的输出。每个位置可以关注前一层的所有位置。
- 解码器自注意力:同样来自解码器前一层的输出,但通过掩码禁止左向信息流,确保自回归性。
- 编码器-解码器注意力:查询来自解码器前一层的输出,键和值来自编码器输出。这使解码器每个位置都能关注输入序列的所有位置,模拟经典序列到序列模型中的注意力机制。

2.4 逐位置前馈网络
每个编码器和解码器层都包含一个全连接前馈网络,独立且相同地应用于每个位置。它由两个线性变换组成,中间使用 ReLU 激活: FFN ( x ) = max ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 FFN(x)=max(0,xW1+b1)W2+b2输入和输出维度均为 d model = 512 d_{\text{model}} = 512 d


1591

被折叠的 条评论
为什么被折叠?



