機器學習者必知的 5 種深度學習框架
本文為雷鋒字幕組編譯的技術博客,原標題 The 5 Deep Learning Frameworks Every Serious Machine Learner Should Be Familiar With,作者為James Le。
翻譯 | 楊恕權 張曉雪 陳明霏 整理 | 凡江
圖片來源:Raphael Koh on Unsplash
深度學習需要大量的計算。它通常包含具有許多節點的神經網路,並且每個節點都有許多需要在學習過程中必須不斷更新的連接。換句話說,神經網路的每一層都有成百上千個相同的人工神經元在執行相同的計算。因此,神經網路的結構適用於GPU(圖形處理單元)可以高效執行的計算類型(GPU 是專門為並行計算相同指令而設計的)。
隨著深度學習和人工智慧在過去幾年的迅速發展,我們也看到了許多深度學習框架的引入。深度學習框架的創建目標是在GPU上高效運行深度學習系統。這些深度學習框架都依賴於計算圖的概念,計算圖定義了需要執行的計算順序。在這些框架中你使用的是一種可以建立計算圖的語言,並且語言的執行機制與其宿主語言本身的機制有所不同。然後,計算圖可以並行地在目標GPU中優化和運行。
在這篇文章中,我想向大家介紹推動深度學習發展的5個主力框架。這些框架使數據科學家和工程師更容易為複雜問題構建深度學習解決方案,並執行更複雜的任務。這只是眾多開源框架中的一小部分,由不同的科技巨頭支持,並相互推動更快創新。
1. TensorFlow (Google)
TensorFlow最初是由Google Brain Team的研究人員和工程師開發的。其目的是面向深度神經網路和機器智能研究。自2015年底以來,TensorFlow的庫已正式在GitHub上開源。TensorFlow對於快速執行基於圖形的計算非常有用。靈活的TensorFlow API可以通過其GPU支持的架構在多個設備之間部署模型。
簡而言之,TensorFlow生態系統有三個主要組成部分:
用C ++編寫的TensorFlow API包含用於定義模型和使用數據訓練模型的API。 它也有一個用戶友好的Python介面。
TensorBoard是一個可視化工具包,可幫助分析,可視化和調試TensorFlow計算圖。
TensorFlow Serving是一種靈活的高性能服務系統,用於在生產環境中部署預先訓練好的機器學習模型。Serving也是由C ++編寫並可通過Python介面訪問,可以即時從舊模式切換到新模式。
TensorFlow已被廣泛應用於學術研究和工業應用。一些值得注意的當前用途包括Deep Speech,RankBrain,SmartReply和On-Device Computer Vision。大家可以在TensorFlow的GitHub項目中查看一些最佳官方用途,研究模型、示例和教程。
我們來看一個運行的示例。 在這裡,我在TensorFlow上用隨機數據訓練一個基於L2損失的2層ReLU網路。
這個代碼有兩個主要組件:定義計算圖並多次運行這個圖。在定義計算圖時,我為輸入x,權重w1和w2以及目標y創建placeholders進行佔位。然後在前向傳播中,我計算目標y的預測以及損失值(損失值為y的真實值與預測值之間的L2距離)。最後,我讓Tensorflow計算關於w1和w2的梯度損失。
完成計算圖構建之後,我創建一個會話框來運行計算圖。在這裡我創建了numpy數組,它將填充建圖時創建的placeholders(佔位符),將它們數值提供給x,y,w1,w2。為了訓練網路,我反覆運行計算圖,使用梯度來更新權重然後獲得loss,grad_w1和grad_w2的numpy數組。
Keras: 高級包裝
深度學習框架在兩個抽象級別上運行:低級別--數學運算和神經網路基本實體的實現(TensorFlow, Theano, PyTorch etc.)和高級別--使用低級基本實體來實現神經網路抽象,如模型和圖層(Keras) 。
Keras是其後端庫的包裝,該後端庫可以是TensorFlow或Theano - 這意味著如果你們在使用以TensorFlow為後端庫的Keras,你實際上是在運行TensorFlow代碼。Keras為您考慮到了許多基本細節,因為它針對神經網路技術用戶,而且非常適合那些練習數據科學的人。它支持簡單快速的原型設計,支持多種神經網路架構,並可在CPU / GPU上無縫運行。
在這個例子中,對一個與之前例子中相似的神經網路進行訓練,我首先將模型對象定義為一系列圖層,然後定義優化器對象。接下來,我建立模型,指定損失函數,並用單個「fit」曲線來訓練模型。
2. ?Theano (蒙特利爾大學)
Theano是另一個用於快速數值計算的Python庫,可以在CPU或GPU上運行。它是蒙特利爾大學蒙特利爾學習演算法小組開發的一個開源項目。它的一些最突出的特性包括GPU的透明使用,與NumPy緊密結合,高效的符號區分,速度/穩定性優化以及大量的單元測試。
遺憾的是,Youshua Bengio(MILA實驗室負責人)在2017年11月宣布他們將不再積極維護或開發Theano。原因在於Theano多年來推出的大部分創新技術現在已被其他框架所採用和完善。如果有興趣,大家仍然可以為它的開源庫做貢獻。
Theano在許多方面與TensorFlow相似。那麼讓我們來看看另一個代碼示例,使用相同批量和輸入/輸出尺寸來訓練神經網路:
我首先定義了Theano符號變數(類似於TensorFlow佔位符)。對於正向傳播,我計算預測和損失; 對於反向傳播,我計算梯度。然後我編譯一個函數,根據數據和權重計算損失,得分和梯度。最後,我多次運行這個函數來訓練網路。
3. PyTorch (Facebook)
Pytorch在學術研究者中很受歡迎,也是相對比較新的深度學習框架。Facebook人工智慧研究組開發了pyTorch來應對一些在它前任資料庫Torch使用中遇到的問題。由於編程語言Lua的普及程度不高,Torch永遠無法經歷Google TensorFlow那樣的迅猛發展。因此,PyTorch採用了被已經為許多研究人員,開發人員和數據科學家所熟悉的原始Python命令式編程風格。同時它還支持動態計算圖,這一特性使得它對做時間序列以及自然語言處理數據相關工作的研究人員和工程師很有吸引力。
到目前為止,Uber將PyTorch使用得最好,它已經構建了Pyro,一種使用PyTorch作為其後端的通用概率編程語言。 PyTorch的動態差異化執行能力和構建梯度的能力對於概率模型中的隨機操作非常有價值。
PyTorch有3個抽象層次:
?張量:命令性的ndarray,但在GPU上運行
?變數:計算圖中的節點;存儲數據和梯度
?模塊:神經網路層;可以存儲狀態或可學習的權重
在這裡我將著重談一談張量抽象層次。 PyTorch張量就像numpy數組,但是它們可以在GPU上運行。沒有內置的計算圖或梯度或深度學習的概念。在這裡,我們使用PyTorch Tensors(張量)擬合一個2層網路:
正如你所看到的,我首先為數據和權重創建隨機張量。然後我計算正向傳播過程中的預測和損失,並在反向傳播過程中手動計算梯度。我也為每個權重設置梯度下降步長。最後,我通過多次運行該功能來訓練網路。
4. ?Torch (NYU / Facebook)
接下來我們來談談Torch。它是Facebook的開源機器學習庫、科學計算框架和基於Lua編程語言的腳本語言。它提供了廣泛的深度學習演算法,並已被Facebook,IBM,Yandex和其他公司用於解決數據流的硬體問題。
作為PyTorch的直系祖先,Torch與PyTorchg共享了很多C後端。與具有3個抽象級別的PyTorch不同,Torch只有2個:張量和模塊。讓我們試一試一個使用Torch張量來訓練兩層神經網路的代碼教程:
最初,我建立了一個多層的神經網路模型,以及一個損失函數。接下來,我定義一個回溯函數,輸入權重並在權重上產生損失/梯度。在函數內部,我計算前向傳播中的預測和損失,以及反向傳播中的梯度。最後,我反覆將該回溯函數傳遞給優化器進行優化。
5. ?Caffe (UC Berkeley)
Caffe是一個兼具表達性、速度和思維模塊化的深度學習框架。由伯克利人工智慧研究小組和伯克利視覺和學習中心開發。雖然其內核是用C ++編寫的,但Caffe有Python和Matlab相關介面。這對訓練或微調前饋分類模型非常有用。雖然它在研究中使用得並不多,但它仍然很受部署模型的歡迎,正如社區貢獻者所證明的那樣。
為了使用Caffe訓練和微調神經網路,您需要經過4個步驟:
1. 轉換數據:我們讀取數據文件,然後清洗並以Caffe可以使用的格式存儲它們。我們將編寫一個進行數據預處理和存儲的Python腳本。
2. 定義模型:模型定義了神經網路的結構。我們選擇CNN體系結構並在擴展名為.prototxt的配置文件中定義其參數。
3. 定義求解器:求解器負責模型優化,定義所有關於如何進行梯度下降的信息。我們在擴展名為.prototxt的配置文件中定義求解器參數。
4. 訓練模型:一旦我們準備好模型和求解器,我們就通過從終端調用caffe binary(咖啡因)來訓練模型。訓練好模型後,我們將在一個擴展名為.caffemodel的文件中獲得訓練好的模型。
我不會為Caffe做代碼展示,但是您可以在 Caffe 的主頁上查看一個教程。總的來說,Caffe對於前饋網路和微調現有網路非常有用。您可以輕鬆地訓練模型而無需編寫任何代碼。它的Python介面非常有用,因為您可以在不使用Python代碼的情況下部署模型。不利的一面是,您需要為每個新的GPU圖層編寫C++內核代碼(在Caffe下)。因此,大網路(AlexNet,VGG,GoogLeNet,ResNet等)的構建將會非常麻煩。
您應該使用哪種深度學習框架?
由於Theano不再繼續被開發,Torch是以不為許多人熟悉的Lua語言編寫的,Caffe還處於它的早熟階段,TensorFlow和PyTorch成為大多數深度學習實踐者的首選框架。雖然這兩個框架都使用Python,但它們之間存在一些差異:
? PyTorch有更加乾淨清爽的介面,更易於使用,特別適合初學者。大部分代碼編寫較為直觀,而不是與庫進行戰鬥。相反,TensorFlow擁有更繁雜的小型、含混的庫。
? 然而,TensorFlow擁有更多的支持和一個非常龐大,充滿活力和樂於助人的社區。這意味著TensorFlow的在線課程,代碼教程,文檔和博客帖子多於PyTorch。
? 也就是說,PyTorch作為一個新平台,有許多有趣的功能尚未被完善。但是令人驚奇的是PyTorch在短短一年多的時間裡取得了巨大的成就。
? TensorFlow更具可擴展性,並且與分散式執行非常兼容。它支持從僅GPU到涉及基於實時試驗和錯誤的繁重分散式強化學習的龐大系統的所有的系統。
最重要的是,TensorFlow是「定義 - 運行」,在圖形結構中定義條件和迭代,然後運行它。另一方面,PyTorch是「按運行定義」,其中圖結構是在正向計算過程中實時定義的。換句話說,TensorFlow使用靜態計算圖,而PyTorch使用動態計算圖。基於動態圖的方法為複雜體系結構(如動態神經網路)提供了更易於操作的調試功能和更強的處理能力。基於靜態圖的方法可以更方便地部署到移動設備,更容易部署到更具不同的體系結構,以及具有提前編譯的能力。
因此,PyTorch更適合於愛好者和小型項目的快速原型開發,而TensorFlow更適合大規模部署,尤其是在考慮跨平台和嵌入式部署時。 TensorFlow經受了時間的考驗,並且仍然被廣泛使用。它對大型項目具有更多功能和更好的可擴展性。 PyTorch越來越容易學習,但它並沒有與TensorFlow相同的一體化整合功能。這對於需要快速完成的小型項目非常有用,但對於產品部署並不是最佳選擇。
圖片來源: Jamie Street on Unsplash
寫在最後
上述列舉只是眾多框架中較為突出的框架,並且大多數支持Python語言。去幾年裡發布了多個新的深度學習框架,如DeepLearning4j(Java),Apache的MXNet(R,Python,Julia),Microsoft CNTK(C ++,Python)和Intel的Neon(Python)。每個框架都是不同的,因為它們是由不同的人為了不同的目的而開發的。有一個整體的大致了解會幫助你解決你的下一個深度學習難題。在選擇適合您的最佳選擇時,易於使用(就架構和處理速度而言),GPU支持,教程和培訓材料的獲得難度,神經網路建模功能以及支持的語言都是重要的考慮因素。
博客原址 https://heartbeat.fritz.ai/the-5-deep-learning-frameworks-every-serious-machine-learner-should-be-familiar-with-93f4d469d24c
添加雷鋒字幕組微信號(leiphonefansub)為好友
備註「我要加入」,To be an AI Volunteer !
4 月 AI 求職季
8 大明星企業
10 場分享盛宴
20 小時獨門秘籍
4.10-4.19,我們準時相約!
新人福利
關注 AI 研習社(okweiwu),回復1領取
【超過 1000G 神經網路 / AI / 大數據資料】
不知道如何開始機器學習?這有份初學者指南!
TAG:AI研習社 |