RNN Encoder-Decoder
Encoder-Decoder模型介绍
RNN Encoder-Decoder模型是一个sequence to sequence模型。该模型将输入序列映射到一个输出序列,而输入序列的长度和输出序列的长度可以是变化的。这种模型最常见的任务是机器翻译。从一种语言的句子(sequence)翻译成另一种语言的句子(sequence)。RNN Encoder-Decoder模型的想法很简单:
(1)一个编码器Encoder处理输入序列 X = ( x ( 1 ) , . . . , x ( n x ) ) \mathrm{X}=(\mathrm{x}^{(1)},...,\mathrm{x}^{(n_x)}) X=(x(1),...,x(nx)),将它们表示成一个固定长度的向量C,通常是Encoder(是一个RNN)最后一个时间步的输出;
(2)一个解码器Decoder以C作为输入,产生一个输出序列 Y = ( y ( 1 ) , . . . , y ( n y ) ) \mathrm{Y}=(\mathrm{y}^{(1)},...,\mathrm{y}^{(n_y)}) Y=(y(1),...,y(ny))。 n x n_x nx和 n y n_y ny是变化的。这是一个sequence-to-sequence结构,两个RNN联合训练,以最大化 log P ( y ( 1 ) , . . . , y ( n y ) ∣ x ( 1 ) , . . . , x ( n x ) ) \log\mathrm{P}(\mathrm{y}^{(1)},...,\mathrm{y}^{(n_{y})}|\mathrm{x}^{(1)},...,\mathrm{x}^{(n_{x})}) logP(y(1),...,y(ny)∣x(1),...,x(nx))。
(3)(x,y)是所有的训练集中的序列对。当然Encoder-Decoder结构也有其他形式,例如有的翻译模型,就是Encoder的状态输出,传递给Decoder。
该模型最初是在EMNLP2014上的论文《Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation》里提出。我们下面就以该论文中的RNN Encoder-Decoder模型为主(该论文还涉及到的其他部分就不介绍了)。注:该文有EMNLP版和预印版。预印版的附录部分对模型具体的实施做了详细的介绍。此处参见的是预印版。
论文链接:https://arxiv.org/pdf/1406.1078
一个典型的RNN Encoder-Decoder例子如图所示。
设输入是一个词的序列 X = ( x 1 , x 2 , . . . , x N ) \mathrm{X=(x_1,x_2,...,x_N)} X=(x1,x2,...,xN),输出序列是 Y = ( y 1 , y 2 , . . . , y M ) \mathrm{Y=(y_{1},y_{2},...,y_{M})} Y=(y1,y2,...,yM)。输入序列和输出序列的长度可以是变化的。
Encoder
编码器Encoder是一个RNN。
RNN隐层的状态按照这个公式计算: h t = f ( h t − 1 , x t ) \mathrm{h}_t=f(\mathrm{h}_{t-1},\mathrm{x}_t) ht=f(ht−1,xt)
是 f f f一个非线性激活函数。 f f f即可以是一个简单的elemente-wise logistic sigmoid函数,也可以很复杂,如一个LSTM unit。最后一个时间步的输出是一个向量c。它是对整个输入序列做的一个总结(summary)得到的结果,即编码结果。
原文自己设计了cell,如图所示。
给出具体的计算如下。喂入Encoder的是一个词的序列,每个词是一个词向量embedding(该文的实验部分使用了维度为500的词向量),用 e ( x i ) ∈ R 500 \mathrm{e}(\mathrm{x}_i)\in\mathrm{R}^{500} e(xi)∈R500表示。一个时间步的隐层包含1000个hidden unit(即隐层的输出是一个长度为1000维的向量)。时间步t的计算:
h t = z h t − 1 + ( 1 − z ) h ~ t \mathrm{h}_t=\mathbf{z}\mathrm{h}_{t-1}+(1-\mathbf{z})\tilde{\mathrm{h}}_t ht=zh