Dynamic seq2seq in tensorflow

v1.0 tensorflow渐渐废弃了老的非dynamicseq2seq接口,已经放到 tf.contrib.legacy_seq2seq目录下面。

tf.contrib.seq2seq下面的实现都是dynamic seq2seq接口。

按照googlerd说法下个月将会给出更加完善的接口和实现。

当前版本也可以使用这里尝试分析一下现有dynamic seq2seq的代码。

   

首先核心函数是seq2seq.py下面的 dynamic_rnn_decoder

   

这里首先看下dynamic的概念,即不需要确定的输入长度,以及batch 大小, 都可以动态。

但是注意首先每个batch对应所有样本的输入长度还是需要一样的 作为dense数据 否则 不可处理

   

这也就是说如果你需要特别在意速度的话,即使使用dyanmic 也可能还需要使用bucket来聚集相似长度的

输入样本作为一个batch 加速训练。

不过一般意义上不用的话,代码比较简单,加上dyanmicseq2seq 性能也可以接受,同时好处是每个batch

的样本可以完全随机。

   

dynamic_rnn_decoder核心是内部调用raw_rnn来实现迭代过程,这里的dynamic最主要体现在输入的

decoder_fn函数上面。

   

这个函数允许计算提前终止(early stop) 也就是说 假如你做inference,不用dynamic seq2seq

你一般的做法是指定一个 最大decode长度 比如20, 那么对应所有样本其实都需要decode走完20

Step 哪怕所有的样本对应输出序列长度都不大于10

   

而有了dynamic decode 当一个batch 所有的样本decode到达 类似<END>结束符之后,整个decode过程就

结束了。

   

但是注意这里仍然是以batch为基础的,也就是说有一个样本比如decode 2次就到达结束符,但是由于

组内其它样本没有结束,仍然需要所有样本继续向后解析,也就是说batch size越大,结束的可能越晚。

   

dynamic_rnn_decodertraininference两种模式,不过如果不使用attention,个人感觉train的时候直接

dynamic_rnn接口就可以了。

   

最后按照刚刚master的代码,seq2seq提供了decoder.py以及sampling_decoder.py等相关的示例,

这个接口更加简洁清晰,也就是说不再用context_state来记录用户其余的状态,而是用户自定义

output的结构 将其它信息也直接写入output

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmimmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

posted @ 2017-01-25 05:38  阁子  阅读(4195)  评论(0编辑  收藏  举报