深度学习方法(八):天然语言处理中的Encoder-Decoder模型,基本Sequence to Sequence模型

欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。技术交流QQ群:433250724,欢迎对算法、技术感兴趣的同窗加入。web


Encoder-Decoder(编码-解码)是深度学习中很是常见的一个模型框架,好比无监督算法的auto-encoding就是用编码-解码的结构设计并训练的;好比这两年比较热的image caption的应用,就是CNN-RNN的编码-解码框架;再好比神经网络机器翻译NMT模型,每每就是LSTM-LSTM的编码-解码框架。所以,准确的说,Encoder-Decoder并非一个具体的模型,而是一类框架。Encoder和Decoder部分能够是任意的文字,语音,图像,视频数据,模型能够采用CNN,RNN,BiRNN、LSTM、GRU等等。因此基于Encoder-Decoder,咱们能够设计出各类各样的应用算法。算法

Encoder-Decoder框架有一个最显著的特征就是它是一个End-to-End学习的算法;本文将以文本-文本的例子做为介绍,这样的模型每每用在机器翻译中,好比将法语翻译成英语。这样的模型也被叫作 Sequence to Sequence learning[1]。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将以前生成的固定向量再转化成输出序列。 以下图示意[3]:网络

Encoder-Decoder

这边为了方便阐述,选取了编码和解码都是RNN的组合。在RNN中,当前时刻隐层状态是由上一时刻的隐层状态和当前时刻的输入决定的,也就是 框架

ht=f(ht1,xt)

得到了各个时刻的隐层状态之后,再将信息汇总,生成最后的语义编码csvg

c=q({fh1,...,hTx})

q 表示某种非线性函数。在[1]中,做者采用LSTM网络做为Encoder网络,实际上在LSTM或者基本的RNN网络中,当前时刻计算完后是看不见前面时刻的隐层状态的了,因此就是用最后一个时刻的隐层状态做为语义编码c,即函数

c=hTx

解码过程咱们要根据给定的语义编码C和已经生成的输出序列y1,y2,…yt−1来预测下一个输出的单词yt,实际上就是把生成句子 y={y1,y2,yT} 的联合几率分解成按顺序的条件几率:学习

p(y)=t=1Tp(yt|{y1,y2,yt1},c)

而每个条件几率又能够写成是
p(yt|{y1,y2,yt1},c)=g(yt1,st,c)

其中 st 是输出RNN中的隐藏层,c表明以前提过的语义向量, yt1 表示上个时刻的输出。 g 表示一种非线性变换,每每就是指一种多层的函数,能够输出 yt 的几率(好比多层RNN后接softmax)。编码

因此,在文本序列的Encoder-Decoder模型中,本来RNN(LSTM)语言模型是要估计 p(y1,y2,yT|x1,x2,...,xT) ,给定一串输入x,获得一串输出y(不须要等长),可是由于Encoder-Decoder中间用语义编码c把先后两部分隔开了,因此输出句子y只须要和c相关便可。atom

这里写图片描述

只要端到端训练RNN(LSTM)网络就能够了,在每个句子末尾打上一个end-of-sentence symbol, EOS符号,用输入句子来预测输出句子。这样的模型就能够完成基本的英语-法语的翻译任务。spa

实际上这样的模型能作什么应用彻底取决于训练数据,若是用英语-法语对应句子做为输入输出训练,那就是英法翻译;若是用文章-摘要来训练那就是自动摘要机了。

基本的Encoder-Decoder模型很是经典,可是也有局限性。最大的局限性就在于编码和解码之间的惟一联系就是一个固定长度的语义向量c。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。可是这样作有两个弊端,一是语义向量没法彻底表示整个序列的信息,还有就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有得到输入序列足够的信息, 那么解码的准确度天然也就要打个折扣了[3]。

为了弥补上述基本Encoder-Decoder模型的局限性,近两年NLP领域提出Attention Model(注意力模型),典型的例子就是在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增长了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,而后根据关注的区域来产生下一个输出,以下图所示:

这里写图片描述

相比于以前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将全部输入信息都编码进一个固定长度的向量之中。相反,此时编码器须要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每个输出的时候,都可以作到充分利用输入序列携带的信息。并且这种方法在翻译任务中取得了很是不错的成果。很显然,每个输出单词在计算的时候,参考的语义编码向量c都是不同的,也就是它们的注意力焦点是不同的。

在下一篇将具体描述Attention Model的机制,是很是重要的一类模型,值得关注!

参考资料

[1] Sequence to Sequence Learning with Neural Networks, 2014, Google
[2] http://chuansong.me/n/344242742806
[3] http://blog.csdn.net/u014595019/article/details/52826423 [4] NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE