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 例子里了。
相关文章推荐
- DemoSpinner有关多个Spinner的例子,网上找的都不是 想要的,可以网络获取数据添加的Spinner
- Command不是也可以对数据库进行insert,update,delete操作吗,为什么还需要DataAdapter。我知道DataAdapter可以用来想AataSet中填充数据,Command不可以吗?
- 变量(查询到的数据)不存在:not available,但是需要用到,用try{}catch(e){}来处理
- (编程解决)List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个有什么区别?
- 有关对字符串的处理,需要用到List时的简化写法
- 如果结果中需要记录某一个数据 可以用到data point
- List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个有什么区别
- 为什么用卷积滤波,而不是很简单的在频率领域内进行数据的频率处理
- 大数据处理需要用到的编程语言开发语言
- 大数据处理需要用到的九种编程语言
- 精灵哈希算法 (Elf Hash) 可以把任意长度的数据转换成int数字
- (编程解决)List和Hashtable都是可以存储数据的,可为什么有时选择List,有时需要Hashtable,这两个有什么区别?
- 为什么需要对数据“加盐”处理
- 为什么需要专门出现GPU来处理图形工作,CPU为啥不可以?
- 不需要用vuex,只需要用到axios一样可以实现登录拦截,想后台请求数据
- 为什么用卷积滤波,而不是非常easy的在频率领域内进行数据的频率处理
- 为什么每个请求都要有用户名密码呢,那不是每次都要查询一下了,token,表示这个用户已经验证通过了,在token有效期内,只需要判断token是否有效就可以了
- CSS解析器,如果需要在程序中处理CSS,则可以用到。
- 我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令
- 【转】为什么很多看起来不是很复杂的网站,比如 Facebook、淘宝,都需要大量顶尖高手来开发?