tensorflow中的seq2seq例子为什么需要bucket? 有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗

来源:互联网 发布:安全的聊天软件 编辑:程序博客网 时间:2024/06/16 00:26

tensorflow中的seq2seq例子为什么需要bucket?

有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗?
关注者
494
被浏览
21348

7 个回答

终于碰到一个是真心谈技术的问题,不容易啊。。。在热那亚机场等飞机,所以时间有限,答得比较简单,请勿怪罪。

的确,如题主所说,RNN在数学上是可以处理任意长度的数据的。我们在TensorFlow中使用bucket的原因主要是为了工程实现的效率:

(1)为什么不直接在graph的层面上支持可变长度的计算?在实现上,这需要使用一个将长度作为一个可变参数的while loop,而while loop的实现又涉及到其他一系列问题,比如说自动梯度计算(autodiff)等等,并不是一个很容易的事情。并且,如果要保证运行时的schedule的效率,还有一些不是那么简单地代码要改。

(2)即使可以支持while loop,还会有的一个问题是,我们在算minibatch,而每个minibatch里面不同的sequence有不同的长度。于是有两种解决方案:(a)对于每个minibatch,取最大的长度,然后跑那个最大长度。(b)实现一个sub-minibatch的计算方法,在每一个timestamp检测每个样本是否已经到达它的最大长度,如果超过就不计算。

(3)可以看到,(2a)是一个很浪费的算法,如果一个minibatch里面有一个很长的,大家都得跟着算到那个长度,所以不好。(2b)对于每个operator的要求都很高,做过数值优化的都知道,基本的计算比如说矩阵乘积,数据结构越简单越好,如果你要实现一个跳过某几行只算某几行的方法。。。good luck。

(4)于是,一个折衷的方案就是,对于sequence先做聚类,预设几个固定的长度bucket,然后每个sequence都放到它所属的bucket里面去,然后pad到固定的长度。这样一来,首先我们不需要折腾while loop了,每一个bucket都是一个固定的computation graph;其次,每一个sequence的pad都不是很多,对于计算资源的浪费很小;再次,这样的实现很简单,就是一个给长度聚类,对于framework的要求很低。

RNN的bucketing其实是一个很好的例子:在深度学习的算法实现上,数学是一部分,工程是另一部分。好的实现,都是在数学的优雅和工程的效率之间寻找一个最优折衷的过程。
发布于 2016-04-02
最新版本的 tensorflow 不需要使用 bucketing了,直接用 dynamic rnn 就好,它会根据每个batch自动计算最好的输出,不过要更定每个example的 sequence length。

当然,现在有人可以做到自动计算 sequence length 了,可参考 tensorlayer.layers

这个方法也用在google 最新开源的 image captioning 例子里了。

阅读全文
0 0
原创粉丝点击