如此多的深度學習框架,爲什麼我選擇PyTorch?

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/broadview2006/article/details/79147351



小編說:目前研究人員正在使用的深度學習框架不盡相同,本文介紹了6種常見的深度學習框架,PyTorch與他們相比又有哪些優勢呢?本文選自《深度學習框架PyTorch:入門與實踐》

1 PyTorch的誕生

2017年1月,Facebook人工智能研究院(FAIR)團隊在GitHub上開源了PyTorch,並迅速佔領GitHub熱度榜榜首。

作爲一個2017年才發佈,具有先進設計理念的框架,PyTorch的歷史可追溯到2002年就誕生於紐約大學的Torch。Torch使用了一種不是很大衆的語言Lua作爲接口。Lua簡潔高效,但由於其過於小衆,用的人不是很多,以至於很多人聽說要掌握Torch必須新學一門語言就望而卻步(其實Lua是一門比Python還簡單的語言)。

考慮到Python在計算科學領域的領先地位,以及其生態完整性和接口易用性,幾乎任何框架都不可避免地要提供Python接口。終於,在2017年,Torch的幕後團隊推出了PyTorch。PyTorch不是簡單地封裝Lua Torch提供Python接口,而是對Tensor之上的所有模塊進行了重構,並新增了最先進的自動求導系統,成爲當下最流行的動態圖框架。

PyTorch一經推出就立刻引起了廣泛關注,並迅速在研究領域流行起來。圖1-2所示爲Google指數,PyTorch自發布起關注度就在不斷上升,截至2017年10月18日,PyTorch的熱度已然超越了其他三個框架(Caffe、MXNet和Theano),並且其熱度還在持續上升中。


PyTorch 和 Caffe、Theano、MXNet 的 Google 指數對比(類別爲科學)

2 常見的深度學習框架簡介

隨着深度學習的發展,深度學習框架如雨後春筍般誕生於高校和公司中。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源的深度學習框架。

目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow 、Caffe、Theano、Keras等,常見的深度學習框架如圖2所示。這些深度學習框架被應用於計算機視覺、語音識別、自然語言處理與生物信息學等領域,並獲取了極好的效果。本部分主要介紹當前深度學習領域影響力比較大的幾個框架,限於筆者個人使用經驗和了解程度,對各個框架的評價可能有不準確的地方。


常見的深度學習框架

2.1 Theano

Theano最初誕生於蒙特利爾大學 LISA 實驗室,於2008年開始開發,是第一個有較大影響力的Python深度學習框架。

Theano 是一個 Python 庫,可用於定義、優化和計算數學表達式,特別是多維數組(numpy.ndarray)。在解決包含大量數據的問題時,使用 Theano 編程可實現比手寫 C 語言更快的速度,而通過 GPU 加速,Theano 甚至可以比基於 CPU 計算的 C 語言快上好幾個數量級。Theano 結合了計算機代數系統(Computer Algebra System,CAS)和優化編譯器,還可以爲多種數學運算生成定製的 C 語言代碼。對於包含重複計算的複雜數學表達式的任務而言,計算速度很重要,因此這種 CAS 和優化編譯器的組合是很有用的。對需要將每一種不同的數學表達式都計算一遍的情況,Theano 可以最小化編譯/解析的計算量,但仍然會給出如自動微分那樣的符號特徵。

Theano誕生於研究機構,服務於研究人員,其設計具有較濃厚的學術氣息,但在工程設計上有較大的缺陷。一直以來,Theano因難調試、構建圖慢等缺點爲人所詬病。爲了加速深度學習研究,人們在它的基礎之上,開發了Lasagne、Blocks、PyLearn2和Keras等第三方框架,這些框架以Theano爲基礎,提供了更好的封裝接口以方便用戶使用。

2017年9月28日,在Theano 1.0正式版即將發佈前夕,LISA實驗室負責人,深度學習三巨頭之一的Yoshua Bengio 宣佈Theano即將停止開發:“Theano is Dead”。儘管Theano即將退出歷史舞臺,但作爲第一個Python深度學習框架,它很好地完成了自己的使命,爲深度學習研究人員的早期拓荒提供了極大的幫助,同時也爲之後深度學習框架的開發奠定了基本設計方向: 以計算圖爲框架的核心,採用GPU加速計算。

2017年11月,LISA實驗室在 GitHub 上開啓了一個初學者入門項目,旨在幫助實驗室新生快速掌握機器學習相關的實踐基礎,而該項目正是使用PyTorch作爲教學框架。

點評:由於Theano已經停止開發,不建議作爲研究工具繼續學習。

2.2 TensorFlow

2015年11月10日,Google宣佈推出全新的機器學習開源工具TensorFlow。 TensorFlow 最初是由 Google 機器智能研究部門的 Google Brain 團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。TensorFlow主要用於進行機器學習和深度神經網絡研究, 但它是一個非常基礎的系統,因此也可以應用於衆多領域。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成爲如今用戶最多的深度學習框架。

TensorFlow在很大程度上可以看作Theano的後繼者,不僅因爲它們有很大一批共同的開發者,而且它們還擁有相近的設計理念,都是基於計算圖實現自動微分系統。TensorFlow 使用數據流圖進行數值計算,圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維數組(張量)。

TensorFlow編程接口支持Python和C++。隨着1.0版本的公佈,Java、Go、R和Haskell API的alpha版本也被支持。此外,TensorFlow還可在Google Cloud和AWS中運行。TensorFlow還支持 Windows 7、Windows 10和Windows Server 2016。由於TensorFlow使用C++ Eigen庫,所以庫可在ARM架構上編譯和優化。這也就意味着用戶可以在各種服務器和移動設備上部署自己的訓練模型,無須執行單獨的模型解碼器或者加載Python解釋器。

作爲當前最流行的深度學習框架,TensorFlow獲得了極大的成功,對它的批評也不絕於耳,總結起來主要有以下四點。
• 過於複雜的系統設計,TensorFlow 在GitHub代碼倉庫的總代碼量超過100萬行。這麼大的代碼倉庫,對於項目維護者來說維護成爲了一個難以完成的任務,而對讀者來說,學習TensorFlow底層運行機制更是一個極其痛苦的過程,並且大多數時候這種嘗試以放棄告終。
• 頻繁變動的接口。TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向後兼容性,這導致現在許多開源代碼已經無法在新版的TensorFlow上運行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。
• 接口設計過於晦澀難懂。在設計TensorFlow時,創造了圖、會話、命名空間、PlaceHolder等諸多抽象概念,對普通用戶來說難以理解。同一個功能,TensorFlow提供了多種實現,這些實現良莠不齊,使用中還有細微的區別,很容易將用戶帶入坑中。
• 文檔混亂脫節。TensorFlow作爲一個複雜的系統,文檔和教程衆多,但缺乏明顯的條理和層次,雖然查找很方便,但用戶卻很難找到一個真正循序漸進的入門教程。
由於直接使用TensorFlow的生產力過於低下,包括Google官方等衆多開發者嘗試基於TensorFlow構建一個更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等數不勝數的第三方框架每隔幾個月就會在新聞中出現一次,但是又大多歸於沉寂,至今TensorFlow仍沒有一個統一易用的接口。

憑藉Google着強大的推廣能力,TensorFlow已經成爲當今最炙手可熱的深度學習框架,但是由於自身的缺陷,TensorFlow離最初的設計目標還很遙遠。另外,由於Google對TensorFlow略顯嚴格的把控,目前各大公司都在開發自己的深度學習框架。

點評:不完美但最流行的深度學習框架,社區強大,適合生產環境。

2.3 Keras

Keras是一個高層神經網絡API,由純Python編寫而成並使用TensorFlow、Theano及CNTK作爲後端。Keras爲支持快速實驗而生,能夠把想法迅速轉換爲結果。Keras應該是深度學習框架之中最容易上手的一個,它提供了一致而簡潔的API, 能夠極大地減少一般應用下用戶的工作量,避免用戶重複造輪子。

嚴格意義上講,Keras並不能稱爲一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作爲Theano的高級API而誕生,後來增加了TensorFlow和CNTK作爲後端。爲了屏蔽後端的差異性,提供一致的用戶接口,Keras做了層層封裝,導致用戶在新增操作或是獲取底層的數據信息時過於困難。同時,過度封裝也使得Keras的程序過於緩慢,許多BUG都隱藏於封裝之中,在絕大多數場景下,Keras是本文介紹的所有框架中最慢的一個。

學習Keras十分容易,但是很快就會遇到瓶頸,因爲它缺少靈活性。另外,在使用Keras的大多數時間裏,用戶主要是在調用接口,很難真正學習到深度學習的內容。

點評:入門最簡單,但是不夠靈活,使用受限。

2.4 Caffe/Caffe2

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,核心語言是C++,它支持命令行、Python和MATLAB接口,既可以在CPU上運行,也可以在GPU上運行。

Caffe的優點是簡潔快速,缺點是缺少靈活性。不同於Keras因爲太多的封裝導致靈活性喪失,Caffe靈活性的缺失主要是因爲它的設計。在Caffe中最主要的抽象對象是層,每實現一個新的層,必須要利用C++實現它的前向傳播和反向傳播代碼,而如果想要新層運行在GPU上,還需要同時利用CUDA實現這一層的前向傳播和反向傳播。這種限制使得不熟悉C++和CUDA的用戶擴展Caffe十分困難。

Caffe憑藉其易用性、簡潔明瞭的源碼、出衆的性能和快速的原型設計獲取了衆多用戶,曾經佔據深度學習領域的半壁江山。但是在深度學習新時代到來之時,Caffe已經表現出明顯的力不從心,諸多問題逐漸顯現(包括靈活性缺失、擴展難、依賴衆多環境難以配置、應用侷限等)。儘管現在在GitHub上還能找到許多基於Caffe的項目,但是新的項目已經越來越少。

Caffe的作者從加州大學伯克利分校畢業後加入了Google,參與過TensorFlow的開發,後來離開Google加入FAIR,擔任工程主管,並開發了Caffe2。Caffe2是一個兼具表現力、速度和模塊性的開源深度學習框架。它沿襲了大量的 Caffe 設計,可解決多年來在 Caffe 的使用和部署中發現的瓶頸問題。Caffe2的設計追求輕量級,在保有擴展性和高性能的同時,Caffe2 也強調了便攜性。Caffe2 從一開始就以性能、擴展、移動端部署作爲主要設計目標。Caffe2 的核心 C++ 庫能提供速度和便攜性,而其 Python 和 C++ API 使用戶可以輕鬆地在 Linux、Windows、iOS、Android ,甚至 Raspberry Pi 和 NVIDIA Tegra 上進行原型設計、訓練和部署。

Caffe2繼承了Caffe的優點,在速度上令人印象深刻。Facebook 人工智能實驗室與應用機器學習團隊合作,利用Caffe2大幅加速機器視覺任務的模型訓練過程,僅需 1 小時就訓練完ImageNet 這樣超大規模的數據集。然而儘管已經發布半年多,開發一年多,Caffe2仍然是一個不太成熟的框架,官網至今沒提供完整的文檔,安裝也比較麻煩,編譯過程時常出現異常,在GitHub上也很少找到相應的代碼。

極盛的時候,Caffe佔據了計算機視覺研究領域的半壁江山,雖然如今Caffe已經很少用於學術界,但是仍有不少計算機視覺相關的論文使用Caffe。由於其穩定、出衆的性能,不少公司還在使用Caffe部署模型。Caffe2儘管做了許多改進,但是還遠沒有達到替代Caffe的地步。

點評:文檔不夠完善,但性能優異,幾乎全平臺支持(Caffe2),適合生產環境。

2.5 MXNet

MXNet是一個深度學習庫,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等語言;支持命令和符號編程;可以運行在CPU、GPU、集羣、服務器、臺式機或者移動設備上。MXNet是CXXNet的下一代,CXXNet借鑑了Caffe的思想,但是在實現上更乾淨。在2014 年的NIPS 上,同爲上海交大校友的陳天奇與李沐碰頭,討論到各自在做深度學習 Toolkits 的項目組,發現大家普遍在做很多重複性的工作,例如文件 loading 等。於是他們決定組建 DMLC【Distributied (Deep) Machine Learning Community】,號召大家一起合作開發 MXNet,發揮各自的特長,避免重複造輪子。

MXNet以其超強的分佈式支持,明顯的內存、顯存優化爲人所稱道。同樣的模型,MXNet往往佔用更小的內存和顯存,並且在分佈式環境下,MXNet展現出了明顯優於其他框架的擴展性能。

由於MXNet最初由一羣學生開發,缺乏商業應用,極大地限制了MXNet的使用。2016年11月,MXNet被AWS正式選擇爲其雲計算的官方深度學習平臺。2017年1月,MXNet項目進入Apache基金會,成爲Apache的孵化器項目。

儘管MXNet擁有最多的接口,也獲得了不少人的支持,但其始終處於一種不溫不火的狀態。個人認爲這在很大程度上歸結於推廣不給力及接口文檔不夠完善。MXNet長期處於快速迭代的過程,其文檔卻長時間未更新,導致新手用戶難以掌握MXNet,老用戶常常需要查閱源碼才能真正理解MXNet接口的用法。

爲了完善MXNet的生態圈,推廣MXNet,MXNet先後推出了包括MinPy、Keras和Gluon等諸多接口,但前兩個接口目前基本停止了開發,Gluon模仿PyTorch的接口設計,MXNet的作者李沐更是親自上陣,在線講授如何從零開始利用Gluon學習深度學習,誠意滿滿,吸引了許多新用戶。

點評:文檔略混亂,但分佈式性能強大,語言支持最多,適合AWS雲平臺使用。

2.6 CNTK

2015年8月,微軟公司在CodePlex上宣佈由微軟研究院開發的計算網絡工具集CNTK將開源。5個月後,2016年1月25日,微軟公司在他們的GitHub倉庫上正式開源了CNTK。早在2014年,在微軟公司內部,黃學東博士和他的團隊正在對計算機能夠理解語音的能力進行改進,但當時使用的工具顯然拖慢了他們的進度。於是,一組由志願者組成的開發團隊構想設計了他們自己的解決方案,最終誕生了CNTK。

根據微軟開發者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要強。CNTK支持CPU和GPU模式,和TensorFlow/Theano一樣,它把神經網絡描述成一個計算圖的結構,葉子節點代表輸入或者網絡參數,其他節點代表計算步驟。CNTK 是一個非常強大的命令行系統,可以創建神經網絡預測系統。CNTK 最初是出於在 Microsoft 內部使用的目的而開發的,一開始甚至沒有Python接口,而是使用了一種幾乎沒什麼人用的語言開發的,而且文檔有些晦澀難懂,推廣不是很給力,導致現在用戶比較少。但就框架本身的質量而言,CNTK表現得比較均衡,沒有明顯的短板,並且在語音領域效果比較突出。

點評:社區不夠活躍,但是性能突出,擅長語音方面的相關研究。

2.7 其他框架

除了上述的幾個框架,還有不少的框架,都有一定的影響力和用戶。比如百度開源的PaddlePaddle,CMU開發的DyNet,簡潔無依賴符合C++11標準的tiny-dnn,使用Java開發並且文檔極其優秀的Deeplearning4J,還有英特爾開源的Nervana,Amazon開源的DSSTNE。這些框架各有優缺點,但是大多流行度和關注度不夠,或者侷限於一定的領域。此外,還有許多專門針對移動設備開發的框架,如CoreML、MDL,這些框架純粹爲部署而誕生,不具有通用性,也不適合作爲研究工具。

3 爲什麼選擇PyTorch

這麼多深度學習框架,爲什麼選擇PyTorch呢?
因爲PyTorch是當前難得的簡潔優雅且高效快速的框架。在筆者眼裏,PyTorch達到目前深度學習框架的最高水平。當前開源的框架中,沒有哪一個框架能夠在靈活性、易用性、速度這三個方面有兩個能同時超過PyTorch。下面是許多研究人員選擇PyTorch的原因。

  • • 簡潔:PyTorch的設計追求最少的封裝,儘量避免重複造輪子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的設計遵循tensor→variable(autograd)→nn.Module 三個由低到高的抽象層次,分別代表高維數組(張量)、自動求導(變量)和神經網絡(層/模塊),而且這三個抽象之間聯繫緊密,可以同時進行修改和操作。
    簡潔的設計帶來的另外一個好處就是代碼易於理解。PyTorch的源碼只有TensorFlow的十分之一左右,更少的抽象、更直觀的設計使得PyTorch的源碼十分易於閱讀。在筆者眼裏,PyTorch的源碼甚至比許多框架的文檔更容易理解。

  • • 速度:PyTorch的靈活性不以速度爲代價,在許多評測中,PyTorch的速度表現勝過TensorFlow和Keras等框架 。框架的運行速度和程序員的編碼水平有極大關係,但同樣的算法,使用PyTorch實現的那個更有可能快過用其他框架實現的。

  • • 易用:PyTorch是所有的框架中面向對象設計的最優雅的一個。PyTorch的面向對象的接口設計來源於Torch,而Torch的接口設計以靈活易用而著稱,Keras作者最初就是受Torch的啓發纔開發了Keras。PyTorch繼承了Torch的衣鉢,尤其是API的設計和模塊的接口都與Torch高度一致。PyTorch的設計最符合人們的思維,它讓用戶儘可能地專注於實現自己的想法,即所思即所得,不需要考慮太多關於框架本身的束縛。

  • • 活躍的社區:PyTorch提供了完整的文檔,循序漸進的指南,作者親自維護的論壇 供用戶交流和求教問題。Facebook 人工智能研究院對PyTorch提供了強力支持,作爲當今排名前三的深度學習研究機構,FAIR的支持足以確保PyTorch獲得持續的開發更新,不至於像許多由個人開發的框架那樣曇花一現。

在PyTorch推出不到一年的時間內,各類深度學習問題都有利用PyTorch實現的解決方案在GitHub上開源。同時也有許多新發表的論文采用PyTorch作爲論文實現的工具,PyTorch正在受到越來越多人的追捧 。

作爲論文實現的工具,PyTorch正在受到越來越多人的追捧 。
如果說 TensorFlow的設計是“Make It Complicated”,Keras的設計是“Make It Complicated And Hide It”,那麼PyTorch的設計真正做到了“Keep it Simple,Stupid”。簡潔即是美。
使用TensorFlow能找到很多別人的代碼,使用PyTorch能輕鬆實現自己的想法。



發佈了0 篇原創文章 · 獲贊 12 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章