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

时间:2024-03-18 08:38:38

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


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)

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

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相关即可。

这里写图片描述

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

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

基本的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