TensorFlow深度学习实战(21)------Transformer架构详解与实现
-
- [0. 前言](#0. 前言)
- [1. Transformer 架构](#1. Transformer 架构)
-
- [1.1 关键思想](#1.1 关键思想)
- [1.2 计算注意力](#1.2 计算注意力)
- [1.3 编码器-解码器架构](#1.3 编码器-解码器架构)
- [1.4 Transformer 架构](#1.4 Transformer 架构)
- [1.5 模型训练](#1.5 模型训练)
- [2. Transformer 类别](#2. Transformer 类别)
-
- [2.1 解码器(自回归)模型](#2.1 解码器(自回归)模型)
- [2.2 编码器(自编码)模型](#2.2 编码器(自编码)模型)
- [2.3 Seq2seq](#2.3 Seq2seq)
- [3. 经典注意力机制](#3. 经典注意力机制)
-
- [3.1 稀疏注意力](#3.1 稀疏注意力)
- [3.2 LSH 注意力](#3.2 LSH 注意力)
- [3.3 局部注意力](#3.3 局部注意力)
- [4. 预训练模型](#4. 预训练模型)
-
- [4.1 编码器预训练](#4.1 编码器预训练)
- [4.2 解码器预训练](#4.2 解码器预训练)
- [4.3 编码器-解码器预训练](#4.3 编码器-解码器预训练)
- [4.4 预训练任务](#4.4 预训练任务)
- [6. 基于 Transformer 实现机器翻译](#6. 基于 Transformer 实现机器翻译)
- 小结
- 系列链接
0. 前言
自 2017
年论文《Attention Is All You Need
》发布后,Transformer
迅速引起了自然语言处理 (Natural Language Processing
, NLP
) 的广泛关注,基于 Transformer
的模型使用注意力机制来识别输入序列(如句子)中词元 (token
) 之间的复杂关系。Transformer
摒弃了传统的循环神经网络 (Recurrent Neural Network, RNN) 和长短时记忆网络 (Long Short Term Memory, LSTM),转而依靠自注意力机制 (Self-Attention
) 来处理输入序列,从而显著提高了效率和效果。基于 Transformer
的架构在 NLP
及其它领域中应用广泛,能够解决各种任务,例如:机器翻译、文本摘要、文本生成、实体识别、问答系统、文本分类、语言建模和阅读理解等。
Transformer
已经成为如 BERT
、T5
和 GPT
等前沿模型的基础构建块,涵盖了从计算机视觉到语音识别、翻译或蛋白质和编码序列等领域。注意力机制还被应用于强化学习,例如,在 DeepMind
的 AlphaStar
中,将玩家和对手的 StarCraft
游戏单位的状态通过自注意力机制处理。因此,斯坦福大学最近引入了基础模型 (foundation model
),以定义基于大型预训练 Transformer
的大语言模型 (Large Language Model
, LLM
)。
1. Transformer 架构
尽管经典的 Transformer
架构通常与循环神经网络 (Recurrent Neural Network
, RNN
) 的架构不同,但它起源于 RNN
的一些关键思想。目前,Transformer
几乎代表了与文本和任何可以表示为序列的数据相关的深度学习架构的研究方向。Transformer
最初在 2017
年的论文《Attention Is All You Need
》中提出,原始的 Transformer
架构是编码器-解码器架构的一种变体,其中递归层被(自)注意力层所替代。
Transformer
架构是编码器-解码器模型的一种实例,在此之前,注意力机制已与 RNN
模型结合使用。注意力机制在 2014
年由 Bahdanau
等人首次提出,并在 2015
年由 Luong
等人应用于机器翻译任务,此后还出现了与其他类型模型结合的多种注意力机制应用。
2017
年,首个 Transformer
模型展示了可以将 RNN
从神经机器翻译 (Neural Machine Translation
, NMT
) 模型中去除,并改用(自)注意力块,因此论文标题为《Attention Is All You Need
》。
1.1 关键思想
Transformer
模型的创新基于以下四个关键思想:
- 位置编码 (
Positional encoding
) - 注意力机制 (
Attention
) - 自注意力机制 (
Self-attention
) - 多头(自)注意力机制 (
Multi-head (self-)attention
)
1.1.1 位置编码
RNN
通过顺序处理单词来保持单词的顺序。这种方法的优点是简单,但其缺点之一是使得并行化变得困难,如果希望有效地利用高度并行的架构,就需要一种替代的顺序表示方式。
Transformer
使用一种简单的顺序表示方法,称为位置编码,这种方法将每个单词与表示其在文本中位置的数字相关联起来:
shell
[("Transformers", 1), ("took", 2), ("NLP", 3), ("by", 4), ("storm", 5)]
通过添加位置信息,Transformer
可以学习每个词元 (token
) 位置的重要性。在原始 Transformer
中引入(绝对)位置编码后,还出现了其他变体,如相对位置编码以及旋转位置编码等。
1.1.2 注意力机制
Transformer
的另一个关键组成部分是注意力机制,注意力机制最早在 2014
年由 Bahdanau
等人引入。为了深入理解,我们考虑以下例子:
shell
The agreement on the European Economic Area was signed in August 1992.
翻译为法语:
shell
L'accord sur la zone économique européenne a été signé en août 1992.
上世纪 80
年代初,机器翻译基于逐字翻译,这种方法性能非常有限,因为文本结构在源语言和目标语言之间可能会发生许多变化。例如,在法语翻译中,一些单词的顺序可能会不同:在英语中,形容词通常位于名词之前,比如 European Economic Area
,而在法语中,形容词可以位于名词之后,la zone économique européenne
。此外,与英语不同,法语有性别词汇。例如,形容词 économique
和 européenne
必须使用女性形式,因为它们属于女性名词 la zone
。
注意力机制的关键思想是构建文本模型时,在将单词翻译成输出语言时"关注
"源句子中的每一个单词。在原始 Transformer
论文中,作者指出这种方法的时间复杂度是平方级的,但在翻译准确性方面获得的提升相当可观。为了降低时间复杂度,Choromanski
等人提出了 Fast Attention Via positive Orthogonal Random
(FAVOR+
) 特征。回顾原始 Transformer
论文中的例子:

使用注意力机制,神经网络可以学习每个源语言英文单词与每个目标语言法文单词之间的热力图,这些关系不仅仅存在于对角线上,还可能遍布整个矩阵。例如,当模型输出法语单词 européenne
时,它会特别关注输入单词 European
和 Economic
(在图中,对应于对角线和相邻单元格)。使用注意力机制能够在没有监督的情况下学习对齐并关注输入元素,将输入的英语句子翻译成法语。当然,训练集越大,基于注意力的模型可以学习到的相关性越多。
简而言之,注意力机制可以访问所有先前的单词,并根据学习到的相关性度量加以权衡。这样,注意力可以提供关于目标句子中远距离词元的相关信息。
1.1.3 自注意力
原始 Transformer
的第三个关键思想是在源语言同一句话中使用注意力,自注意力。通过这种机制,神经网络可以学习每个输入序列(如句子)中所有元素(如单词)之间的关系,而不考虑它们的位置,然后再专注于具体任务(如机器翻译)。观察以下示例:
shell
"Server, can I have the check?"
"Looks like I just crashed the server."
单词 server
在以上两个句子中有着不同的含义,而自注意力能够在考虑周围单词的上下文时理解每个单词。需要注意的是,注意力机制可以访问所有先前的单词,并根据学到的相关性度量对它们进行加权,自注意力提供了关于源句子中远距离词元的相关信息。
1.1.4 多头(自)注意力
原始 Transformer
执行了多次(自)注意力操作,一组权重矩阵就是一个注意力头。当有多组这样的权重矩阵集合时,就形成了多个注意力头。多头(自)注意力层通常具有几个并行的(自)注意力层。值得注意的是,引入多个头使我们能够定义哪些单词彼此"相关
"。此外,这些相关性可以通过硬件加速器并行计算,从而加快计算速度。
1.2 计算注意力
在原始 Transformer
中,自注意力函数是通过缩放点积单元计算的,称为缩放点积注意力 (Scaled Dot-Product Attention
),两个向量之间的点积可以很好地反映出这两个向量的"接近
"程度。
每个输入的词元序列(例如句子)嵌入传入 Transformer
(编码器或解码器)后,生成注意力权重,这些权重在每个序列元素(如单词)之间同时计算。输出结果是为每个词元生成的嵌入,包含词元本身以及所有相关词元,按照其相对注意力权重进行加权。
注意力层将输入向量转换为查询 (Query
)、键 (Key
) 和值 (Value
) 矩阵,然后将它们拆分为多个注意力头(因此称为多头注意力):
- 查询可以理解为正在计算注意力函数的词
- 键和值是所关注的词
点积反映了词之间的相似度。如果两个词向量的对齐结果更高,则注意力分数将更高。Tansformer
以如下方式学习权重,如果句子中的两个词彼此相关,则它们的词向量就会对齐。
每个注意力层学习三个权重矩阵:
- 查询权重 W Q W_Q WQ
- 键权重 W K W_K WK
- 值权重 W V W_V WV
对于每个单词 i i i,计算输入词嵌入 x i x_i xi ,得到:
- 查询向量 q i = x i W Q q_i = x_i W_Q qi=xiWQ
- 键向量 k i = x i W K k_i = x_i W_K ki=xiWK
- 值向量 v i = x i W V v_i = x_i W_V vi=xiWV
给定查询向量和对应的键向量,注意力权重计算如下:
a i , j = q i ⋅ k j a_{i,j}=q_i\cdot k_j ai,j=qi⋅kj
其中: a i , j a_{i,j} ai,j 是从词 i i i 到词 j j j 的注意力;点积 ⋅ \cdot ⋅ (dot-product
) 是查询与键的点积,反映向量的"接近"程度。
词 i i i 的注意力是所有词的值向量的加权和,权重由 a i , j a_{i,j} ai,j 决定,即词 i i i 到词 j j j$ 的注意力。
为了在训练过程中稳定梯度,注意力权重会被键向量维度的平方根 d k \sqrt {d_k} dk 进行除法处理。然后,将结果通过 softmax
函数进行归一化。需要注意的是,词 i i i 到词 j j j 的注意力函数与词 j j j 到词 i i i 的注意力函数值并不相同。
现代深度学习加速器在处理矩阵计算时表现良好,因此可以使用大矩阵来计算所有词的注意力。将 q i q_i qi、 k i k_i ki、 v i v_i vi (其中 i i i 是第 i i i 行)定义为矩阵 Q Q Q、 K K K、 V V V,可以将注意力函数总结为一个注意力矩阵:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac {QK^T}{\sqrt {d_k}})V Attention(Q,K,V)=softmax(dk QKT)V
1.3 编码器-解码器架构
类似于seq2seq 模型,原始 Transformer
模型也使用了编码器-解码器架构:
- 编码器接收输入(源)序列的嵌入,并将其转换为一个新的固定长度的嵌入向量
- 解码器接收来自编码器的嵌入向量,并将其转换为输出嵌入序列
- 编码器和解码器都由多个堆叠的网络层组成,每个编码器和解码器层都使用注意力机制
自 Transformer
架构引入以来,变体网络可以只使用编码器或解码器组件,或两者同时使用。
同时,基于 Transformer
的网络会重用其他现有的先进机器学习方法,如残差或归一化。
1.4 Transformer 架构
我们已经了解了 Transformer
的一些关键概念,接下来我们深入探讨 Transformer
架构。需要注意的是,基于 Transformer
的模型通常通过利用各种注意力机制来构建,而不是使用循环神经网络 (Recurrent Neural Network
, RNN
),这是因为注意力机制本身能够替代并超越带有注意力的 RNN
编码器-解码器模型。下图对比了具有注意力机制的 seq2seq
网络与 Transformer
网络。

Transformer
与具有注意力机制的 seq2seq
模型具有以下相似性:
- 都处理源(输入)和目标(输出)序列
- 都使用编码器-解码器架构
- 编码器最后一个模块的输出用作上下文向量,以计算解码器中的注意力函数
- 目标(输出)序列的嵌入被输入到全连接模块中,全连接块将输出嵌入转换为最终的整数序列
两种架构的不同之处在于:
seq2seq
网络在编码器中使用循环层和注意力层,而在解码器中使用循环层;Transformer
用Transformer
块(N
个相同的层堆叠)替代了这些层- 在编码器中,
Transformer
块由一系列子层组成:一个多头(自)注意力层和一个逐位置前馈层 (position-wise feedforward layer
),这两个层都使用残差连接和归一化层 - 在解码器中,
Transformer
块包含一种带有掩码的多头(自)注意力层(掩码多头自注意力层),以及一个类似于编码器中的前馈层(同样具有残差连接和归一化层),掩码可以防止位置对未来的关注,此外,解码器中的第二个多头(自)注意力层计算对编码器Transformer
块输出的注意力
- 在编码器中,
- 在带有注意力机制的
seq2seq
网络中,编码器状态会传递到第一个循环层时间步中;在Transformer
中,编码器的状态被传递给解码器中的每一个Transformer
块,这使得Transformer
网络能够在时间步之间并行计算,不像seq2seq
网络那样存在时间依赖性 - 为了并行计算,
Transformer
添加了一个编码层,以提供位置信息区分Transformer
网络序列中每个元素的位置(位置编码层),这样,编码器将输入序列的位置信息和嵌入作为输入,从而能够考虑位置信息
接下来,逐步介绍数据在 Transformer
网络中的流动过程。在之后的学习中,我们将使用 TensorFlow
从零开始创建并训练一个 Transformer
模型:
-
数据预处理,将输入和输出分词化并转换为嵌入
-
接下来,将位置编码应用于输入和输出嵌入,以获得关于序列中词元相对位置的信息。在编码器部分:
- 编码器包含一个嵌入层和一个位置编码层,随后是
6
个相同的Transformer
块,每个编码器中的Transformer
块由一个多头(自)注意力层和一个逐位置前馈层组成
自注意力是关注同一序列中某些部分的过程,处理一个句子时,我们可能希望知道哪些单词与当前单词最为相关
- 多头注意力层由多个(本节中为
8
个)并行的自注意力层组成。自注意力通过从输入嵌入构建三个向量 Q Q Q (查询)、 K K K (键)和 V V V (值)来实现,这些向量是通过将输入嵌入与三个可训练的权重矩阵 W Q W_Q WQ、 W K W_K WK 和 W V W_V WV 相乘创建的。输出向量 Z 是通过在每个自注意力层中使用以下公式结合 K K K、 Q Q Q 和 V V V 创建的,其中 d K d_K dK 表示 K K K、 Q Q Q 和 V V V 向量的维度(本节中为64
):
z = s o f t m a x ( Q K T d k ) V z=softmax(\frac {QK^T}{\sqrt {d_k}})V z=softmax(dk QKT)V - 多头注意力层会为 Z 创建多个值(基于每个自注意力层中的多个可训练权重矩阵 W Q W_Q WQ、 W K W_K WK 和 W V W_V WV),然后将这些值连接起来,作为逐位置前馈层的输入
- 逐位置前馈层的输入由序列中不同元素(如句子中的单词)的嵌入组成,这些嵌入通过多头注意力层中的自注意力进行处理。每个词元在内部由一个固定长度的嵌入向量表示(在本节中为
512
),每个向量并行通过前馈层处理。前馈网络的输出作为下一个Transformer
块中的多头注意力层的输入。在编码器的最后一个Transformer
块中,输出是传递给解码器的上下文向量 - 多头注意力层和逐位置前馈层不仅将前一层的信号传递给下一层,还将其输入的残差信号传递给输出。输出和残差输入经过一个层归一化
- 由于编码器中整个序列是并行处理的,各个元素的位置相关信息会丢失。为弥补这一点,输入嵌入通过位置编码处理,位置编码实现为无学习参数的正弦函数,位置编码会加到输入嵌入上
- 编码器包含一个嵌入层和一个位置编码层,随后是
-
接下来,了解数据在解码器中的流动过程:
- 编码器的输出生成一对注意力向量 K K K 和 V V V,这些向量并行地传送到解码器中的所有
Transformer
块。解码器中的Transformer
块类似于编码器中的Transformer
块,不同之处在于它具有一个额外的多头注意力层,用于处理来自编码器的注意力向量。这个额外的多头注意力层的工作方式与编码器中的层类似,但它结合了来自下层的 Q Q Q 向量和来自编码器状态的 K K K 和 V V V 向量 - 与
seq2seq
网络类似,输出序列一次生成一个词元,使用来自前一时间步的输入。与编码器的输入类似,解码器的输入也会用位置编码进行处理。不同于编码器,解码器中的自注意力过程只能关注先前时间点的词元,这是通过屏蔽未来时间步的词元实现的 - 解码器中最后一个
Transformer
块的输出是一个低维嵌入序列(本节中为512
)。这个嵌入序列会传递到全连接层,转换成目标词汇表中的概率分布序列,据此可以通过贪心算法或更复杂的技术(如束搜索)生成最可能的单词
- 编码器的输出生成一对注意力向量 K K K 和 V V V,这些向量并行地传送到解码器中的所有
Tranformer
整体架构如下图所示:

1.5 模型训练
Transformer
通常通过半监督学习进行训练,分为以下两个步骤:
- 首先是无监督的预训练,通常在一个非常大的语料库上进行
- 然后是在一个较小的标注数据集上进行有监督的微调。
无论是预训练还是微调,都可能需要大量的资源,特别是,考虑到大语言模型 (large language model
, LLM
) 参数数量的不断增加,这种情况更为明显。
有时,第二个步骤中的标注数据集通常规模较小,这也称为少样本学习 (few-shot learning
),指的是在样本数量有限的情况下进行预测。
2. Transformer 类别
2.1 解码器(自回归)模型
一个典型的例子是 GPT
(Generative Pre-Trained
) 模型,自回归模型仅使用原始 Transformer
模型的解码器,其注意力头只能看到文本中之前的内容,而无法看到之后的内容,并在完整句子上使用掩码机制。自回归模型通过观察所有先前的词元来推测下一个词元。通常,自回归模型用于文本生成任务。其他经典的自回归模型包括 GPT-2
、Transformer-XL
、Reformer
和 XLNet
。
2.2 编码器(自编码)模型
一个典型的例子是 BERT
(Bidirectional Encoder Representations from Transformers
),自编码器对应于原始 Transformer
模型中的编码器,能够访问完整的输入词元。自编码模型通过掩码/更改输入词元,然后尝试重建原始句子来进行预训练。通常,这些模型建立了完整句子的双向表示。需要注意的是,自编码器和自回归模型之间唯一的区别在于预训练阶段,因此相同的架构可以以两种方式使用。自编码器可以用于自然语言生成,以及分类和其它 NLP
任务。除了 BERT
,其他经典的自编码模型包括 ALBERT
、RoBERTa
和 ELECTRA
。
2.3 Seq2seq
典型的例子包括 T5
(Text-to-Text Transfer Transformer
)、多任务统一模型 (Multitask Unified Model
, MUM
) 和原始 Transformer
。Seq2seq
模型使用原始 Transformer
架构中的编码器和解码器。Seq2seq
可以微调用于许多任务,如翻译、摘要和问答等。
3. 经典注意力机制
注意力机制有多种类型,例如自注意力、局部/硬注意力和全局/软注意力等。接下来,我们重点介绍一些经典注意力机制。
3.1 稀疏注意力
原始 Transformer
论文中的(缩放)点积注意力通常是在一个完整的平方矩阵 ( O ( L 2 ) O(L^2) O(L2)) 上计算,其中 L L L 是最大考虑的序列长度。BigBird Transformer
引入了稀疏注意力的思想,通过利用稀疏矩阵来实现。
3.2 LSH 注意力
Reformer
引入了通过哈希减少注意力机制复杂度的思想,称之为局部敏感哈希 (locality-sensitive hashing
, LSH
) 注意力。该方法基于在计算 $softmax(QKT) 时仅使用最大元素的思想,换句话说,对于每个查询 q ∈ Q q\in Q q∈Q,仅计算与 q q q 接近的键 k ∈ K k\in K k∈K。为了计算接近度,根据局部敏感哈希技术计算多个哈希函数。
3.3 局部注意力
一些 Transformer
采用了仅使用局部上下文窗口的思想(例如,右侧几个词元和左侧几个词元)。核心思想在于,使用较少的参数可以考虑更长的序列,但注意力的范围有限。因此,局部注意力的受欢迎程度较低。
4. 预训练模型
原始 Transformer
具有编码器-解码器架构,但在某些情况下,可以仅使用编码器、仅使用解码器或两者同时使用。
4.1 编码器预训练
这类模型也称为自编码模型,在预训练过程中仅使用编码器。预训练通过在输入序列中屏蔽单词并训练模型重建序列进行。通常,编码器可以访问所有输入单词,通常用于分类任务。
4.2 解码器预训练
解码器模型称为自回归模型。在预训练期间,解码器被优化以预测下一个单词。需要注意的是,解码器只能访问序列中给定单词之前的所有单词,通常用于文本生成任务。
4.3 编码器-解码器预训练
模型可以同时使用编码器和解码器。编码器中的注意力可以使用序列中的所有单词,而解码器中的注意力只能使用序列中给定单词之前的单词。编码器-解码器架构具有广泛的应用,包括文本生成、翻译、摘要和问答。
4.4 预训练任务
预训练任务可以分成以下类别:
- 语言建模 (
Language Modeling
,LM
):对于单向语言模型,任务是预测下一个词元。对于双向语言模型,任务是预测前后词元 - 掩码语言建模 (
Masked Language Modeling
,MLM
):关键思想是将输入句子中的某些词元进行掩码处理,模型在给定非掩码词元的情况下训练以预测被掩码的词元 - 排列语言建模 (
Permuted Language Modeling
,PLM
):与语言建模类似,但对输入序列进行随机排列。然后选择一部分词元作为目标,模型训练预测这些目标 - 去噪自编码器 (
Denoising Autoencoder
,DAE
):输入数据集中部分数据被破坏。例如,随机抽取输入词元并用特殊的 [MASK] 元素替换它们,或者随机删除输入词元,或者随机打乱句子的顺序。模型的任务是恢复未被破坏的原始输入 - 对比学习 (
Contrastive Learning
,CTL
):通过假设某些观察到的文本对比随机采样的文本对更具语义相似性,为文本对学习评分函数,常用方法包括:- 深度信息最大化 (
Deep InfoMax
,DIM
):最大化输入图像表示与同一图像的各种局部区域之间的互信息 - 替换词元检测 (
Replaced Token Detection
,RTD
):预测给定上下文的输入词元是否被替换 - 下一句子预测 (
Next Sentence Prediction
,NSP
):模型训练用于区分两个输入句子在训练语料库中是否是连续的 - 句子顺序预测 (
Sentence Order Prediction
,SOP
):与NSP
的思想相同,但增加了附加信号:两个连续的句子作为正样本,而两个顺序颠倒的句子作为负样本。
- 深度信息最大化 (
6. 基于 Transformer 实现机器翻译
使用 TensorFlow
从零开始实现基于 Transformer
的机器翻译模型,代码实现链接。
小结
Transformer
模型通过引入自注意力机制和多头注意力机制,克服了传统循环神经网络和长短期记忆网络在处理长序列时的局限性,与序列处理方法相比,Transformer
不仅提高了计算效率,支持并行化训练,还能捕捉序列中远距离的依赖关系,极大提升了模型的性能。凭借这些优势,Transformer
已成为现代深度学习中的核心架构,不仅在机器翻译、文本生成等传统自然语言处理任务中取得了卓越成果,还被成功应用于计算机视觉、语音识别等领域,推动了人工智能技术的飞速发展。
系列链接
TensorFlow深度学习实战(1)------神经网络与模型训练过程详解
TensorFlow深度学习实战(2)------使用TensorFlow构建神经网络
TensorFlow深度学习实战(3)------深度学习中常用激活函数详解
TensorFlow深度学习实战(4)------正则化技术详解
TensorFlow深度学习实战(5)------神经网络性能优化技术详解
TensorFlow深度学习实战(6)------回归分析详解
TensorFlow深度学习实战(7)------分类任务详解
TensorFlow深度学习实战(8)------卷积神经网络
TensorFlow深度学习实战(9)------构建VGG模型实现图像分类
TensorFlow深度学习实战(10)------迁移学习详解
TensorFlow深度学习实战(11)------风格迁移详解
TensorFlow深度学习实战(12)------词嵌入技术详解
TensorFlow深度学习实战(13)------神经嵌入详解
TensorFlow深度学习实战(14)------循环神经网络详解
TensorFlow深度学习实战(15)------编码器-解码器架构
TensorFlow深度学习实战(16)------注意力机制详解
TensorFlow深度学习实战(17)------主成分分析详解
TensorFlow深度学习实战(18)------K-means 聚类详解
TensorFlow深度学习实战(19)------受限玻尔兹曼机
TensorFlow深度学习实战(20)------自组织映射详解