机器学习的transformer

新的深度学习模型被引入的速度越来越快,有时很难及时的了解所有新技术。 也就是说,已经证明一种特定的神经网络模型对于常见的自然语言处理任务特别有效。

该模型称为Transformer,我们将分为两个部分详细介绍它

第1部分:序列到序列学习和Attention机制

序列到序列(Seq2Seq)是一个神经网络,它将给定的元素序列(例如句子中的单词序列)转换为另一个序列。
Seq2Seq模型特别擅长翻译,将一种语言的单词序列转换为另一种语言的不同单词序列。这种类型的模型的一个流行选择是基于长期短期记忆(LSTM)的模型。使用依赖序列的数据,LSTM模块可以在记住(或忘记)发现重要(或不重要)的部分的同时赋予序列含义。

Seq2Seq模型由一个编码器和一个解码器组成。编码器采用输入序列并将其映射到更高维的空间(n维向量)中。该抽象向量被馈送到解码器,该解码器将其转换为输出序列。输出序列可以是另一种语言,符号,输入副本等。

想象编码器和解码器是只能说两种语言的人工翻译。他们分别会两个不同的母语(例如德语和法语),而第二语言则是假想的语言。为了将德语翻译成法语,编码器将德语句子转换为它知道的另一种语言,即虚构语言(比如第二语言都是英语)。由于解码器能够读取虚构的语言,因此它现在可以从该语言翻译成法语。该模型(由编码器和解码器组成)可以一起将德语翻译成法语!

假设最初,无论是编码器还是解码器,都不会流利地使用虚构语言(都还在学英语)。要学习它,我们将通过许多示例来训练他们(模型)。

我们需要更多的技术细节,以使“transformer”更容易理解:Attention(在之前的文章具体介绍过)。Attention机制着眼于输入序列,并在每个步骤中确定序列的其他部分很重要。听起来很抽象,但是让我用一个简单的例子来说明一下:阅读本文时,您始终专注于阅读的单词,但同时您的大脑仍将文本的重要关键字保留在内存中以提供上下文。

Attention机制在给定序列上的工作原理类似。对于人类编码器和解码器的示例,请想象,编码器不仅写下了虚构语言的句子翻译,还写下了对句子语义重要的关键字,并将其提供给解码器。除了常规翻译。这些新关键字使解码器的翻译更加轻松,因为它知道句子的哪些部分很重要,哪些关键术语为句子提供了上下文。

换句话说,对于LSTM(编码器)读取的每个输入,Attention机制会同时考虑其他几个输入,并通过为这些输入分配不同的权重来确定哪个输入很重要。然后,解码器将输入的句子和Attention机制提供的权重作为输入。

第2部分:Transformer

它使用了我们之前看到的transformer机制。像LSTM一样,Transformer是一种通过两个部分(编码器和解码器)将一个序列转换为另一序列的体系结构,但它与先前描述/现有的序列到序列模型不同,因为它并不暗示任何递归网络( GRU,LSTM等)。

到目前为止,循环网络被认为是捕获序列中及时依存关系的最佳方法之一。但是,工程师们发现,仅具有注意力机制而没有任何RNN(递归神经网络)的体系结构可以改善翻译任务和其他任务的结果!一个介绍自然语言任务的改进是由一个介绍BERT的团队提出的:BERT:深度双向变压器的预训练,以进行语言理解。(在之前的文章介绍过Bert可以去查看)

那么,什么是Transformer?

机器学习的transformer_第1张图片

编码器在左侧,解码器在右侧。 编码器和解码器均由可以相互堆叠多次的模块组成,这在图中用Nx描述。 我们看到模块主要由多头attention和前馈层组成。 输入和输出(目标句子)首先被嵌入到n维空间中,因为我们不能直接使用字符串。

该模型的一个微小但重要的部分是不同单词的位置编码。 由于我们没有可以记住序列如何馈入模型的循环网络,因此我们需要以某种方式赋予序列中的每个单词/部分一个相对位置,因为序列取决于其元素的顺序。 这些位置将添加到每个单词的嵌入表示形式(n维向量)中。

让我们仔细看一下模型中的这些“多头attention”图块:

机器学习的transformer_第2张图片
让我们从左侧的attention机制描述开始。 它不是很复杂,可以用以下等式描述:

机器学习的transformer_第3张图片

Q是一个包含查询的矩阵(序列中一个单词的向量表示),K是所有键(序列中所有词的向量表示),V是值,它们也是所有查询的向量表示 序列中的单词。 对于编码器和解码器,多头attention模块,V由与Q相同的单词序列组成。但是,对于考虑到编码器和解码器序列的attention模块,V与Q表示的序列不同。

为了简化一点,我们可以说将V中的值与一些注意权重a相乘并相加,其中我们的权重定义为:

机器学习的transformer_第4张图片

这意味着权重a由序列中的每个单词(由Q表示)如何受到序列中所有其他词(由K表示)的影响来定义(就是上下文)。

此外,将SoftMax函数应用于权重a,以使其分布在0到1之间。然后,将这些权重应用于V中引入的序列中的所有单词(对于编码器和解码器,向量与Q相同,但对于向量具有编码器和解码器输入的模块)。

右图描述了如何将这种注意力机制并行化为可以并行使用的多种机制。注意机制通过Q,K和V的线性投影重复多次。这使系统可以从Q,K和V的不同表示中学习,这对模型很有帮助。这些线性表示是通过将Q,K和V乘以在训练过程中获得的权重矩阵W来完成的。

对于attention模块在结构中的每个位置,那些矩阵Q,K和V是不同的,这取决于它们是在编码器,解码器中还是在编码器和解码器之间。原因是我们要参加整个编码器输入序列或一部分解码器输入序列。连接编码器和解码器的多头注意模块将确保将编码器输入序列与解码器输入序列一起考虑到给定位置。

训练

如何训练这种“野兽”?对Seq2Seq模型的训练和推断与通常的分类问题有点不同。transformer也是如此。

我们知道,要为翻译任务训练模型,我们需要两个互不相同的语言的句子。一旦有很多成对的句子,我们就可以开始训练模型。假设我们想将法语翻译成德语。我们的编码输入将是法语句子,而解码器的输入将是德语句子。但是,解码器输入将向右移动一个位置。 为什么?

一个原因是我们不希望我们的模型在训练期间学习如何复制解码器输入,但是我们希望了解给定编码器序列和模型已经看到的特定解码器序列,我们可以预测下一个字/字符。

如果我们不改变解码器的顺序,则模型将学习简单地“复制”解码器输入,因为位置i的目标字/字符将是解码器输入中的字/字符i。因此,通过将解码器输入移位一个位置,我们的模型需要预测仅在解码器序列中仅看到字/字符1,…,i-1的位置i的目标字/字符。这会阻止我们的模型学习复制/粘贴任务。我们用开始标记填充解码器输入的第一个位置,类似地,我们将句子结尾标记附加到解码器输入序列以标记该序列的结尾,并且还将它附加到目标输出语句。一会儿,我们将看到这对推断结果有何用。

对于Seq2Seq模型和Transformer都是如此。除了右移之外,transformer在第一个多头注意模块中的输入上加上一个Mask。这是特定于Transformer体系结构的,因为我们没有RNN可以顺序输入序列。在这里,我们将所有内容一起输入,如果没有mask,则多头attention会考虑每个位置的整个解码器输入序列。

我们想要进行损失计算的目标序列只是解码器输入(德语句子)而不进行移位,并且在末尾带有序列结束标记。

用这些模型推断不同于训练,这是有道理的,因为最后我们要翻译法语句子而不用德语句子。这里的窍门是为输出序列的每个位置重新馈送我们的模型,直到遇到句子结束标记。

更多分步方法将是:

  1. 输入完整的编码器序列(法语句子),并作为解码器输入,我们采用一个空序列,在第一个位置仅带有一个句子开始标记。这将输出一个仅包含第一个元素的序列。
  2. 该元素将被填充到我们的解码器输入序列的第二个位置,该位置现在有一个句子开始标记和一个第一个单词/字符。
  3. 将编码器序列和新的解码器序列输入模型。将输出的第二个元素放入解码器输入序列。

重复此过程,直到您预测句子的结尾标记,它标志着翻译的结束。

我们看到我们需要遍历我们的模型才能翻译我们的句子。

你可能感兴趣的:(机器学习)