TensorFlow和Caffe、CNTK、MXNet等其他7種深度學(xué)習(xí)框架的對(duì)比
主流深度學(xué)習(xí)框架對(duì)比
深度學(xué)習(xí)研究的熱潮持續(xù)高漲,各種開(kāi)源深度學(xué)習(xí)框架也層出不窮,其中包括TensorFlow、Caffe8、Keras9、CNTK10、Torch711、MXNet12、Leaf13、Theano14、DeepLearning415、Lasagne16、Neon17,等等。然而TensorFlow卻殺出重圍,在關(guān)注度和用戶數(shù)上都占據(jù)絕對(duì)優(yōu)勢(shì),大有一統(tǒng)江湖之勢(shì)。表2-1所示為各個(gè)開(kāi)源框架在GitHub上的數(shù)據(jù)統(tǒng)計(jì)(數(shù)據(jù)統(tǒng)計(jì)于2017年1月3日),可以看到TensorFlow在star數(shù)量、fork數(shù)量、contributor數(shù)量這三個(gè)數(shù)據(jù)上都完勝其他對(duì)手。
究其原因,主要是Google在業(yè)界的號(hào)召力確實(shí)強(qiáng)大,之前也有許多成功的開(kāi)源項(xiàng)目,以及Google強(qiáng)大的人工智能研發(fā)水平,都讓大家對(duì)Google的深度學(xué)習(xí)框架充滿信心,以至于TensorFlow在2015年11月剛開(kāi)源的第一個(gè)月就積累了10000+的star。其次,TensorFlow確實(shí)在很多方面擁有優(yōu)異的表現(xiàn),比如設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的代碼的簡(jiǎn)潔度,分布式深度學(xué)習(xí)算法的執(zhí)行效率,還有部署的便利性,都是其得以勝出的亮點(diǎn)。
如果一直關(guān)注著TensorFlow的開(kāi)發(fā)進(jìn)度,就會(huì)發(fā)現(xiàn)基本上每星期TensorFlow都會(huì)有1萬(wàn)行以上的代碼更新,多則數(shù)萬(wàn)行。產(chǎn)品本身優(yōu)異的質(zhì)量、快速的迭代更新、活躍的社區(qū)和積極的反饋,形成了良性循環(huán),可以想見(jiàn)TensorFlow未來(lái)將繼續(xù)在各種深度學(xué)習(xí)框架中獨(dú)占鰲頭。
觀察表2-1還可以發(fā)現(xiàn),Google、Microsoft、Facebook等巨頭都參與了這場(chǎng)深度學(xué)習(xí)框架大戰(zhàn),此外,還有畢業(yè)于伯克利大學(xué)的賈揚(yáng)清主導(dǎo)開(kāi)發(fā)的Caffe,蒙特利爾大學(xué)Lisa Lab團(tuán)隊(duì)開(kāi)發(fā)的Theano,以及其他個(gè)人或商業(yè)組織貢獻(xiàn)的框架。另外,可以看到各大主流框架基本都支持Python,目前Python在科學(xué)計(jì)算和數(shù)據(jù)挖掘領(lǐng)域可以說(shuō)是獨(dú)領(lǐng)風(fēng)騷。雖然有來(lái)自R、Julia等語(yǔ)言的競(jìng)爭(zhēng)壓力,但是Python的各種庫(kù)實(shí)在是太完善了,Web開(kāi)發(fā)、數(shù)據(jù)可視化、數(shù)據(jù)預(yù)處理、數(shù)據(jù)庫(kù)連接、爬蟲等無(wú)所不能,有一個(gè)完美的生態(tài)環(huán)境。僅在數(shù)據(jù)挖據(jù)工具鏈上,Python就有NumPy、SciPy、Pandas、Scikit-learn、XGBoost等組件,做數(shù)據(jù)采集和預(yù)處理都非常方便,并且之后的模型訓(xùn)練階段可以和TensorFlow等基于Python的深度學(xué)習(xí)框架完美銜接。
表2-2和圖2-1所示為對(duì)主流的深度學(xué)習(xí)框架TensorFlow、Caffe、CNTK、Theano、Torch在各個(gè)維度的評(píng)分,本書2.2節(jié)會(huì)對(duì)各個(gè)深度學(xué)習(xí)框架進(jìn)行比較詳細(xì)的介紹。
圖2-1 主流深度學(xué)習(xí)框架對(duì)比圖
各深度學(xué)習(xí)框架簡(jiǎn)介
在本節(jié),我們先來(lái)看看目前各流行框架的異同,以及各自的特點(diǎn)和優(yōu)勢(shì)。
TensorFlow
TensorFlow是相對(duì)高階的機(jī)器學(xué)習(xí)庫(kù),用戶可以方便地用它設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),而不必為了追求高效率的實(shí)現(xiàn)親自寫C++或CUDA18代碼。它和Theano一樣都支持自動(dòng)求導(dǎo),用戶不需要再通過(guò)反向傳播求解梯度。其核心代碼和Caffe一樣是用C++編寫的,使用C++簡(jiǎn)化了線上部署的復(fù)雜度,并讓手機(jī)這種內(nèi)存和CPU資源都緊張的設(shè)備可以運(yùn)行復(fù)雜模型(Python則會(huì)比較消耗資源,并且執(zhí)行效率不高)。
除了核心代碼的C++接口,TensorFlow還有官方的Python、Go和Java接口,是通過(guò)SWIG(Simplified Wrapper and Interface Generator)實(shí)現(xiàn)的,這樣用戶就可以在一個(gè)硬件配置較好的機(jī)器中用Python進(jìn)行實(shí)驗(yàn),并在資源比較緊張的嵌入式環(huán)境或需要低延遲的環(huán)境中用C++部署模型。SWIG支持給C/C++代碼提供各種語(yǔ)言的接口,因此其他腳本語(yǔ)言的接口未來(lái)也可以通過(guò)SWIG方便地添加。
不過(guò)使用Python時(shí)有一個(gè)影響效率的問(wèn)題是,每一個(gè)mini-batch要從Python中feed到網(wǎng)絡(luò)中,這個(gè)過(guò)程在mini-batch的數(shù)據(jù)量很小或者運(yùn)算時(shí)間很短時(shí),可能會(huì)帶來(lái)影響比較大的延遲?,F(xiàn)在TensorFlow還有非官方的Julia、Node.js、R的接口支持,地址如下。
Julia:github.com/malmaud/TensorFlow.jl
Node.js:github.com/node-tensorflow/node-tensorflow
R:github.com/rstudio/tensorflow
TensorFlow也有內(nèi)置的TF.Learn和TF.Slim等上層組件可以幫助快速地設(shè)計(jì)新網(wǎng)絡(luò),并且兼容Scikit-learn estimator接口,可以方便地實(shí)現(xiàn)evaluate、grid search、cross validation等功能。同時(shí)TensorFlow不只局限于神經(jīng)網(wǎng)絡(luò),其數(shù)據(jù)流式圖支持非常自由的算法表達(dá),當(dāng)然也可以輕松實(shí)現(xiàn)深度學(xué)習(xí)以外的機(jī)器學(xué)習(xí)算法。事實(shí)上,只要可以將計(jì)算表示成計(jì)算圖的形式,就可以使用TensorFlow。用戶可以寫內(nèi)層循環(huán)代碼控制計(jì)算圖分支的計(jì)算,TensorFlow會(huì)自動(dòng)將相關(guān)的分支轉(zhuǎn)為子圖并執(zhí)行迭代運(yùn)算。TensorFlow也可以將計(jì)算圖中的各個(gè)節(jié)點(diǎn)分配到不同的設(shè)備執(zhí)行,充分利用硬件資源。定義新的節(jié)點(diǎn)只需要寫一個(gè)Python函數(shù),如果沒(méi)有對(duì)應(yīng)的底層運(yùn)算核,那么可能需要寫C++或者CUDA代碼實(shí)現(xiàn)運(yùn)算操作。
在數(shù)據(jù)并行模式上,TensorFlow和Parameter Server很像,但TensorFlow有獨(dú)立的Variable node,不像其他框架有一個(gè)全局統(tǒng)一的參數(shù)服務(wù)器,因此參數(shù)同步更自由。TensorFlow和Spark的核心都是一個(gè)數(shù)據(jù)計(jì)算的流式圖,Spark面向的是大規(guī)模的數(shù)據(jù),支持SQL等操作,而TensorFlow主要面向內(nèi)存足以裝載模型參數(shù)的環(huán)境,這樣可以最大化計(jì)算效率。
TensorFlow的另外一個(gè)重要特點(diǎn)是它靈活的移植性,可以將同一份代碼幾乎不經(jīng)過(guò)修改就輕松地部署到有任意數(shù)量CPU或GPU的PC、服務(wù)器或者移動(dòng)設(shè)備上。相比于Theano,TensorFlow還有一個(gè)優(yōu)勢(shì)就是它極快的編譯速度,在定義新網(wǎng)絡(luò)結(jié)構(gòu)時(shí),Theano通常需要長(zhǎng)時(shí)間的編譯,因此嘗試新模型需要比較大的代價(jià),而TensorFlow完全沒(méi)有這個(gè)問(wèn)題。TensorFlow還有功能強(qiáng)大的可視化組件TensorBoard,能可視化網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練過(guò)程,對(duì)于觀察復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)和監(jiān)控長(zhǎng)時(shí)間、大規(guī)模的訓(xùn)練很有幫助。TensorFlow針對(duì)生產(chǎn)環(huán)境高度優(yōu)化,它產(chǎn)品級(jí)的高質(zhì)量代碼和設(shè)計(jì)都可以保證在生產(chǎn)環(huán)境中穩(wěn)定運(yùn)行,同時(shí)一旦TensorFlow廣泛地被工業(yè)界使用,將產(chǎn)生良性循環(huán),成為深度學(xué)習(xí)領(lǐng)域的事實(shí)標(biāo)準(zhǔn)。
除了支持常見(jiàn)的網(wǎng)絡(luò)結(jié)構(gòu)[卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurent Neural Network,RNN)]外,TensorFlow還支持深度強(qiáng)化學(xué)習(xí)乃至其他計(jì)算密集的科學(xué)計(jì)算(如偏微分方程求解等)。TensorFlow此前不支持symbolic loop,需要使用Python循環(huán)而無(wú)法進(jìn)行圖編譯優(yōu)化,但最近新加入的XLA已經(jīng)開(kāi)始支持JIT和AOT,另外它使用bucketing trick也可以比較高效地實(shí)現(xiàn)循環(huán)神經(jīng)網(wǎng)絡(luò)。TensorFlow的一個(gè)薄弱地方可能在于計(jì)算圖必須構(gòu)建為靜態(tài)圖,這讓很多計(jì)算變得難以實(shí)現(xiàn),尤其是序列預(yù)測(cè)中經(jīng)常使用的beam search。
TensorFlow的用戶能夠?qū)⒂?xùn)練好的模型方便地部署到多種硬件、操作系統(tǒng)平臺(tái)上,支持Intel和AMD的CPU,通過(guò)CUDA支持NVIDIA的GPU(最近也開(kāi)始通過(guò)OpenCL支持AMD的GPU,但沒(méi)有CUDA成熟),支持Linux和Mac,最近在0.12版本中也開(kāi)始嘗試支持Windows。在工業(yè)生產(chǎn)環(huán)境中,硬件設(shè)備有些是最新款的,有些是用了幾年的老機(jī)型,來(lái)源可能比較復(fù)雜,TensorFlow的異構(gòu)性讓它能夠全面地支持各種硬件和操作系統(tǒng)。同時(shí),其在CPU上的矩陣運(yùn)算庫(kù)使用了Eigen而不是BLAS庫(kù),能夠基于ARM架構(gòu)編譯和優(yōu)化,因此在移動(dòng)設(shè)備(Android和iOS)上表現(xiàn)得很好。
TensorFlow在最開(kāi)始發(fā)布時(shí)只支持單機(jī),而且只支持CUDA 6.5和cuDNN v2,并且沒(méi)有官方和其他深度學(xué)習(xí)框架的對(duì)比結(jié)果。在2015年年底,許多其他框架做了各種性能對(duì)比評(píng)測(cè),每次TensorFlow都會(huì)作為較差的對(duì)照組出現(xiàn)。那個(gè)時(shí)期的TensorFlow真的不快,性能上僅和普遍認(rèn)為很慢的Theano比肩,在各個(gè)框架中可以算是墊底。但是憑借Google強(qiáng)大的開(kāi)發(fā)實(shí)力,很快支持了新版的cuDNN(目前支持cuDNN v5.1),在單GPU上的性能追上了其他框架。表2-3所示為https://github.com/soumith/convnet-benchmarks給出的各個(gè)框架在AlexNet上單GPU的性能評(píng)測(cè)。
目前在單GPU的條件下,絕大多數(shù)深度學(xué)習(xí)框架都依賴于cuDNN,因此只要硬件計(jì)算能力或者內(nèi)存分配差異不大,最終訓(xùn)練速度不會(huì)相差太大。但是對(duì)于大規(guī)模深度學(xué)習(xí)來(lái)說(shuō),巨大的數(shù)據(jù)量使得單機(jī)很難在有限的時(shí)間完成訓(xùn)練。這時(shí)需要分布式計(jì)算使GPU集群乃至TPU集群并行計(jì)算,共同訓(xùn)練出一個(gè)模型,所以框架的分布式性能是至關(guān)重要的。TensorFlow在2016年4月開(kāi)源了分布式版本,使用16塊GPU可達(dá)單GPU的15倍提速,在50塊GPU時(shí)可達(dá)到40倍提速,分布式的效率很高。目前原生支持的分布式深度學(xué)習(xí)框架不多,只有TensorFlow、CNTK、DeepLearning4J、MXNet等。不過(guò)目前TensorFlow的設(shè)計(jì)對(duì)不同設(shè)備間的通信優(yōu)化得不是很好,其單機(jī)的reduction只能用CPU處理,分布式的通信使用基于socket的RPC,而不是速度更快的RDMA,所以其分布式性能可能還沒(méi)有達(dá)到最優(yōu)。
Google 在2016年2月開(kāi)源了TensorFlow Serving19,這個(gè)組件可以將TensorFlow訓(xùn)練好的模型導(dǎo)出,并部署成可以對(duì)外提供預(yù)測(cè)服務(wù)的RESTful接口,如圖2-2所示。有了這個(gè)組件,TensorFlow就可以實(shí)現(xiàn)應(yīng)用機(jī)器學(xué)習(xí)的全流程:從訓(xùn)練模型、調(diào)試參數(shù),到打包模型,最后部署服務(wù),名副其實(shí)是一個(gè)從研究到生產(chǎn)整條流水線都齊備的框架。這里引用TensorFlow內(nèi)部開(kāi)發(fā)人員的描述:“TensorFlow Serving是一個(gè)為生產(chǎn)環(huán)境而設(shè)計(jì)的高性能的機(jī)器學(xué)習(xí)服務(wù)系統(tǒng)。它可以同時(shí)運(yùn)行多個(gè)大規(guī)模深度學(xué)習(xí)模型,支持模型生命周期管理、算法實(shí)驗(yàn),并可以高效地利用GPU資源,讓TensorFlow訓(xùn)練好的模型更快捷方便地投入到實(shí)際生產(chǎn)環(huán)境”。除了TensorFlow以外的其他框架都缺少為生產(chǎn)環(huán)境部署的考慮,而Google作為廣泛在實(shí)際產(chǎn)品中應(yīng)用深度學(xué)習(xí)的巨頭可能也意識(shí)到了這個(gè)機(jī)會(huì),因此開(kāi)發(fā)了這個(gè)部署服務(wù)的平臺(tái)。TensorFlow Serving可以說(shuō)是一副王牌,將會(huì)幫TensorFlow成為行業(yè)標(biāo)準(zhǔn)做出巨大貢獻(xiàn)。
圖2-2 TensorFlow Serving架構(gòu)
TensorBoard是TensorFlow的一組Web應(yīng)用,用來(lái)監(jiān)控TensorFlow運(yùn)行過(guò)程,或可視化Computation Graph。TensorBoard目前支持5種可視化:標(biāo)量(scalars)、圖片(images)、音頻(audio)、直方圖(histograms)和計(jì)算圖(Computation Graph)。TensorBoard的Events Dashboard可以用來(lái)持續(xù)地監(jiān)控運(yùn)行時(shí)的關(guān)鍵指標(biāo),比如loss、學(xué)習(xí)速率(learning rate)或是驗(yàn)證集上的準(zhǔn)確率(accuracy);Image Dashboard則可以展示訓(xùn)練過(guò)程中用戶設(shè)定保存的圖片,比如某個(gè)訓(xùn)練中間結(jié)果用Matplotlib等繪制(plot)出來(lái)的圖片;Graph Explorer則可以完全展示一個(gè)TensorFlow的計(jì)算圖,并且支持縮放拖曳和查看節(jié)點(diǎn)屬性。TensorBoard的可視化效果如圖2-3和圖2-4所示。
圖2-3 TensorBoard的loss標(biāo)量的可視化
圖2-4 TensorBoard的模型結(jié)構(gòu)可視化
TensorFlow擁有產(chǎn)品級(jí)的高質(zhì)量代碼,有Google強(qiáng)大的開(kāi)發(fā)、維護(hù)能力的加持,整體架構(gòu)設(shè)計(jì)也非常優(yōu)秀。相比于同樣基于Python的老牌對(duì)手Theano,TensorFlow更成熟、更完善,同時(shí)Theano的很多主要開(kāi)發(fā)者都去了Google開(kāi)發(fā)TensorFlow(例如書籍Deep Learning的作者Ian Goodfellow,他后來(lái)去了OpenAI)。Google作為巨頭公司有比高?;蛘邆€(gè)人開(kāi)發(fā)者多得多的資源投入到TensorFlow的研發(fā),可以預(yù)見(jiàn),TensorFlow未來(lái)的發(fā)展將會(huì)是飛速的,可能會(huì)把大學(xué)或者個(gè)人維護(hù)的深度學(xué)習(xí)框架遠(yuǎn)遠(yuǎn)甩在身后。
Caffe
官方網(wǎng)址:caffe.berkeleyvision.org/
GitHub:github.com/BVLC/caffe
Caffe全稱為Convolutional Architecture for Fast Feature Embedding,是一個(gè)被廣泛使用的開(kāi)源深度學(xué)習(xí)框架(在TensorFlow出現(xiàn)之前一直是深度學(xué)習(xí)領(lǐng)域GitHub star最多的項(xiàng)目),目前由伯克利視覺(jué)學(xué)中心(Berkeley Vision and Learning Center,BVLC)進(jìn)行維護(hù)。Caffe的創(chuàng)始人是加州大學(xué)伯克利的Ph.D.賈揚(yáng)清,他同時(shí)也是TensorFlow的作者之一,曾工作于MSRA、NEC和Google Brain,目前就職于Facebook FAIR實(shí)驗(yàn)室。Caffe的主要優(yōu)勢(shì)包括如下幾點(diǎn)。
容易上手,網(wǎng)絡(luò)結(jié)構(gòu)都是以配置文件形式定義,不需要用代碼設(shè)計(jì)網(wǎng)絡(luò)。
訓(xùn)練速度快,能夠訓(xùn)練state-of-the-art的模型與大規(guī)模的數(shù)據(jù)。
組件模塊化,可以方便地拓展到新的模型和學(xué)習(xí)任務(wù)上。
Caffe的核心概念是Layer,每一個(gè)神經(jīng)網(wǎng)絡(luò)的模塊都是一個(gè)Layer。Layer接收輸入數(shù)據(jù),同時(shí)經(jīng)過(guò)內(nèi)部計(jì)算產(chǎn)生輸出數(shù)據(jù)。設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)時(shí),只需要把各個(gè)Layer拼接在一起構(gòu)成完整的網(wǎng)絡(luò)(通過(guò)寫protobuf配置文件定義)。比如卷積的Layer,它的輸入就是圖片的全部像素點(diǎn),內(nèi)部進(jìn)行的操作是各種像素值與Layer參數(shù)的convolution操作,最后輸出的是所有卷積核filter的結(jié)果。每一個(gè)Layer需要定義兩種運(yùn)算,一種是正向(forward)的運(yùn)算,即從輸入數(shù)據(jù)計(jì)算輸出結(jié)果,也就是模型的預(yù)測(cè)過(guò)程;另一種是反向(backward)的運(yùn)算,從輸出端的gradient求解相對(duì)于輸入的gradient,即反向傳播算法,這部分也就是模型的訓(xùn)練過(guò)程。實(shí)現(xiàn)新Layer時(shí),需要將正向和反向兩種計(jì)算過(guò)程的函數(shù)都實(shí)現(xiàn),這部分計(jì)算需要用戶自己寫C++或者CUDA(當(dāng)需要運(yùn)行在GPU時(shí))代碼,對(duì)普通用戶來(lái)說(shuō)還是非常難上手的。
正如它的名字Convolutional Architecture for Fast Feature Embedding所描述的,Caffe最開(kāi)始設(shè)計(jì)時(shí)的目標(biāo)只針對(duì)于圖像,沒(méi)有考慮文本、語(yǔ)音或者時(shí)間序列的數(shù)據(jù),因此Caffe對(duì)卷積神經(jīng)網(wǎng)絡(luò)的支持非常好,但對(duì)時(shí)間序列RNN、LSTM等支持得不是特別充分。同時(shí),基于Layer的模式也對(duì)RNN不是非常友好,定義RNN結(jié)構(gòu)時(shí)比較麻煩。在模型結(jié)構(gòu)非常復(fù)雜時(shí),可能需要寫非常冗長(zhǎng)的配置文件才能設(shè)計(jì)好網(wǎng)絡(luò),而且閱讀時(shí)也比較費(fèi)力。
Caffe的一大優(yōu)勢(shì)是擁有大量的訓(xùn)練好的經(jīng)典模型(AlexNet、VGG、Inception)乃至其他state-of-the-art(ResNet等)的模型,收藏在它的Model Zoo(github.com/BVLC/ caffe/wiki/Model-Zoo)。因?yàn)橹容^高,Caffe被廣泛地應(yīng)用于前沿的工業(yè)界和學(xué)術(shù)界,許多提供源碼的深度學(xué)習(xí)的論文都是使用Caffe來(lái)實(shí)現(xiàn)其模型的。在計(jì)算機(jī)視覺(jué)領(lǐng)域Caffe應(yīng)用尤其多,可以用來(lái)做人臉識(shí)別、圖片分類、位置檢測(cè)、目標(biāo)追蹤等。
雖然Caffe主要是面向?qū)W術(shù)圈和研究者的,但它的程序運(yùn)行非常穩(wěn)定,代碼質(zhì)量比較高,所以也很適合對(duì)穩(wěn)定性要求嚴(yán)格的生產(chǎn)環(huán)境,可以算是第一個(gè)主流的工業(yè)級(jí)深度學(xué)習(xí)框架。因?yàn)镃affe的底層是基于C++的,因此可以在各種硬件環(huán)境編譯并具有良好的移植性,支持Linux、Mac和Windows系統(tǒng),也可以編譯部署到移動(dòng)設(shè)備系統(tǒng)如Android和iOS上。和其他主流深度學(xué)習(xí)庫(kù)類似,Caffe也提供了Python語(yǔ)言接口pycaffe,在接觸新任務(wù),設(shè)計(jì)新網(wǎng)絡(luò)時(shí)可以使用其Python接口簡(jiǎn)化操作。
不過(guò),通常用戶還是使用Protobuf配置文件定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),再使用command line進(jìn)行訓(xùn)練或者預(yù)測(cè)。Caffe的配置文件是一個(gè)JSON類型的.prototxt文件,其中使用許多順序連接的Layer來(lái)描述神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。Caffe的二進(jìn)制可執(zhí)行程序會(huì)提取這些.prototxt文件并按其定義來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)。理論上,Caffe的用戶可以完全不寫代碼,只是定義網(wǎng)絡(luò)結(jié)構(gòu)就可以完成模型訓(xùn)練了。
Caffe完成訓(xùn)練之后,用戶可以把模型文件打包制作成簡(jiǎn)單易用的接口,比如可以封裝成Python或MATLAB的API。不過(guò)在.prototxt文件內(nèi)部設(shè)計(jì)網(wǎng)絡(luò)節(jié)構(gòu)可能會(huì)比較受限,沒(méi)有像TensorFlow或者Keras那樣在Python中設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)方便、自由。更重要的是,Caffe的配置文件不能用編程的方式調(diào)整超參數(shù),也沒(méi)有提供像Scikit-learn那樣好用的estimator可以方便地進(jìn)行交叉驗(yàn)證、超參數(shù)的Grid Search等操作。Caffe在GPU上訓(xùn)練的性能很好(使用單塊GTX 1080訓(xùn)練AlexNet時(shí)一天可以訓(xùn)練上百萬(wàn)張圖片),但是目前僅支持單機(jī)多GPU的訓(xùn)練,沒(méi)有原生支持分布式的訓(xùn)練。慶幸的是,現(xiàn)在有很多第三方的支持,比如雅虎開(kāi)源的CaffeOnSpark,可以借助Spark的分布式框架實(shí)現(xiàn)Caffe的大規(guī)模分布式訓(xùn)練。
Theano
官方網(wǎng)址:http://www.deeplearning.net/software/theano/
GitHub:github.com/Theano/Theano
Theano誕生于2008年,由蒙特利爾大學(xué)Lisa Lab團(tuán)隊(duì)開(kāi)發(fā)并維護(hù),是一個(gè)高性能的符號(hào)計(jì)算及深度學(xué)習(xí)庫(kù)。因其出現(xiàn)時(shí)間早,可以算是這類庫(kù)的始祖之一,也一度被認(rèn)為是深度學(xué)習(xí)研究和應(yīng)用的重要標(biāo)準(zhǔn)之一。Theano的核心是一個(gè)數(shù)學(xué)表達(dá)式的編譯器,專門為處理大規(guī)模神經(jīng)網(wǎng)絡(luò)訓(xùn)練的計(jì)算而設(shè)計(jì)。它可以將用戶定義的各種計(jì)算編譯為高效的底層代碼,并鏈接各種可以加速的庫(kù),比如BLAS、CUDA等。Theano允許用戶定義、優(yōu)化和評(píng)估包含多維數(shù)組的數(shù)學(xué)表達(dá)式,它支持將計(jì)算裝載到GPU(Theano在GPU上性能不錯(cuò),但是CPU上較差)。與Scikit-learn一樣,Theano也很好地整合了NumPy,對(duì)GPU的透明讓Theano可以較為方便地進(jìn)行神經(jīng)網(wǎng)絡(luò)設(shè)計(jì),而不必直接寫CUDA代碼。Theano的主要優(yōu)勢(shì)如下。
集成NumPy,可以直接使用NumPy的ndarray,API接口學(xué)習(xí)成本低。
計(jì)算穩(wěn)定性好,比如可以精準(zhǔn)地計(jì)算輸出值很小的函數(shù)(像log(1+x))。
動(dòng)態(tài)地生成C或者CUDA代碼,用以編譯成高效的機(jī)器代碼。
因?yàn)門heano非常流行,有許多人為它編寫了高質(zhì)量的文檔和教程,用戶可以方便地查找Theano的各種FAQ,比如如何保存模型、如何運(yùn)行模型等。不過(guò)Theano更多地被當(dāng)作一個(gè)研究工具,而不是當(dāng)作產(chǎn)品來(lái)使用。雖然Theano支持Linux、Mac和Windows,但是沒(méi)有底層C++的接口,因此模型的部署非常不方便,依賴于各種Python庫(kù),并且不支持各種移動(dòng)設(shè)備,所以幾乎沒(méi)有在工業(yè)生產(chǎn)環(huán)境的應(yīng)用。
Theano在調(diào)試時(shí)輸出的錯(cuò)誤信息非常難以看懂,因此DEBUG時(shí)非常痛苦。同時(shí),Theano在生產(chǎn)環(huán)境使用訓(xùn)練好的模型進(jìn)行預(yù)測(cè)時(shí)性能比較差,因?yàn)轭A(yù)測(cè)通常使用服務(wù)器CPU(生產(chǎn)環(huán)境服務(wù)器一般沒(méi)有GPU,而且GPU預(yù)測(cè)單條樣本延遲高反而不如CPU),但是Theano在CPU上的執(zhí)行性能比較差。
Theano在單GPU上執(zhí)行效率不錯(cuò),性能和其他框架類似。但是運(yùn)算時(shí)需要將用戶的Python代碼轉(zhuǎn)換成CUDA代碼,再編譯為二進(jìn)制可執(zhí)行文件,編譯復(fù)雜模型的時(shí)間非常久。此外,Theano在導(dǎo)入時(shí)也比較慢,而且一旦設(shè)定了選擇某塊GPU,就無(wú)法切換到其他設(shè)備。目前,Theano在CUDA和cuDNN上不支持多GPU,只在OpenCL和Theano自己的gpuarray庫(kù)上支持多GPU訓(xùn)練,速度暫時(shí)還比不上CUDA的版本,并且Theano目前還沒(méi)有分布式的實(shí)現(xiàn)。不過(guò),Theano在訓(xùn)練簡(jiǎn)單網(wǎng)絡(luò)(比如很淺的MLP)時(shí)性能可能比TensorFlow好,因?yàn)槿看a都是運(yùn)行時(shí)編譯,不需要像TensorFlow那樣每次feed mini-batch數(shù)據(jù)時(shí)都得通過(guò)低效的Python循環(huán)來(lái)實(shí)現(xiàn)。
Theano是一個(gè)完全基于Python(C++/CUDA代碼也是打包為Python字符串)的符號(hào)計(jì)算庫(kù)。用戶定義的各種運(yùn)算,Theano可以自動(dòng)求導(dǎo),省去了完全手工寫神經(jīng)網(wǎng)絡(luò)反向傳播算法的麻煩,也不需要像Caffe一樣為L(zhǎng)ayer寫C++或CUDA代碼。Theano對(duì)卷積神經(jīng)網(wǎng)絡(luò)的支持很好,同時(shí)它的符號(hào)計(jì)算API支持循環(huán)控制(內(nèi)部名scan),讓RNN的實(shí)現(xiàn)非常簡(jiǎn)單并且高性能,其全面的功能也讓Theano可以支持大部分state-of-the-art的網(wǎng)絡(luò)。
Theano派生出了大量基于它的深度學(xué)習(xí)庫(kù),包括一系列的上層封裝,其中有大名鼎鼎的Keras,Keras對(duì)神經(jīng)網(wǎng)絡(luò)抽象得非常合適,以至于可以隨意切換執(zhí)行計(jì)算的后端(目前同時(shí)支持Theano和TensorFlow)。Keras比較適合在探索階段快速地嘗試各種網(wǎng)絡(luò)結(jié)構(gòu),組件都是可插拔的模塊,只需要將一個(gè)個(gè)組件(比如卷積層、激活函數(shù)等)連接起來(lái),但是設(shè)計(jì)新模塊或者新的Layer就不太方便了。除Keras外,還有學(xué)術(shù)界非常喜愛(ài)的Lasagne,同樣也是Theano的上層封裝,它對(duì)神經(jīng)內(nèi)網(wǎng)絡(luò)的每一層的定義都非常嚴(yán)謹(jǐn)。
另外,還有scikit-neuralnetwork、nolearn這兩個(gè)基于Lasagne的上層封裝,它們將神經(jīng)網(wǎng)絡(luò)抽象為兼容Scikit-learn接口的classifier和regressor,這樣就可以方便地使用Scikit-learn中經(jīng)典的fit、transform、score等操作。除此之外,Theano的上層封裝庫(kù)還有blocks、deepy、pylearn2和Scikit-theano,可謂是一個(gè)龐大的家族。如果沒(méi)有Theano,可能根本不會(huì)出現(xiàn)這么多好用的Python深度學(xué)習(xí)庫(kù)。同樣,如果沒(méi)有Python科學(xué)計(jì)算的基石NumPy,就不會(huì)有SciPy、Scikit-learn和 Scikit-image,可以說(shuō)Theano就是深度學(xué)習(xí)界的NumPy,是其他各類Python深度學(xué)習(xí)庫(kù)的基石。
雖然Theano非常重要,但是直接使用Theano設(shè)計(jì)大型的神經(jīng)網(wǎng)絡(luò)還是太煩瑣了,用 Theano實(shí)現(xiàn)Google Inception就像用NumPy實(shí)現(xiàn)一個(gè)支持向量機(jī)(SVM)。且不說(shuō)很多用戶做不到用Theano實(shí)現(xiàn)一個(gè)Inception網(wǎng)絡(luò),即使能做到但是否有必要花這個(gè)時(shí)間呢?畢竟不是所有人都是基礎(chǔ)科學(xué)工作者,大部分使用場(chǎng)景還是在工業(yè)應(yīng)用中。所以簡(jiǎn)單易用是一個(gè)很重要的特性,這也就是其他上層封裝庫(kù)的價(jià)值所在:不需要總是從最基礎(chǔ)的tensor粒度開(kāi)始設(shè)計(jì)網(wǎng)絡(luò),而是從更上層的Layer粒度設(shè)計(jì)網(wǎng)絡(luò)。
Torch
官方網(wǎng)址:http://torch.ch/
GitHub:github.com/torch/torch7
Torch給自己的定位是LuaJIT上的一個(gè)高效的科學(xué)計(jì)算庫(kù),支持大量的機(jī)器學(xué)習(xí)算法,同時(shí)以GPU上的計(jì)算優(yōu)先。Torch的歷史非常悠久,但真正得到發(fā)揚(yáng)光大是在Facebook開(kāi)源了其深度學(xué)習(xí)的組件之后,此后包括Google、Twitter、NYU、IDIAP、Purdue等組織都大量使用Torch。Torch的目標(biāo)是讓設(shè)計(jì)科學(xué)計(jì)算算法變得便捷,它包含了大量的機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺(jué)、信號(hào)處理、并行運(yùn)算、圖像、視頻、音頻、網(wǎng)絡(luò)處理的庫(kù),同時(shí)和Caffe類似,Torch擁有大量的訓(xùn)練好的深度學(xué)習(xí)模型。它可以支持設(shè)計(jì)非常復(fù)雜的神經(jīng)網(wǎng)絡(luò)的拓?fù)鋱D結(jié)構(gòu),再并行化到CPU和GPU上,在Torch上設(shè)計(jì)新的Layer是相對(duì)簡(jiǎn)單的。
它和TensorFlow一樣使用了底層C++加上層腳本語(yǔ)言調(diào)用的方式,只不過(guò)Torch使用的是Lua。Lua的性能是非常優(yōu)秀的(該語(yǔ)言經(jīng)常被用來(lái)開(kāi)發(fā)游戲),常見(jiàn)的代碼可以通過(guò)透明的JIT優(yōu)化達(dá)到C的性能的80%;在便利性上,Lua的語(yǔ)法也非常簡(jiǎn)單易讀,擁有漂亮和統(tǒng)一的結(jié)構(gòu),易于掌握,比寫C/C++簡(jiǎn)潔很多;同時(shí),Lua擁有一個(gè)非常直接的調(diào)用C程序的接口,可以簡(jiǎn)便地使用大量基于C的庫(kù),因?yàn)榈讓雍诵氖荂寫的,因此也可以方便地移植到各種環(huán)境。Lua支持Linux、Mac,還支持各種嵌入式系統(tǒng)(iOS、Android、FPGA等),只不過(guò)運(yùn)行時(shí)還是必須有LuaJIT的環(huán)境,所以工業(yè)生產(chǎn)環(huán)境的使用相對(duì)較少,沒(méi)有Caffe和TensorFlow那么多。
為什么不簡(jiǎn)單地使用Python而是使用LuaJIT呢?官方給出了以下幾點(diǎn)理由。
LuaJIT的通用計(jì)算性能遠(yuǎn)勝于Python,而且可以直接在LuaJIT中操作C的pointers。
Torch的框架,包含Lua是自洽的,而完全基于Python的程序?qū)Σ煌脚_(tái)、系統(tǒng)移植性較差,依賴的外部庫(kù)較多。
LuaJIT的FFI拓展接口非常易學(xué),可以方便地鏈接其他庫(kù)到Torch中。Torch中還專門設(shè)計(jì)了N-Dimension array type的對(duì)象Tensor,Torch中的Tensor是一塊內(nèi)存的視圖,同時(shí)一塊內(nèi)存可能有許多視圖(Tensor)指向它,這樣的設(shè)計(jì)同時(shí)兼顧了性能(直接面向內(nèi)存)和便利性。同時(shí),Torch還提供了不少相關(guān)的庫(kù),包括線性代數(shù)、卷積、傅里葉變換、繪圖和統(tǒng)計(jì)等,如圖2-5所示。
圖2-5 Torch提供的各種數(shù)據(jù)處理的庫(kù)
Torch的nn庫(kù)支持神經(jīng)網(wǎng)絡(luò)、自編碼器、線性回歸、卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等,同時(shí)支持定制的損失函數(shù)及梯度計(jì)算。Torch因?yàn)槭褂昧薒uaJIT,因此用戶在Lua中做數(shù)據(jù)預(yù)處理等操作可以隨意使用循環(huán)等操作,而不必像在Python中那樣擔(dān)心性能問(wèn)題,也不需要學(xué)習(xí)Python中各種加速運(yùn)算的庫(kù)。不過(guò),Lua相比Python還不是那么主流,對(duì)大多數(shù)用戶有學(xué)習(xí)成本。Torch在CPU上的計(jì)算會(huì)使用OpenMP、SSE進(jìn)行優(yōu)化,GPU上使用CUDA、cutorch、cunn、cuDNN進(jìn)行優(yōu)化,同時(shí)還有cuda-convnet的wrapper。
Torch有很多第三方的擴(kuò)展可以支持RNN,使得Torch基本支持所有主流的網(wǎng)絡(luò)。和Caffe類似的是,Torch也是主要基于Layer的連接來(lái)定義網(wǎng)絡(luò)的。Torch中新的Layer依然需要用戶自己實(shí)現(xiàn),不過(guò)定義新Layer和定義網(wǎng)絡(luò)的方式很相似,非常簡(jiǎn)便,不像Caffe那么麻煩,用戶需要使用C++或者CUDA定義新Layer。同時(shí),Torch屬于命令式編程模式,不像Theano、TensorFlow屬于聲明性編程(計(jì)算圖是預(yù)定義的靜態(tài)的結(jié)構(gòu)),所以用它實(shí)現(xiàn)某些復(fù)雜操作(比如beam search)比Theano和TensorFlow方便很多。
Keras
官方網(wǎng)址:keras.io
GitHub:github.com/fchollet/keras
Keras是一個(gè)崇尚極簡(jiǎn)、高度模塊化的神經(jīng)網(wǎng)絡(luò)庫(kù),使用Python實(shí)現(xiàn),并可以同時(shí)運(yùn)行在TensorFlow和Theano上。它旨在讓用戶進(jìn)行最快速的原型實(shí)驗(yàn),讓想法變?yōu)榻Y(jié)果的這個(gè)過(guò)程最短。Theano和TensorFlow的計(jì)算圖支持更通用的計(jì)算,而Keras則專精于深度學(xué)習(xí)。Theano和TensorFlow更像是深度學(xué)習(xí)領(lǐng)域的NumPy,而Keras則是這個(gè)領(lǐng)域的Scikit-learn。它提供了目前為止最方便的API,用戶只需要將高級(jí)的模塊拼在一起,就可以設(shè)計(jì)神經(jīng)網(wǎng)絡(luò),它大大降低了編程開(kāi)銷(code overhead)和閱讀別人代碼時(shí)的理解開(kāi)銷(cognitive overhead)。
它同時(shí)支持卷積網(wǎng)絡(luò)和循環(huán)網(wǎng)絡(luò),支持級(jí)聯(lián)的模型或任意的圖結(jié)構(gòu)的模型(可以讓某些數(shù)據(jù)跳過(guò)某些Layer和后面的Layer對(duì)接,使得創(chuàng)建Inception等復(fù)雜網(wǎng)絡(luò)變得容易),從CPU上計(jì)算切換到GPU加速無(wú)須任何代碼的改動(dòng)。因?yàn)榈讓邮褂肨heano或TensorFlow,用Keras訓(xùn)練模型相比于前兩者基本沒(méi)有什么性能損耗(還可以享受前兩者持續(xù)開(kāi)發(fā)帶來(lái)的性能提升),只是簡(jiǎn)化了編程的復(fù)雜度,節(jié)約了嘗試新網(wǎng)絡(luò)結(jié)構(gòu)的時(shí)間??梢哉f(shuō)模型越復(fù)雜,使用Keras的收益就越大,尤其是在高度依賴權(quán)值共享、多模型組合、多任務(wù)學(xué)習(xí)等模型上,Keras表現(xiàn)得非常突出。
Keras所有的模塊都是簡(jiǎn)潔、易懂、完全可配置、可隨意插拔的,并且基本上沒(méi)有任何使用限制,神經(jīng)網(wǎng)絡(luò)、損失函數(shù)、優(yōu)化器、初始化方法、激活函數(shù)和正則化等模塊都是可以自由組合的。Keras也包括絕大部分state-of-the-art的Trick,包括Adam、RMSProp、Batch Normalization、PReLU、ELU、LeakyReLU等。同時(shí),新的模塊也很容易添加,這讓Keras非常適合最前沿的研究。Keras中的模型也都是在Python中定義的,不像Caffe、CNTK等需要額外的文件來(lái)定義模型,這樣就可以通過(guò)編程的方式調(diào)試模型結(jié)構(gòu)和各種超參數(shù)。
在Keras中,只需要幾行代碼就能實(shí)現(xiàn)一個(gè)MLP,或者十幾行代碼實(shí)現(xiàn)一個(gè)AlexNet,這在其他深度學(xué)習(xí)框架中基本是不可能完成的任務(wù)。Keras最大的問(wèn)題可能是目前無(wú)法直接使用多GPU,所以對(duì)大規(guī)模的數(shù)據(jù)處理速度沒(méi)有其他支持多GPU和分布式的框架快。Keras的編程模型設(shè)計(jì)和Torch很像,但是相比Torch,Keras構(gòu)建在Python上,有一套完整的科學(xué)計(jì)算工具鏈,而Torch的編程語(yǔ)言Lua并沒(méi)有這樣一條科學(xué)計(jì)算工具鏈。無(wú)論從社區(qū)人數(shù),還是活躍度來(lái)看,Keras目前的增長(zhǎng)速度都已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)了Torch。
MXNet
官網(wǎng)網(wǎng)址:mxnet.io
GitHub:github.com/dmlc/mxnet
MXNet是DMLC(Distributed Machine Learning Community)開(kāi)發(fā)的一款開(kāi)源的、輕量級(jí)、可移植的、靈活的深度學(xué)習(xí)庫(kù),它讓用戶可以混合使用符號(hào)編程模式和指令式編程模式來(lái)最大化效率和靈活性,目前已經(jīng)是AWS官方推薦的深度學(xué)習(xí)框架。
MXNet的很多作者都是中國(guó)人,其最大的貢獻(xiàn)組織為百度,同時(shí)很多作者來(lái)自cxxnet、minerva和purine2等深度學(xué)習(xí)項(xiàng)目,可謂博采眾家之長(zhǎng)。它是各個(gè)框架中率先支持多GPU和分布式的,同時(shí)其分布式性能也非常高。MXNet的核心是一個(gè)動(dòng)態(tài)的依賴調(diào)度器,支持自動(dòng)將計(jì)算任務(wù)并行化到多個(gè)GPU或分布式集群(支持AWS、Azure、Yarn等)。
它上層的計(jì)算圖優(yōu)化算法可以讓符號(hào)計(jì)算執(zhí)行得非???,而且節(jié)約內(nèi)存,開(kāi)啟mirror模式會(huì)更加省內(nèi)存,甚至可以在某些小內(nèi)存GPU上訓(xùn)練其他框架因顯存不夠而訓(xùn)練不了的深度學(xué)習(xí)模型,也可以在移動(dòng)設(shè)備(Android、iOS)上運(yùn)行基于深度學(xué)習(xí)的圖像識(shí)別等任務(wù)。
此外,MXNet的一個(gè)很大的優(yōu)點(diǎn)是支持非常多的語(yǔ)言封裝,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可謂非常全面,基本主流的腳本語(yǔ)言全部都支持了。在MXNet中構(gòu)建一個(gè)網(wǎng)絡(luò)需要的時(shí)間可能比Keras、Torch這類高度封裝的框架要長(zhǎng),但是比直接用Theano等要快。MXNet的各級(jí)系統(tǒng)架構(gòu)(下面為硬件及操作系統(tǒng)底層,逐層向上為越來(lái)越抽象的接口)如圖2-6所示。
圖2-6 MXNet系統(tǒng)架構(gòu)
CNTK
官方網(wǎng)址:cntk.ai
GitHub:github.com/Microsoft/CNTK
CNTK(Computational Network Toolkit)是微軟研究院(MSR)開(kāi)源的深度學(xué)習(xí)框架。它最早由start the deep learning craze的演講人創(chuàng)建,目前已經(jīng)發(fā)展成一個(gè)通用的、跨平臺(tái)的深度學(xué)習(xí)系統(tǒng),在語(yǔ)音識(shí)別領(lǐng)域的使用尤其廣泛。CNTK通過(guò)一個(gè)有向圖將神經(jīng)網(wǎng)絡(luò)描述為一系列的運(yùn)算操作,這個(gè)有向圖中子節(jié)點(diǎn)代表輸入或網(wǎng)絡(luò)參數(shù),其他節(jié)點(diǎn)代表各種矩陣運(yùn)算。CNTK支持各種前饋網(wǎng)絡(luò),包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自動(dòng)求解梯度。CNTK有豐富的細(xì)粒度的神經(jīng)網(wǎng)絡(luò)組件,使得用戶不需要寫底層的C++或CUDA,就能通過(guò)組合這些組件設(shè)計(jì)新的復(fù)雜的Layer。CNTK擁有產(chǎn)品級(jí)的代碼質(zhì)量,支持多機(jī)、多GPU的分布式訓(xùn)練。
CNTK設(shè)計(jì)是性能導(dǎo)向的,在CPU、單GPU、多GPU,以及GPU集群上都有非常優(yōu)異的表現(xiàn)。同時(shí)微軟最近推出的1-bit compression技術(shù)大大降低了通信代價(jià),讓大規(guī)模并行訓(xùn)練擁有了很高的效率。CNTK同時(shí)宣稱擁有很高的靈活度,它和Caffe一樣通過(guò)配置文件定義網(wǎng)絡(luò)結(jié)構(gòu),再通過(guò)命令行程序執(zhí)行訓(xùn)練,支持構(gòu)建任意的計(jì)算圖,支持AdaGrad、RmsProp等優(yōu)化方法。它的另一個(gè)重要特性就是拓展性,CNTK除了內(nèi)置的大量運(yùn)算核,還允許用戶定義他們自己的計(jì)算節(jié)點(diǎn),支持高度的定制化。
CNTK在2016年9月發(fā)布了對(duì)強(qiáng)化學(xué)習(xí)的支持,同時(shí),除了通過(guò)寫配置文件的方式定義網(wǎng)絡(luò)結(jié)構(gòu),CNTK還將支持其他語(yǔ)言的綁定,包括Python、C++和C#,這樣用戶就可以用編程的方式設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)。CNTK與Caffe一樣也基于C++并且跨平臺(tái),大部分情況下,它的部署非常簡(jiǎn)單。PC上支持Linux、Mac和Windows,但是它目前不支持ARM架構(gòu),限制了其在移動(dòng)設(shè)備上的發(fā)揮。圖2-7所示為CNTK目前的總體架構(gòu)圖。
圖2-7 CNTK的總體架構(gòu)圖
CNTK原生支持多GPU和分布式,從官網(wǎng)公布的對(duì)比評(píng)測(cè)來(lái)看,性能非常不錯(cuò)。在多GPU方面,CNTK相對(duì)于其他的深度學(xué)習(xí)庫(kù)表現(xiàn)得更突出,它實(shí)現(xiàn)了1-bit SGD和自適應(yīng)的mini-batching。圖2-8所示為CNTK官網(wǎng)公布的在2015年12月的各個(gè)框架的性能對(duì)比。在當(dāng)時(shí),CNTK是唯一支持單機(jī)8塊GPU的框架,并且在分布式系統(tǒng)中可以超越8塊GPU的性能。
圖2-8 CNTK與各個(gè)框架的性能對(duì)比
Deeplearning4J
官方網(wǎng)址:http://deeplearning4j.org/
GitHub: github.com/deeplearning4j/deeplearning4j
Deeplearning4J(簡(jiǎn)稱DL4J)是一個(gè)基于Java和Scala的開(kāi)源的分布式深度學(xué)習(xí)庫(kù),由Skymind于2014年6月發(fā)布,其核心目標(biāo)是創(chuàng)建一個(gè)即插即用的解決方案原型。埃森哲、雪弗蘭、博斯咨詢和IBM等都是DL4J的客戶。DL4J擁有一個(gè)多用途的n-dimensional array的類,可以方便地對(duì)數(shù)據(jù)進(jìn)行各種操作;擁有多種后端計(jì)算核心,用以支持CPU及GPU加速,在圖像識(shí)別等訓(xùn)練任務(wù)上的性能與Caffe相當(dāng);可以與Hadoop及Spark自動(dòng)整合,同時(shí)可以方便地在現(xiàn)有集群(包括但不限于AWS,Azure等)上進(jìn)行擴(kuò)展,同時(shí)DL4J的并行化是根據(jù)集群的節(jié)點(diǎn)和連接自動(dòng)優(yōu)化,不像其他深度學(xué)習(xí)庫(kù)那樣可能需要用戶手動(dòng)調(diào)整。
DL4J選擇Java作為其主要語(yǔ)言的原因是,目前基于Java的分布式計(jì)算、云計(jì)算、大數(shù)據(jù)的生態(tài)非常龐大。用戶可能擁有大量的基于Hadoop和Spark的集群,因此在這類集群上搭建深度學(xué)習(xí)平臺(tái)的需求便很容易被DL4J滿足。同時(shí)JVM的生態(tài)圈內(nèi)還有數(shù)不勝數(shù)的Library的支持,而DL4J也創(chuàng)建了ND4J,可以說(shuō)是JVM中的NumPy,支持大規(guī)模的矩陣運(yùn)算。此外,DL4J還有商業(yè)版的支持,付費(fèi)用戶在出現(xiàn)問(wèn)題時(shí)可以通過(guò)電話咨詢尋求支持。
作者介紹
黃文堅(jiān),PPmoney大數(shù)據(jù)算法總監(jiān),負(fù)責(zé)集團(tuán)的風(fēng)控、理財(cái)、互聯(lián)網(wǎng)證券等業(yè)務(wù)的數(shù)據(jù)挖掘工作。Google TensorFlow Contributor。前明略數(shù)據(jù)技術(shù)合伙人,領(lǐng)導(dǎo)了對(duì)諸多大型銀行、保險(xiǎn)公司、基金的數(shù)據(jù)挖掘項(xiàng)目,包括建立金融風(fēng)控模型、新聞?shì)浨榉治?、保險(xiǎn)復(fù)購(gòu)預(yù)測(cè)等。曾就職于阿里巴巴搜索引擎算法團(tuán)隊(duì),負(fù)責(zé)天貓個(gè)性化搜索系統(tǒng)。曾參加阿里巴巴大數(shù)據(jù)推薦算法大賽,于7000多支隊(duì)伍中獲得前10名。本科、研究生就讀于香港科技大學(xué),曾在頂級(jí)會(huì)議和期刊SIGMOBILE MobiCom、IEEE Transactions on Image Processing發(fā)表論文,研究成果獲美國(guó)計(jì)算機(jī)協(xié)會(huì)移動(dòng)計(jì)算大會(huì)(MobiCom)最佳移動(dòng)應(yīng)用技術(shù)冠軍,并獲得兩項(xiàng)美國(guó)專利和一項(xiàng)中國(guó)專利。
唐源,目前在芝加哥的Uptake公司帶領(lǐng)團(tuán)隊(duì)建立用于多個(gè)物聯(lián)網(wǎng)領(lǐng)域的數(shù)據(jù)科學(xué)引擎進(jìn)行條件和健康監(jiān)控,也建立了公司的預(yù)測(cè)模型引擎,現(xiàn)在被用于航空、能源等大型機(jī)械領(lǐng)域。一直活躍在開(kāi)源軟件社區(qū),是TensorFlow和DMLC的成員,是TensorFlow、XGBoost、MXNet等軟件的committer,TF.Learn、ggfortify等軟件的作者,以及caret、pandas等軟件的貢獻(xiàn)者。曾獲得谷歌Open Source Peer Bonus,以及多項(xiàng)高校和企業(yè)編程競(jìng)賽的獎(jiǎng)項(xiàng)。在美國(guó)賓州州立大學(xué)獲得榮譽(yù)數(shù)學(xué)學(xué)位,曾在本科學(xué)習(xí)期間成為創(chuàng)業(yè)公司DataNovo的核心創(chuàng)始成員,研究專利數(shù)據(jù)挖掘、無(wú)關(guān)鍵字現(xiàn)有技術(shù)搜索、策略推薦等。