2017年1月,F(xiàn)acebook人工智能研究院(FAIR)團(tuán)隊(duì)在GitHub上開源了PyTorch,并迅速占領(lǐng)GitHub熱度榜榜首。 作為一個(gè)2017年才發(fā)布,具有先進(jìn)設(shè)計(jì)理念的框架,PyTorch的歷史可追溯到2002年就誕生于紐約大學(xué)的Torch。Torch使用了一種不是很大眾的語言Lua作為接口。Lua簡(jiǎn)潔高效,但由于其過于小眾,用的人不是很多,以至于很多人聽說要掌握Torch必須新學(xué)一門語言就望而卻步(其實(shí)Lua是一門比Python還簡(jiǎn)單的語言)。 考慮到Python在計(jì)算科學(xué)領(lǐng)域的領(lǐng)先地位,以及其生態(tài)完整性和接口易用性,幾乎任何框架都不可避免地要提供Python接口。終于,在2017年,Torch的幕后團(tuán)隊(duì)推出了PyTorch。PyTorch不是簡(jiǎn)單地封裝Lua Torch提供Python接口,而是對(duì)Tensor之上的所有模塊進(jìn)行了重構(gòu),并新增了最先進(jìn)的自動(dòng)求導(dǎo)系統(tǒng),成為當(dāng)下最流行的動(dòng)態(tài)圖框架。 PyTorch一經(jīng)推出就立刻引起了廣泛關(guān)注,并迅速在研究領(lǐng)域流行起來。圖1所示為Google指數(shù),PyTorch自發(fā)布起關(guān)注度就在不斷上升,截至2017年10月18日,PyTorch的熱度已然超越了其他三個(gè)框架(Caffe、MXNet和Theano),并且其熱度還在持續(xù)上升中。 圖 1 PyTorch 和 Caffe、Theano、MXNet 的 Google 指數(shù)對(duì)比(類別為科學(xué))
隨著深度學(xué)習(xí)的發(fā)展,深度學(xué)習(xí)框架如雨后春筍般誕生于高校和公司中。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學(xué)習(xí)重點(diǎn)投資了一系列新興項(xiàng)目,他們也一直在支持一些開源的深度學(xué)習(xí)框架。 目前研究人員正在使用的深度學(xué)習(xí)框架不盡相同,有 TensorFlow 、Caffe、Theano、Keras等,常見的深度學(xué)習(xí)框架如圖2所示。這些深度學(xué)習(xí)框架被應(yīng)用于計(jì)算機(jī)視覺、語音識(shí)別、自然語言處理與生物信息學(xué)等領(lǐng)域,并獲取了極好的效果。本部分主要介紹當(dāng)前深度學(xué)習(xí)領(lǐng)域影響力比較大的幾個(gè)框架,限于筆者個(gè)人使用經(jīng)驗(yàn)和了解程度,對(duì)各個(gè)框架的評(píng)價(jià)可能有不準(zhǔn)確的地方。 圖 2 常見的深度學(xué)習(xí)框架 1 . Theano Theano最初誕生于蒙特利爾大學(xué) LISA 實(shí)驗(yàn)室,于2008年開始開發(fā),是第一個(gè)有較大影響力的Python深度學(xué)習(xí)框架。 Theano 是一個(gè) Python 庫,可用于定義、優(yōu)化和計(jì)算數(shù)學(xué)表達(dá)式,特別是多維數(shù)組(numpy.ndarray)。在解決包含大量數(shù)據(jù)的問題時(shí),使用 Theano 編程可實(shí)現(xiàn)比手寫 C 語言更快的速度,而通過 GPU 加速,Theano 甚至可以比基于 CPU 計(jì)算的 C 語言快上好幾個(gè)數(shù)量級(jí)。Theano 結(jié)合了計(jì)算機(jī)代數(shù)系統(tǒng)(Computer Algebra System,CAS)和優(yōu)化編譯器,還可以為多種數(shù)學(xué)運(yùn)算生成定制的 C 語言代碼。對(duì)于包含重復(fù)計(jì)算的復(fù)雜數(shù)學(xué)表達(dá)式的任務(wù)而言,計(jì)算速度很重要,因此這種 CAS 和優(yōu)化編譯器的組合是很有用的。對(duì)需要將每一種不同的數(shù)學(xué)表達(dá)式都計(jì)算一遍的情況,Theano 可以最小化編譯/解析的計(jì)算量,但仍然會(huì)給出如自動(dòng)微分那樣的符號(hào)特征。 Theano誕生于研究機(jī)構(gòu),服務(wù)于研究人員,其設(shè)計(jì)具有較濃厚的學(xué)術(shù)氣息,但在工程設(shè)計(jì)上有較大的缺陷。一直以來,Theano因難調(diào)試、構(gòu)建圖慢等缺點(diǎn)為人所詬病。為了加速深度學(xué)習(xí)研究,人們?cè)谒幕A(chǔ)之上,開發(fā)了Lasagne、Blocks、PyLearn2和Keras等第三方框架,這些框架以Theano為基礎(chǔ),提供了更好的封裝接口以方便用戶使用。 2017年9月28日,在Theano 1.0正式版即將發(fā)布前夕,LISA實(shí)驗(yàn)室負(fù)責(zé)人,深度學(xué)習(xí)三巨頭之一的Yoshua Bengio 宣布Theano即將停止開發(fā):“Theano is Dead”。盡管Theano即將退出歷史舞臺(tái),但作為第一個(gè)Python深度學(xué)習(xí)框架,它很好地完成了自己的使命,為深度學(xué)習(xí)研究人員的早期拓荒提供了極大的幫助,同時(shí)也為之后深度學(xué)習(xí)框架的開發(fā)奠定了基本設(shè)計(jì)方向: 以計(jì)算圖為框架的核心,采用GPU加速計(jì)算。 2017年11月,LISA實(shí)驗(yàn)室在 GitHub 上開啟了一個(gè)初學(xué)者入門項(xiàng)目,旨在幫助實(shí)驗(yàn)室新生快速掌握機(jī)器學(xué)習(xí)相關(guān)的實(shí)踐基礎(chǔ),而該項(xiàng)目正是使用PyTorch作為教學(xué)框架。
2 TensorFlow 2015年11月10日,Google宣布推出全新的機(jī)器學(xué)習(xí)開源工具TensorFlow。 TensorFlow 最初是由 Google 機(jī)器智能研究部門的 Google Brain 團(tuán)隊(duì)開發(fā),基于Google 2011年開發(fā)的深度學(xué)習(xí)基礎(chǔ)架構(gòu)DistBelief構(gòu)建起來的。TensorFlow主要用于進(jìn)行機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)研究, 但它是一個(gè)非?;A(chǔ)的系統(tǒng),因此也可以應(yīng)用于眾多領(lǐng)域。由于Google在深度學(xué)習(xí)領(lǐng)域的巨大影響力和強(qiáng)大的推廣能力,TensorFlow一經(jīng)推出就獲得了極大的關(guān)注,并迅速成為如今用戶最多的深度學(xué)習(xí)框架。 TensorFlow在很大程度上可以看作Theano的后繼者,不僅因?yàn)樗鼈冇泻艽笠慌餐拈_發(fā)者,而且它們還擁有相近的設(shè)計(jì)理念,都是基于計(jì)算圖實(shí)現(xiàn)自動(dòng)微分系統(tǒng)。TensorFlow 使用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算,圖中的節(jié)點(diǎn)代表數(shù)學(xué)運(yùn)算, 而圖中的邊則代表在這些節(jié)點(diǎn)之間傳遞的多維數(shù)組(張量)。 TensorFlow編程接口支持Python和C 。隨著1.0版本的公布,Java、Go、R和Haskell API的alpha版本也被支持。此外,TensorFlow還可在Google Cloud和AWS中運(yùn)行。TensorFlow還支持 Windows 7、Windows 10和Windows Server 2016。由于TensorFlow使用C Eigen庫,所以庫可在ARM架構(gòu)上編譯和優(yōu)化。這也就意味著用戶可以在各種服務(wù)器和移動(dòng)設(shè)備上部署自己的訓(xùn)練模型,無須執(zhí)行單獨(dú)的模型解碼器或者加載Python解釋器。 作為當(dāng)前最流行的深度學(xué)習(xí)框架,TensorFlow獲得了極大的成功,對(duì)它的批評(píng)也不絕于耳,總結(jié)起來主要有以下四點(diǎn)。
由于直接使用TensorFlow的生產(chǎn)力過于低下,包括Google官方等眾多開發(fā)者嘗試基于TensorFlow構(gòu)建一個(gè)更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等數(shù)不勝數(shù)的第三方框架每隔幾個(gè)月就會(huì)在新聞中出現(xiàn)一次,但是又大多歸于沉寂,至今TensorFlow仍沒有一個(gè)統(tǒng)一易用的接口。 憑借Google著強(qiáng)大的推廣能力,TensorFlow已經(jīng)成為當(dāng)今最炙手可熱的深度學(xué)習(xí)框架,但是由于自身的缺陷,TensorFlow離最初的設(shè)計(jì)目標(biāo)還很遙遠(yuǎn)。另外,由于Google對(duì)TensorFlow略顯嚴(yán)格的把控,目前各大公司都在開發(fā)自己的深度學(xué)習(xí)框架。
3 . Keras Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API,由純Python編寫而成并使用TensorFlow、Theano及CNTK作為后端。Keras為支持快速實(shí)驗(yàn)而生,能夠把想法迅速轉(zhuǎn)換為結(jié)果。Keras應(yīng)該是深度學(xué)習(xí)框架之中最容易上手的一個(gè),它提供了一致而簡(jiǎn)潔的API, 能夠極大地減少一般應(yīng)用下用戶的工作量,避免用戶重復(fù)造輪子。 嚴(yán)格意義上講,Keras并不能稱為一個(gè)深度學(xué)習(xí)框架,它更像一個(gè)深度學(xué)習(xí)接口,它構(gòu)建于第三方框架之上。Keras的缺點(diǎn)很明顯:過度封裝導(dǎo)致喪失靈活性。Keras最初作為Theano的高級(jí)API而誕生,后來增加了TensorFlow和CNTK作為后端。為了屏蔽后端的差異性,提供一致的用戶接口,Keras做了層層封裝,導(dǎo)致用戶在新增操作或是獲取底層的數(shù)據(jù)信息時(shí)過于困難。同時(shí),過度封裝也使得Keras的程序過于緩慢,許多BUG都隱藏于封裝之中,在絕大多數(shù)場(chǎng)景下,Keras是本文介紹的所有框架中最慢的一個(gè)。 學(xué)習(xí)Keras十分容易,但是很快就會(huì)遇到瓶頸,因?yàn)樗鄙凫`活性。另外,在使用Keras的大多數(shù)時(shí)間里,用戶主要是在調(diào)用接口,很難真正學(xué)習(xí)到深度學(xué)習(xí)的內(nèi)容。
4 . Caffe/Caffe2 Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個(gè)清晰、高效的深度學(xué)習(xí)框架,核心語言是C ,它支持命令行、Python和MATLAB接口,既可以在CPU上運(yùn)行,也可以在GPU上運(yùn)行。 Caffe的優(yōu)點(diǎn)是簡(jiǎn)潔快速,缺點(diǎn)是缺少靈活性。不同于Keras因?yàn)樘嗟姆庋b導(dǎo)致靈活性喪失,Caffe靈活性的缺失主要是因?yàn)樗脑O(shè)計(jì)。在Caffe中最主要的抽象對(duì)象是層,每實(shí)現(xiàn)一個(gè)新的層,必須要利用C 實(shí)現(xiàn)它的前向傳播和反向傳播代碼,而如果想要新層運(yùn)行在GPU上,還需要同時(shí)利用CUDA實(shí)現(xiàn)這一層的前向傳播和反向傳播。這種限制使得不熟悉C 和CUDA的用戶擴(kuò)展Caffe十分困難。 Caffe憑借其易用性、簡(jiǎn)潔明了的源碼、出眾的性能和快速的原型設(shè)計(jì)獲取了眾多用戶,曾經(jīng)占據(jù)深度學(xué)習(xí)領(lǐng)域的半壁江山。但是在深度學(xué)習(xí)新時(shí)代到來之時(shí),Caffe已經(jīng)表現(xiàn)出明顯的力不從心,諸多問題逐漸顯現(xiàn)(包括靈活性缺失、擴(kuò)展難、依賴眾多環(huán)境難以配置、應(yīng)用局限等)。盡管現(xiàn)在在GitHub上還能找到許多基于Caffe的項(xiàng)目,但是新的項(xiàng)目已經(jīng)越來越少。 Caffe的作者從加州大學(xué)伯克利分校畢業(yè)后加入了Google,參與過TensorFlow的開發(fā),后來離開Google加入FAIR,擔(dān)任工程主管,并開發(fā)了Caffe2。Caffe2是一個(gè)兼具表現(xiàn)力、速度和模塊性的開源深度學(xué)習(xí)框架。它沿襲了大量的 Caffe 設(shè)計(jì),可解決多年來在 Caffe 的使用和部署中發(fā)現(xiàn)的瓶頸問題。Caffe2的設(shè)計(jì)追求輕量級(jí),在保有擴(kuò)展性和高性能的同時(shí),Caffe2 也強(qiáng)調(diào)了便攜性。Caffe2 從一開始就以性能、擴(kuò)展、移動(dòng)端部署作為主要設(shè)計(jì)目標(biāo)。Caffe2 的核心 C 庫能提供速度和便攜性,而其 Python 和 C API 使用戶可以輕松地在 Linux、Windows、iOS、Android ,甚至 Raspberry Pi 和 NVIDIA Tegra 上進(jìn)行原型設(shè)計(jì)、訓(xùn)練和部署。 Caffe2繼承了Caffe的優(yōu)點(diǎn),在速度上令人印象深刻。Facebook 人工智能實(shí)驗(yàn)室與應(yīng)用機(jī)器學(xué)習(xí)團(tuán)隊(duì)合作,利用Caffe2大幅加速機(jī)器視覺任務(wù)的模型訓(xùn)練過程,僅需 1 小時(shí)就訓(xùn)練完ImageNet 這樣超大規(guī)模的數(shù)據(jù)集。然而盡管已經(jīng)發(fā)布半年多,開發(fā)一年多,Caffe2仍然是一個(gè)不太成熟的框架,官網(wǎng)至今沒提供完整的文檔,安裝也比較麻煩,編譯過程時(shí)常出現(xiàn)異常,在GitHub上也很少找到相應(yīng)的代碼。 極盛的時(shí)候,Caffe占據(jù)了計(jì)算機(jī)視覺研究領(lǐng)域的半壁江山,雖然如今Caffe已經(jīng)很少用于學(xué)術(shù)界,但是仍有不少計(jì)算機(jī)視覺相關(guān)的論文使用Caffe。由于其穩(wěn)定、出眾的性能,不少公司還在使用Caffe部署模型。Caffe2盡管做了許多改進(jìn),但是還遠(yuǎn)沒有達(dá)到替代Caffe的地步。
5 . MXNet MXNet是一個(gè)深度學(xué)習(xí)庫,支持C 、Python、R、Scala、Julia、MATLAB及JavaScript等語言;支持命令和符號(hào)編程;可以運(yùn)行在CPU、GPU、集群、服務(wù)器、臺(tái)式機(jī)或者移動(dòng)設(shè)備上。MXNet是CXXNet的下一代,CXXNet借鑒了Caffe的思想,但是在實(shí)現(xiàn)上更干凈。在2014 年的NIPS 上,同為上海交大校友的陳天奇與李沐碰頭,討論到各自在做深度學(xué)習(xí) Toolkits 的項(xiàng)目組,發(fā)現(xiàn)大家普遍在做很多重復(fù)性的工作,例如文件 loading 等。于是他們決定組建 DMLC【Distributied (Deep) Machine Learning Community】,號(hào)召大家一起合作開發(fā) MXNet,發(fā)揮各自的特長(zhǎng),避免重復(fù)造輪子。 MXNet以其超強(qiáng)的分布式支持,明顯的內(nèi)存、顯存優(yōu)化為人所稱道。同樣的模型,MXNet往往占用更小的內(nèi)存和顯存,并且在分布式環(huán)境下,MXNet展現(xiàn)出了明顯優(yōu)于其他框架的擴(kuò)展性能。 由于MXNet最初由一群學(xué)生開發(fā),缺乏商業(yè)應(yīng)用,極大地限制了MXNet的使用。2016年11月,MXNet被AWS正式選擇為其云計(jì)算的官方深度學(xué)習(xí)平臺(tái)。2017年1月,MXNet項(xiàng)目進(jìn)入Apache基金會(huì),成為Apache的孵化器項(xiàng)目。 盡管MXNet擁有最多的接口,也獲得了不少人的支持,但其始終處于一種不溫不火的狀態(tài)。個(gè)人認(rèn)為這在很大程度上歸結(jié)于推廣不給力及接口文檔不夠完善。MXNet長(zhǎng)期處于快速迭代的過程,其文檔卻長(zhǎng)時(shí)間未更新,導(dǎo)致新手用戶難以掌握MXNet,老用戶常常需要查閱源碼才能真正理解MXNet接口的用法。 為了完善MXNet的生態(tài)圈,推廣MXNet,MXNet先后推出了包括MinPy、Keras和Gluon等諸多接口,但前兩個(gè)接口目前基本停止了開發(fā),Gluon模仿PyTorch的接口設(shè)計(jì),MXNet的作者李沐更是親自上陣,在線講授如何從零開始利用Gluon學(xué)習(xí)深度學(xué)習(xí),誠(chéng)意滿滿,吸引了許多新用戶。
6 . CNTK 2015年8月,微軟公司在CodePlex上宣布由微軟研究院開發(fā)的計(jì)算網(wǎng)絡(luò)工具集CNTK將開源。5個(gè)月后,2016年1月25日,微軟公司在他們的GitHub倉庫上正式開源了CNTK。早在2014年,在微軟公司內(nèi)部,黃學(xué)東博士和他的團(tuán)隊(duì)正在對(duì)計(jì)算機(jī)能夠理解語音的能力進(jìn)行改進(jìn),但當(dāng)時(shí)使用的工具顯然拖慢了他們的進(jìn)度。于是,一組由志愿者組成的開發(fā)團(tuán)隊(duì)構(gòu)想設(shè)計(jì)了他們自己的解決方案,最終誕生了CNTK。 根據(jù)微軟開發(fā)者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要強(qiáng)。CNTK支持CPU和GPU模式,和TensorFlow/Theano一樣,它把神經(jīng)網(wǎng)絡(luò)描述成一個(gè)計(jì)算圖的結(jié)構(gòu),葉子節(jié)點(diǎn)代表輸入或者網(wǎng)絡(luò)參數(shù),其他節(jié)點(diǎn)代表計(jì)算步驟。CNTK 是一個(gè)非常強(qiáng)大的命令行系統(tǒng),可以創(chuàng)建神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)系統(tǒng)。CNTK 最初是出于在 Microsoft 內(nèi)部使用的目的而開發(fā)的,一開始甚至沒有Python接口,而是使用了一種幾乎沒什么人用的語言開發(fā)的,而且文檔有些晦澀難懂,推廣不是很給力,導(dǎo)致現(xiàn)在用戶比較少。但就框架本身的質(zhì)量而言,CNTK表現(xiàn)得比較均衡,沒有明顯的短板,并且在語音領(lǐng)域效果比較突出。
7 . 其他框架 除了上述的幾個(gè)框架,還有不少的框架,都有一定的影響力和用戶。比如百度開源的PaddlePaddle,CMU開發(fā)的DyNet,簡(jiǎn)潔無依賴符合C 11標(biāo)準(zhǔn)的tiny-dnn,使用Java開發(fā)并且文檔極其優(yōu)秀的Deeplearning4J,還有英特爾開源的Nervana,Amazon開源的DSSTNE。這些框架各有優(yōu)缺點(diǎn),但是大多流行度和關(guān)注度不夠,或者局限于一定的領(lǐng)域。此外,還有許多專門針對(duì)移動(dòng)設(shè)備開發(fā)的框架,如CoreML、MDL,這些框架純粹為部署而誕生,不具有通用性,也不適合作為研究工具。
這么多深度學(xué)習(xí)框架,為什么選擇PyTorch呢? 因?yàn)镻yTorch是當(dāng)前難得的簡(jiǎn)潔優(yōu)雅且高效快速的框架。在筆者眼里,PyTorch達(dá)到目前深度學(xué)習(xí)框架的最高水平。當(dāng)前開源的框架中,沒有哪一個(gè)框架能夠在靈活性、易用性、速度這三個(gè)方面有兩個(gè)能同時(shí)超過PyTorch。下面是許多研究人員選擇PyTorch的原因。 ① 簡(jiǎn)潔:PyTorch的設(shè)計(jì)追求最少的封裝,盡量避免重復(fù)造輪子。不像TensorFlow中充斥著session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的設(shè)計(jì)遵循tensor→variable(autograd)→nn.Module 三個(gè)由低到高的抽象層次,分別代表高維數(shù)組(張量)、自動(dòng)求導(dǎo)(變量)和神經(jīng)網(wǎng)絡(luò)(層/模塊),而且這三個(gè)抽象之間聯(lián)系緊密,可以同時(shí)進(jìn)行修改和操作。 簡(jiǎn)潔的設(shè)計(jì)帶來的另外一個(gè)好處就是代碼易于理解。PyTorch的源碼只有TensorFlow的十分之一左右,更少的抽象、更直觀的設(shè)計(jì)使得PyTorch的源碼十分易于閱讀。在筆者眼里,PyTorch的源碼甚至比許多框架的文檔更容易理解。 ② 速度:PyTorch的靈活性不以速度為代價(jià),在許多評(píng)測(cè)中,PyTorch的速度表現(xiàn)勝過TensorFlow和Keras等框架 。框架的運(yùn)行速度和程序員的編碼水平有極大關(guān)系,但同樣的算法,使用PyTorch實(shí)現(xiàn)的那個(gè)更有可能快過用其他框架實(shí)現(xiàn)的。 ③易用:PyTorch是所有的框架中面向?qū)ο笤O(shè)計(jì)的最優(yōu)雅的一個(gè)。PyTorch的面向?qū)ο蟮慕涌谠O(shè)計(jì)來源于Torch,而Torch的接口設(shè)計(jì)以靈活易用而著稱,Keras作者最初就是受Torch的啟發(fā)才開發(fā)了Keras。PyTorch繼承了Torch的衣缽,尤其是API的設(shè)計(jì)和模塊的接口都與Torch高度一致。PyTorch的設(shè)計(jì)最符合人們的思維,它讓用戶盡可能地專注于實(shí)現(xiàn)自己的想法,即所思即所得,不需要考慮太多關(guān)于框架本身的束縛。 ④活躍的社區(qū):PyTorch提供了完整的文檔,循序漸進(jìn)的指南,作者親自維護(hù)的論壇 供用戶交流和求教問題。Facebook 人工智能研究院對(duì)PyTorch提供了強(qiáng)力支持,作為當(dāng)今排名前三的深度學(xué)習(xí)研究機(jī)構(gòu),F(xiàn)AIR的支持足以確保PyTorch獲得持續(xù)的開發(fā)更新,不至于像許多由個(gè)人開發(fā)的框架那樣曇花一現(xiàn)。 在PyTorch推出不到一年的時(shí)間內(nèi),各類深度學(xué)習(xí)問題都有利用PyTorch實(shí)現(xiàn)的解決方案在GitHub上開源。同時(shí)也有許多新發(fā)表的論文采用PyTorch作為論文實(shí)現(xiàn)的工具,PyTorch正在受到越來越多人的追捧 。 如果說 TensorFlow的設(shè)計(jì)是“Make It Complicated”,Keras的設(shè)計(jì)是“Make It Complicated And Hide It”,那么PyTorch的設(shè)計(jì)真正做到了“Keep it Simple,Stupid”。簡(jiǎn)潔即是美。 使用TensorFlow能找到很多別人的代碼,使用PyTorch能輕松實(shí)現(xiàn)自己的想法。 |
|