TensorFlow:最棒的深度學習加速器
TensorFlow沒有改變世界。但是,它顯然是最棒的,也是現有最便利的深度學習庫。本文作者Zachary Chase Lipton是來自加利福尼亞大學計算機科學工程學院的博士生,接受生物醫學信息部的資助。他對機器學習的理論基礎和實際應用都非常感興趣。除了大學的研究工作,他還是微軟研發實驗室的實習生,亞馬遜的機器學習科學家,同時還是KDnuggets雜志的特約編輯,以及曼寧出版公司的簽約作者。
11月9日,谷歌宣布TensorFlow開源,這是一個在GPU上進行快速梯度式機器學習的巨大數據庫。人工智能領域最新的發展也讓這個網站散發出神奇的魅力。
一些文章推測TensorFlow會帶來一場人工智能革命。許多文章稱谷歌的這一舉動很大膽,因為Torch(由非死book人工智能實驗室的Ronan Collobert維護)已經提供了相似的深度學習開放資源,同時Yoshua Bengio教授的實驗室對Theano(深度學習領域的先驅,一個適合普通大眾的革命性軟件)已經進行了長期的維護開發。在Wired的一篇文章中,Cade Metz把TensorFlow描述成谷歌的「人工智能引擎」。這篇文章講的是進行線性代數和求導計算的開源數據庫,甚至標題也十分夸張。許多其他新聞報道中,卻對谷歌把代碼設為公開資源感到驚詫。
從更加技術的一方來看,從夸張的贊揚到潑冷水,各種反響都有。Soumith Chintala發布了一套應對所有競爭軟件包的標準,為人們提供了一種定量的評價,它顯示TensorFlow的首個版本落后于Torch和Caffe,特別在卷積神經網絡方面。正如Jeff Dean 和Oriol Vinyals在2015年的NIPS(Neural Information Processing Systems)會議上披露的,跑分讓人失望主要是因為英偉達(NVIDIA) 的CUDA深層神經網絡庫( CUDA Deep Neural Network library )底層版本和對其他工具底層調用的uDNN庫版上有區別,如果采取類似的cuDNN版本,則TensorFlow的跑分會是很有競爭力。
Matt Mayo,一名研究生、KDnuggests網站成員,寫過一篇著名文章,表達了對TensorFLow失望。文中隱晦提到,他本人并不是深度學習領域的專家,他的意見是,TensorFlow作為資源太簡單了,他哀嘆,分布式計算的大部分功能沒有發揮出來。2015年年初的蒙特利爾NIPS會議上,Dean和Vinyal也指出,TensorFlow應該具有一部分能夠支持大型分布式系統的功能。Mayo正確的指出,TensorFlow和Theano或Torch并沒有本質的區別。
對TensorFlow評價總體是失望的,但是,我對此并不茍同。就像特斯拉仍是另一個有頂、有方向盤、有四扇門、四個輪子的交通工具,TensorFLow是最好、最便捷的深度學習庫,更值得被揀選。TensorFlow, Torch和Theano 都不能代表人工智能的革命。它們都只是簡單的庫,用來建立和完善梯度式機器學習模型。
如果你以訓練模型是為生,那么,能力和可靠性之間的微妙區別仍然會對你的生活質量產生顯著影響。在這篇文章里,我將會解釋這些庫的功能,TensorFlow在哪些微妙而重要的方面看起來很贊,以及它被設計成開放資源的顯而易見的原因。我還會進一步解釋,為什么我們需要對媒體以及工業界過分狂熱的反應保持警醒。
為什么是快速數學?
深度學習通常意味著建立具有很多層的大規模的神經網絡。簡單地說,這些神經網絡都是簡單的函數,輸入X就會產生輸出Y。除了輸入X,函數還使用一系列參數(被稱為權重),其中包括標量值、向量以及最昂貴的矩陣和高階張量。
張量是向量的泛化以及更高維度的矩陣。如今流行的特殊函數包括數目龐大、昂貴、可計算的線性代數操作,以及矩陣乘積和卷積操作。在能夠訓練網絡之前,我們定義一個代價函數,常見的代價函數包括回歸問題的方差以及分類時候的交叉熵。為了達到網絡訓練的目的,我們需要連續的將多批的(many batches)新輸入投入網絡。當每批輸入被傳遞進去,我們根據我們所有的參數來求導得出代價函數值,從而更新整個網絡模型。
故而這里馬上就出現了一點明顯的問題,首先,較大的數字或者張量在一起相乘百萬次的處理過程盡管只是一個中等體量的數據集,整個模型代價也是非常大的。其次,手動對一個巨大而丑陋的函數求導本身是一個很痛苦而且耗時非常久的過程,數天甚至數周的求導過程還不如來進行新實驗設計。這就是我們為什么需要諸如Theano,Caffe,Torch,以及TensorFlow等庫的原因。在Theano事先給出的范式之下,我們可以很簡單的使用符號將所有基礎操作組成起來定義需要的函數,而導入的Theano庫知道如何進行求導。這樣的庫之后就可以接受符號函數并且在任何可以進行編譯的后端下執行編譯操作。這些操作可以用于CPU,GPU,或是異構計算的平臺。這樣的方便之處就在于首先任意一個庫你都可以只寫預測代碼實現前向傳播過程,同時框架替你找出如何求導的方法,也就是我們說的后向傳播過程。
為何選擇TensorFlow?
正如Matt在他的文章中準確指出的那樣,TensorFlow不是這個大家庭中的第一位成員,Theano在2010年發表,就在伯克利發布Caffe之后不久,Caffe是一個在C++框架下主要用于卷積神經網絡的高性能深度學習庫。在這個時期Torch,另一個相似的庫,使用自動分化并且有GPU編譯能力。更近一步,TensorFlow緊緊跟隨著Theano為先驅的界面問世了,TensorFlow的變量行為比較像Theano的共享變量。TensorFlow的占位符也和Theano的符號變量類似。所以究竟關鍵在哪兒?
首先,TensorFlow選擇了正確的語言,正合我意。我喜歡用Python編程。Python寫的很快并且具有可讀性。在之前提到過的所有的庫中,性能相關的代碼都是用C++或者Cuda來寫的,我則更愿意一門語言提供給我高級的接口方便我容易地進行剩下的工作的集成。使用Python,我能夠使用相同的語言來處理數據,訪問最強大的開源科學計算工具,并且建立一個網絡服務器來為我的工作做個小demo。如果我正在做除了深度許惡習之外絕大部分其他科學計算的工作,我大腦中第一時間迸現的就是尋找一個合適的Python庫,我一度很喜歡我曾經從Torch學到的一切并且對非死book的人工智能研究項目有很深入的了解,但是我對于學習Lua并不感興趣,并且不喜歡過度學習,比如讓學習一門編程語言占據了我絕大部分的研究時間。進一步說,我已經在使用Python的Numpy庫上投入了很多精力,使用一個python架構使我的工作變得簡單方便。這是只有Python和Theano擁有的屬性。(Caffe擁有Python綁定進行模型運行的接口,但是你不可以定義任意的新模型,同時在沒寫夠C++代碼的情況下也無法定義自己的神經網絡層次。)
第二,TensorFlow在多GPU系統上的運行更為順暢。雖然之前在Kdnuggets刊登的文章曾稱其他人工智能框架也可以在類似環境下運行,但這并不屬實。在多個設備間實現間歇或模型的并行工作是比較復雜的。而且,你用Theano工作時僅僅是在一個設備上進行編譯。在釋譯過程改變配置要么無法完成,至少并不是那么容易。相較之下,TensorFlow可以在各類型設備上保證代碼運算速度,并且不會發生重啟或退出的情況。
第三,TensorFlow的代碼編譯效率似乎非常令人欣喜。 如果你曾經癡癡地面對Theano框架好幾分鐘來等它完成代碼調整,你就知道我說的是什么了。
第四,TensorFlow社區發展的非常迅速并且異常活躍。我開始觀察GitHub上的項目并對此決定深感遺憾。世界上各個角落隨時都有不下十人在完善TensorFlow框架。相較之下,盡管我深愛Theano,但時常會被它的不確定性嚇到:搞不清是我的代碼出了Bug還是Theano的bug。舉個栗子。Theano有一個似乎廣為人知的bug,每當在調用Scan函數時在函數調用語句里做了生成隨機數的操作。函數返回的錯誤信息并不特別有用,我也沒辦法知道這個bug啥時能被解決掉,或者能不能被解決。
第五,TensorFlow的組件做的不是一般漂亮,可以生成非常強大的顯示網絡拓撲結構和性能的可視化圖。
簡而言之,Theano創造了一種流派。它之于深度學習的代碼編譯功能就像是福特汽車的發動機。然而TensorFlow的出現無疑像是汽車行業的特斯拉,自成一派。Theano有很多優點,欣慰的是TensorFlow也取其精華。我認為這非常寶貴。TensorFlow在代碼編譯上有著更快的速度和更好的交互體驗。Caffe給卷積神經網絡訓練提供了非常棒的庫,然而它并不能算是模擬和訓練神經網絡的工具。Torch似乎要推出類似的系統,可以預見未來幾年庫的競爭會相當激烈。眼下,我還是非常滿意Python和Numpy的陪伴。
開源的公認案例
關于谷歌為何開源其深度學習框架TensorFlow的各種猜測甚囂塵上,然而如果冷靜地對庫的用途進行分析,那谷歌的意圖就顯而易見了。實際谷歌僅僅開放了庫并不是算法。谷歌不會透露其搜索算法的細節,正如非死book不會把Torch框架中的訓練模型分享出來。為了實力均衡,不論研究人員是否在Theano,Caffe,TensorFlow中做過,都或多或少需要進行重復性工作。目前,谷歌,臉書,微軟都在機器學習的領域搶奪人才,對于下一代博士生們而言,帶著技術嫁到臉書的Torch平臺可能會比在谷歌創造更多生產力和價值。因此,谷歌開放TensorFlow,無疑是為了在這場比賽中扳回一局。
機器學習就像是網頁開發
另一些人認為,很多不論是正面還是負面的報道都夸大其詞的認為機器學習和網頁開發一樣依賴庫的使用。一些網頁開發社區已經導致了庫套庫的庫。這很討人厭,不僅沒必要還造成浪費,更令人擔心的是,這種情況導致了一種環境,在該環境中,很多最有用的技術還依賴于瞬息萬變的函數庫之上。可悲的是,當機器學習從小范圍的學術界向商業公司發展時,有些是難以避免的。我希望TensorFlow可以成為最后的機器學習庫,畢竟我還需要時間來熟悉它。