sequence to sequence model小记

sequence to sequence model小记

首先介绍几篇比较重要的 seq2seq 相关的论文:

[1] Cho et al., 2014 . Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation

[2] Sutskever et al., 2014. Sequence to Sequence Learning with Neural Networks

[3] Bahdanau et al., 2014. Neural Machine Translation by Jointly Learning to Align and Translate

[4] Jean et. al., 2014. On Using Very Large Target Vocabulary for Neural Machine Translation

[5] Vinyals et. al., 2015. A Neural Conversational Model[J]. Computer Science


seq2seq 模型就像一个翻译模型,输入是一个序列(比如一个英文句子),输出也是一个序列(比如该英文句子所对应的法文翻译)。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。

其应用场景如其名字一样,对于序列的翻译问题例如:

  • 机器翻译
  • 自动摘要
  • 标题生成

等等序列到序列的转换问题都非常的fit。

第一种seq2seq:

第一次提出seq2seq应该是在论文[1](在本文中他还提出了rnn的变体,GRU结构单元代替原始的RNN单元)中,他采取了以下结构:

其中 Encoder 部分应该是非常容易理解的,就是一个RNNCell(RNN ,GRU,LSTM 等) 结构。每个 timestep, 我们向 Encoder 中输入一个字/词(一般是表示这个字/词的一个实数向量),直到我们输入这个句子的最后一个字/词 XT ,然后输出整个句子的语义向量 c(一般情况下, c=hXT , XT 是最后一个输入)因为 RNN 的特点就是把前面每一步的输入信息都考虑进来了,所以理论上这个 c 就能够把整个句子的信息都包含了,我们可以把 c 当成这个句子的一个语义表示,也就是一个句向量。在 Decoder 中,我们根据 Encoder 得到的句向量 c, 一步一步地把蕴含在其中的信息分析出来。

在decoder中,每个时刻的ht在论文中由以下公式得到:

需要注意的是在训练阶段yt-1是真实label,而不是上一时刻的预测值。测试阶段是上一时刻的预测值,可以通过beam search(见附录)来优化解码。

但是在实际训练过程中,label是否使用真实数据2种方式,可以交替进行,即一种是把标准答案作为decoder的输入,还有一种是吧decoder上一次的输出的结果作为输入,因为如果完全使用标准答案,会导致收敛的过快,导致测试的时候产生不稳定性。

好了既然我们得到了h<t>,那我们就可以根据ht,yt-1以及encoder的输入c得到这一时刻的输出yt的条件概率,定义为:

这里有两个函数 f 和 g , 一般来说, f 函数结构应该是一个 RNNCell 结构或者类似的结构(论文[1]原文中用的是 GRU);g 函数一般是 softmax (或者是论文 [4] 中提出的 sampled_softmax 函数)。具体实现的时候是,decoder先输入一个开始符号y0,例如start一般写成SOS(start of seq),然后Decoder 根据 h<0>,y0,c ,就能够计算出 y1 的概率分布了,同理,根据 h<1>,y1,c 可以计算y2 的概率分布…以此类推直到预测到结束的特殊标志 <EOS>,才结束预测。

第二种seq2seq:

在论文[2] 中,google机器翻译团队使用了encoder-decoder模型的变体,其模型结构如下:

我们可以看到,相比于上一个网络,该结构encoder的输出只作用了一次,也就是作为decoder的初始状态h,同时我们不使用SOS,只使用EOS,实际上没有什么本质区别,只是一词两用而已。这个结构简化了原始的模型。原文中使用的是lstm单元,其具体的结构图大概如下图所示,这是一个邮件回复系统:

在原文中,作者除了使用的是4层lstm之外还使用了一些小trick,就是把输入的语句倒过来,但是作者没有明确给出解释,只是大致猜测了一下,可能是由于这种结构会使翻译pair开头的单词距离接近,使语义能够更好地传递。

但是有一点应该是可以改进的,既然反向的效果好,可以在encoder的时候使用bilstm,然后把2个隐层的state输入到decoder。


附录:beam-search算法

首先beam-search只在test的时候有用。假设词表是a,b,c,beam_size=2

1.生成第一个词的时候,选择概率最大的两个词,设为a和c

2.生成第二个词的时候,把前一时刻的输入进去,得到第二时刻的a,b,c的概率,也就是当输入是a的时候我们得到的abc相当于aa,ab,ac的概率,输入是c的时候得到的是ca,cb,cc的概率,在这6个序列中,选择2个得分最高的,然后作为保留序列,例如选择了aa和cb

3.生成第三个词的时候,由前2个保留的序列,可见输入是a和b,也就是6个序列为,aaa,aab,aac和cba,cbb,cbc,再选2个最大的。

4.之后的重复这个过程,获得2个最佳序列



参考网页:

blog.csdn.net/jerr__y/a

编辑于 2017-07-08

文章被以下专栏收录