機器學習和深度學習的最佳框架大比拼
在過去的一年里,咱們討論了六個開源機器學習和/或深度學習框架:Caffe,Microsoft Cognitive Toolkit(又名CNTK 2),MXNet,Scikit-learn,Spark MLlib和TensorFlow。如果把網(wǎng)撒得大些,可能還會覆蓋其他幾個流行的框架,包括Theano(一個10年之久的Python深度學習和機器學習框架),Keras(一個Theano和TensorFlow深度學習的前端),DeepLearning4j(Java和Scala在Hadoop和Spark之上的深度學習軟件)。如果你有興趣使用機器學習和神經(jīng)網(wǎng)絡,你從來沒有像現(xiàn)在這樣多的選擇。
機器學習框架和深度學習框架之間有區(qū)別。本質(zhì)上,機器學習框架涵蓋用于分類,回歸,聚類,異常檢測和數(shù)據(jù)準備的各種學習方法,并且其可以或可以不包括神經(jīng)網(wǎng)絡方法。深度學習或深度神經(jīng)網(wǎng)絡(DNN)框架涵蓋具有許多隱藏層的各種神經(jīng)網(wǎng)絡拓撲。這些層包括模式識別的多步驟過程。網(wǎng)絡中的層越多,可以提取用于聚類和分類的特征越復雜。
Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度學習框架。 Scikit-learning和Spark MLlib是機器學習框架。 Theano跨越了這兩個類別。
一般來說,深層神經(jīng)網(wǎng)絡計算在GPU(特別是Nvidia CUDA通用GPU,大多數(shù)框架)上運行的速度要比CPU快一個數(shù)量級。一般來說,更簡單的機器學習方法不需要GPU的加速。
雖然你可以在一個或多個CPU上訓練DNN,訓練往往是緩慢的,慢慢我不是說秒或分鐘。需要訓練的神經(jīng)元和層數(shù)越多,可用于訓練的數(shù)據(jù)越多,需要的時間就越長。當Google Brain小組在2016年針對新版Google翻譯訓練語言翻譯模型時,他們在多個GPU上同時運行了一周的訓練時間。沒有GPU,每個模型訓練實驗將需要幾個月。
這些框架中每一個框架具有至少一個顯著特征。 Caffe的強項是用于圖像識別的卷積DNN。 Cognitive Toolkit有一個單獨的評估庫,用于部署在ASP.Net網(wǎng)站上工作的預測模型。 MXNet具有良好的可擴展性,可用于多GPU和多機器配置的訓練。 Scikit-learn具有廣泛的強大的機器學習方法,易學已用。 Spark MLlib與Hadoop集成,具有良好的機器學習可伸縮性。 TensorFlow為其網(wǎng)絡圖TensorBoard提供了一個獨特的診斷工具。
另一方面,所有深度學習框架在GPU上的訓練速度幾乎相同。這是因為訓練內(nèi)循環(huán)在Nvidia CuDNN包中花費大部分時間。然而,每個框架采用一種不同的方法來描述神經(jīng)網(wǎng)絡,具有兩個主要的陣營:使用圖形描述文件的陣營,以及通過執(zhí)行代碼來創(chuàng)建它們的描述的陣營。
考慮到這一點,讓我們來看看每一個框架的特性。
Caffe(咖啡)
Caffe深度學習項目,最初是一個強大的圖像分類框架,似乎停滯不前,基于它的持續(xù)的bug,以及它已被卡住1.0版RC3一年多的事實,并且創(chuàng)始人已離開項目。它仍然有良好的卷積網(wǎng)絡圖像識別和良好的支持Nvidia CUDA GPU,以及一個簡單的網(wǎng)絡描述格式。另一方面,它的模型通常需要大量的GPU內(nèi)存(超過1GB)運行,它的文檔是多斑點和問題,支持很難獲得,安裝是iffy,特別是對于它的Python筆記本支持。
Caffe有命令行,Python和Matlab接口,它依靠ProtoText文件來定義它的模型和求解器。 Caffe在其自己的模型模式中逐層定義網(wǎng)絡。網(wǎng)絡定義從輸入數(shù)據(jù)到丟失的整個模型。當數(shù)據(jù)和派生數(shù)據(jù)在前向和后向遍歷網(wǎng)絡時,Caffe存儲,通信和操作信息為blob(二進制大對象),內(nèi)部是以C連續(xù)方式存儲的N維數(shù)組(表示行該數(shù)組被存儲在連續(xù)的存儲器塊中,如在C語言中)。 Blob之于Caffe如Tensor之于TensorFlow。
圖層對blob執(zhí)行操作,并構(gòu)成Caffe模型的組件。層卷積濾波器,執(zhí)行池,取內(nèi)部乘積,應用非線性(諸如整流線性和S形以及其他元素方面的變換),歸一化,加載數(shù)據(jù)和計算諸如softmax和鉸鏈的損失。
Caffe已經(jīng)證明其在圖像分類中的有效性,但它的時刻似乎已經(jīng)過去了。除非現(xiàn)有的Caffe模型符合您的需要,或者可以根據(jù)您的目的進行微調(diào),我建議使用TensorFlow,MXNet或CNTK。

在NBViewer中顯示的預先計算的CaffeJupyter筆記本。這本筆記本解釋了使用一只可愛的小貓在Caffe網(wǎng)絡上做“手術(shù)”。
Microsoft Cognitive Toolkit(Microsoft認知工具包)
Microsoft Cognitive Toolkit是一個快速,易用的深度學習軟件包,但與TensorFlow相比,其范圍有限。它有各種各樣的模型和算法,極好的支持Python和Jupyter筆記本,一個有趣的聲明性神經(jīng)網(wǎng)絡配置語言BrainScript,以及在Windows和Ubuntu Linux環(huán)境下自動部署。
在缺點方面,當我審查Beta 1的文檔還沒有完全更新到CNTK 2,并且包沒有對MacOS支持。雖然自Beta 1以來,CNTK 2有許多改進,包括新的內(nèi)存壓縮模式,以減少GPU和新的Nuget安裝包的內(nèi)存使用,但對MacOS支持仍然缺失。
為Beta 1添加的PythonAPI有助于將認知工具包帶入主流的、用Python碼的、深度學習研究人員當中。 API包含模型定義和計算、學習算法、數(shù)據(jù)讀取和分布式訓練的抽象。作為PythonAPI的補充,CNTK 2具有新的Python示例和教程,以及對 Google Protocol Buffer序列化的支持。教程以Jupyter筆記本實現(xiàn)。
CNTK 2組件可以處理來自Python,C ++或BrainScript的多維密集或稀疏數(shù)據(jù)。認知工具包包括各種各樣的神經(jīng)網(wǎng)絡類型:FFN(前饋),CNN(卷積),RNN/ LSTM(遞歸/長期短期記憶),批次標準化和序列注意序列。它支持強化學習,生成對抗網(wǎng)絡,監(jiān)督和非監(jiān)督學習,自動超參數(shù)調(diào)整,以及從Python添加新的,用戶定義的核心組件在GPU上運行的能力。它能夠在多個GPU和機器上做到精確的并行性,而且(微軟聲稱)它甚至可以適應***的模型到GPU內(nèi)存。
CNTK 2 API支持從Python,C ++和BrainScript定義網(wǎng)絡,學習者,讀者,培訓和評估。他們還支持使用C#進行評估。 Python API與NumPy互操作,并包括一個高級層級庫,可以精確定義包括復現(xiàn)在內(nèi)的高級神經(jīng)網(wǎng)絡。該工具包支持以符號形式表示循環(huán)模型作為神經(jīng)網(wǎng)絡中的循環(huán),而不需要靜態(tài)展開循環(huán)步驟。
您可以在Azure網(wǎng)絡和GPU上訓練CNTK 2模型。配備GPU的N系列Azure虛擬機系列,在我審核Beta 1時受到限制,現(xiàn)在通??梢詮腁zure控制臺獲得并完全管理。

幾個CNTK 2 / Microsoft Cognitive Toolkit教程以Jupyter筆記本提供。該圖顯示了Logistic回歸訓練的繪制的可視化。
MXNet
MXNet是一個可移植的、可伸縮的深度學習庫,是亞馬遜的DNN框架的選擇,結(jié)合了神經(jīng)網(wǎng)絡幾何的象征性聲明與張量操作的命令性編程。 MXNet可跨多個主機擴展到多個GPU,接近線性擴展效率為85%,具有出色的開發(fā)速度、可編程性和可移植性。它支持Python,R,Scala,Julia和C ++,支持程度各不相同,它允許你混合符號和命令式編程風格。
在我***次評論MXNet時,文檔感覺還沒有完成,除Python之外,我發(fā)現(xiàn)很少有其它語言的例子。自從我評論以后,這兩種情況都有所改善。
MXNet平臺是建立在一個動態(tài)依賴調(diào)度器上的,它可以自動并行化符號和命令式操作,但是你必須告訴MXNet要使用哪些GPU和CPU核心。在調(diào)度器頂部的圖優(yōu)化層使符號執(zhí)行快速和內(nèi)存高效。
MXNet目前支持用Python,R,Scala,Julia和C ++構(gòu)建和訓練模型;訓練的MXNet模型也可以用于Matlab和JavaScript中的預測。無論您選擇哪種語言來構(gòu)建模型,MXNet都會調(diào)用優(yōu)化的C ++后端引擎。
MXNet作者認為他們的API是Torch、Theano、Chainer和Caffe提供的一個超集,盡管對GPU集群有更多的可移植性和支持。在許多方面MXNet類似于TensorFlow,但增加了嵌入命令張量操作的能力。
除了實際強制的MNIST數(shù)字分類之外,MXNet教程的計算機視覺包含使用卷積神經(jīng)網(wǎng)絡(CNN)的圖像分類和分割,使用更快的R-CNN的對象檢測,神經(jīng)藝術(shù)和使用深度CNN的大規(guī)模圖像分類和ImageNet數(shù)據(jù)集。還有自然語言處理、語音識別、對抗網(wǎng)絡以及監(jiān)督和非監(jiān)督機器學習的其他教程。

亞馬遜測試了在P2.16xlarge實例上的MXNet中實現(xiàn)的Inception v3算法,發(fā)現(xiàn)其伸縮效率為85%。
Scikit-learn
Scikit-learn Python框架具有廣泛的可靠的機器學習算法,但沒有深度學習算法。如果你是一個Python粉絲,Scikit-learn可能是一般機器學習庫中***選擇。
Scikit-learn是一個強大的,成熟的機器學習Python庫,包含各種各樣成熟的算法和集成圖。它相對容易安裝、學習和使用,帶有很好的例子和教程。
在另一方面,Scikit-learn不包括深度學習或強化學習,缺少圖模型和序列預測,并且除Python之外,不能真正使用其它語言。它不支持PyPy,Python即時編譯器或GPU。也就是說,除了它的少量進入神經(jīng)網(wǎng)絡,它不會真的有速度問題。它使用Cython(Python到C編譯器)來處理需要快速的函數(shù),例如內(nèi)循環(huán)。
Scikit-learn對分類、回歸、聚類、降維、模型選擇和預處理算法具有很好的選擇。它有所有這些的良好的文檔和示例,但沒有任何種類的指導工作流以完成這些任務。
Scikit-learn贏得了易于開發(fā)的***分,主要是因為算法都像廣告和文檔一樣工作,API是一致的,設計良好,數(shù)據(jù)結(jié)構(gòu)之間幾乎沒有“阻抗不匹配”。函數(shù)庫其中的功能已徹底充實,錯誤徹底消除,用來開發(fā)十分愉快。
本示例使用Scikit-learn的小手寫數(shù)字數(shù)據(jù)集來演示使用Label Spreading模型的半監(jiān)督學習。在1,797總樣本中只有30個被標記。
另一方面,函數(shù)庫沒有涵蓋深度學習或強化學習,這隱藏了當前困難但重要的問題,例如準確的圖像分類和可靠的實時語言解析和翻譯。顯然,如果你對深度學習感興趣,你應該另覓他處。
然而,存在許多問題,從建立鏈接不同觀察值的預測函數(shù)到分類觀察值到學習未標記數(shù)據(jù)集的結(jié)構(gòu),這使得它們適應于普通的老的機器學習,而不需要數(shù)十層的神經(jīng)元,對于這些領域 Scikit-learn 是非常好的選擇。
Spark MLlib
Spark MLlib是Spark的開源機器學習庫,提供了通用的機器學習算法,如分類、回歸、聚類和協(xié)同過濾(但不包括DNN)以及特征提取、轉(zhuǎn)換、維數(shù)降低工具,以及構(gòu)建、評估和調(diào)整機器學習管道選擇和工具。Spark MLlib還包括用于保存和加載算法、模型和管線、用于數(shù)據(jù)處理以及進行線性代數(shù)和統(tǒng)計的實用程序。
Spark MLlib是用Scala編寫的,并使用線性代數(shù)包Breeze。 Breeze依靠netlib-java來優(yōu)化數(shù)值處理,雖然在開源分布中意味著優(yōu)化使用CPU。 Databricks提供與GPU配合使用的定制Spark集群,這有可能為您帶來另一個10倍的速度改進,用于訓練具有大數(shù)據(jù)的復雜機器學習模型。
MLlib實現(xiàn)了大量的分類和回歸的常用算法和模型,新手可能變得混亂不堪,無可適從,但專家最終可能會為分析數(shù)據(jù)找到一個很好的模型的數(shù)據(jù)。對于這么多的模型Spark2.x增加了超參數(shù)調(diào)優(yōu)的重要特性,也稱為模型選擇。超參數(shù)t允許調(diào)優(yōu)分析人員設置參數(shù)網(wǎng)格、估計器和評估器,并且它允許交叉驗證方法(耗時但準確)或訓練驗證分割方法(更快但不太準確)找到***數(shù)據(jù)模型。
Spark MLlib擁有針對Scala和Java的完整API,主要是針對Python的完整API以及針對R的粗略部分API。您可以通過計算示例來獲得良好的覆蓋率:54個Java和60個Scala機器學習示例,52個Python機器學習示例,只有五個R示例。在我的經(jīng)驗中,Spark MLlib是最容易使用Jupyter筆記本,但你可以肯定地在控制臺運行它,如果你馴服詳細的Spark狀態(tài)消息。
Spark MLlib提供了你想要的基本機器學習、特性選擇、管道和持久性的任何東西。它在分類、回歸、聚類和過濾方面做得相當不錯。鑒于它是Spark的一部分,它具有訪問數(shù)據(jù)庫、流和其他數(shù)據(jù)源的強大訪問權(quán)限。另一方面,SparkMLlib并不真正采用與TensorFlow,MXNet,Caffe和Microsoft Cognitive Toolkit相同的方式建模和訓練深層神經(jīng)網(wǎng)絡。

Spark MLlibPython示例(Naive Bayes)作為Databricks筆記本。注意解釋,代碼和輸出如何散布。
TensorFlow
TensorFlow,Google的可移植機器學習和神經(jīng)網(wǎng)絡庫,執(zhí)行和伸縮性很好,雖然它有點難學。TensorFlow擁有各種各樣的模型和算法,它們對深度學習非常重視,并且在具有GPU(用于訓練)或Google TPU(用于生產(chǎn)規(guī)模預測)的硬件上具有出色的性能。它還具有對Python的良好支持,良好的文檔和良好的軟件,用于顯示和理解描述其計算的數(shù)據(jù)流圖TensorBoard。
數(shù)據(jù)流圖中的節(jié)點表示數(shù)學運算,而圖的邊表示在它們之間流動的多維數(shù)據(jù)數(shù)組(張量)。這種靈活的架構(gòu)允許您將計算部署到桌面、服務器或移動設備中的一個或多個CPU或GPU,而無需重寫代碼。
使用TensorFlow的主要語言是Python,雖然對C ++有限的支持。TensorFlow提供的教程包括手寫數(shù)字分類。圖像識別、字嵌入、遞歸神經(jīng)網(wǎng)絡,用于機器翻譯的序列到序列模型、自然語言處理和基于PDE(偏微分方程)的模擬的應用。
TensorFlow可以方便地處理各種神經(jīng)網(wǎng)絡,包括目前正在急劇變化的圖像識別和語言處理領域的深度CNN和LSTM遞歸模型。用于定義圖層的代碼可能fan,但是您方便但不詳細,可以使用三個可選的深度學習界面中的任何一個來修復它。雖然調(diào)試異步網(wǎng)絡求解器可以是平凡的,但TensorBoard軟件可以幫助您可視化圖。

TensorBoard顯示TensorFlow計算的圖形。我們放大了幾個部分來檢查圖形的細節(jié)。
總結(jié)
對于任何給定的預測任務,您應該使用哪種機器學習或深度學習包取決于機器學習的復雜性,用于訓練的數(shù)據(jù)量和形式,您的計算資源以及您的編程語言偏好和技能。它也可能取決于您是否喜歡使用代碼或配置文件定義模型。
但是,在開始自己的模型訓練考察之前,您可能希望了解來自Google,HPE和MicrosoftAzure云的任何預先訓練的應用機器學習服務是否能夠處理您的數(shù)據(jù),無論是語音、文本或圖像。如果他們對你的數(shù)據(jù)不能很好地工作,你可能還想在嘗試基本的機器學習訓練(***,如果沒有其他工作)深度學習訓練之前,看看你能用簡單的統(tǒng)計方法獲得多大的好處。這里的原則是保持分析盡可能簡單,但不是更簡單。
在我討論的兩個基本的機器學習包,我建議喜歡Scala和在Hadoop中有他們的數(shù)據(jù)的使用Spark MLlib 。我建議喜歡Python的人Scikit-learn。
我應該提到那些喜歡Scala(和Java)的人和在Hadoop中有他們的數(shù)據(jù)的人的另一個選擇事Deeplearning4j。我沒有評論他,但是,因為其名稱意味著它是一個學習深度包。
選擇Caffe,Microsoft Cognitive Toolkit,MXNet和TensorFlow的深度學習包是一個更困難的決定。我不再建議使用Caffe,因為它的發(fā)展停滯不前。然而,選擇其他三個中的一個仍然是棘手,因為對于具有類似功能,它們都是***的選擇。
Cognitive Toolkit現(xiàn)在有Python和C ++ API以及網(wǎng)絡配置語言BrainScript。如果您喜歡使用配置文件而不是編程網(wǎng)絡拓撲,那么CognitiveToolkit可能是一個不錯的選擇。另一方面,它似乎不像TensorFlow一樣成熟,它不能在MacOS上運行。
MXNet支持Python、R、Scala、Julia和C ++,但其支持***的API是用Python開發(fā)的。 MXNet在多個主機上的多個GPU上展示出良好的伸縮性(85%的線性)。當我評論MXNet的文檔和示例是吝嗇的,但他們已經(jīng)改進了。
TensorFlow可能是三個包中最成熟的,并且它是一個很好的選擇,只要你喜歡編寫Python,并可以克服學習曲線。 TensorFlow具有你可以使用基本的構(gòu)建塊,它給你細粒度的控制,但也需要你編寫大量的代碼來描述一個神經(jīng)網(wǎng)絡。有三個簡化的API與TensorFlow一起工作來解決這個問題:tf.contrib.learn,TF-Slim和Keras。支持TensorFlow的最終考慮是TensorBoard,它對于可視化和理解您的數(shù)據(jù)流圖非常有用。
文章來源:網(wǎng)路冷眼|翻譯

















 
 
 




 
 
 
 