tensorflow中的seq2seq例子为什么需要bucket? 有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗
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 例子里了。
總結
以上是生活随笔為你收集整理的tensorflow中的seq2seq例子为什么需要bucket? 有关tensorflow 的sequence2sequence例子,为什么需要用到buckets,rnn不是可以处理任意长度的数据吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对seq2seq的一些个人理解
- 下一篇: 最新|TensorFlow开源的序列到序