當前位置:
首頁 > 科技 > Tensorflow 好差勁!

Tensorflow 好差勁!

作者簡介:Nico Jimenez開發了Mathpix(https://mathpix.com),這種圖形處理API每個月為全球各地的數百萬用戶處理 2000萬個圖像。他還開發了Losswise(https://losswise.com),他在Mathpix公司開發的這種內部機器學習監控和分析解決方案已向公眾開放。

引言

每隔幾個月,我往谷歌搜索引擎輸入下列查詢:「Tensorflow sucks」(Tensorflow好差勁了)或「f*** Tensorflow」(讓Tensorflow滾蛋),希望可以在互聯網上找到持相同觀點的人。遺憾的是,雖然Tensorflow問世至今已有大概兩年,我還是找不到一篇讓我完全滿意的抨擊Tensorflow的文章。

雖然我想可能自己問錯了搜索引擎,不過我認為這方面有一個不同的心理因素在作祟:嫉妒谷歌。「極度嫉妒谷歌」這個現象歸因於全球各地的工程師們心裡都有這一系列假設:

在谷歌工作的人比你自己更聰明、更能幹;

如果你學習Tensorflow,也許能在谷歌找到一份深度學習工作!

如果你那家平庸的初創公司使用Tensorflow,你的博客誇讚其優點和好處,也許谷歌會想要收購;

如果你沒有「搞明白」Tensorflow缺乏直觀的設計,那也是由於你太笨了;

姑且把上述這些假設擱在一邊,不妨客觀地分析一下Tensorflow。

Tensorflow橫空出世時,谷歌向我們承諾:可以從此告別設計糟糕或維護糟糕的深度學習框架這個無休止的噩夢(比如https://github.com/BVLC/caffe/issues)。我們得到的是相當於Java的深度學習框架(編寫一次,即可到處運行),可是用起來不太好玩,它是一種純粹聲明式的模式,這令人討厭。

問題在哪裡出了岔子?由於試圖構建一種滿足所有人的要求的工具,谷歌似乎開發出了一種滿足所有人的要求方面表現一般般的產品。

對於研究人員而言,Tensorflow學習和使用起來都很難。研究工作注重的是靈活性,而缺乏靈活性恰恰是Tensorflow根深蒂固的弊端。

想要提取神經網路中間層(intermediate layer)的值?你需要定義一個圖,然後用作為字典來傳遞的數據來執行該圖,另外還不能忘了添加中間層作為該圖的輸出,否則你就無法檢索它們的值。這很麻煩,不過好歹可以實現。

想要有條件地執行層,比如只要句末(EOS)標記生成、就會停止的循環神經網路(RNN)?等到你完成了這一步,人家使用Pytorch的早開辦第三家AI初創公司了。

對於像我本人這樣的機器學習從業人員而言,Tensorflow也不是一種很好的選擇。這種框架具有聲明性,因而調試起來困難得多。能夠在Android或iOS上運行模型的優點似乎很棒,不過你看一下框架二進位文件有多龐大(20MB+),或者看一下幾乎不存在的C++說明文檔,或者你想要完成任何一種有條件的網路執行(這在像移動這些資源很少的環境下超有用),就會發現Tensorflow只是看起來很美。

與其他框架之間的比較

誠然,Tensorflow的開發人員是深度學習界的超級明星。然而,Tensorflow的元老級開發者賈揚清(Yangqing Jia)最近卻離開了谷歌,加入了Facebook。他在Facebook搞的Caffe2項目正悄然受到追捧:(https://github.com/caffe2/caffe2/graphs/contributors和https://github.com/caffe2/caffe2/issues)。不像Tensorflow,Caffe2讓用戶可以在一個數據上執行層,只用一行代碼。這頗具革命性!

此外,Pytorch在頂尖AI研究人員當中的人氣正迅速躥升起來。雖然Torch用戶在調理編寫Lua代碼以處理簡單的字元串操作引起的重複性過度勞損(RSI)損傷,但根本沒有大批轉向Tensorflow,他們在改用Pytorch。看來,Tensorflow對頂尖的AI實驗室來說根本就不夠好。谷歌,不好意思,恕我如此直言。

在我看來最值得關注的問題是,為何谷歌為Tensorflow選擇了一種純粹聲明性的模式,儘管這種方法存在明顯的缺點。是否谷歌覺得:將所有的計算封裝在單單一個計算圖中會簡化在其Tensorflow處理單元(TPU)上執行模型,從而可以從英偉達手中奪取從雲託管基於深度學習的應用系統賺取的數百萬美元?這很難說。總的來說,Tensorflow並不像是一種謀取共同利益的純粹的開源項目。與谷歌其他出色的開源項目(比如Protobuf、Golang和Kubernetes)相比,Tensorflow相差了不止一點點。

雖然聲明性模式對用戶界面(UI)編程來說很好,但是許多理由表明它對於深度學習來說卻是個有問題的選擇。

以React Javascript庫為例,這是如今互動式Web應用程序的標準選擇。在React中,數據如何流經應用程序方面的複雜性隱藏了起來、不讓開發人員看見,這有其必要性,因為Javascript執行的速度通常比DOM的更新快幾個數量級。React開發人員可不想為狀態如何傳播方面的底層細節而操心,只要最終用戶體驗「夠好」就行。

另一方面,在深度學習中,單單一個層實際上會執行數十億個FLOP!而深度學習研究人員非常關注計算如何執行方面的底層細節,還想要精細化控制,因為他們在不斷逼近現有技術的極限(比如動態網路方面),想要易於獲取中間結果。

一個具體的例子

不妨看一下這個簡單例子:訓練一個模型,將輸入乘以3。

首先,不妨看一下Tensorflow例子:

現在看一下實現同樣功能的Pytorch例子:

雖然Pytorch例子少一行代碼,但操作起來卻要明晰得多,而且在下面這個訓練循環(training loop)裡面,語法遵循實際學習過程要嚴謹得多。

向前傳遞輸入

生成損失函數

計算梯度

反向傳播

而在Tensorflow中,核心操作是神奇的sess.run調用。

為何你想要編寫更多行代碼,開發出到頭來理解和維護起來更困難的系統?客觀地說,Pytorch的介面比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

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

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


請您繼續閱讀更多來自 雲頭條 的精彩文章:

Gartner 2018 年十大戰略性技術趨勢:AI 成為基礎、從雲到邊緣等
傳蘋果iCloud基礎架構主管離職:或加大自主研發力度
數據中心服務商商 Switch 上市融資 5.3 億美元,市值超 56 億美元
科研人員擊敗 Rowhammer 保護機制!
Facebook 會使用 Apollo 取代 MySQL 資料庫嗎?

TAG:雲頭條 |