TensorFlow實戰(zhàn)之深度學(xué)習(xí)框架的對比
Google近日發(fā)布了TensorFlow 1.0候選版,這第一個穩(wěn)定版將是深度學(xué)習(xí)框架發(fā)展中的里程碑的一步。自TensorFlow于2015年底正式開源,距今已有一年多,這期間TensorFlow不斷給人以驚喜。在這一年多時間,TensorFlow已從初入深度學(xué)習(xí)框架大戰(zhàn)的新星,成為了幾近壟斷的行業(yè)事實標(biāo)準(zhǔn)。本文節(jié)選自《TensorFlow實戰(zhàn)》第二章。
主流深度學(xué)習(xí)框架對比深度學(xué)習(xí)研究的熱潮持續(xù)高漲,各種開源深度學(xué)習(xí)框架也層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlow卻殺出重圍,在關(guān)注度和用戶數(shù)上都占據(jù)絕對優(yōu)勢,大有一統(tǒng)江湖之勢。表2-1所示為各個開源框架在GitHub上的數(shù)據(jù)統(tǒng)計(數(shù)據(jù)統(tǒng)計于2017年1月3日),可以看到TensorFlow在star數(shù)量、fork數(shù)量、contributor數(shù)量這三個數(shù)據(jù)上都完勝其他對手。
究其原因,主要是Google在業(yè)界的號召力確實強大,之前也有許多成功的開源項目,以及Google強大的人工智能研發(fā)水平,都讓大家對Google的深度學(xué)習(xí)框架充滿信心,以至于TensorFlow在2015年11月剛開源的第一個月就積累了10000+的star。其次,TensorFlow確實在很多方面擁有優(yōu)異的表現(xiàn),比如設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的代碼的簡潔度,分布式深度學(xué)習(xí)算法的執(zhí)行效率,還有部署的便利性,都是其得以勝出的亮點。如果一直關(guān)注著TensorFlow的開發(fā)進度,就會發(fā)現(xiàn)基本上每星期TensorFlow都會有1萬行以上的代碼更新,多則數(shù)萬行。產(chǎn)品本身優(yōu)異的質(zhì)量、快速的迭代更新、活躍的社區(qū)和積極的反饋,形成了良性循環(huán),可以想見TensorFlow未來將繼續(xù)在各種深度學(xué)習(xí)框架中獨占鰲頭。
表2-1 各個開源框架在GitHub上的數(shù)據(jù)統(tǒng)計
觀察表1還可以發(fā)現(xiàn),Google、Microsoft、Facebook等巨頭都參與了這場深度學(xué)習(xí)框架大戰(zhàn),此外,還有畢業(yè)于伯克利大學(xué)的賈揚清主導(dǎo)開發(fā)的Caffe,蒙特利爾大學(xué)Lisa Lab團隊開發(fā)的Theano,以及其他個人或商業(yè)組織貢獻的框架。另外,可以看到各大主流框架基本都支持Python,目前Python在科學(xué)計算和數(shù)據(jù)挖掘領(lǐng)域可以說是獨領(lǐng)風(fēng)騷。雖然有來自R、Julia等語言的競爭壓力,但是Python的各種庫實在是太完善了,Web開發(fā)、數(shù)據(jù)可視化、數(shù)據(jù)預(yù)處理、數(shù)據(jù)庫連接、爬蟲等無所不能,有一個完美的生態(tài)環(huán)境。僅在數(shù)據(jù)挖據(jù)工具鏈上,Python就有NumPy、SciPy、Pandas、Scikit-learn、XGBoost等組件,做數(shù)據(jù)采集和預(yù)處理都非常方便,并且之后的模型訓(xùn)練階段可以和TensorFlow等基于Python的深度學(xué)習(xí)框架完美銜接。
表2-1和圖2-1所示為對主流的深度學(xué)習(xí)框架TensorFlow、Caffe、CNTK、Theano、Torch在各個維度的評分,本書2.2節(jié)會對各個深度學(xué)習(xí)框架進行比較詳細的介紹。
表2-2 主流深度學(xué)習(xí)框架在各個維度的評分
圖2-1 主流深度學(xué)習(xí)框架對比圖
各深度學(xué)習(xí)框架簡介在本節(jié),我們先來看看目前各流行框架的異同,以及各自的特點和優(yōu)勢。
TensorFlow
TensorFlow是相對高階的機器學(xué)習(xí)庫,用戶可以方便地用它設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),而不必為了追求高效率的實現(xiàn)親自寫C++或CUDA代碼。它和Theano一樣都支持自動求導(dǎo),用戶不需要再通過反向傳播求解梯度。其核心代碼和Caffe一樣是用C++編寫的,使用C++簡化了線上部署的復(fù)雜度,并讓手機這種內(nèi)存和CPU資源都緊張的設(shè)備可以運行復(fù)雜模型(Python則會比較消耗資源,并且執(zhí)行效率不高)。除了核心代碼的C++接口,TensorFlow還有官方的Python、Go和Java接口,是通過SWIG(Simplified Wrapper and Interface Generator)實現(xiàn)的,這樣用戶就可以在一個硬件配置較好的機器中用Python進行實驗,并在資源比較緊張的嵌入式環(huán)境或需要低延遲的環(huán)境中用C++部署模型。SWIG支持給C/C++代碼提供各種語言的接口,因此其他腳本語言的接口未來也可以通過SWIG方便地添加。不過使用Python時有一個影響效率的問題是,每一個mini-batch要從Python中feed到網(wǎng)絡(luò)中,這個過程在mini-batch的數(shù)據(jù)量很小或者運算時間很短時,可能會帶來影響比較大的延遲?,F(xiàn)在TensorFlow還有非官方的Julia、Node.js、R的接口支持。