您的位置:首页 > 产品设计 > UI/UE

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

2017-09-10 21:40 661 查看


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

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

关注者

494

被浏览

21348

1 条评论

分享

邀请回答

关注问题写回答

7 个回答

默认排序



知乎用户

深度学习(Deep Learning)机器学习 话题的优秀回答者

494 人赞同了该回答

终于碰到一个是真心谈技术的问题,不容易啊。。。在热那亚机场等飞机,所以时间有限,答得比较简单,请勿怪罪。
的确,如题主所说,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

494

25 条评论

分享

收藏

感谢





欧阳

google前端

14 人赞同了该回答

最新版本的 tensorflow 不需要使用 bucketing了,直接用 dynamic rnn 就好,它会根据每个batch自动计算最好的输出,不过要更定每个example的 sequence length。

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

这个方法也用在google 最新开源的 image captioning 例子里了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐