當前位置:
首頁 > 新聞 > TensorFlow Fold:用動態計算圖實現深度學習

TensorFlow Fold:用動態計算圖實現深度學習

TensorFlow Fold:用動態計算圖實現深度學習

論文鏈接:https://openreview.net/pdf?id=ryrGawqex


摘要

動態圖的批處理過程在計算機視覺、自然語言處理等領域中十分普遍。然而,由於每個批次要處理的數據的類型和形態(shape)具有多樣性,所以要想用現有的框架和庫在這種數據集上使用靜態圖進行批處理工作幾乎是不可能的。

在本研究(發表於ICLR 2017)中,來自谷歌的M. Looks等人開發了一個名為「動態批處理」的先進演算法,同時他們也相應地開發了一個基於TensorFlow的庫「TensorFlowFold」,它可以藉助動態計算圖來克服批處理帶來的困難。

這項技術利用傳統庫生成的靜態圖,模仿任意形狀的動態計算圖。此外,除了可以對不同的輸入圖進行批處理操作外,它還可以在單個輸入圖中對大量不同的標記(note)進行處理。

背景

神經網路深度學習領域(尤其是化學信息學與自然語言理解領域)很流行用數據流圖(data-flow graph)來進行計算。在大多數框架如TensorFlow中,圖是靜態的,這意味著批處理只能應用於一系列有著同樣類型和形狀的數據。然而,在最原始的數據集中,每個數據都有自己獨有的類型或形狀,這會使得神經網路無法用靜態圖對這些數據進行批處理。這個問題即是所謂的「動態圖計算」(Dynamic Computation Graphs,DCG)問題。DCG會使得批處理低效,tooling很差。 近兩年來,雖然進行情感分類與語義聯繫的研究者們在克服DCG問題上成功地取得了一些突破,然而,大量從業者仍然選擇避免在動態圖上直接進行批處理。因此,我們需要一種新的演算法來對動態圖進行批處理。


動態批處理

以下是進行動態批處理的幾個法則:

1. 輸入數據:

神經網路的輸入可以是一系列不同形態的數據,這也意味著,對於每個不同的數據而言,其計算圖也會不同。

2. 「operations」與「ops」概念辨析:

雖然看上去類似,但二者實為兩個不同的概念。

i)當我們說「ops」的時候,指的是單獨的運算過程,比如加法或矩陣乘法等,這些單獨的運算會以節點的形式呈現在圖中。

ii)當我們說「operations」的時候,指的是函數運算,如前饋層或LSTM單元。在圖中我們用子圖(sub-graph)的方式來表示它。

「動態批處理」處理的是operations,而不是ops。

3. operation的輸入與輸出:

我們將operation的輸入 (b, x1, x2, ..., xn)和輸出(b, y1, y2, ..., yn) 稱為張量數據類型,對此我們得事先進行規定,並在整個處理過程中不作改動,以便operation可以分別進行改變。

4. 處理的簡明原則:

每個不同的數據都有自己的計算圖,由循環圖中不同深度(depth)的各種opeartion組成。通過對同一個operation的所有數據進行計算(同一深度),動態批處理將會替代(重寫過程)先前的圖。

5. 重寫過程:

動態批處理將兩個不同的operation 「concat」(即concatenate,級聯)和「gather」插入圖中,以保證數據流可以很好地在已經批處理過的operation之間傳遞。

6. 在TensorFlow中實現:

d表示圖中每個節點的深度,同時它也是後面while-loop的迭代器。

一個operation所有的輸入都將在該operation執行之前由"tf.gather"收集,所有operation的輸出都將由"tf.concat"連結起來。最後,所有這些ops都會在一個while-loop中執行。

7. While-Loop:

每個變數都有兩個參數,t代表張量的數據類型,d代表深度。對於處理這些變數的operation來說,它們也需要分別由t和d兩個參數來定義。

while-loop沿著輸入圖的深度進行迭代。loop會先維持 [state variables for tensor type t] 和 [the output of tf.concat for type t & iteration d],然後將其饋送至 [the tf.gather at tensor type t and iteration d+1] 。

圖一表示深度為d的靜態數據流圖,它向我們展示了在單個迭代步驟中變數改變的情況。

TensorFlow Fold:用動態計算圖實現深度學習


實驗結果

在實驗中,我們開發了一個基於Tensorflow的庫「TensorFlow Fold」。

為了測試該庫的性能,我們進行了一項實驗。因為本來的TensorFlow不能處理不同形狀的圖,只能執行那些由動態批處理(用"dynamic"標記)和手動批處理(用"manual"標記)在一批同樣形狀的隨機圖上進行操作從而生成的模型。測試模擬出了最好的情況,所有的operation都可以一起進行批處理。

此外,我們還進行了第三個測試組的實驗(用"fully dynamic"標記),其中每個圖都有自己獨特的形狀。因此這一組沒有對照組。

從下表我們可以看到,對於同樣的性能來說,使用TensorFlow Fold進行動態批處理的損耗(時間消耗)明顯低於手動批處理。此外,批處理的速度與輸入圖的相似性之間完全沒有任何聯繫,這意味著動態批處理的性能極佳且穩定。

TensorFlow Fold:用動態計算圖實現深度學習

COMBINATOR

簡化例子:通過將一系列不同長度的詞連接成一個句子這樣的工作,他們引入了幾個可以直接在單個塊(或函數)上工作的連接器(combinator),combinator可以直接對元素(此處指輸入單詞)進行操作。

  • Map(f) 產生一個向量[f(x1), f(x2), ..., f(xn)]:將一個塊f應用到每一個輸入辭彙上,以便將辭彙嵌入進向量。
  • Fold(f, z) 產生 f(...g(g(z,x1), x2), ...xn):左鏈中按順序應用f在一個序列上運行RNN。
  • Reduce(g) 產生 g(Reduce([x1, x2, ...,xn]), Reduce( [x(n/2+1), ... xn] )):在平衡樹(即圖)上應用f,例如對辭彙進行最大池化。

動態批處理演算法的一個好處是,我們不需要填充單詞或截斷句子,使之達到相同長度,這給用戶提供了極大的便利。

Combinator庫旨在簡化用戶建模過程,同時它也展示了在更高度抽象化時使用動態批處理實現深度學習模型的好處。他們進行了一些實驗,將N-ary Tree-LSTM應用在情感分析中,實驗結果顯示在下表:

TensorFlow Fold:用動態計算圖實現深度學習

表中,標有「fine-grained accuracy」的一列衡量所有的樹,基於五種可能的標籤進行計算。第二列「binary accuracy」只衡量非中性情感的樹,並且基於消極vs積極分類。

從這些表我們可以總結出,相比之前的研究,他們在兩種方法上的準確率都更高。同時,動態批處理使用的代碼相比於其它方法也更為精簡。


討論

現有的深度學習庫大部分只支持對靜態數據流圖進行批處理。因此,幾乎不可能對動態計算圖進行有效的批計算。Bowman引入了SPINN架構,這種架構能夠對有不同拓撲結構的樹進行計算,但是只限於二值樹(binary tree)。

在這篇文章中,來自谷歌的M. Looks等人引入了一個新的演算法「動態批處理」,同時他們開發了基於Tensorflow的庫「TensorFlow Fold」,該庫既在理論上也在實驗中解決了DCG問題。

通過實驗,他們證明了其模型的有效性,而且比之前的研究更加有效。下一步,他們需要用更多的項目來驗證該演算法的有效性。我們希望該方法也可以用於其他類似的DCG問題,目前,該演算法的性能還有很大的提升空間。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

深度學習果實即將摘盡?11位大牛談AI的當下與未來

TAG:機器之心 |