Seq2Seq

sequence to sequence的端到端模型在诸如机器翻译、自动摘要等方向都取得了不错的效果,其基本思想是通过一个encoder模型将输入序列映射到某个context vector中,然后将该context vector进行decoder得到目标序列,具体如下图所示[1]:

这里就涉及到几个问题,这些问题也是seq2seq模型的诸多改进的方向的考量之一。

  • encoder和decoder的选取
  • encoder阶段context vector的生成
  • decoder阶段context vector的输入

首先看第一个问题-encoder和decoder的选取。通常而言,seq2seq处理的都是变长序列问题,encoder一般选取的是基于rnn的模型(lstm/gru/bi-lstm/bi-gru), 不过也可以支持cnn, facebook提出了基于cnn的encoder-decoder架构[2], 将字符所在的位置的embedding也加入到了字符的embedding表示之中。

其次,context vector的生成一般是根据encoder阶段各个时刻的隐状态得到,也即
$$
\begin{align}
C = q(h_1, h_2, …, h_T)
\end{align}
$$
对于C的生成一般有如下几种形式:

  • $C=h_T$;
  • $C=tanh(h_T*V)$, 不过一般V取单位矩阵,也即$C=tanh(h_T)$
  • $C=q(h_1, h_2, …, h_T)$

其中,第三种就是seq2seq的attention机制需要做的事情了,仅仅依靠encoder最后时刻$h_T$得到的context vector丢失了过多的信息,无法很好的在decoder阶段捕捉input seq和out seq之间的对应关系,通过加以attention机制,使得在生成output sequence的时候能够尽量利用上和当前out seq元素关系较为密切的input seq的元素的特征~ 这里简单的介绍较为常用的attention model.  decoder阶段每个时刻的context vector均不一样,反映的是在生成output sequence的元素的时候,对input sequence中元素的关注点也不一样,比如对「你好中国」进行翻译的时候,利用seq2seq生成的china肯定更依赖与「中国」,所以中国这个时刻的隐含状态输出对应的权重应该更高点。t时刻的context vector $C_t$为:
$$
\begin{align}
C_t = \sum_{j=1}h_j*a_{t,j}
\end{align}
$$
这个$a_{t,j}$反映的就是decoder阶段t时刻的输出$s_{t-1}$对encoder阶段j时刻的依赖程度,$a_{t,j}=softmax(e_{t,j})$. 其中,$e_{t,j}$为输入为$s_{t-1}$和$h_j$的全连接层输出, 也即
$$
e_{t,j} = tanh(s_{t-1}*W + h_j*U) * V
$$
其中, W、U、V均为attention model的参数。

最后就是怎么用$c$的问题了,如果加了attention,一般每个decoder的输入都会有不同的context,如果没有加attention, c即可以只作为起始时刻的输入,也可以作为之后每个时刻的输入。另外对于decoder而言,在training阶段下一个时刻直接用的label作为输入,而在预测阶段则是用的前一时刻的预测输出作为输入~

参考:

  1. http://blog.csdn.net/u014595019/article/details/52826423
  2. https://arxiv.org/abs/1705.03122

Leave a Reply

Your email address will not be published. Required fields are marked *