觀點 | TensorFlow sucks,有人吐槽TensorFlow晦澀難用

 2017-10-09 12:49:00.0

原標題:觀點 | TensorFlow sucks,有人吐槽TensorFlow晦澀難用

選自nicodjimenez

參與:李澤南、劉曉坤

作爲當今最流行的深度學習框架,TensorFlow 已經出現了兩年之久。儘管其背後有着谷歌這樣的科技巨頭支持,但它的很多缺點已經開始顯現。本文作者,創業公司 Mathpix 的首席執行官 Nicolas D. Jimenez 試圖向我們全面分析 TensorFlow 的缺點。

每隔幾月,我都會向谷歌的搜索框裏鍵入「TensorFlow sucks」或「f**k TensorFlow」,期待能在互聯網上找到和我志同道合的人。不幸的是,儘管 TensorFlow 已經出現了兩年之久,我們還是很難找到一篇能夠全面「冷靜評價」TensoFlow 的文章。

或許這是因爲我用了一個錯誤的搜索引擎?應該不是這樣,我認爲原因在於谷歌信仰。全球的工程師們或多或少都有一點對於谷歌的盲目崇拜,表現在於認爲:

  • 在谷歌工作的人比自己更聰明

  • 如果用好 TensorFlow,或許能在谷歌找到一個深度學習的工作(繼續做夢吧少年)

  • 如果你的創業公司使用的深度學習框架是 TensorFlow,而你的博客宣揚了它的優點,谷歌或許會考慮來收購你

  • 如果你 get 不到 TensorFlow 的優點,那你就是不懂事

但我們還是要客觀,讓我們拋棄以上假設,還原 TensorFlow 的真面目吧。

當 TensorFlow 剛剛出現時,它的開發者們承諾將會結束深度學習框架缺乏維護的陰暗時代(看看 https://github.com/BVLC/caffe/issues 吧)我們或許會得到一個像 Java 一樣的深度學習框架(寫出來就可以在任何地方使用),雖然不怎麼有趣,但有一個純粹的陳述範式。然而,事情好像並沒有這麼順利。

究竟哪裏出錯了?爲了構建一個能讓所有人都滿意的產品,谷歌似乎只做到了在所有方面都一般般的結果。

對於研究人員來說,TensorFlow 難以學習和使用。研究只關乎靈活性,而缺乏靈活性正是根植於 TensorFlow 的特性之一。

想要提取神經網絡中間層的數值?你需要定義一個圖,然後以字典的形式傳遞數據,同時不要忘了在圖的中間層添加輸出,否則你將無法獲得它的值。雖然這很麻煩,但還是可行的。

想要有條件地執行幾個層?比如讓 RNN 在句子末端(EOS)生成表徵時停止?到你學會使用 PyTorch 做這件事的時候,你可能已經身處第三家搖搖欲墜的創業公司了。對於像我這樣的機器學習從業者而言,TensorFlow 也並不是一個絕佳的選擇。框架的聲明特性使調試變得更加困難。能夠讓模型運行在安卓和 iOS 上的能力看起來很美好,但當你看到框架二進制文件的大小(20Mb 以上)後就不那麼想了。或許你會嘗試尋找那幾乎不存在的 C++說明文檔,或者嘗試加入任何類型的條件網絡執行——它們在移動端這種計算資源缺乏的情況下比較好用。

對比其它的框架

確實 TensorFlow 的開發者都是深度學習的超級巨星。然而,最爲出名且受人尊敬的 TensorFlow 的最初開發者賈揚清,離開了谷歌而加入了 Facebook,在那裏他的 Caffe2 項目正在快速推進。和 TensorFlow 不一樣,Caffe2 允許用戶只用一行代碼就能爲數據創建一個層,非常激進的革新!

此外,Pytorch 在頂級的 AI 研究者中推廣的很迅速。雖然 Torch 用戶需要編寫 Lua 代碼執行簡單的字符串運算以防止 RSI 損傷,不過並沒有完全拋棄 TensorFlow,只是轉換成了 PyTorch。看來 TensorFlow 對於頂級的 AI 實驗室來說只是不夠好而已。抱歉了,谷歌。

我最感興趣的是爲什麼谷歌會在 TensorFlow 中選擇完全陳述範式而不顧這種方法的明顯弊端。他們是不是覺得把所有的計算壓縮進單一的計算圖會簡化在 TPU 上執行模型,從而可以省下英偉達提供的雲端驅動深度學習芯片的幾百萬美元的費用嗎?很難說。總之,對公衆來說,TensorFlow 並不像是一個完全開源的項目,我很同意。雖然設計精巧,但比起谷歌那些漂亮的的開源項目如 Protobuf,Golang 和 Kubernetes,TensorFlow 實在差的太遠。

雖然陳述範式對於 UI 編程很有用,但是對於深度學習而言,這個選擇造成了困難,有這麼幾個原因。

以 React Java 庫爲例,這是今天交互網頁應用的標準選擇。在 React 中,數據在應用中流通的複雜過程對開發者來說是不可見的,這很合理,因爲 Java 的執行通常比 DOM 的更新快得多。只要終端用戶體驗足夠好,React 的開發者並不關心狀態傳播的機制。

另一方面,在深度學習中,一個層就需要用到幾百萬 FLOP。而且深度學習研究者都很關心計算過程的機制,並希望能很好的控制過程,因爲他們隨時都在擴大可能性的邊緣(比如動態網絡),並希望能很容易獲取中間結果。

一個實例

我們看看這個簡單的例子,通過訓練模型使其將輸入乘以 3。

首先看看 TensorFlow 的例子:

  1. importtensorflow as tf

  2. importnumpy as np

  3. X =tf.placeholder("float")

  4. Y =tf.placeholder("float")

  5. W =tf.Variable(np.random.random(),name="weight")

  6. pred =tf.multiply(X,W)

  7. cost =tf.reduce_sum(tf.pow(pred-Y,2))

  8. optimizer =tf.train.GradientDescentOptimizer(0.01).minimize(cost)

  9. init =tf.global_variables_initializer()

  10. withtf.Session()as sess:

  11. sess.run(init)

  12. fort in range(10000):

  13. x =np.array(np.random.random()).reshape((1,1,1,1))

  14. y =x *3

  15. (_,c)=sess.run([optimizer,cost],feed_dict={X:x,Y:y})

  16. print c

接下來看看 Pytorch 的例子:

  1. importnumpy as np

  2. importtorch

  3. from torch.autograd importVariable

  4. model =torch.nn.Linear(1,1)

  5. loss_fn =torch.nn.MSELoss(size_average=False)

  6. optimizer =torch.optim.SGD(model.parameters(),lr=0.01)

  7. fort in range(10000):

  8. x =Variable(torch.from_numpy(np.random.random((1,1)).astype(np.float32)))

  9. y =x *3

  10. y_pred =model(x)

  11. loss =loss_fn(y_pred,y)

  12. optimizer.zero_grad()

  13. loss.backward()

  14. optimizer.step()

  15. print loss.data[0]

雖然 PyTorch 的例子比 TensorFlow 少一行代碼,但其中的計算過程要更加清晰易懂,訓練循環中的句法和真實的學習過程要匹配得多:

1. 輸入的前向傳遞

2. 生成損失

3. 計算梯度

4. 反向傳播

而在 TensorFlow 中核心的算子是像魔術一般呼叫 sess.run。

你真的想寫更多行,但是又很難理解和維護的代碼嗎?PyTorch 的接口從客觀上講比 TensorFlow 要好得多。

結論

通過 TensorFlow,谷歌成功創造了一個完整的深度學習框架,但它同時也太過難以使用,過於低級,不適用於快速進行原型設計;對於尖端研究和資源驅動的生產環境來說又過於高級。

老實說,當你意識到已經有六個開源的高級庫是建立在已經是高級庫的 TensorFlow 的基礎上——才能讓一切變得可用起來——這裏面的問題就不是一星半點了:

  • http://tflearn.org/

  • https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/slim

  • https://github.com/fchollet/keras

  • https://github.com/tensorflow/skflow

注意:我得承認 Tensorboard(TensorFlow 的監視工具)非常棒。但如果你你想找到一個完美的機器學習項目監控解決方案,其中包含深度模型對比特徵,你可以試試 Losswise(https://losswise.com/)。我開發它就是爲了讓我這樣的人能夠輕鬆解耦並追蹤使用所有庫的模型的表現,我也實現了 Tensorboard 不能提供的很多有用特性。

原文鏈接:http://nicodjimenez.github.io/2017/10/08/tensorflow.html

本文爲機器之心編譯,轉載請聯繫本公衆號獲得授權。

責任編輯:

文章來源:機器之心