最好的六個機器學習和深度學習庫

最好的六個機器學習和深度學習庫

如果您正在開始新的機器學習或深度學習項目,您可能會對選擇哪個框架感到困惑。正如我們將要討論的那樣,這兩種項目都有幾個不錯的選擇。

機器學習框架和深度學習框架之間存在差異。本質上,機器學習框架涵蓋了用於分類,迴歸,聚類,異常檢測和數據準備的各種學習方法,並且可以包括或不包括神經網絡方法。

深度學習或深度神經網絡框架涵蓋了具有許多隱藏層的各種神經網絡拓撲。Keras,MXNet,PyTorch和TensorFlow是深度學習的框架。Scikit-learn和Spark MLlib是機器學習框架。(單擊以前的任何鏈接以閱讀我對產品的獨立評論。)

通常,深度神經網絡計算在GPU(特別是Nvidia CUDA通用GPU),TPU或FPGA 上運行得更快,而不是在CPU上運行。通常,更簡單的機器學習方法不會受益於GPU。

雖然你可以在一個或多個CPU上訓練深度神經網絡,但訓練往往很慢,而且我說的不是秒或分鐘。需要訓練的神經元和層越多,可用於訓練的數據越多,所需的時間就越長。當Google Brain團隊在2016年為新版Google翻譯培訓其語言翻譯模型時,他們會在多個GPU上一次運行一週的培訓課程。如果沒有GPU,每個模型培訓實驗都需要數月時間。

從那時起,英特爾數學核心庫(MKL)就可以在合理的時間內在CPU上訓練一些神經網絡。與此同時,GPU,TPU和FPGA的速度更快。

在相同GPU上運行的所有深度學習包的訓練速度幾乎相同。這是因為訓練內循環將大部分時間花在Nvidia CuDNN包中。

除了訓練速度之外,每個深度學習庫都有自己的優點和缺點,Scikit-learn和Spark MLlib也是如此。讓我們潛入。

Keras

Keras是一個用於構建神經網絡模型的高級前端規範和實現,它支持三個後端深度學習框架:TensorFlow,CNTK和Theano。亞馬遜目前正致力於為Keras開發MXNet後端。也可以使用PlaidML(一個獨立項目)作為Keras的後端,以利用PlaidML對所有GPU的OpenCL支持。

TensorFlow是Keras的默認後端,也是推薦用於通過CUDA和cuDNN在Nvidia硬件上進行GPU加速的許多用例以及Google Cloud中的TPU加速的後端。TensorFlow還包含一個內部tf.keras類,與外部Keras安裝分開。

Keras具有高級環境,使得在神經網絡中添加一層像其順序模型中的一行代碼一樣簡單,並且每個只需要一個函數調用來編譯和訓練模型。Keras允許您根據需要使用其模型或功能API在較低級別工作。

Keras允許您通過子類化進一步下載到Python編碼級別keras.Model,但在可能的情況下更喜歡功能API。Keras還有一個scikit-learnAPI,因此您可以使用Scikit-learn網格搜索在Keras模型中執行超參數優化。

MXNet

自從2017年初在Apache軟件基金會的支持下移動以來,MXNet已經發展和改進了很多。雖然在Keras上有一個MXNet後端的工作,但是不同的高級接口變得更加重要:Gluon。在合併Gluon之前,您可以在MXNet中編寫簡單的命令式代碼或快速符號代碼,但不能同時編寫兩者。使用Gluon,您可以以與Keras和PyTorch競爭的方式結合兩者中的優點。

Gluon的優勢包括:

  • 簡單易懂的代碼:Gluon提供了一整套即插即用的神經網絡構建塊,包括預定義的層,優化器和初始化器。
  • 靈活,強制性的結構:Gluon不需要嚴格定義神經網絡模型,而是將訓練算法和模型更緊密地結合在一起,以便在開發過程中提供靈活性。
  • 動態圖:Gluon使開發人員能夠定義動態的神經網絡模型,這意味著它們可以動態構建,使用任何結構,並使用Python的任何本機控制流。
  • 高性能:Gluon提供上述所有優點,而不會影響底層引擎提供的訓練速度。

這四個優點,以及大量擴展的模型示例集,使Gluon / MXNet與Keras / TensorFlow和PyTorch大致相同,以便於開發和培訓速度。您可以在Gluon主頁面上查看每個代碼示例,並在Gluon API的概述頁面上重複。

Gluon API包括神經網絡層,遞歸神經網絡,損失函數,數據集方法和視覺數據集,模型動物園以及一組貢獻的實驗神經網絡方法的功能。可以自由地與標準MXNet和NumPy的模塊結合膠子,例如module,autograd,和ndarray,以及與Python控制流。

Gluon具有很好的層建築模型選擇,包括基本層(密集,輟學等),卷積層,池層和激活層。這些都是一線電話。這些可以在網絡容器內部使用,例如gluon.nn.Sequential()。

PyTorch

PyTorch建立在舊的Torch和新的Caffe2框架之上。正如您可能從名稱中猜到的那樣,PyTorch使用Python作為其腳本語言,它使用了一個演進的Torch C / CUDA後端。Caffe2的生產功能正在納入PyTorch項目。

PyTorch被稱為“具有強大GPU加速功能的Python中的張量和動態神經網絡。”這意味著什麼?

張量是一種在物理學和工程學中大量使用的數學結構。二級張量是一種特殊的矩陣; 利用張量取向量的內積得到另一個具有新量值和新方向的向量。TensorFlow的名稱來自張量(突觸權重)在其網絡模型中流動的方式。NumPy也使用張量,但稱之為ndarray。

GPU加速是大多數現代深度神經網絡框架的基礎。甲動態神經網絡是一個可以從迭代改變迭代中,例如允許PyTorch模型來添加和訓練期間刪除隱藏層以提高其精度和通用性。PyTorch在每個迭代步驟中即時重新創建圖形。相比之下,TensorFlow默認創建單個數據流圖,優化圖代碼以提高性能,然後訓練模型。

雖然急切執行 模式在TensorFlow中是一個相當新的選項,但它是PyTorch運行的唯一方式:API調用在調用時執行,而不是添加到圖形以便稍後運行。這可能看起來計算效率會低一些,但是PyTorch的設計就是以這種方式工作,而且在訓練或預測速度方面並不吝嗇。

PyTorch集成了加速庫,如英特爾MKL和Nvidia cuDNN以及NCCL(Nvidia集體通信庫),以最大限度地提高速度。其核心CPU和GPU Tensor和神經網絡後端-TH(Torch),THC(Torch CUDA),THNN(Torch神經網絡)和THCUNN(Torch CUDA神經網絡) - 作為具有C99 API的獨立庫編寫。同時,PyTorch不是Python綁定到單片C ++框架 - 其目的是與Python深度集成並允許使用其他Python庫。

Scikit-learn

該Scikit學習 Python的框架有一個廣泛的選擇穩健的機器學習算法,但沒有深度學習。如果您是Python粉絲,Scikit-learn可能是普通機器學習庫中最好的選擇。

Scikit-learn是一個功能強大且經過充分驗證的Python機器學習庫,具有各種成熟的算法和集成圖形。它相對容易安裝,學習和使用,並且它有很好的示例和教程。

另外,Scikit-learn不包括深度學習或強化學習,缺乏圖形模型和序列預測,並且它不能真正用於Python以外的語言。它不支持PyPy,Python即時編譯器或GPU。也就是說,除了對神經網絡的輕微嘗試之外,它並沒有真正的速度問題。它使用Cython(Python到C編譯器)來處理需要快速的函數,例如內部循環。

Scikit-learn有很好的算法選擇,可用於分類,迴歸,聚類,降維,模型選擇和預處理。它具有良好的文檔和所有這些的示例,但缺乏任何類型的指導工作流程來完成這些任務。

Scikit-learn在易於開發方面獲得了最高分,主要是因為算法都按照文檔記錄,API一致且設計良好,數據結構之間幾乎沒有“阻抗不匹配”。很高興與一個圖書館合作,該圖書館的功能已經徹底充實,並且其漏洞已被徹底清除。

另一方面,圖書館不包括深度學習或強化學習,這省去了當前困難但重要的問題,例如準確的圖像分類和可靠的實時語言解析和翻譯。顯然,如果你對深度學習感興趣,你應該去別處看看。

然而,存在許多問題 - 從建立連接不同觀察的預測功能,到分類觀察,到學習未標記數據集的結構 - 這些都適用於簡單的舊機器學習而不需要幾十層神經元,以及這些區域Scikit-learn確實非常好。

Spark MLlib

Spark MLlib是Apache Spark的開源機器學習庫,提供常見的機器學習算法,如分類,迴歸,聚類和協同過濾(但不是深度神經網絡)。它還包括用於特徵提取,轉換,降維和選擇的工具; 用於構建,評估和調整機器學習流程的工具; 用於保存和加載算法,模型和流水線,用於數據處理以及用於執行線性代數和統計的實用程序。

Spark MLlib是用Scala編寫的,並使用線性代數包Breeze。Breeze依賴於netlib-java進行優化的數值處理,儘管在開源分發中意味著優化了CPU的使用。Databricks提供使用GPU的定製Spark集群,可以為您提供另外10倍的速度提升,以培訓具有大數據的複雜機器學習模型。

Spark MLlib實現了大量用於分類和迴歸的常用算法和模型,以至於新手可能會感到困惑,但專家可能最終會為要分析的數據找到一個很好的模型選擇。對於過多的模型,Spark 2.x增加了超參數調整的重要特徵,也稱為模型選擇。超參數調整允許分析人員設置參數網格,估計器和評估器,並讓交叉驗證方法(耗時但準確)或列車驗證拆分方法(更快但不太準確)找到最佳模型數據。

Spark MLlib擁有適用於Scala和Java的完整API,主要是用於Python的完整API,以及用於R的粗略部分API。通過計算樣本可以很好地瞭解覆蓋範圍:54 Java和60 Scala機器學習示例,52 Python機器學習例子,只有五個R例子。根據我的經驗,Spark MLlib最容易使用Jupyter筆記本,但如果你馴服詳細的Spark狀態消息,你當然可以在控制檯中運行它。

Spark MLlib提供了基本的機器學習,功能選擇,流水線和持久性方面的任何你想要的東西。它在分類,迴歸,聚類和過濾方面表現相當不錯。鑑於它是Spark的一部分,它可以很好地訪問數據庫,流和其他數據源。另一方面,Spark MLlib並沒有像TensorFlow,PyTorch,MXNet和Keras一樣建立和訓練深度神經網絡。

TensorFlow

TensorFlow可能是深度神經網絡開發的黃金標準,儘管它並非沒有缺陷。TensorFlow歷史上最大的兩個問題是,它太難學,而且創建模型需要太多代碼。這兩個問題在過去幾年都得到了解決。

為了使TensorFlow更易於學習,TensorFlow團隊已經制作了更多的學習資料,並闡明瞭現有的“入門”教程。許多第三方已經制作了自己的教程材料(包括InfoWorld)。現在有多本TensorFlow書籍和幾本在線TensorFlow課程。您甚至可以參加斯坦福大學的CS20課程,TensorFlow for Deep Learning Research,該課程在線發佈所有幻燈片和講義。

TensorFlow庫有幾個新的部分,它們提供的接口需要較少的編程來創建和訓練模型。其中包括tf.keras,它提供了TensorFlow版本的其他引擎中立的Keras軟件包,並tf.estimator提供了許多用於處理模型的高級設施。這些包括線性,深度神經網絡的迴歸量和分類器,以及線性和深度神經網絡的組合,以及可以構建自己的估算器的基類。此外,Dataset API使您能夠從簡單,可重用的部分構建複雜的輸入管道。您不必只選擇一個。作為本教程顯示,可以有效地使tf.keras,tf.data.dataset和tf.estimator共同努力。

TensorFlow Lite是TensorFlow針對移動和嵌入式設備的輕量級解決方案,可實現低延遲和小二進制大小的設備內機器學習推理(但不是培訓)。TensorFlow Lite還支持Android神經​​網絡API的硬件加速。TensorFlow Lite模型足夠小,可以在移動設備上運行,並可以為離線用例提供服務。

TensorFlow Lite的基本思想是訓練一個完整的TensorFlow模型並將其轉換為TensorFlow Lite模型格式。然後,您可以在Android或iOS上的移動應用程序中使用轉換後的文件。

或者,您可以使用其中一個預先訓練過的TensorFlow Lite模型進行圖像分類或智能回覆。智能回覆是與上下文相關的消息,可作為響應選項提供; 這基本上提供了與Google的Gmail客戶端相同的回覆預測功能。

另一種選擇是針對新的標記數據集重新訓練現有的TensorFlow模型,這是一種稱為轉移學習的重要技術,可顯著縮短訓練時間。關於此過程的實踐教程稱為TensorFlow for Poets。

機器學習還是深度學習?

有時您知道您需要一個深度神經網絡來有效地解決特定問題,例如對圖像進行分類,識別語音或翻譯語言。其他時候,您不知道是否有必要,例如預測下個月的銷售數據或檢測數據中的異常值。

如果你確實需要一個深度神經網絡,那麼Keras,MXNet與Gluon,PyTorch和TensorFlow與Keras或Estimators都是不錯的選擇。如果你不確定,那麼先從Scikit-learn或Spark MLlib開始,然後嘗試所有相關的算法。如果您從最佳模型或多個模型的集合中獲得滿意的結果,則可以停止。

如果您需要更好的結果,那麼嘗試在訓練有素的深層神經網絡上進行轉移學習。如果您仍然無法獲得所需,請嘗試從頭開始構建和訓練深度神經網絡。要優化模型,請嘗試超參數調整。

無論您使用何種方法訓練模型,請記住模型僅與您用於訓練的數據一樣好。記得清理它,使其標準化,並平衡訓練課程的大小。


分享到:


相關文章: