- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
一.参考文献
摘要
Deep Neural Networks (DNNs) are powerful models that have achieved excellent performance on difficult learning tasks. Although DNNs work well whenever large labeled training sets are available, they cannot be used to map sequences to sequences.深度神经网络 (DNN) 是强大的模型,在困难的学习任务上取得了优异的性能。 尽管只要有大型标记训练集可用,DNN 就能很好地工作,但它们不能用于将序列映射到序列。In this paper, we present a general end-to-end approach to sequence learning that makes minimal assumptions on the sequence structure.在本文中,我们提出了一种通用的端到端序列学习方法,该方法对序列结构做出最少的假设。Our method uses a multilayered Long Short-Term Memory (LSTM) to map the input sequence to a vector of a fixed dimensionality,and then another deep LSTM to decode the target sequence from the vector. 我们的方法使用多层长短期记忆网络(LSTM)将输入序列映射到固定维度的向量,然后另一个深度 LSTM 从向量中解码目标序列。Our main result is that on an English to French translation task from the WMT-14 dataset, the translations produced by the LSTM achieve a BLEU score of 34.8 on the entire test set, where the LSTM’s BLEU score was penalized on out-of-vocabulary words.我们的主要结果是,在 WMT-14 数据集的英语到法语翻译任务中,LSTM 生成的翻译在整个测试集上的 BLEU 得分为 34.8,其中 LSTM 的 BLEU 得分因词汇外的内容而受到惩罚字。Additionally, the LSTM did not have difficulty on long sentences. For comparison, a phrase-based SMT system achieves a BLEU score of 33.3 on the same dataset. When we used the LSTM to rerank the 1000 hypotheses produced by the aforementioned SMT system, its BLEU score increases to 36.5, which is close to the previous state of the art.此外,LSTM在长句上没有困难。相比之下,基于短语的SMT系统在相同数据集上的BLEU得分为33.3。当我们使用LSTM对上述SMT系统产生的1000个假设进行重新排序时,其BLEU分数增加到36.5,接近之前的技术水平。The LSTM also learned sensible phrase and sentence representations that are sensitive to word order and are relatively invariant to the active and the passive voice. Finally, we found that reversing the order of the words in all source sentences (but not target sentences) improved the LSTM’s performance markedly, because doing so introduced many short term dependencies between the source and the target sentence which made the optimization problem easier.LSTM还学习了对语序敏感、对主动语态和被动语态相对不敏感的短语和句子表征。最后,我们发现反转所有源句子(但不是目标句子)中的单词顺序可以显着提高 LSTM 的性能,因为这样做会在源句子和目标句子之间引入许多短期依赖关系,从而使优化问题变得更容易。
二、介绍
seq2seq干了什么事情?seq2seq模型的输入可以是一个(单词、字母或者图像特征)序列,输出是另外一个(单词、字母或者图像特征)序列。一个训练好的seq2seq模型如下图所示:
如下图所示,以NLP中的机器翻译任务为例,序列指的是一连串的单词,输出也是一连串单词。
三、seq2seq原理
将上图中蓝色的seq2seq模型进行拆解,如下图所示:seq2seq模型由编码器(Encoder)和解码器(Decoder)组成。绿色的编码器会处理输入序列中的每个元素并获得输入信息,这些信息会被转换成为一个黄色的向量(称为context向量)。当我们处理完整个输入序列后,编码器把 context向量 发送给紫色的解码器,解码器通过context向量中的信息,逐个元素输出新的序列。
在机器翻译任务中,seq2seq模型实现翻译的过程如下图所示。seq2seq模型中的编码器和解码器一般采用的是循环神经网络RNN,编码器将输入的法语单词序列编码成context向量(在绿色encoder和紫色decoder中间出现),然后解码器根据context向量解码出英语单词序列。关于循环神经网络,建议阅读 Luis Serrano写的循环神经网络精彩介绍.
我们来看一下黄色的context向量是什么?本质上是一组浮点数。而这个context的数组长度是基于编码器RNN的隐藏层神经元数量的。下图展示了长度为4的context向量,但在实际应用中,context向量的长度是自定义的,比如可能是256,512或者1024。
那么RNN是如何具体地处理输入序列的呢?
1、假设序列输入是一个句子,这个句子可以由n个词表示:sentence={}。
2、RNN首先将句子中的每一个词映射成为一个向量得到一个向量序列:X={},每个单词映射得到的向量通常又叫做:word enbedding。
3、然后再处理t∈[1,n]个时间步的序列输入时,RNN网络的输入和输出可以表示为:
输入:RNN在时间步t的输入之一为单词经过映射得到的向量。
输入:RNN另一个输入为上一个时间步t-1得到的hidden state向量,同样是一个向量。
输出:RNN在时间步t的输出为 hideen tate向量。
图注:word embedding例子。我们在处理单词之前,需要将单词映射成为向量,通常使用 word embedding 算法来完成。一般来说,我们可以使用提前训练好的 word embeddings,或者在自有的数据集上训练word embedding。为了简单起见,上图展示的word embedding维度是4。上图左边每个单词经过word embedding算法之后得到中间一个对应的4维的向量。
让我们来进一步可视化一下基于RNN的seq2seq模型中的编码器在第1个时间步是如何工作:
图注:如图所示,RNN在第2个时间步,采用第1个时间步得到hidden state#10(隐藏层状态)和第2个时间步的输入向量input#1,来得到新的输出hidden state#1。
看下面的动态图,让我们详细观察一下编码器如何在每个时间步得到hidden sate,并将最终的hidden state传输给解码器,解码器根据编码器所给予的最后一个hidden state信息解码处输出序列。注意,最后一个 hidden state实际上是我们上文提到的context向量。
图注:编码器逐步得到hidden state并传输最后一个hidden state给解码器。接着,结合编码器处理输入序列,一起来看下解码器如何一步步得到输出序列。与编码器类似,解码器在每个时间步也会得到 hidden state(隐藏层状态),而且也需要把 hidden state(隐藏层状态)从一个时间步传递到下一个时间步。
图注:编码器首先按照时间步依次编码每个法语单词,最终将最后一个hidden state也就是context向量传递给解码器,解码器根据context向量逐步解码得到英文输出。
四、Attention的引入
基于RNN的seq2seq模型编码器所有信息都编码到了一个context向量中,便是这类模型的瓶颈。一方面单个向量很难包含所有文本序列的信息,另一方面RNN递归地编码文本序列使得模型在处理长文本时面临非常大的挑战(比如RNN处理到第500个单词的时候,很难再包含1-499个单词中的所有信息了)。
针对上述问题,提出了一种叫做注意力attetion的技术。通过attention技术,seq2seq模型极大地提高了机器翻译的质量。归其原因是:attention注意力机制,使得seq2seq模型可以有区分度、有重点地关注输入序列。
图注:在第 7 个时间步,注意力机制使得解码器在产生英语翻译student英文翻译之前,可以将注意力集中在法语输入序列的:étudiant。
让我们继续来理解带有注意力的seq2seq模型:一个注意力模型与经典的seq2seq模型主要有2点不同:
1、首先,编码器会把更多的数据传递给解码器。编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而不是只传递最后一个 hidden state(隐藏层状态),如下面的动态图所示:
2、注意力模型的解码器在产生输出之前,做了一个额外的attention处理。如下图所示,具体为:
a.由于编码器中每个 hidden state(隐藏层状态)都对应到输入句子中一个单词,那么解码器要查看所有接收到的编码器的 hidden state(隐藏层状态)。
b.给每个 hidden state(隐藏层状态)计算出一个分数(我们先忽略这个分数的计算过程)。
c.所有hidden state(隐藏层状态)的分数经过softmax进行归一化。
d.将每个 hidden state(隐藏层状态)乘以所对应的分数,从而能够让高分对应的 hidden state(隐藏层状态)会被放大,而低分对应的 hidden state(隐藏层状态)会被缩小。
e.将所有hidden state根据对应分数进行加权求和,得到对应时间步的context向量 。
所以,attention可以简单理解为:一种有效的加权求和技术,其艺术在于如何获得权重。
现在,让我们把所有内容都融合到下面的图中,来看看结合注意力的seq2seq模型解码器全流程,动态图展示的是第4个时间步:
1、注意力模型的解码器 RNN 的输入包括:一个word embedding 向量,和一个初始化好的解码器 hidden state,图中是。
2、RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state,图中为h4。
3、注意力的步骤:我们使用编码器的所有 hidden state向量和 h4 向量来计算这个时间步的context向量(C4)。
4、再把 h4 和 C4 拼接起来,得到一个橙色向量。
5、我们把这个橙色向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。
6、根据前馈神经网络的输出向量得到输出单词:假设输出序列可能的单词有N个,那么这个前馈神经网络的输出向量通常是N维的,每个维度的下标对应一个输出单词,每个维度的数值对应的是该单词的输出概率。
7、在下一个时间步重复1-6步骤。
图注:解码器结合attention全过程,下面是动态图
最后,我们可视化一下注意力机制,看看在解码器在每个时间步关注了输入序列的哪些部分:
需要注意的是:注意力模型不是无意识地把输出的第一个单词对应到输入的第一个单词,它是在训练阶段学习到如何对两种语言的单词进行对应(在本文的例子中,是法语和英语)。
下图还展示了注意力机制的准确程度(图片来自于上面提到的论文):