Sequence-to- Sequence 模型是一个深度学习模型,它能够成功完成例如机器翻译、文本摘要和图片描述等任务。Google翻译最开始在2016年使用这项技术。这个模型最先由这两篇论文提出(Sutskever et al.,2014,Cho et al.,2014)。

然而,我发现如果想要很好的理解这个模型并实现它,需要明白很多相互关联的概念。我认为如果把这些想法用视觉来体现出来可能会有助于理解。这就是我这篇文章的目的。你可能会需要一些深度学习方面的前置知识来理解这篇文章。我希望它能够成为你阅读上面几篇论文和后面将会提到的论文的得力帮手。

一个seq2seq模型是一个能够使用一个序列(单词、字母、图片特征等)然后输出另一个序列。一个训练好的模型工作方式如下:

在机器翻译领域,对于输入序列和输出序列可能如下:

看看具体的工作原理

在中间的部分,模型分为编码器(encoder)和解码器(decoder)。

编码器处理输入序列中的每一项,它将它捕获的信息汇集成一个向量(我们称之为长下文(context))。在处理过所有的输入信息之后,编码器将上下文发送到解码器,然后解码器开始逐项生成输出序列。

还是用之前的机器翻译来举例:

在机器翻译的情况下,上下文是一个向量(大部分情况下是一个数组)。编码器解码器往往都是一个递归神经网络(RNN)(一定要看看Luis Serrano的 A friendly introduction to Recurrent Neural Networks 来看看什么是RNN)

这个上下文是一个浮点向量。之后我们将为具有更高权重的单元分配更亮的颜色来可视化这个向量

你可以在你设置你的模型的时候设置上下文的大小。它基本上是编码器的RNN中隐藏单元的数量。我们在上面距离上下文向量大小为4,实际上这个大小可能是256、512甚至是1024。

通过设计,RNN在每一步上都有两个输入,一个输入(对于编码器来说,是来自输入语句的一个单词),和一个隐藏状态。但是,这个词需要一个向量(词向量)来表示。为了将一个单词转换为一个向量,我们将这个方法称之为“词嵌入(word wmbedding)”算法。它将单词映射到空间向量从而捕获到单词许多的含义/语义信息。(例如 国王-男人+女人=女王)

在处理他们之前,我们需要将输入的单词转换为向量。这个转换使用的是词嵌入算法。我们可以预训练的嵌入或者在我们自己的数据集上训练一个自己的词嵌入。嵌入向量长度通常为200或300。为了简单起见,我们只举例大小为4。

现在我们已经介绍了我们主要的向量/张量(tensor),那让我们回顾一下RNN机制,并建立一个可视化的语言来描述这些模型:

下一个RNN步骤使用第二个输入向量和隐藏状态#1来生成当前时间步的输出。在本文的后面,我们将使用这样的动画来描述机器翻译模型。

在下面的可视化中,编码器或解码器的每一步都是RNN在每一个时间步中处理输入并且生成输出。因为编码器和解码器都是RNNs,每一个时间步RNNs都会进行一些处理,它会根据它得到的输入和之前的输入(感觉是作者笔误,应该是之前的输出)来更新它的隐藏状态。

让我们看看编码器隐藏层。注意,最后一个隐藏状态实际上是我们传递给解码器的上下文。

解码器还维护了一个隐藏状态,以便从一个时间步长传递到下一个时间步长(后面会介绍)。我们没有把这一步进行可视化,因为我们现在关心的是模型的主要部分。

现在我们看一下另一种对seq2seq的可视化过程。这个动画将使理解这个模型变得更容易。如下图,我们可以看到每一步的输入和输出:

现在引入注意力机制

显然上下文成为了这类模型的瓶颈,因为这给模型处理长文本带来了挑战。Bahdanau et al.,2014Luong et al.,2015等人提出了一个解决办法。这些论文提出了一个叫“注意力”的技术,极大地提高了机器翻译的质量。注意力允许模型根据需要关注输入序列的不同部分。

注意力模型与经典的seq2seq有两个主要的区别:

首先,编码器将更多的信息传递给解码器。编码器不再传递最后一个隐藏层状态,而是将所有的隐藏层状态传递给解码器

然后,注意力解码器在产生输出前多了一步。为了关注输入的不同部分,解码器执行以下操作:

  • 查看接收到的编码层隐藏层状态集——每个隐藏层状态都与输入与剧中某个单词有很大的关联。
  • 给定每一个隐藏层一个分数(暂时忽略这个分数是怎么得到的)
  • 对每一个隐藏层状态乘以softmax后的分数,从而放大得分高的隐藏层状态,掩盖得分低的隐藏层状态。

这个评分是由解码器端在每一个时间步中进行的。

现在让我们把所有的东西放在一起进行可视化,然后观察注意力机制到底做了什么?

  • 注意力解码器RNN包含了<END> 标记 和一个初始的解码器隐藏层状态。
  • RNN处理输入,产生输出和一个新的隐藏层状态向量(h4)。输出会被抛弃。
  • 注意力步骤:我们使用编码器隐藏层状态和h4向量来计算上下文向量(C4)。
  • 我们连接h4和C4成一个向量。
  • 我们通过一个前馈神经网络(与模型连接一同训练)来处理这个向量。
  • 前馈神经网络的输出作为该时间步长的输出。
  • 重复下一时间步。

另一种方式来观察在每一个解码过程中注意力机制是怎么观察输入句子的过程如下:

请注意,模型并不只是盲目的将输出中的第一个单词与输入的第一个单词对齐。实际上,它从训练阶段学习了如何排列语言中的单词(实例是法语翻译到英语)。下面举个例子:

我们可以看到该模型在输出“European Economic Area”。在法语中,这些词的顺序与英语相反 (“européenne économique zone”) 。这个句子中其他单词的顺序都差不多。

如果你觉得你已经准备好了学习怎么实现,一定要去学一学TensorFlow的seq2seq教程

翻译整理自,Jay Alamar,Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注