拥抱新时代的引擎:为何我们必须学习Transformer
历史的长河由几次关键的技术革命所定义,每一次革命都有一种核心技术充当着时代的“引擎”。
在第一次工业革命的滚滚浓烟中,蒸汽机是驱动工厂和火车的铁血心脏。对于当时的工程师和商人而言,理解蒸汽机的原理——活塞、锅炉与压力的舞蹈——就意味着抓住了开启大规模生产和全新社会结构的金钥匙。学习蒸汽机,就是学习那个时代的语言。
一个世纪后,当黑夜被电灯点亮,世界进入了电气时代。电,这种无形的力量通过电线渗透到每个角落,驱动着电动机,传递着声音。对于当时的创新者来说,掌握电路、电磁感应的知识,就是掌握了重新定义能源、通信乃至生活节奏的能力。学习电气原理,就是驾驭那个时代的洪流。
今天,我们正站在另一场颠覆性革命的浪潮之巅——人工智能革命。这场革命的核心引擎,不再是燃烧煤炭或输送电子,而是处理信息、理解语言、创造知识。而驱动这一切的,正是 Transformer 架构。
因此,在今天,学习Transformer,就如同当年学习蒸汽机和电气原理一样,具有无可比拟的重要性。这不仅仅是程序员和科学家的必修课,更是每一个希望在新时代中成为创造者、思想者和明智参与者的必经之路。理解它,就是理解我们这个时代的底层逻辑,是获得一张通往未来、用AI创造无限可能的入场券。
Transformer 指南:
它们如何用于自然语言处理,为什么优于 RNN,用通俗易懂的语言解释。注意力机制 (Attention) 如何帮助提升性能。
我们最近经常听到关于 Transformer 的讨论,这是有充分理由的。在过去几年里,它们席卷了自然语言处理 (NLP) 领域。Transformer 是一种利用注意力机制 (Attention) 来显著提升深度学习 NLP 模型性能的架构。它最早在论文《Attention is all you need》(注意力机制是你所需要的一切)中被提出,并迅速成为大多数文本数据应用领域的领先架构。
从那时起,包括谷歌的 BERT 和 OpenAI 的 GPT 系列在内的众多项目都在此基础上构建,并发布了轻松超越现有顶尖水平的成果。
在本系列文章中,我将介绍 Transformer 的基础知识、其架构以及内部工作原理。我们将以自上而下的方式介绍 Transformer 的功能。在后续文章中,我们将深入探讨,详细了解系统的运作方式。我们还将深入研究多头注意力机制 (multi-head attention) 的工作原理,这是 Transformer 的核心。
以下是本系列之前和之后文章的简要总结。我始终的目标不仅是理解某事物是如何工作的,还要理解它为什么那样工作。
-
功能概览 :Transformer 的应用场景,为何优于 RNN。核心架构组件,以及训练与推理阶段的行为特性 -
工作原理详解:端到端的内部运作机制。数据如何流动,执行哪些计算,包括矩阵表示的细节 -
多头注意力机制深度剖析:Transformer 中注意力模块的精细运作方式 -
注意力机制为何能提升性能:不仅讲述注意力机制做了什么事情,并可是为什么它如此高效。注意力机制是如何捕捉句子中词与词之间复杂关系的。
什么是 Transformer
Transformer 架构擅长处理本质上是序列性的文本数据。它们以文本序列作为输入,并产生另一个文本序列作为输出。例如,将输入的英语句子翻译成中文。
其核心包含一个编码器层 (Encoder layers) 堆栈和一个解码器层 (Decoder layers) 堆栈。为避免混淆,我们将单个层称为编码器 (Encoder) 或解码器 (Decoder),并将一组编码器层称为编码器堆栈 (Encoder stack) 或解码器堆栈 (Decoder stack)。
编码器堆栈和解码器堆栈各自拥有其对应输入的嵌入层 (Embedding layers)。最后,还有一个输出层 (Output layer) 来生成最终输出。
所有的编码器彼此相同。同样,所有的解码器也彼此相同。
-
编码器包含至关重要的自注意力层 (Self-attention layer),用于计算序列中不同词语之间的关系,以及一个前馈网络层 (Feed-forward layer)。 -
解码器包含自注意力层和前馈网络层,以及第二个编码器-解码器注意力层 (Encoder-Decoder attention layer)。 -
每个编码器和解码器都有其自己的一组权重。
编码器是一个可重用模块,是所有 Transformer 架构的定义组件。除了上述两个层之外,它还在两个层周围都有残差跳跃连接 (Residual skip connections),以及两个层归一化层 (LayerNorm layers)。
Transformer 架构有许多变体。一些 Transformer 架构根本没有解码器,仅依赖于编码器。
注意力机制 (Attention) 做什么?
Transformer 突破性性能的关键在于其对注意力机制的使用。
在处理一个词时,注意力机制使模型能够关注输入中与该词紧密相关的其他词。
例如,“Ball”(球)与“blue”(蓝色)和“holding”(拿着)紧密相关。另一方面,“blue”(蓝色)与“boy”(男孩)不相关。
图片为“一个男孩拿着一个蓝色的球”,其中“球”与“蓝色”和“拿着”有高注意力连接,“蓝色”与“男孩”的连接较弱。
关联:
Transformer 架构通过将输入序列中的每个词与所有其他词相关联来使用自注意力机制。
例如,考虑两个句子:
-
The cat drank the milk because it was hungry. (猫喝了牛奶,因为它饿了。) -
The cat drank the milk because it was sweet. (猫喝了牛奶,因为它很甜。)
在第一个句子中,“it” 指的是 “cat”,而在第二个句子中,它指的是 “milk”。当模型处理 “it” 这个词时,自注意力机制为模型提供了更多关于其含义的信息,以便它可以将 “it” 与正确的词联系起来。
深色代表更高的注意力权重
分数:
图片显示两句话中 "it" 对其他词的注意力权重。"it" 在第一句中对 "cat" 有高权重,在第二句中对 "milk" 有高权重。
为了使其能够处理句子意图和语义的更多细微差别,Transformer 为每个词包含了多个注意力分数。
例如,在处理单词 “it” 时,第一个分数突出了 “cat”,而第二个分数突出了 “hungry”。因此,当它解码单词 “it” 时(例如,将其翻译成另一种语言),它会将 “cat” 和 “hungry” 的某些方面都融入到翻译后的单词中。
图片显示对 "it" 的多头注意力,一个头关注 "cat",另一个头关注 "hungry"。
训练 Transformer
Transformer 在训练期间和进行推断期间的运作方式略有不同。
让我们首先看一下训练期间的数据流。训练数据包括两部分:
-
源序列或输入序列 (例如,对于翻译问题,英语中的 “You are welcome”) -
目标序列或输出序列 (例如,中文的 “不客气”)
Transformer 的目标是学习如何通过同时使用输入序列和目标序列来输出目标序列。
图片显示训练流程图:输入序列 -> 编码器,目标序列 (带开始标记) -> 解码器,编码器输出也送入解码器,解码器输出 -> 输出层 -> 最终输出,最终输出与目标序列比较计算损失。
Transformer 这样处理数据:
-
输入序列被转换为嵌入 (Embeddings)(带有位置编码 Position Encoding)并输入到编码器。 -
编码器堆栈处理这些信息并产生输入序列的编码表示。 -
目标序列前面加上一个句子开始标记 (start-of-sentence token),转换为嵌入(带有位置编码),并输入到解码器。 -
解码器堆栈结合编码器堆栈的编码表示来处理这些信息,以产生目标序列的编码表示。 -
输出层将其转换为词概率和最终的输出序列。 -
Transformer 的损失函数将此输出序列与训练数据中的目标序列进行比较。此损失用于生成梯度,以便在反向传播期间训练 Transformer。
推断 (Inference)
在推断期间,我们只有输入序列,而没有目标序列可以作为输入传递给解码器。Transformer 的目标是仅从输入序列生成目标序列。
因此,与 Seq2Seq 模型类似,我们在一个循环中生成输出,并将前一个时间步的输出序列在下一个时间步馈送给解码器,直到遇到句子结束标记 (end-of-sentence token)。
与 Seq2Seq 模型的区别在于,在每个时间步,我们重新馈送迄今为止生成的整个输出序列,而不仅仅是最后一个词。
推断流程,第一个时间步之后 图片显示推断流程图:输入序列 -> 编码器,编码器输出 -> 解码器。解码器初始输入为开始标记,之后每一步将前一步预测的词加入解码器输入序列,直到预测出结束标记。
推断期间的数据流是:
-
输入序列被转换为嵌入(带有位置编码)并输入到编码器。 -
编码器堆栈处理这些信息并产生输入序列的编码表示。 -
我们使用一个仅包含句子开始标记的空序列来代替目标序列。它被转换为嵌入(带有位置编码)并输入到解码器。 -
解码器堆栈结合编码器堆栈的编码表示来处理这些信息,以产生目标序列的编码表示。 -
输出层将其转换为词概率并产生一个输出序列。 -
我们将输出序列的最后一个词作为预测词。该词现在被填入我们解码器输入序列的第二个位置,该序列现在包含一个句子开始标记和第一个词。 -
返回步骤 3。像之前一样,将新的解码器序列输入模型。然后取输出的第二个词并将其附加到解码器序列中。重复此过程,直到它预测出句子结束标记。请注意,由于编码器序列在每次迭代中都不会改变,因此我们不必每次都重复步骤 1 和 2
教师强制 (Teacher Forcing)
在训练期间将目标序列馈送给解码器的方法称为教师强制(Teacher Forcing)。我们为什么要这样做,这个术语是什么意思?
在训练期间,我们本可以使用与推断期间相同的方法。换句话说,在一个循环中运行Transformer,从输出序列中取出最后一个词,将其附加到解码器输入中,并在下一次迭代中将其馈送给解码器。最后,当预测出句子结束标记时,损失函数会将生成的输出序列与目标序列进行比较,以训练网络。
这种循环不仅会导致训练时间大大延长,而且还会使模型更难训练。模型将不得不基于一个可能错误的第一个预测词来预测第二个词,依此类推。
相反,通过将目标序列馈送给解码器,可以说是在给它提示,就像老师一样。即使它预测了一个错误的第一个词,它也可以使用正确的第一个词来预测第二个词,这样错误就不会持续累积。
此外,Transformer 能够并行输出所有单词而无需循环,这大大加快了训练速度。
Transformer 用于什么?
Transformer 用途广泛,可用于大多数 NLP 任务,如语言模型和文本分类。它们经常用于序列到序列 (sequence-to-sequence) 模型中,应用于机器翻译、文本摘要、问答、实体识别和语音识别等。
针对不同的问题,存在不同类型的 Transformer 架构。基本的编码器层被用作这些架构的通用构建块(block),根据要解决的问题配备不同的特定应用“头”(heads)。
Transformer 分类架构
例如,情感分析应用会以文本文档作为输入。分类头 (Classification head) 接收 Transformer 的输出,并生成类别标签的预测,例如正面或负面情感。
图片显示文本输入 -> Transformer 编码器 -> 分类头 -> 类别预测(如正面/负面)
Transformer 语言模型架构
语言模型架构会以输入序列的初始部分(例如文本句子)作为输入,并通过预测后续句子来生成新文本。语言模型头 (Language Model head) 接收 Transformer 的输出,并为词汇表中的每个词生成概率。概率最高的词成为句子中下一个词的预测输出。
图片显示输入文本 -> Transformer 编码器 -> 语言模型头 -> 下一个词的概率分布 -> 预测的下一个词。
它们如何优于 RNN?
在 Transformer 出现并取代它们之前,RNN 及其 LSTM 和 GRU 是所有 NLP 应用的事实上的标准架构。
基于 RNN 的序列到序列模型表现良好,当注意力机制首次引入时,它被用来辅助增强其性能。
然而,它们有两个局限性:
-
处理长句子中相隔较远的词之间的长距离依赖关系具有挑战性。 -
它们逐词顺序处理输入序列,这意味着它在完成时间步 的计算之前无法进行时间步 t 的计算。这会减慢训练和推断速度。
顺便提一下,对于 CNN,所有输出都可以并行计算,这使得卷积速度快得多。然而,它们在处理长距离依赖关系方面也存在局限性:
-
在卷积层中,只有足够接近以适应核大小的图像部分(或应用于文本数据时的词语)才能相互作用。对于相距较远的item,你需要一个具有许多层的更深层网络。
Transformer 架构解决了这两个局限性。它完全摒弃了 RNN,并完全依赖于注意力机制的优势。
-
它们并行处理序列中的所有词语,从而大大加快了计算速度。
图片对比 RNN 的顺序处理和 Transformer 的并行处理。
-
输入序列中词语之间的距离无关紧要。它同样擅长计算相邻词语之间以及相距较远的词语之间的依赖关系。
现在我们对 Transformer 有了一个高层次的了解,我们可以在下一篇文章中更深入地探讨其内部功能,以了解其工作原理的细节。

