介绍
我将以非常简单的方式向你解释转换器编码器。对于那些在学习转换器时遇到困难的人来说,可以通读本博客文章,如果你对在NLP领域工作感兴趣,你至少应该了解到转换器,因为大多数行业都在使用这些最先进的模型来完成各种任务。转换器是NLP任务中的最先进模型,超越了传统的RNN和LSTM模型。转换器通过依赖于自我注意力而不是循环来解决了捕捉长期依赖的挑战。它们彻底改变了NLP,并为BERT、GPT-3和T5等架构铺平了道路。
学习目标
在本文中,您将学到:
- 转换器为什么变得如此受欢迎?
- 自我注意机制在NLP领域的作用。
- 如何从自己的输入数据中创建键、查询和值矩阵。
- 如何使用键、查询和值矩阵计算注意力矩阵。
- 在机制中应用softmax函数的重要性。
本文是数据科学博客马拉松的一部分。
转换器为什么超越了RNN和LSTM模型?
在使用RNN和LSTM模型时,我们遇到了一个重要障碍,即这些递归模型仍然无法理解长期依赖,并且处理复杂数据时计算负荷越来越大。论文《Attention Is All You Need》提出了一种名为转换器的新设计,以克服传统序列网络的限制,现在它们是许多NLP应用的最先进模型。
- 在RNN和LSTM中,输入和标记逐个传递,而转换器同时传输完整的序列(并行传输数据)。
- 转换器模型完全消除了递归过程,完全依赖于注意机制,使用了一种独特的自我注意机制。
转换器由什么组成?它如何工作?
对于许多NLP任务,转换器模型目前是最先进的模型。转换器的引入在NLP领域取得了重大进展,为BERT、GPT-3、T5等先进系统铺平了道路。
让我们通过一个语言翻译任务来了解转换器和自我注意的工作原理。转换器由编码器-解码器架构组成。我们将输入句子(源句子)输入编码器。编码器学习输入句子的表示并将表示发送给解码器。解码器接收编码器学习到的表示作为输入,并生成输出句子(目标句子)。
假设我们想将一个短语从英语翻译成法语。如下图所示,我们需要将英语句子作为编码器的输入。编码器学习给定英语句子的表示并将表示传递给解码器。解码器将编码器的表示作为输入,并生成法语句子作为输出。
一切进行得很好,但是这里到底发生了什么?转换器的编码器和解码器是如何将英语句子(源句子)翻译成法语句子(目标句子)的?编码器和解码器内部到底发生了什么?因此,在本文中,我们只关注编码器网络,因为我们希望保持简洁,先专注于编码器。未来的文章中,我们肯定会涵盖解码器部分。在接下来的几节中,让我们找出答案。
理解转换器的编码器
编码器只是一个神经网络,用于接收输入并将其转换为机器可以理解的不同表示/形式。转换器由N个编码器堆叠而成。一个编码器的输出作为输入传递给它上面的另一个编码器。如下图所示,我们有一个由N个编码器组成的堆叠。每个编码器将其输出发送给上面的编码器。最后一个编码器将给定源句子的表示作为输出返回。我们将源句子作为输入传递给编码器,并获得源句子的表示作为输出:
原论文《Attention Is All You Need》的作者选择了 N = 6,这意味着他们将六个编码器堆叠在一起。然而,我们可以尝试其他的 N 值。为了简单和更好的理解,我们保留 N = 2。
好了,问题是编码器具体是如何工作的?它是如何为给定的源句子(输入句子)生成表示的?让我们看看编码器中有什么。
从上图可以看出,所有的编码器块都是相同的。我们还可以观察到每个编码器块包含两个组件。
- 多头注意力
- 前馈网络
让我们深入了解这两个组件的工作原理。为了理解多头注意力的工作原理,首先我们需要了解自注意力机制。
自注意力机制
让我们通过一个例子来理解自注意力机制。考虑以下句子
我游过河去对岸
例子1
在上面的例子1中,如果我让你告诉我这里的 bank 是什么意思。那么为了回答这个问题,你必须理解围绕单词 bank 的单词。
所以是这样的吗:
bank == 金融机构?
bank == 河边的地面?
通过阅读句子,你可以轻松地说出单词“bank”在这里的意思是河边的地面。
所以上下文很重要!
让我们看另一个例子 –
一条狗吃了食物,因为它饿了
例子2
一个机器如何理解给定句子中的这些未知单词指的是什么?这就是自注意力机制帮助机器理解的地方。
在给定的句子中,一条狗吃了食物,因为它饿了,首先,我们的模型将计算单词 A 的表示,然后计算单词狗的表示,然后计算单词吃的表示,依此类推。在计算每个单词的表示时,它会将每个单词与句子中的所有其他单词相关联,以更好地理解该单词。
例如,在计算单词 it 的表示时,我们的模型将单词 it 与句子中的所有其他单词相关联,以更好地理解单词 it。
在下面的图像中,我们的模型将单词“it”与短语中的每个单词连接起来计算其表示。通过这样做,我们的模型理解到“it”与“dog”相关联,而不是与“food”相关联。连接“it”和“dog”的线条的粗细更大,表示得分更高,关系更强。这使得机器能够根据更高的得分进行预测。
好了,但具体是如何工作的呢?既然我们对它是什么有了基本的理解,现在让我们更详细地了解自注意力过程。
假设我有:
SourceSentence = 我很好
Tokenized = [‘我’, ‘很’, ‘好’]
在这里,representation只是一个词嵌入模型。
输入矩阵(嵌入矩阵)
从上述输入矩阵(嵌入矩阵)可以看出,矩阵的第一行表示单词”我”的嵌入,第二行表示单词”很”的嵌入,第三行表示单词”好”的嵌入。因此,输入矩阵的维度将是 – [句子长度 x 嵌入维度]。我们句子中的单词数(句子长度)为3。暂时设定嵌入维度为3,根据解释,那么我们的输入矩阵(输入嵌入)维度将为[3,3]。所以,如果你将维度设定为512,那么你的形状将是[3×512]。为了方便,我们取[3,3]
我们现在从上述矩阵X生成三个新矩阵:查询矩阵Q,关键字矩阵K和值矩阵V。等等,这三个矩阵究竟是什么?为什么我们需要它们?它们在自我注意机制中被使用。一会儿,我们将看到这三个矩阵是如何被使用的。
所以,让我给你一个例子,帮助你理解和想象自我注意。我只是在寻找好的数据科学教程,以帮助我学习数据科学。尽管YouTube的数据库如此庞大,但它允许我插入一个查询,并从各种数据中为我提供结果。因此,如果我提供查询”数据科学教程”,我的问题将是”数据科学教程”,它将计算其他数据序列(键)之间的分数,并返回与之相关的结果(具有较高分数的结果)。
注意:上述解释只是为了让您想象我的查询是如何与其他单词/序列作为键进行比较的。
让我回到[键、查询和值]的概念。现在考虑如何为自我注意机制生成这三个矩阵。为了生成这三个矩阵,我们添加三个新权重W[Q]、W[K]和W[V]。通过将输入矩阵X与W[Q]、W[K]和W[V]相乘,我们得到查询矩阵Q、关键字矩阵K和值矩阵V。
注意:W[Q]、W[K]和W[V]权重矩阵是随机初始化的,它们的最佳值是在训练过程中学习的。随着我们学习到最佳权重,我们将得到更准确的查询、关键字和值矩阵。
如下图所示,我们将输入矩阵(X)与权重矩阵W[Q]、W[K]和W[V]相乘,得到查询矩阵、关键字矩阵和值矩阵。此外,这些只是为了理解而提供的任意值,而不是准确的嵌入。
理解自我注意机制
那么为什么我们要计算查询(query)、键(key)和值(values)矩阵呢?让我们通过以下四个步骤来理解:
步骤 1
- 在自注意力过程中,首先计算查询矩阵 Q 和键矩阵 K(转置)的点积。
- 以下显示了查询矩阵 Q 和键矩阵 K(转置)之间的点积结果。
- 但是计算查询和键矩阵的点积有什么用呢?Q.K(转置)到底表示什么?让我们通过详细观察 Q.K(转置) 的结果来理解。
- 让我们看一下 Q.K(转置) 矩阵的第一行,如下图所示。我们可以观察到,我们正在计算查询向量 q1(I)和所有键向量 – k1(I)、k2(am)和k3(good)之间的点积。
注意:计算点积表示它们的相似程度。关系越强,分数越高。
- 无论如何,点积仅用于计算查询向量和键向量之间的相似性,以计算注意力分数。
- 同样地,我们也计算其他行的点积。
步骤 2
- 在自注意力过程中,Q.K(转置)矩阵被键向量的维度的平方根除以。但是为什么我们必须这样做呢?
如果我们不进行这种类型的缩放,会发生什么?
结果是,如果不进行缩放,点积的大小可能会因键向量的大小而变化。当键向量较大时,点积也可能变得更大。这可能导致训练过程中梯度过快地扩大或缩小,导致优化过程不稳定,模型训练受到影响。
- 令 dk 为键向量的维度。因此,如果我的嵌入大小为 512,假设键向量维度为 64。那么,如果我们对其进行平方根运算,得到的结果是 8。
步骤 3
- 通过观察可以发现,上述相似度得分处于非规范化的形式。因此,我们使用 softmax 函数对其进行归一化。softmax 函数有助于将得分范围调整为 0 到 1,并且得分的总和为 1,如下图所示:
- 将先前的矩阵称为评分矩阵,通过分析分配给每个单词的分数,我们可以理解句子中每个单词之间的相互关系。检查分数矩阵的第一行,我们观察到单词“I”与自身的连接程度为90%,与单词“am”的连接程度为7%,与单词“good”的连接程度为3%。对我的这个词新的关注无疑是令人满意的。
步骤4
- 那接下来呢?我们生成了查询矩阵和键矩阵的点积,计算了分数,然后使用softmax函数对分数进行了归一化。在自注意力机制的最后一步中,计算注意力矩阵Z。
- 短语中的每个单词在注意力矩阵中都有自己的注意力值。注意力矩阵Z通过将分数矩阵与值矩阵V相乘来计算,如下所示:
- 因此,我们的序列将具有以下注意力矩阵:
- 注意力矩阵是通过加权求和值向量得到的。让我们逐行来更好地理解它。首先,考虑在第一行中如何计算单词“I”的自注意力:
- 从上图可以推断出,计算单词“I”的自注意力涉及将值向量按照分数进行加权并将它们相加。结果中,值向量v1(I)的值将包含来自值向量v1(I)的值的90%,来自值向量v2(am)的值的7%,来自值向量v3(good)的值的3%,以此类推。
因此,这就是自注意力机制在基于Transformer的编码器中的运行方式。
结论
因此,我们对Transformer的编码器和自注意力方法的运作方式有了全面的了解。我认为,了解各种框架的架构并将其有效地整合到基于自然语言处理的任务中是这一领域工作的重要方面。未来,我们将在解码器、Bert、大型语言模型等方面增加其他部分。我建议您在将其部署到其他地方之前,先了解这样的架构,这样您会感到更加了解和投入数据科学。
- 以没有困难的心态来处理复杂的架构非常重要。凭借正确的知识、奉献精神和充分利用您的才能,您可以有效地简化并穿越这些架构,使其更易管理,从而增强您在数据科学中的工作。
- 理解框架的架构,例如Transformer的编码器和自注意力方法,对于在基于自然语言处理的活动中有效地工作至关重要。它使您能够掌握这些模型的基本原理和机制。
- 正确地将框架的架构整合到任何任务中是一项重要的技能。它使您能够有效地利用框架的功能并在自然语言处理任务中取得更好的结果。
常见问题
本文中显示的媒体不归Analytics Vidhya所有,而是根据作者的判断使用。