序列到序列网络
序列到序列网络(Sequence to Sequence network),也叫做seq2seq网络, 又或者是编码器解码器网络(Encoder Decoder network), 是一个由两个称为编码器解码器的RNN组成的模型。在这里进行介绍的作用是确定变量的名称,为接下来讲注意力机制做铺垫。
自编码器也是seq2seq模型中的一种。在自编码器中,解码器的工作是将编码器产生的向量还原成为原序列。经过压缩之后不可避免的会出现信息的损失,我们需要尽量将这种损失降低(方法是设置合理的中间向量大小和经过多次训练迭代的编码-解码器)。相关理论本身在这里讲得不是很清楚,有兴趣了解更多的同学可以移步数学专题中的信息论。
编码器
把一个不定长的输入序列变换成一个定长的背景变量 c c c,并在该背景变量中编码输入序列信息。编码器可以使用循环神经网络。
在时间步 t t t,循环神经网络将输入的特征向量 x t x_t xt和上个时间步的隐藏状态 h t − 1 h_{t−1} ht−1变换为当前时间步的隐藏状态 h t h_t ht。
h t = f ( x t , h t − 1 ) h_t = f(x_t, h_{t-1}) ht=f(xt,ht−1)
接下来,编码器通过自定义函数 q q q将各个时间步的隐藏状态变换为背景变量
c = q ( h 1 , . . . , h T ) c=q(h_1,...,h_T) c=q(h1,...,hT)
例如,我们可以将背景变量设置成为输入序列最终时间步的隐藏状态 h T h_T hT。
以上描述的编码器是一个单向的循环神经网络,每个时间步的隐藏状态只取决于该时间步及之前的输入子序列。我们也可以使用双向循环神经网络构造编码器。在这种情况下,编码器每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列(包括当前时间步的输入),并编码了整个序列的信息。
解码器
对每个时间步 t ′ t′ t′,解码器输出 y t ′ y_{t′} yt′的条件概率将基于之前的输出序列 y 1 , . . . , y t ′ − 1 y_1,...,y_{t′−1} y1,...,yt′−1和背景变量 c c c(所有时间步共用),即 P ( y t ′ ∣ y 1 , . . . , y t ′ − 1 , c ) P(y_{t′}∣y_1,...,y_{t′−1},c) P(yt′∣y1,...,yt′−1,c)。同时还要考虑上一时间步的隐藏状态 s t ′ − 1 s_{t′−1} st′−1。
s t ′ = g ( y t ′ − 1 , c , s t ′ − 1 ) s_{t'} = g(y_{t′−1}, c, s_{t'-1}) st′=g(yt′−1