Transformer 模型自问世以来,依然是人工智能领域的核心技术之一。作为深度学习中革命性的架构,Transformer 不仅在自然语言处理(NLP)中占据主导地位,还扩展到了计算机视觉、语音处理和科学计算等多个领域。
如今,无论是大语言模型(如 GPT-4 和 Bard)推动的生成式 AI 热潮,还是 Vision Transformer 在图像分析中的崛起,Transformer 的影响力无处不在。同时,研究者们也在不断优化和改进这一架构,通过轻量化设计、高效注意力机制以及多模态融合,进一步拓宽了其应用场景和效率边界。可以说,Transformer 已经从一种模型架构发展为一种贯穿多领域的技术范式,其热度不仅未减,反而随着新技术和新应用的涌现而持续升温。
一文详解 Transformer 的实现细节与工作原理,万字长文助你全面掌握核心概念与技术要点。内容丰富,建议收藏细读!
1►
什么是 Transformer 模型
循环神经网络和长短期记忆网络已经广泛应用于时序任务,比如文本预测、机器翻译、文章生成等。然而,它们面临的一大问题就是如何记录长期依赖。
为了解决这个问题,一个名为 Transformer 的新架构应运而生。从那以后,Transformer 被应用到多个自然语言处理方向,到目前为止还未有新的架构能够将其替代。可以说,它的出现是自然语言处理领域的突破,并为新的革命性架构(BERT、GPT-3、T5等)打下了理论基础。
Transformer 完全依赖于注意力机制,并摒弃了循环。它使用的是一种特殊的注意力机制,称为自注意力(self-attention)。我们将在后面介绍具体细节。
我们来通过一个文本翻译实例来了解 Transformer 是如何工作的。Transformer 由编码器和解码器两部分组成。首先,向编码器输入一句话(原句),让其学习这句话的特征,再将特征作为输入传输给解码器。最后,此特征会通过解码器生成输出句(目标句)。
假设我们需要将一个句子从英文翻译为法文。如图 1-1 所示,首先,我们需要将这个英文句子(原句)输进编码器。编码器将提取英文句子的特征并提供给解码器。最后,解码器通过特征完成法文句子(目标句)的翻译。
图 1-1 Transformer的编码器和解码器
此方法看起来很简单,但是如何实现呢?Transformer 中的编码器和解码器是如何将英文(原句)转换为法文(目标句)的呢?编码器和解码器的内部又是怎样工作的呢?
接下来,我们将按照数据处理的顺序,依次讲解编码器和解码器。
2►
理解编码器
Transformer 中的编码器不止一个,而是由一组个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在图 1-2 中有
个编码器,每一个编码器都从下方接收数据,再输出给上方。以此类推,原句中的特征会由最后一个编码器输出。编码器模块的主要功能就是提取原句中的特征。
图 1-2个编码器
需要注意的是,在 Transformer 原论文 Attention Is All You Need 中,作者使用了,也就是说,一共有 6 个编码器叠加在一起。当然,我们可以尝试使用不同的
值。这里为了方便理解,我们使用
,如图 1-3 所示。
图 1-3 两个叠加在一起的编码器
编码器到底是如何工作的呢?它又是如何提取出原句(输入句)的特征的呢?要进一步理解,我们可以将编码器再次分解。图 1-4 展示了编码器的组成部分。
图 1-4 编码器的组成部分
从图 1-4 中可知,每一个编码器的构造都是相同的,并且包含两个部分:
多头注意力层
前馈网络层
现在我们来看看这两部分是如何工作的。
要了解多头注意力机制的工作原理,我们首先需要理解什么是自注意力机制。
1.2.1 自注意力机制
让我们通过一个例子来快速理解自注意力机制。请看下面的例句:
A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿)
例句中的代词 it(它)可以指代 dog(狗)或者 food(食物)。当读这段文字的时候,我们自然而然地认为 it 指代的是 dog,而不是 food。但是当计算机模型在面对这两种选择时该如何决定呢?这时,自注意力机制有助于解决这个问题。
还是以上句为例,我们的模型首先需要计算出单词 A 的特征值,其次计算 dog 的特征值,然后计算 ate 的特征值,以此类推。当计算每个词的特征值时,模型都需要遍历每个词与句子中其他词的关系。模型可以通过词与词之间的关系来更好地理解当前词的意思。
比如,当计算 it 的特征值时,模型会将 it 与句子中的其他词一一关联,以便更好地理解它的意思。
如图 1-5 所示,it 的特征值由它本身与句子中其他词的关系计算所得。通过关系连线,模型可以明确知道原句中 it 所指代的是 dog 而不是 food,这是因为 it 与 dog 的关系更紧密,关系连线相较于其他词也更粗。
图 1-5 自注意力示例
我们已经初步了解了什么是自注意力机制,下面我们将关注它具体是如何实现的。
为简单起见,我们假设输入句(原句)为 I am good(我很好)。首先,我们将每个词转化为其对应的词嵌入向量。需要注意的是,嵌入只是词的特征向量,这个特征向量也是需要通过训练获得的。
单词 I 的词嵌入向量可以用来表示,相应地,am 为
,good 为
,即:
单词 I 的词嵌入向量量
=[1.76, 2.22, , 6.66];
单词 am 的词嵌入向量
=[7.77, 0.631, , 5.35];
单词 good 的词嵌入向量
=[11.44, 10.10, , 3.33]。
这样一来,原句 I am good 就可以用一个矩阵(输入矩阵或嵌入矩阵)来表示,如图 1-6 所示。
图 1-6 输入矩阵
图 1-6 中的值为随意设定,只是为了让我们更好地理解其背后的数学原理。
通过输入矩阵,我们可以看出,矩阵的第一行表示单词 I 的词嵌入向量。以此类推,第二行对应单词 am 的词嵌入向量,第三行对应单词 good 的词嵌入向量。所以矩阵
的维度为[句子的长度×词嵌入向量维度]。原句的长度为 3,假设词嵌入向量维度为 512,那么输入矩阵的维度就是 [3×512]。
现在通过矩阵,我们再创建三个新的矩阵:查询(query)矩阵
、键(key)矩阵
,以及值(value)矩阵
。等一下,怎么又多了三个矩阵?为何需要创建它们?接下来,我们将继续了解在自注意力机制中如何使用这三个矩阵。
为了创建查询矩阵、键矩阵和值矩阵,我们需要先创建另外三个权重矩阵,分别为、
、
。用矩阵
分别乘以矩阵
、
、
,就可以依次创建出查询矩阵
、键矩阵
和值矩阵
。
值得注意的是,权重矩阵、
和
的初始值完全是随机的,但最优值则需要通过训练获得。我们取得的权值越优,通过计算所得的查询矩阵、键矩阵和值矩阵也会越精确。
如图 1-7 所示,将输入矩阵分别乘以
、
和
后,我们就可以得出对应的查询矩阵、键矩阵和值矩阵。
图 1-7 创建查询矩阵、键矩阵和值矩阵
根据图 1-7,我们可以总结出以下三点。
三个矩阵的第一行
、
和
分别代表单词 I 的查询向量、键向量和值向量。
三个矩阵的第二行
、
和
分别代表单词 am 的查询向量、键向量和值向量。
三个矩阵的第三行
、
和
分别代表单词 good 的查询向量、键向量和值向量。
因为每个向量的维度均为 64,所以对应的矩阵维度为 [句子长度×64]。因为我们的句子长度为 3,所以代入后可得维度为 [3×64]。
至此,我们还是不明白为什么要计算这些值。该如何使用查询矩阵、键矩阵和值矩阵呢?它们怎样才能用于自注意力模型呢?这些问题将在下面进行解答。
理解自注意力机制
目前,我们学习了如何计算查询矩阵、键矩阵
和值矩阵
,并知道它们是基于输入矩阵
计算而来的。现在,让我们学习查询矩阵、键矩阵和值矩阵如何应用于自注意力机制。
要计算一个词的特征值,自注意力机制会使该词与给定句子中的所有词联系起来。还是以 I am good 这句话为例。为了计算单词 I 的特征值,我们将单词 I 与句子中的所有单词一一关联,如图 1-8 所示。
图 1-8 自注意力的示例
了解一个词与句子中所有词的相关程度有助于更精确地计算特征值。现在,让我们学习自注意力机制如何利用查询矩阵、键矩阵和值矩阵将一个词与句子中的所有词联系起来。自注意力机制包括 4 个步骤,我们来逐一学习。
第 1 步,自注意力机制首先要计算查询矩阵与键矩阵
的点积,两个矩阵如图 1-9 所示。
图 1-9 查询矩阵和键矩
图 1-10 显示了查询矩阵与键矩阵
的点积结果。
图 1-10 计算查询矩阵与键矩阵的点积
但为何需要计算查询矩阵与键矩阵的点积呢?到底是什么意思?下面,我们将通过细看
的结果来理解以上问题。
首先,来看矩阵的第一行,如图1-11所示。可以看到,这一行计算的是查询向量