機器學習和深度學習的最佳框架大比拼

雲頭條發表於2017-02-05

在過去的一年裡,我們們討論了六個開源機器學習和/或深度學習框架:Caffe,Microsoft Cognitive Toolkit(又名CNTK 2),MXNet,Scikit-learn,Spark MLlib和TensorFlow。如果把網撒得大些,可能還會覆蓋其他幾個流行的框架,包括Theano(一個10年之久的Python深度學習和機器學習框架),Keras(一個Theano和TensorFlow深度學習的前端),DeepLearning4j(Java和Scala在Hadoop和Spark之上的深度學習軟體)。如果你有興趣使用機器學習和神經網路,你從來沒有像現在這樣多的選擇。

機器學習框架和深度學習框架之間有區別。本質上,機器學習框架涵蓋用於分類,迴歸,聚類,異常檢測和資料準備的各種學習方法,並且其可以或可以不包括神經網路方法。深度學習或深度神經網路(DNN)框架涵蓋具有許多隱藏層的各種神經網路拓撲。這些層包括模式識別的多步驟過程。網路中的層越多,可以提取用於聚類和分類的特徵越複雜。

Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度學習框架。 Scikit-learning和Spark MLlib是機器學習框架。 Theano跨越了這兩個類別。

一般來說,深層神經網路計算在GPU(特別是Nvidia CUDA通用GPU,大多數框架)上執行的速度要比CPU快一個數量級。一般來說,更簡單的機器學習方法不需要GPU的加速。

雖然你可以在一個或多個CPU上訓練DNN,訓練往往是緩慢的,慢慢我不是說秒或分鐘。需要訓練的神經元和層數越多,可用於訓練的資料越多,需要的時間就越長。當Google Brain小組在2016年針對新版Google翻譯訓練語言翻譯模型時,他們在多個GPU上同時執行了一週的訓練時間。沒有GPU,每個模型訓練實驗將需要幾個月。

這些框架中每一個框架具有至少一個顯著特徵。 Caffe的強項是用於影像識別的卷積DNN。 Cognitive Toolkit有一個單獨的評估庫,用於部署在ASP.Net網站上工作的預測模型。 MXNet具有良好的可擴充套件性,可用於多GPU和多機器配置的訓練。 Scikit-learn具有廣泛的強大的機器學習方法,易學已用。 Spark MLlib與Hadoop整合,具有良好的機器學習可伸縮性。 TensorFlow為其網路圖TensorBoard提供了一個獨特的診斷工具。

另一方面,所有深度學習框架在GPU上的訓練速度幾乎相同。這是因為訓練內迴圈在Nvidia CuDNN包中花費大部分時間。然而,每個框架採用一種不同的方法來描述神經網路,具有兩個主要的陣營:使用圖形描述檔案的陣營,以及通過執行程式碼來建立它們的描述的陣營。

考慮到這一點,讓我們來看看每一個框架的特性。

Caffe(咖啡)

Caffe深度學習專案,最初是一個強大的影像分類框架,似乎停滯不前,基於它的持續的bug,以及它已被卡住1.0版RC3一年多的事實,並且創始人已離開專案。它仍然有良好的卷積網路影像識別和良好的支援Nvidia CUDA GPU,以及一個簡單的網路描述格式。另一方面,它的模型通常需要大量的GPU記憶體(超過1GB)執行,它的文件是多斑點和問題,支援很難獲得,安裝是iffy,特別是對於它的Python筆記本支援。

Caffe有命令列,Python和Matlab介面,它依靠ProtoText檔案來定義它的模型和求解器。 Caffe在其自己的模型模式中逐層定義網路。網路定義從輸入資料到丟失的整個模型。當資料和派生資料在前向和後向遍歷網路時,Caffe儲存,通訊和操作資訊為blob(二進位制大物件),內部是以C連續方式儲存的N維陣列(表示行該陣列被儲存在連續的儲存器塊中,如在C語言中)。 Blob之於Caffe如Tensor之於TensorFlow。

圖層對blob執行操作,並構成Caffe模型的元件。層卷積濾波器,執行池,取內部乘積,應用非線性(諸如整流線性和S形以及其他元素方面的變換),歸一化,載入資料和計算諸如softmax和鉸鏈的損失。

Caffe已經證明其在影像分類中的有效性,但它的時刻似乎已經過去了。除非現有的Caffe模型符合您的需要,或者可以根據您的目的進行微調,我建議使用TensorFlow,MXNet或CNTK。

在NBViewer中顯示的預先計算的CaffeJupyter筆記本。這本筆記本解釋了使用一隻可愛的小貓在Caffe網路上做“手術”。

Microsoft Cognitive Toolkit(Microsoft認知工具包)

Microsoft Cognitive Toolkit是一個快速,易用的深度學習軟體包,但與TensorFlow相比,其範圍有限。它有各種各樣的模型和演算法,極好的支援Python和Jupyter筆記本,一個有趣的宣告性神經網路配置語言BrainScript,以及在Windows和Ubuntu Linux環境下自動部署。

在缺點方面,當我審查Beta 1的文件還沒有完全更新到CNTK 2,並且包沒有對MacOS支援。雖然自Beta 1以來,CNTK 2有許多改進,包括新的記憶體壓縮模式,以減少GPU和新的Nuget安裝包的記憶體使用,但對MacOS支援仍然缺失。

為Beta 1新增的PythonAPI有助於將認知工具包帶入主流的、用Python碼的、深度學習研究人員當中。 API包含模型定義和計算、學習演算法、資料讀取和分散式訓練的抽象。作為PythonAPI的補充,CNTK 2具有新的Python示例和教程,以及對 Google Protocol Buffer序列化的支援。教程以Jupyter筆記本實現。

CNTK 2元件可以處理來自Python,C ++或BrainScript的多維密集或稀疏資料。認知工具包包括各種各樣的神經網路型別:FFN(前饋),CNN(卷積),RNN/ LSTM(遞迴/長期短期記憶),批次標準化和序列注意序列。它支援強化學習,生成對抗網路,監督和非監督學習,自動超引數調整,以及從Python新增新的,使用者定義的核心元件在GPU上執行的能力。它能夠在多個GPU和機器上做到精確的並行性,而且(微軟聲稱)它甚至可以適應最大的模型到GPU記憶體。

CNTK 2 API支援從Python,C ++和BrainScript定義網路,學習者,讀者,培訓和評估。他們還支援使用C#進行評估。 Python API與NumPy互操作,幷包括一個高階層級庫,可以精確定義包括復現在內的高階神經網路。該工具包支援以符號形式表示迴圈模型作為神經網路中的迴圈,而不需要靜態展開迴圈步驟。

您可以在Azure網路和GPU上訓練CNTK 2模型。配備GPU的N系列Azure虛擬機器系列,在我稽核Beta 1時受到限制,現在通常可以從Azure控制檯獲得並完全管理。

幾個CNTK 2 / Microsoft Cognitive Toolkit教程以Jupyter筆記本提供。該圖顯示了Logistic迴歸訓練的繪製的視覺化。

MXNet

MXNet是一個可移植的、可伸縮的深度學習庫,是亞馬遜的DNN框架的選擇,結合了神經網路幾何的象徵性宣告與張量操作的命令性程式設計。 MXNet可跨多個主機擴充套件到多個GPU,接近線性擴充套件效率為85%,具有出色的開發速度、可程式設計性和可移植性。它支援Python,R,Scala,Julia和C ++,支援程度各不相同,它允許你混合符號和命令式程式設計風格

在我第一次評論MXNet時,文件感覺還沒有完成,除Python之外,我發現很少有其它語言的例子。自從我評論以後,這兩種情況都有所改善。

MXNet平臺是建立在一個動態依賴排程器上的,它可以自動並行化符號和命令式操作,但是你必須告訴MXNet要使用哪些GPU和CPU核心。在排程器頂部的圖優化層使符號執行快速和記憶體高效。

MXNet目前支援用Python,R,Scala,Julia和C ++構建和訓練模型;訓練的MXNet模型也可以用於Matlab和JavaScript中的預測。無論您選擇哪種語言來構建模型,MXNet都會呼叫優化的C ++後端引擎。

MXNet作者認為他們的API是Torch、Theano、Chainer和Caffe提供的一個超集,儘管對GPU叢集有更多的可移植性和支援。在許多方面MXNet類似於TensorFlow,但增加了嵌入命令張量操作的能力。

除了實際強制的MNIST數字分類之外,MXNet教程的計算機視覺包含使用卷積神經網路(CNN)的影像分類和分割,使用更快的R-CNN的物件檢測,神經藝術和使用深度CNN的大規模影像分類和ImageNet資料集。還有自然語言處理、語音識別、對抗網路以及監督和非監督機器學習的其他教程。

亞馬遜測試了在P2.16xlarge例項上的MXNet中實現的Inception v3演算法,發現其伸縮效率為85%。

Scikit-learn

Scikit-learn Python框架具有廣泛的可靠的機器學習演算法,但沒有深度學習演算法。如果你是一個Python粉絲,Scikit-learn可能是一般機器學習庫中最佳選擇。

Scikit-learn是一個強大的,成熟的機器學習Python庫,包含各種各樣成熟的演算法和整合圖。它相對容易安裝、學習和使用,帶有很好的例子和教程。

在另一方面,Scikit-learn不包括深度學習或強化學習,缺少圖模型和序列預測,並且除Python之外,不能真正使用其它語言。它不支援PyPy,Python即時編譯器或GPU。也就是說,除了它的少量進入神經網路,它不會真的有速度問題。它使用Cython(Python到C編譯器)來處理需要快速的函式,例如內迴圈。

Scikit-learn對分類、迴歸、聚類、降維、模型選擇和預處理演算法具有很好的選擇。它有所有這些的良好的文件和示例,但沒有任何種類的指導工作流以完成這些任務。

Scikit-learn贏得了易於開發的最高分,主要是因為演算法都像廣告和文件一樣工作,API是一致的,設計良好,資料結構之間幾乎沒有“阻抗不匹配”。函式庫其中的功能已徹底充實,錯誤徹底消除,用來開發十分愉快。

本示例使用Scikit-learn的小手寫數字資料集來演示使用Label Spreading模型的半監督學習。在1,797總樣本中只有30個被標記。

另一方面,函式庫沒有涵蓋深度學習或強化學習,這隱藏了當前困難但重要的問題,例如準確的影像分類和可靠的實時語言解析和翻譯。顯然,如果你對深度學習感興趣,你應該另覓他處。

然而,存在許多問題,從建立連結不同觀察值的預測函式到分類觀察值到學習未標記資料集的結構,這使得它們適應於普通的老的機器學習,而不需要數十層的神經元,對於這些領域 Scikit-learn 是非常好的選擇。

Spark MLlib

Spark MLlib是Spark的開源機器學習庫,提供了通用的機器學習演算法,如分類、迴歸、聚類和協同過濾(但不包括DNN)以及特徵提取、轉換、維數降低工具,以及構建、評估和調整機器學習管道選擇和工具。Spark MLlib還包括用於儲存和載入演算法、模型和管線、用於資料處理以及進行線性代數和統計的實用程式。

Spark MLlib是用Scala編寫的,並使用線性代數包Breeze。 Breeze依靠netlib-java來優化數值處理,雖然在開源分佈中意味著優化使用CPU。 Databricks提供與GPU配合使用的定製Spark叢集,這有可能為您帶來另一個10倍的速度改進,用於訓練具有大資料的複雜機器學習模型。

MLlib實現了大量的分類和迴歸的常用演算法和模型,新手可能變得混亂不堪,無可適從,但專家最終可能會為分析資料找到一個很好的模型的資料。對於這麼多的模型Spark2.x增加了超引數調優的重要特性,也稱為模型選擇。超引數t允許調優分析人員設定引數網格、估計器和評估器,並且它允許交叉驗證方法(耗時但準確)或訓練驗證分割方法(更快但不太準確)找到最佳資料模型。

Spark MLlib擁有針對Scala和Java的完整API,主要是針對Python的完整API以及針對R的粗略部分API。您可以通過計算示例來獲得良好的覆蓋率:54個Java和60個Scala機器學習示例,52個Python機器學習示例,只有五個R示例。在我的經驗中,Spark MLlib是最容易使用Jupyter筆記本,但你可以肯定地在控制檯執行它,如果你馴服詳細的Spark狀態訊息。

Spark MLlib提供了你想要的基本機器學習、特性選擇、管道和永續性的任何東西。它在分類、迴歸、聚類和過濾方面做得相當不錯。鑑於它是Spark的一部分,它具有訪問資料庫、流和其他資料來源的強大訪問許可權。另一方面,SparkMLlib並不真正採用與TensorFlow,MXNet,Caffe和Microsoft Cognitive Toolkit相同的方式建模和訓練深層神經網路。

Spark MLlibPython示例(Naive Bayes)作為Databricks筆記本。注意解釋,程式碼和輸出如何散佈。

TensorFlow

TensorFlow,Google的可移植機器學習和神經網路庫,執行和伸縮性很好,雖然它有點難學。TensorFlow擁有各種各樣的模型和演算法,它們對深度學習非常重視,並且在具有GPU(用於訓練)或Google TPU(用於生產規模預測)的硬體上具有出色的效能。它還具有對Python的良好支援,良好的文件和良好的軟體,用於顯示和理解描述其計算的資料流圖TensorBoard。

資料流圖中的節點表示數學運算,而圖的邊表示在它們之間流動的多維資料陣列(張量)。這種靈活的架構允許您將計算部署到桌面、伺服器或移動裝置中的一個或多個CPU或GPU,而無需重寫程式碼。

使用TensorFlow的主要語言是Python,雖然對C ++有限的支援。TensorFlow提供的教程包括手寫數字分類。影像識別、字嵌入、遞迴神經網路,用於機器翻譯的序列到序列模型、自然語言處理和基於PDE(偏微分方程)的模擬的應用。

TensorFlow可以方便地處理各種神經網路,包括目前正在急劇變化的影像識別和語言處理領域的深度CNN和LSTM遞迴模型。用於定義圖層的程式碼可能fan,但是您方便但不詳細,可以使用三個可選的深度學習介面中的任何一個來修復它。雖然除錯非同步網路求解器可以是平凡的,但TensorBoard軟體可以幫助您視覺化圖。

TensorBoard顯示TensorFlow計算的圖形。我們放大了幾個部分來檢查圖形的細節。

總結

對於任何給定的預測任務,您應該使用哪種機器學習或深度學習包取決於機器學習的複雜性,用於訓練的資料量和形式,您的計算資源以及您的程式語言偏好和技能。它也可能取決於您是否喜歡使用程式碼或配置檔案定義模型。

但是,在開始自己的模型訓練考察之前,您可能希望瞭解來自Google,HPE和MicrosoftAzure雲的任何預先訓練的應用機器學習服務是否能夠處理您的資料,無論是語音、文字或影像。如果他們對你的資料不能很好地工作,你可能還想在嘗試基本的機器學習訓練(最後,如果沒有其他工作)深度學習訓練之前,看看你能用簡單的統計方法獲得多大的好處。這裡的原則是保持分析儘可能簡單,但不是更簡單。

在我討論的兩個基本的機器學習包,我建議喜歡Scala和在Hadoop中有他們的資料的使用Spark MLlib 。我建議喜歡Python的人Scikit-learn。

我應該提到那些喜歡Scala(和Java)的人和在Hadoop中有他們的資料的人的另一個選擇事Deeplearning4j。我沒有評論他,但是,因為其名稱意味著它是一個學習深度包。

選擇Caffe,Microsoft Cognitive Toolkit,MXNet和TensorFlow的深度學習包是一個更困難的決定。我不再建議使用Caffe,因為它的發展停滯不前。然而,選擇其他三個中的一個仍然是棘手,因為對於具有類似功能,它們都是最好的選擇。

Cognitive Toolkit現在有Python和C ++ API以及網路配置語言BrainScript。如果您喜歡使用配置檔案而不是程式設計網路拓撲,那麼CognitiveToolkit可能是一個不錯的選擇。另一方面,它似乎不像TensorFlow一樣成熟,它不能在MacOS上執行。

MXNet支援Python、R、Scala、Julia和C ++,但其支援最好的API是用Python開發的。 MXNet在多個主機上的多個GPU上展示出良好的伸縮性(85%的線性)。當我評論MXNet的文件和示例是吝嗇的,但他們已經改進了。

TensorFlow可能是三個包中最成熟的,並且它是一個很好的選擇,只要你喜歡編寫Python,並可以克服學習曲線。 TensorFlow具有你可以使用基本的構建塊,它給你細粒度的控制,但也需要你編寫大量的程式碼來描述一個神經網路。有三個簡化的API與TensorFlow一起工作來解決這個問題:tf.contrib.learn,TF-Slim和Keras。支援TensorFlow的最終考慮是TensorBoard,它對於視覺化和理解您的資料流圖非常有用。

文章來源:網路冷眼|翻譯

相關文章