现在很多研究的NLP问题都可以转换成一个Sequence to Sequence模型来解决,比如说机器翻译,智能问答,语音识别等。
Sequence to Sequence模型由一个encoder和一个decoder组成,encoder完成编码工作,将不同的输入编码成一个定长的向量,decoder则完成解码工作,对编码器的结果进行解码输出,例如在中英文翻译中,首先编码器将中文编码成一个向量表示,接着解码器把该向量解码成一个英文表示 ,完成翻译过程。
但是序列模型会有两个问题,不管输入有多长,它都会把它编码成一个固定长度的向量,若句子比较长,则编码结果会可能会损失较多想信息,这将不利于接下来的解码工作;其次在解码的时候,每个时刻的输出在解码过程中用到的上下文向量是相同的,没有做区分,这也会给解码带来问题。为了解决这样的问题,会给模型加入注意力机制(attention mechanism)。
RNN Encoder-Decoder
首先讲一下简单的RNN 编码解码器框架,给定输入x =( x1,x2,...,xT ),编码器会利用RNN将其转换成一个向量c:
ht=f(xt,ht−1)
c=q(h1,h2,...,hT)
其中, ht 是t时刻的隐状态,c是由整个序列得到的向量表示。
接下来,解码器通过语言模型生产一个新的序列:
p(y)=∏t=1Tp(yt|y1,y