目录

Transformer 初探

Attension Is All You Need


问题背景

Transformer 并不是凭空出现的一种新模型。它的提出,建立在 序列建模(Sequence Modeling) 长期发展的背景之上。所谓序列建模,指的是对一组具有顺序关系的数据进行表示、理解和生成。自然语言处理(Natural Language Processing, NLP)中的句子、语音处理中的声学帧序列,以及机器翻译(Machine Translation)中的输入输出文本,都是典型的序列数据。

这类问题的共同特点在于,模型不能只根据当前位置本身作出判断,还必须结合前后文信息。一个词的含义往往依赖上下文,一个输出词是否合理也取决于输入序列中多个位置的信息。于是,序列建模的核心任务并不只是对单个元素做映射,而是刻画序列内部不同位置之间的依赖关系(Dependency)。

在 Transformer 出现之前,主流的序列到序列模型(Sequence-to-Sequence Model)大多采用 编码器—解码器(Encoder-Decoder) 框架。其基本思想是:先由编码器将输入序列映射为一组连续表示(Continuous Representations),再由解码器根据这些表示逐步生成输出序列。原始工作沿用了这一总体框架,但它对框架内部的实现方式作了根本调整:不再依赖循环结构(Recurrent Structure)或卷积结构(Convolutional Structure)作为主体,而是将注意力机制(Attention Mechanism)提升为整个模型的核心。

从这个角度看,理解 Transformer,首先不是去记住它有多少层、多少头,而是要先弄清楚一个更基本的问题:在它之前,人们是如何处理序列的,这些方法为什么不够理想,以及注意力机制为什么能够承担更核心的角色。

序列建模的既有路径

在较长一段时间内,循环神经网络(Recurrent Neural Network, RNN) 及其变体,如 长短期记忆网络(Long Short-Term Memory, LSTM)门控循环单元(Gated Recurrent Unit, GRU),是序列建模的主要方法。它们的共同特点是沿着序列位置逐步展开计算:在第 $t$ 个位置的隐藏状态(Hidden State)由当前位置输入和前一时刻状态共同决定。对于具有天然时间顺序的数据,这种结构是合理的,因为它直接将“先后顺序”嵌入了模型计算过程。

但这种做法也带来了明显限制。首先,循环结构具有天然的顺序性。由于后一步依赖前一步,同一个样本内部难以实现充分并行,这会限制训练效率。原始论文明确指出,循环模型通常将计算沿输入和输出符号位置展开,而这种内在的顺序特性会妨碍训练样本内部的并行化,在序列较长时问题尤其突出。

其次,长距离依赖(Long-Range Dependency) 的建模并不理想。尽管理论上循环模型可以将早期信息传递到后面的位置,但在实际训练中,随着依赖跨度增大,信息传递路径也会变长,学习难度随之上升。这个问题并非某一类循环单元的局部缺陷,而是“信息必须沿时间步逐步传播”这一结构本身带来的结果。

除了循环方法,研究者也尝试过利用卷积网络进行序列建模。卷积结构的优势在于更容易并行,因为不同位置的局部卷积运算可以同时进行。然而,卷积方法通常依赖 有限感受野(Receptive Field) 进行局部建模,若要建立远距离位置之间的联系,就需要堆叠更多层或使用特殊设计。原始工作在背景部分将卷积方法与 自注意力(Self-Attention) 进行比较,指出在卷积模型中,任意两个位置之间的关联路径会随着距离增长而增加,而 Transformer 将这种路径缩短到了常数量级。

因此,在 Transformer 提出之前,序列建模的主要困难可以概括为两个方向:一方面,循环结构的顺序计算限制了并行效率;另一方面,无论是循环还是卷积,当模型需要处理较远位置之间的关系时,都面临路径较长、建模困难的问题。也正是在这个背景下,注意力机制的重要性逐渐凸显出来。

注意力机制与 Transformer 的提出

注意力机制最初并不是以“主体结构”的身份出现的。在早期的序列到序列模型中,它通常作为一种辅助机制,用来缓解编码器将整句压缩到单一表示所带来的信息瓶颈。其基本思想是:当模型处理当前输出位置时,不必只依赖一个固定的上下文向量,而可以动态地从输入序列各位置中选择更相关的信息,并以加权形式进行聚合。

这一思想本身非常重要,因为它表明 序列建模并不一定只能依赖逐步传递的信息链条。对于一个位置的表示,模型可以直接利用其他位置的信息,而不必要求这些信息经过许多步状态传播后再到达当前位置。原始论文在引言中指出,注意力机制已经成为多种序列建模与转导任务(Transduction Task)中的关键组成部分,它能够在不受距离限制的情况下建模输入和输出序列之间的依赖关系;但在当时的大多数方法中,注意力仍然只是和循环网络配合使用,而不是独立承担整个建模过程。

Transformer 的提出,正是在这个基础上进一步推进了一步。它给出的核心判断是:既然注意力机制本身已经能够建立全局依赖关系,那么是否可以彻底摆脱循环和卷积,只依靠注意力机制来完成序列表示与生成?原始论文给出的答案是肯定的。它提出了一种完全基于注意力机制的新架构,并明确强调,这一架构去除了循环和卷积,直接利用注意力建立输入与输出之间的全局依赖,因此具有更强的并行性。

这是一种结构层面的变化,而不是局部模块的替换。过去的主流思路默认序列必须沿位置逐步处理,而 Transformer 则改为让序列中每个位置都能够直接与其他位置发生交互。这样一来,模型一方面更容易捕捉长距离关系,另一方面也更适合在现代并行硬件上训练。原始论文后续在模型结构部分进一步说明,Transformer 仍然采用编码器—解码器总体框架,但编码器和解码器内部都由自注意力层(Self-Attention Layer)和按位置前馈网络(Position-wise Feed-Forward Network)堆叠而成。编码器与解码器各由六层相同结构组成,编码器每层包含 多头自注意力(Multi-Head Self-Attention) 和前馈网络,解码器则在此基础上增加一层对编码器输出的注意力模块。

基本表示与注意力计算

在进入 Transformer 的具体结构之前,还需要先处理一个更基础的问题:序列如何进入模型,以及模型内部究竟在计算什么。Transformer 虽然最终表现为多层编码器与解码器的堆叠,但从输入到输出,它的基本处理逻辑并不复杂。输入序列首先被表示为向量,然后这些向量经过若干层变换不断更新;而在这些变换之中,真正起核心作用的,是 注意力计算

原始论文沿用了序列到序列模型的一般设定。设输入序列为 $(x_1,\dots,x_n)$,编码器将其映射为一组连续表示 $z=(z_1,\dots,z_n)$;解码器则在给定这些表示的条件下,以 自回归(Auto-Regressive) 的方式逐步生成输出序列 $(y_1,\dots,y_m)$。这里所谓自回归,是指解码器在生成当前位置输出时,会将之前已经生成的内容作为额外输入。

图1 Transformer 架构
图1 Transformer 架构 点击查看大图

从整体结构上看,Transformer 仍然保留了编码器—解码器框架,但内部每一层不再采用循环单元,而是由注意力层和前馈网络组成。图中左半部分是编码器堆栈,右半部分是解码器堆栈。编码器每层都包含多头自注意力(Multi-Head Self-Attention)和按位置前馈网络(Position-wise Feed-Forward Network);解码器除了这两个部分外,还多了一层对编码器输出进行注意力计算的模块。图中还标出了残差连接(Residual Connection)、层归一化(Layer Normalization)、输入嵌入(Input Embedding)和位置编码(Positional Encoding)等部件。

如果只从功能上概括,Transformer 的内部可以分成两个层面。第一个层面是 表示:也就是把离散的输入符号转成模型能够处理的连续向量。第二个层面是 交互:也就是让序列中每个位置根据其他位置的信息更新自身表示。前者解决“输入如何表示”的问题,后者解决“不同位置如何建立联系”的问题。理解 Transformer,关键就在于把这两个层面区分清楚。

输入表示通常从 嵌入(Embedding) 开始。原始论文中,输入词元(Token)和输出词元都会先通过学习得到的嵌入矩阵映射到维度为 $d_{\text{model}}$ 的向量空间中,文中采用的模型维度是 $d_{\text{model}}=512$。此外,解码器输出侧在映射到词表概率之前,也使用线性变换和 softmax。原始论文还提到,输入嵌入层、输出嵌入层以及最终 softmax 前的线性变换共享同一组权重,只是在嵌入层会额外乘上 $\sqrt{d_{\text{model}}}$。

但仅有嵌入还不够。因为 Transformer 内部没有循环,也没有卷积,这意味着它本身并不会天然感知序列顺序。对模型来说,如果只给出一组嵌入向量,而不额外提供位置信息,那么交换两个词元的位置后,模型很难分辨这是否代表不同的输入。因此,还必须向输入中注入位置编码(Positional Encoding)。原始论文采用的是正弦和余弦形式的位置编码,并将其直接加到输入嵌入上。这样做的目的是在不引入循环结构的前提下,让模型获得关于相对位置和绝对位置的信息。

完成输入表示之后,就进入 Transformer 最核心的部分:注意力计算。注意力机制的一般形式可以表述为,从一个查询(Query)出发,在一组键(Key)和值(Value)中寻找与其相关的信息,并按相关程度对值进行加权求和。原始论文对注意力函数的定义非常明确:它接收一个 query 和一组 key-value 对,输出则是 value 的加权和,其中权重由 query 与各个 key 的相容性函数(Compatibility Function)决定。

这一表述本身已经足够概括注意力的本质。注意力并不是简单地把所有位置平均起来,而是对不同位置赋予不同权重;权重高的位置对当前输出贡献更大,权重低的位置影响较小。换言之,注意力机制完成的是一种“相关性驱动的加权聚合”。在序列建模中,这意味着当前位置的表示可以不再只依赖局部邻域或前一步状态,而是直接从全局范围内筛选对当前最有用的信息。

Transformer 使用的是缩放点积注意力(Scaled Dot-Product Attention)。设查询矩阵、键矩阵和值矩阵分别为 $Q$、$K$、$V$,则其计算公式为

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

原始论文在第 4 页给出了这一公式,并说明其计算过程可以理解为:先对查询与所有键做点积,得到相关性分数;再除以 $\sqrt{d_k}$ 进行缩放;然后经过 softmax 转成归一化权重;最后用这些权重对值做加权求和。

这个公式里最值得单独解释的是缩放项 $\sqrt{d_k}$。如果 $d_k$ 较大,那么点积结果的数值幅度也会随之增大,进而使 softmax 更容易落入梯度很小的区域,影响训练稳定性。原始论文指出,加入这一缩放因子,就是为了缓解这种数值问题。

到这里,注意力机制已经可以从数学上写清楚,但还有一个问题没有回答:在 Transformer 中,查询、键和值究竟从哪里来?这就涉及自注意力的概念。所谓自注意力,是指查询、键和值都来自同一个序列本身。原始论文在背景部分将其表述为:自注意力是一种关联同一序列中不同位置的注意力机制,用来计算该序列的表示。

如果将这一定义代入前面的公式,那么自注意力的含义就很清楚了。设当前层输入为一组位置表示 $X$,那么模型先通过线性变换从 $X$ 中得到 $Q$、$K$、$V$,再计算各位置之间的相关性,并用这些相关性来更新每个位置的表示。这样一来,序列中的每个位置都可以根据其他位置的信息重新表达自己。一个词元在经过自注意力层之后,不再只是原始嵌入加位置编码的结果,而是已经融合了整个序列相关上下文的信息。

这正是 Transformer 与传统循环模型的根本区别之一。在循环结构中,当前位置的信息主要依赖沿时间步传递过来的状态;而在自注意力中,当前位置可以直接访问整个序列。原始论文在后文专门比较了自注意力、循环和卷积三类结构的复杂度、顺序操作数以及最大路径长度,并指出自注意力在任意两个位置之间建立联系所需的路径长度是常数级,而循环层则随序列长度线性增长。

因此,如果从这一节收束出一个中心结论,那么可以写成下面这句话:Transformer 的核心不只是“用注意力替代了循环”,而是将序列表示过程改写为一种全局交互过程。 输入序列先被映射到向量空间并加入位置信息,随后每个位置通过注意力机制对整个序列进行选择性聚合,从而不断更新自己的表示。后续的多头注意力、编码器层和解码器层,都是在这一基本计算框架上展开的。

自注意力与多头机制

前一部分已经给出了 Transformer 中注意力计算的基本形式,但还需要进一步说明两个问题:其一,自注意力(Self-Attention)在模型内部究竟怎样使用;其二,为什么原始论文没有停留在单个注意力计算上,而是进一步提出了多头注意力(Multi-Head Attention)。这两点共同决定了 Transformer 的实际表达能力。原始论文在第 4 页和第 5 页先后给出了缩放点积注意力和多头注意力的定义,并说明了它们在编码器与解码器中的不同用法。

先看自注意力的含义。所谓自注意力,是指查询(Query)、键(Key)和值(Value)都来自同一组输入表示。若当前层输入记为 $X$,则模型先通过三组可学习的线性变换,将 $X$ 投影为 $Q$、$K$、$V$,再根据

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

计算输出。这样,每个位置都会与序列中其他位置计算相关性,并据此聚合信息。结果是,某个位置在这一层的输出表示,不再只对应它自身的原始输入,而是已经吸收了其他相关位置的内容。原始论文在背景部分将自注意力定义为“关联同一序列中不同位置,以计算该序列表示的注意力机制”,而在模型部分则进一步说明,编码器中的自注意力层里,查询、键和值都来自编码器前一层的输出。

图2 缩放点积注意力与多头注意力
图2 缩放点积注意力与多头注意力 点击查看大图

结合上图左侧来看,缩放点积注意力的流程其实很清晰:先通过 $QK^\top$ 得到相关性分数矩阵,再除以 $\sqrt{d_k}$ 做缩放,然后经过 softmax 得到注意力权重,最后用这些权重对 $V$ 做加权求和。这个结构的重点在于,模型并不是平均使用所有位置信息,而是根据当前位置与其他位置之间的相容性,为不同位置分配不同权重。因此,自注意力层本质上是在做一种面向全序列的、内容相关的加权信息汇总

在编码器中,这种机制的作用相对直接。编码器每一层都包含一个自注意力子层(Self-Attention Sublayer)和一个按位置前馈网络子层(Feed-Forward Sublayer)。由于编码器自注意力允许每个位置关注输入序列中的所有位置,因此编码器输出的每个表示都带有全局上下文信息。编码器由 $N=6$ 个相同层堆叠而成,每层首先是多头自注意力机制,其后是按位置前馈网络,并且每个子层外侧都使用残差连接和层归一化。

在解码器中,自注意力的使用要更谨慎一些。原因在于,解码器承担的是逐步生成输出的任务,因此当前位置在生成时不能看到未来位置的信息,否则训练阶段就会泄露目标序列后文。为了解决这个问题,原始论文在解码器的自注意力中加入了掩码(Masking)机制,将当前位置之后的连接屏蔽掉,使得位置 $i$ 只能依赖于不超过 $i$ 的已知输出。这一掩码与“输出嵌入整体右移一位”的做法结合起来,保证了位置 $i$ 的预测只依赖于先前已知的输出。

除了编码器自注意力和解码器自注意力之外,Transformer 还有第三种注意力用法,即 编码器—解码器注意力(Encoder-Decoder Attention)。在这种结构中,查询来自解码器前一子层的输出,而键和值来自编码器输出。它的作用是让解码器在生成当前位置时,能够有选择地利用输入序列中不同位置的信息。原始论文把这三种用法区分得很明确:编码器内部使用自注意力,解码器内部使用带掩码的自注意力,而解码器还额外通过编码器—解码器注意力访问整个输入序列。

到这里,还只是说明了“一个注意力层”如何工作。但原始论文并没有采用单头注意力(Single-Head Attention),而是提出了多头注意力。其核心做法是:不是只用一组 $Q$、$K$、$V$ 做一次注意力,而是先将输入通过不同的线性投影映射到多个子空间,在每个子空间中分别独立进行注意力计算,最后再将多个头(Head)的输出拼接并线性变换,得到最终结果。多头注意力公式为

$$ \mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(\mathrm{head}_1,\dots,\mathrm{head}_h)W^O, $$

其中

$$ \mathrm{head}_i=\mathrm{Attention}(QW_i^Q,KW_i^K,VW_i^V). $$

也就是说,每个头都拥有自己独立的投影矩阵。

为什么要这样设计,是理解多头机制的关键。若只使用单头注意力,那么所有信息交互都被压缩到同一个表示子空间中,模型只能在这一种表示方式下决定“关注谁”。而多头注意力允许模型 在不同表示子空间、不同位置关系上并行地建立联系。原始论文指出,多头注意力使模型能够在不同表示子空间中的不同位置上共同关注信息;如果只使用单头,平均化过程会抑制这种能力。换言之,多头并不是简单重复,而是为了让模型从多个不同角度观察同一序列。

论文中的具体设置也说明了这一点。文中采用 $h=8$ 个并行注意力头,并将每个头的键和值维度设置为 $d_k=d_v=d_{\text{model}}/h=64$。这样做的结果是,虽然每个头只在较低维空间中工作,但多个头并行后,总体计算成本与单头全维注意力相近,同时模型获得了更丰富的表示能力。

结合上图右侧来看,多头注意力的直观结构也很清楚:多个注意力头并行处理同一组输入,但由于投影矩阵不同,每个头实际看到的是不同的特征子空间。最后将这些头的输出拼接,再投影回模型维度。这意味着模型并不是只学会了一种“相关性模式”,而是能够并行学习多种不同的相关性模式,例如某些头更偏向局部依赖,某些头更偏向远距离依赖,某些头更偏向语法结构,另一些头则可能更关注语义搭配。论文在后文还提到,注意力分布常常具有一定可解释性,不同头可能呈现出不同的功能分工。

从模型结构上看,多头注意力的作用可以概括为两点。首先,它保留了自注意力“任意位置直接建立联系”的优点,因此仍然具有短路径和高并行性的结构特征。其次,它通过多组并行投影避免了单头表达能力过于单一的问题,使同一层能够同时建模多种不同类型的依赖关系。正因如此,多头注意力不是 Transformer 的一个附属技巧,而是其核心表达机制的一部分。

到这一部分为止,Transformer 中最关键的注意力主线已经清楚了:输入表示经过线性投影形成查询、键和值;自注意力使序列中每个位置都能直接从其他位置选择性聚合信息;多头机制则将这种聚合扩展到多个表示子空间中并行进行。接下来需要进一步说明的,是在注意力层之外,编码器和解码器内部其余模块为何同样不可缺少,尤其是按位置前馈网络、残差连接、层归一化以及位置编码在整体结构中的作用。

编码器、解码器与位置信息

仅仅理解注意力机制,还不足以完整理解 Transformer。注意力负责在不同位置之间建立信息交互,但一个可训练、可堆叠、可稳定优化的模型,还需要其他结构共同配合。原始论文在给出多头注意力之后,继续介绍了按位置前馈网络(Position-wise Feed-Forward Network)、输入嵌入(Embedding)、位置编码(Positional Encoding),以及贯穿编码器和解码器各子层的残差连接(Residual Connection)与层归一化(Layer Normalization)。这些部分虽然不像注意力那样最受关注,但它们共同决定了 Transformer 能否形成一个完整而有效的架构。

先看编码器(Encoder)和解码器(Decoder)的整体组织方式。原始论文中,编码器由 $N=6$ 个相同层堆叠而成,每层包括两个子层:第一是多头自注意力,第二是按位置前馈网络。解码器同样由 $N=6$ 个相同层堆叠而成,但每层多出一个子层,即位于中间的编码器—解码器注意力,因此总共有三个子层:带掩码的多头自注意力、编码器—解码器注意力以及按位置前馈网络。图 1 已经把这一结构画得很清楚:左侧是编码器的重复堆叠,右侧是解码器的重复堆叠,解码器顶部最终接线性层和 softmax,用于输出词表上的概率分布。

这种层级组织体现出一个重要思想。注意力层并不是单独使用一次,而是作为基本计算单元的一部分被多次堆叠。每经过一层,序列表示都会重新整合上下文信息;而在注意力之后,还要经过前馈变换,对每个位置的表示做进一步映射。因此,Transformer 并不是“只做一次全局加权”,而是 “在多层结构中反复执行全局交互与位置内变换”

按位置前馈网络的作用就在这里体现出来。原始论文给出的形式是

$$ \mathrm{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2, $$

即两层线性变换之间夹一个 ReLU 激活函数。这里的关键点不在公式本身,而在“按位置”这三个字:它表示这个前馈网络对每个位置单独、相同地应用,不在不同位置之间再次建立交互。不同位置共享相同的参数,但每个位置都独立地通过这一非线性映射完成表示变换。原始论文还指出,这一结构也可以理解为两个卷积核大小为 1 的卷积层;在其设置中,输入输出维度为 $d_{\text{model}}=512$,中间层维度为 $d_{ff}=2048$。

如果只看功能划分,那么注意力层和前馈层承担的是不同职责。注意力层负责跨位置的信息聚合,它决定“当前位置应该从其他位置吸收什么信息”;前馈层则负责对单个位置的表示进行更充分的非线性变换,它决定“已经聚合好的信息应当怎样进一步加工”。这两个步骤结合起来,使得每一层既能做全局交互,又能做局部表示变换。若缺少前馈层,模型每层内部的非线性加工能力会明显受限;若缺少注意力层,则不同位置之间难以形成直接联系。因此,这两类子层是互补关系,而不是替代关系。

接下来需要解释的是为什么这些子层可以一层层堆叠而不至于训练困难。原始论文采用的做法是:在每一个子层外部加入残差连接,并在其后施加层归一化。具体地,若某个子层表示为 $\mathrm{Sublayer}(x)$,则其输出形式为

$$ \mathrm{LayerNorm}(x+\mathrm{Sublayer}(x)). $$

原始论文明确给出了这一表达式,并说明为了实现残差连接,模型中所有子层以及嵌入层的输出维度都统一为 $d_{\text{model}}=512$。

残差连接的直接作用是保留输入信息,并为深层堆叠提供更顺畅的梯度传播路径。一个子层如果学习到的变换不足够有用,残差项至少可以使输入直接传递到后面,从而减轻深层网络中的优化困难。层归一化则负责稳定各层表示的数值分布,降低训练过程中不同层之间尺度变化带来的影响。虽然原始论文这里没有展开很多理论说明,但从结构安排看可以看出,它们共同服务于同一个目标:使由多层注意力和前馈子层堆叠而成的网络能够稳定训练。

接着看位置信息的问题。前面已经提到,Transformer 去掉了循环和卷积,也就失去了天然的顺序归纳偏置。对模型而言,如果两个词元嵌入本身相同,而没有额外位置信息,那么它们在序列中的前后关系无法被区分。因此,模型必须显式接收关于序列顺序的信息。原始论文在第 5 页专门用一节讨论位置编码,指出由于模型内部既没有 recurrence,也没有 convolution,为了让模型利用序列顺序,必须向输入中注入关于词元相对位置或绝对位置的信息。

论文采用的是固定的正弦—余弦位置编码,其定义为

$$ PE(pos,2i)=\sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right), \qquad PE(pos,2i+1)=\cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right). $$

这里 $pos$ 表示位置,$i$ 表示维度索引。也就是说,不同维度对应不同频率的正弦和余弦波,从而为每个位置构造一个与模型维度相同的向量。原始论文将位置编码与输入嵌入直接相加,而不是拼接,这是因为两者维度相同,且相加后仍然保持统一的表示维度。

为什么使用这种形式,原始论文也给出了动机。其一,它不需要额外学习参数;其二,作者希望这种形式有助于模型学习基于相对位置的关系,因为对于固定偏移量 $k$,$PE_{pos+k}$ 可以表示为 $PE_{pos}$ 的线性函数。原始论文还说明,他们也实验过学习式位置嵌入(Learned Positional Embedding),结果与正弦位置编码几乎相同,但最终选择正弦形式,是因为它可能更容易外推到比训练时更长的序列。

这一点实际上反映了 Transformer 的一个基本特点:模型虽然主要依赖注意力来建模内容相关性,但顺序信息并不会自动从注意力公式中产生,而必须通过专门设计注入进去。换句话说,注意力负责决定“看哪里”,位置编码负责告诉模型“谁在前、谁在后”。二者缺一不可。

从整个编码器—解码器框架回看,这些模块之间的关系就比较清楚了。嵌入层把离散符号转成连续向量;位置编码把顺序信息加入这些向量;多头注意力负责在不同位置之间建立依赖;前馈网络对每个位置做进一步非线性变换;残差连接与层归一化则保证整个多层结构能够稳定训练。编码器通过重复这一流程,逐层构造输入序列的上下文化表示;解码器则在此基础上结合已生成输出和编码器表示,逐步生成目标序列。图 1 其实正是对这一整套流程的压缩展示。

到这一部分为止,Transformer 的主要结构已经基本齐全:多层编码器和解码器、三类注意力、前馈网络、残差连接、层归一化以及位置编码。接下来更值得讨论的问题,是原始论文为什么认为自注意力优于循环和卷积,以及这种优越性具体体现在哪些计算和建模层面。这个问题不仅涉及架构设计动机,也有助于解释 Transformer 为什么能成为后续大模型的基础。

自注意力的优势与 Transformer 的意义

在结构层面梳理完 Transformer 之后,还需要回到一个更基础的问题:为什么原始论文会认为自注意力(Self-Attention)是一种比循环结构(Recurrent Structure)和卷积结构(Convolutional Structure)更合适的核心计算机制。这个问题并不是附属讨论,而是 Transformer 设计动机的中心。原始论文在第 6 页专门用一节讨论 “Why Self-Attention”,并从计算复杂度、顺序操作数量以及长距离依赖的路径长度三个角度,将自注意力与循环层、卷积层进行了对比。

第一个优势是 并行性。循环模型的计算沿序列位置逐步展开,因此即使每一步计算本身不复杂,整个样本内部也必须按顺序执行。原始论文在引言中已经指出,循环模型在训练样本内部难以并行,而这在序列较长时尤为突出。相比之下,自注意力层在一个前向传播中同时处理所有位置:所有查询、键和值都可以打包成矩阵,一次性完成矩阵乘法、softmax 与加权求和。因此,从计算图结构上看,自注意力更适合现代硬件的并行计算模式。

第二个优势是 长距离依赖的建模路径更短。若两个位置之间的信息交互必须经过多步状态传递,那么模型学习这一依赖的难度通常也会增大。原始论文在第 6 页给出的比较表中指出,自注意力层中任意两个位置之间的最大路径长度为 $O(1)$,也就是常数级;循环层中这一长度为 $O(n)$,会随序列长度线性增长;卷积层则依赖卷积核大小和堆叠深度,通常也需要多层才能让远距离位置发生充分交互。原始论文特别强调,路径越短,前向和反向信号在网络中传播时越容易建立远距离依赖关系。

这一点对于语言任务尤其重要。自然语言中的相关信息不一定出现在相邻位置,很多时候相隔很远的两个词之间依然有紧密关系。若模型只能通过逐步传递来让它们发生作用,那么学习成本会变高;而在自注意力中,这种联系从结构上就是直接建立的。也正因为如此,Transformer 在句子级任务上能够较自然地处理跨越较大范围的依赖关系。

第三个优势与 计算复杂度 有关。原始论文给出了一个条件性的判断:当序列长度 $n$ 小于表示维度 $d$ 时,自注意力层的计算复杂度在很多典型任务中会优于循环层,而这在当时常见的机器翻译场景中是经常成立的。原始论文比较表显示,标准自注意力每层复杂度为 $O(n^2d)$,循环层为 $O(nd^2)$,卷积层则与卷积核大小 $k$ 有关。单独看这个结论时需要谨慎,因为自注意力的二次复杂度意味着它在很长序列上会迅速变贵,但在原始论文聚焦的句子级翻译任务里,这一代价是可接受的,而其并行性和短路径优势则更突出。

原始论文并没有声称自注意力在所有场景下都绝对优于其他结构,而是明确给出了适用条件,并且提到对于非常长的序列,可以考虑限制注意力只关注大小为 $r$ 的局部邻域,以降低计算开销。也就是说,Transformer 的优势并不是没有代价的。它用更强的全局交互能力换取了注意力矩阵随序列长度平方增长的成本。后续许多高效 Transformer 工作,本质上都是在处理这一代价。

除了计算与路径上的优点,原始论文还提到自注意力有一个附带优势,即 模型具有一定可解释性。注意力分布可以直接反映一个位置在计算当前表示时主要关注了哪些其他位置,而多头机制又允许不同注意力头呈现不同的关注模式。原始论文指出,部分注意力头展现出了与句法结构和语义结构相关的行为。这里需要注意的是,这并不等于“注意力权重就是解释本身”,但至少从结构可观察性上看,自注意力确实比隐藏状态逐步演化的循环结构更容易直接检查。

如果把这些优点收束起来,原始论文所强调的其实不是单一指标上的改进,而是一种新的折中方式。循环结构天然带有顺序归纳偏置,但并行性差、长路径问题明显;卷积结构并行性较好,但远距离交互仍依赖层数扩展;自注意力则牺牲了对超长序列的线性扩展性,换来了全局交互、短路径和强并行性。在当时的机器翻译任务上,这一折中表现出了明显优势。原始论文在实验部分报告,Transformer 在 WMT 2014 英德翻译和英法翻译任务上取得了优于当时已有方法的 BLEU 分数,同时训练成本显著降低。具体而言,big 版本模型在英德任务上达到 28.4 BLEU,在英法任务上达到 41.0 BLEU。

这些结果的意义不只是“某个模型在某个基准上更强”。更重要的是,Transformer 展示出了一条新的路线:一个不依赖循环和卷积、完全由注意力驱动的序列模型,不仅可以工作,而且在性能和训练效率上都可能优于此前主流方法。原始论文在结论部分也明确将其表述为:Transformer 是第一个完全基于注意力的序列转导模型,它用多头自注意力替代了编码器—解码器架构中最常见的循环层,并在翻译任务上实现了更快训练和更好的结果。

从今天回看,这一工作真正重要的地方在于,它提供了一种 高度可扩展的基本模块。编码器、解码器、注意力、前馈网络、位置编码,这些部件组合成的结构非常规整,适合堆叠、适合扩展,也适合在大规模数据和参数条件下训练。后续大量模型虽然在具体形式上不断变化,但许多核心思想都沿着这一框架发展:例如只保留编码器得到判别式模型,只保留解码器得到生成式语言模型,或者将 Transformer 扩展到视觉、语音和多模态任务中。严格来说,这些内容已经超出了原始论文本身,但它们恰好说明了 Transformer 的基础性地位。

不过,写到这里时也不应把 Transformer 说成没有边界的“最终答案”。从原始论文出发,至少可以看出两个明显局限。第一,标准自注意力对序列长度的复杂度是二次的,因此在超长文本、长视频或高分辨率图像场景中,计算与显存成本会迅速上升。第二,Transformer 本身不像循环和卷积那样天然带有强顺序或局部性偏置,因此它需要借助位置编码,并往往依赖更大规模的数据和训练来学到合适的结构特征。这些问题并不否定 Transformer 的价值,但有助于更客观地理解它:它是一次非常成功的结构重构,而不是所有问题上的无条件最优解。

到这里,Transformer 的主要逻辑链条已经基本完整了。它从序列建模的既有困难出发,提出以注意力机制替代循环和卷积;通过自注意力和多头机制,使不同位置之间能够直接、并行地建立多种依赖关系;再通过前馈网络、残差连接、层归一化与位置编码,构成完整的编码器—解码器结构;最终在机器翻译任务上验证了这种架构的有效性,并为后续大规模预训练模型奠定了基础。

总结

Transformer 的提出改变了序列建模的基本思路。在传统方法中,序列信息主要沿时间步或局部邻域逐步传播,而 Transformer 将这一过程改写为全局范围内的选择性信息聚合。其核心机制是自注意力:每个位置都可以直接根据与其他位置的相关性,对全序列信息进行加权汇总。多头注意力进一步将这一过程扩展到多个表示子空间,使模型能够并行捕捉不同类型的依赖关系。编码器和解码器则在这一机制基础上,通过前馈网络、残差连接、层归一化和位置编码,构成了一个可训练、可堆叠的完整架构。原始论文的关键贡献,不只是提出了若干新模块,而是证明了一个完全基于注意力的模型可以在典型序列任务上同时获得较强性能和较高训练效率。