赞
踩
序列到序列(seq2seq)模型是一种深度学习模型,在很多任务上都取得了成功,如:机器翻译、文本摘要、图像、图像理解(image captioning)。谷歌翻译在 2016 年年末开始使用这种模型。有 2 篇开创性的论文(Sutskever et al., 2014, Cho et al., 2014)对这些模型进行了解释。
然而,我发现,想要充分理解模型并实现它,需要拆解一系列概念,而这些概念是层层递进的。我认为,如果能够把这些概念进行可视化,会更加容易理解。这就是这篇文章的目标。你需要先了解一些深度学习的知识,才能读完这篇文章。我希望这篇文章,可以对你阅读上面提到的 2 篇论文有帮助。
一个序列到序列(seq2seq)模型,接收的输入是一个输入的(单词、字母、图像特征)序列,输出是另外一个序列。一个训练好的模型如下图所示:
模型是由编码器(encoder)和解码器(decoder)组成的。其中,编码器会处理输入序列中的每个元素,把这些信息转换为一个向量(称为上下文(context))。当我们处理完整个输入序列后,编码器把上下文(context)发送给解码器,解码器开始逐项生成输出序列中的元素。
根据设计,RNN 在每个时间步接受 2 个输入:
然而每个单词都需要表示为一个向量。为了把一个词转换为一个向量,我们使用一类称为 “word embedding” 的方法。这类方法把单词转换到一个向量空间,这种表示能够捕捉大量的单词的语义信息(例如,king - man + woman = queen)。
在下面的可视化图形中,编码器和解码器在每个时间步处理输入,并得到输出。由于编码器和解码器都是 RNN,RNN 会根据当前时间步的输入,和前一个时间步的 hidden state(隐藏层状态),更新当前时间步的 hidden state(隐藏层状态)。
让我们看下编码器的 hidden state(隐藏层状态)。注意,最后一个 hidden state(隐藏层状态)实际上是我们传给解码器的上下文(context)。
现在让我们用另一种方式来可视化序列到序列(seq2seq)模型。下面的动画会让我们更加容易理解模型。这种方法称为展开视图。其中,我们不只是显示一个解码器,而是在时间上展开,每个时间步都显示一个解码器。通过这种方式,我们可以看到每个时间步的输入和输出。
事实证明,上下文向量是这类模型的瓶颈。这使得模型在处理长文本时面临非常大的挑战。
在 Bahdanau et al., 2014 和 Luong et al., 2015 两篇论文中,提出了一种解决方法。这 2 篇论文提出并改进了一种叫做注意力(Attention)的技术,它极大地提高了机器翻译的质量。注意力使得模型可以根据需要,关注到输入序列的相关部分。
让我们继续从高层次来理解注意力模型。一个注意力模型不同于经典的序列到序列(seq2seq)模型,主要体现在 2 个方面:
首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state(隐藏层状态)。
这个加权平均的步骤是在解码器的每个时间步做的。
现在,让我们把所有内容都融合到下面的图中,来看看注意力模型的整个过程:
我希望这篇文章会对你有帮助,文中的可视化的图片,来自于 Udacity 自然语言处理纳米课程](https://www.udacity.com/course/natural-language-processing-nanodegree–nd892)。在这门课里,我们会深入讨论更多细节,包括应用方面,并且会涉及到最近的注意力新方法,如来自于 Attention Is All You Need 的 Transformer。
我还创建了一些课程,作为 Udacity 机器学习纳米学位的一部分。我创建的课程包括无监督学习,以及使用协同过滤实现电影推荐的 jupyternotebook。
你可以通过 @JayAlammmar 联系我,期望你的反馈。
如果你觉得这篇文章对你有帮助,不妨点个赞,让我有更多动力写出好文章。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。