1 ►
什么是 Transformer 模型
2 ►
理解编码器
Transformer 中的编码器不止一个,而是由一组
个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在图 1-2 中有
个编码器,每一个编码器都从下方接收数据,再输出给上方。以此类推,原句中的特征会由最后一个编码器输出。编码器模块的主要功能就是提取原句中的特征。
-
多头注意力层
-
前馈网络层
现在我们来看看这两部分是如何工作的。
要了解多头注意力机制的工作原理,我们首先需要理解什么是自注意力机制。
1.2.1 自注意力机制
A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿)
例句中的代词 it(它)可以指代 dog(狗)或者 food(食物)。当读这段文字的时候,我们自然而然地认为 it 指代的是 dog,而不是 food。但是当计算机模型在面对这两种选择时该如何决定呢?这时,自注意力机制有助于解决这个问题。
我们已经初步了解了什么是自注意力机制,下面我们将关注它具体是如何实现的。
单词 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 中的值为随意设定,只是为了让我们更好地理解其背后的数学原理。
为了创建查询矩阵、键矩阵和值矩阵,我们需要先创建另外三个权重矩阵,分别为
、
、
。用矩阵
分别乘以矩阵
、
、
,就可以依次创建出查询矩阵
、键矩阵
和值矩阵
。
根据图 1-7,我们可以总结出以下三点。
-
三个矩阵的第一行
、
和
分别代表单词 I 的查询向量、键向量和值向量。
-
三个矩阵的第二行
、
和
分别代表单词 am 的查询向量、键向量和值向量。
-
三个矩阵的第三行
、
和
分别代表单词 good 的查询向量、键向量和值向量。
因为每个向量的维度均为 64,所以对应的矩阵维度为 [句子长度×64]。因为我们的句子长度为 3,所以代入后可得维度为 [3×64]。
至此,我们还是不明白为什么要计算这些值。该如何使用查询矩阵、键矩阵和值矩阵呢?它们怎样才能用于自注意力模型呢?这些问题将在下面进行解答。
理解自注意力机制
目前,我们学习了如何计算查询矩阵
、键矩阵
和值矩阵
,并知道它们是基于输入矩阵
计算而来的。现在,让我们学习查询矩阵、键矩阵和值矩阵如何应用于自注意力机制。
图 1-8 自注意力的示例
了解一个词与句子中所有词的相关程度有助于更精确地计算特征值。现在,让我们学习自注意力机制如何利用查询矩阵、键矩阵和值矩阵将一个词与句子中的所有词联系起来。自注意力机制包括 4 个步骤,我们来逐一学习。
第 1 步
,
自注意力机制首先要计算查询矩阵
与键矩阵
的点积,两个矩阵如图 1-9 所示。
图 1-10 显示了查询矩阵
与键矩阵
的点积结果。
图 1-11 计算查询向量(
)与键向量(
、
、
)的点积
注意,本文使用的数值是任意选择的,只是为了让我们更好地理解背后的数学原理。
图 1-13 计算查询向量(
)与键向量(
、
、
)的点积
图 1-14
除以键向量维度的平方根
第 4 步
,
至此,我们计算了查询矩阵与键矩阵的点积,得到了分数,然后用 softmax 函数将分数归一化。自注意力机制的最后一步是计算注意力矩阵
。
图 1-16 计算注意力矩阵
假设计算结果如图 1-17 所示。
图 1-17 注意力矩阵示例
图 1-18 单词I的自注意力值
从图 1-18 中可以看出,单词 I 的自注意力值
是分数加权的值向量之和。所以,
的值将包含 90% 的值向量
(I)、7% 的值向量
(am),以及 3% 的值向量
(good)。
从图 1-19 中可以看出,it 这个词的自注意力值包含 100% 的值向量
(dog)。这有助于模型理解 it 这个词实际上指的是 dog 而不是 food。这也再次说明,通过自注意力机制,我们可以了解一个词与句子中所有词的相关程度。
回到 I am good 这个例子,单词 am 的自注意力值
也是分数加权的值向量之和,如图 1-20 所示。
从图 1-20 中可以看出,
的值包含 2.5% 的值向量
(I)、95% 的值向量
(am),以及 2.5% 的值向量
(good)。
同样,单词 good 的自注意力值
也是分数加权的值向量之和,如图 1-21 所示。
可见,
的值包含 21% 的值向量
(I)、3% 的值向量
(am),以及 76% 的值向量
(good)。
现将自注意力机制的计算步骤总结如下:
-
计算查询矩阵与键矩阵的点积
,求得相似值,称为分数;
-
将
除以键向量维度的平方根
;
-
用 softmax 函数对分数进行归一化处理,得到分数矩阵
;
-
通过将分数矩阵与值矩阵
相乘,计算出注意力矩阵
。
图 1-22 自注意力机制
自注意力机制也被称为缩放点积注意力机制,这是因为其计算过程是先求查询矩阵与键矩阵的点积,再用
对结果进行缩放。
1.2.2 多头注意力层
图 1-23 单词well的自注意力值
这只有在词义含糊不清的情况下才有用。以下句为例:
A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿)
假设我们需要计算 it 的自注意力值。在计算相似度分数后,我们得到图 1-24 所示的结果。
假设要计算两个注意力矩阵
和
。首先,计算注意力矩阵
。
我们已经知道,为了计算注意力矩阵,需要创建三个新的矩阵,分别为查询矩阵、键矩阵和值矩阵。为了创建查询矩阵
、键矩阵
和值矩阵
,我们引入三个新的权重矩阵,称为
、
、
。用矩阵
分别乘以矩阵
、
、
,就可以依次创建出查询矩阵、键矩阵和值矩阵。
接下来计算第二个注意力矩阵
。
为了计算注意力矩阵
,我们创建了另一组矩阵:查询矩阵
、键矩阵
和值矩阵
,并引入了三个新的权重矩阵,即
、
、
。用矩阵
分别乘以矩阵
、
、
,就可以依次得出对应的查询矩阵、键矩阵和值矩阵。
现在,我们已经了解了多头注意力层的工作原理。1.2.3 节将介绍另一个有趣的概念,即位置编码(positional encoding)。
1.2.3 通过位置编码来学习位置
还是以 I am good(我很好)为例。在 RNN 模型中,句子是逐字送入学习网络的。换言之,首先把 I 作为输入,接下来是 am,以此类推。通过逐字地接受输入,学习网络就能完全理解整个句子。
不过,并行地将词送入 Transformer,却不保留词序,它将如何理解句子的意思呢?要理解一个句子,词序(词在句子中的位置)不是很重要吗?
当然,Transformer 也需要一些关于词序的信息,以便更好地理解句子。但这将如何做到呢?现在,让我们来解答这个问题。
同样,用输入矩阵
(嵌入矩阵)表示输入句 I am good。假设输入矩阵
如图 1-25 所示。
图 1-25 输入矩阵
如果把输入矩阵
直接传给 Transformer,那么模型是无法理解词序的。因此,需要添加一些表明词序(词的位置)的信息,以便神经网络能够理解句子的含义。所以,我们不能将输入矩阵直接传给 Transformer。这里引入了一种叫作位置编码的技术,以达到上述目的。顾名思义,位置编码是指词在句子中的位置(词序)的编码。
图 1-26 在输入矩阵中添加位置编码
位置编码矩阵究竟是如何计算的呢?如下所示,Transformer 论文 Attention Is All You Need 的作者使用了正弦函数来计算位置编码:
1.2.4 前馈网络层
1.2.5 叠加和归一组件
在编码器中还有一个重要的组成部分,即叠加和归一组件。它同时连接一个子层的输入和输出,如图 1-33 所示(虚线部分)。
-
同时连接多头注意力层的输入和输出。 -
同时连接前馈网络层的输入和输出。
1.2.6 编码器总览
通过图 1-34,我们可以总结出以下几点:
-
将输入转换为嵌入矩阵(输入矩阵),并将位置编码加入其中,再将结果作为输入传入底层的编码器(编码器1)。 -
编码器 1 接受输入并将其送入多头注意力层,该子层运算后输出注意力矩阵。 -
将注意力矩阵输入到下一个子层,即前馈网络层。前馈网络层将注意力矩阵作为输入,并计算出特征值作为输出。 -
接下来,把从编码器1中得到的输出作为输入,传入下一个编码器(编码器 2)。 -
编码器 2 进行同样的处理,再将给定输入句子的特征值作为输出。
3 ►
理解解码器
假设我们想把英语句子 I am good(原句)翻译成法语句子 Je vais bien (目标句)。首先,将原句 I am good 送入编码器,使编码器学习原句,并计算特征值。
如图 1-41 所示,假设在时间步
,我们将输入转换为嵌入(我们称之为嵌入值输出,因为这里计算的是解码器在以前的步骤中生成的词的嵌入),将位置编码加入其中,然后将其送入解码器。
图 1-41 带有位置编码的编码器和解码器
图 1-42 解码器模块
从图 1-42 中可以看到,解码器内部有 3 个子层。
-
带掩码的多头注意力层
-
多头注意力层
-
前馈网络层
1.3.1 带掩码的多头注意力层
为什么我们需要输入整个目标句,让解码器预测位移后的目标句呢?下面来解答。
首先,我们不是将输入直接送入解码器,而是将其转换为嵌入矩阵(输出嵌入矩阵)并添加位置编码,然后再送入解码器。假设添加输出嵌入矩阵和位置编码后得到图 1-45 所示的矩阵
。
图 1-45 嵌入矩阵