天天看點

AI 從業者該如何選擇深度學習開源架構

導語:本文是微軟美國總部機器學習科學家彭河森博士在雷鋒網硬創公開課的分享,由雷鋒網旗下欄目“AI科技評論”整理。

編者按:本文内容來自微軟美國總部機器學習科學家彭河森博士在雷鋒網(公衆号:雷鋒網)硬創公開課的分享,并由彭河森博士親自整理成文。

正如程式語言一樣,深度學習開源架構同樣各有優劣和适用的場景,那麼 AI 從業者該如何有針對性地選擇這些平台來玩轉深度學習?

本期公開課特邀了先後在谷歌、亞馬遜、微軟供職的機器學習科學家彭河森博士為大家講述《MXNet火了,AI從業者該如何選擇深度學習開源架構》。彭河森博士親眼見證并深入參與了這三家巨頭布局深度學習的過程。

嘉賓介紹

彭河森,埃默裡大學統計學博士。現擔任微軟美國總部的機器學習科學家、微軟必應廣告部應用資深研究員,目前主要研究方向是自然語言處理和機器學習在廣告和推薦系統中的應用。此外,彭河森博士曾是亞馬遜最年輕的機器學習研究員,之前還供職于谷歌計量經濟學部和中科院。

AI 從業者該如何選擇深度學習開源架構

深度學習是一個非常熱門的領域,現在市面上也有很多非常優秀的平台,相信大家在入行之初都在想,這麼多平台應該怎麼選擇?

我先提兩點,可能是一般測評沒有考慮到的東西:

  • 一個是圖像計算和符号求導,這是深度學習一個非常有意思且非常重要的副産物。
  •  另一個是深度學習架構的可觸碰深度,這點直接關系到深度學習系統的發展未來和使用者的自由度。

這兩點對于初學者和從業人員都非常重要,我在後面詳細講述。

首先要恭喜 MXNet 近日獲得了亞馬遜的背書,MXNet 平台本身非常優秀,具有很多優良的性質:例如多節點模型訓練,目前是我知道最全面的多語言支援。此外,也有評測說 MXNet 性能方面可以高出同行平台很多,我們将會在後面的讨論中提到。現在進入正題,我們該如何選擇深度學習開源平台,參考标準應該是什麼樣的?

一、深度學習開源平台的 5 大參考标準

今天主要探讨的平台(或者軟體)包括:Caffe, Torch, MXNet, CNTK, Theano, TensorFlow, Keras。

如何選擇一個深度學習平台?我總結出了下面的這些考量标準。因人而異,因項目而異。可能你是做圖像處理,也可能是自然語言處理,或是數量金融,根據你不同的需求,對平台做出的選擇可能會不同。

标準1:與現有程式設計平台、技能整合的難易程度

無論是學術研究還是工程開發,在上馬深度學習課題之前一般都已積累不少開發經驗和資源。可能你最喜歡的程式設計語言已經确立,或者你的資料已經以一定的形式儲存完畢,或者對模型的要求(如延遲等)也不一樣。标準1 考量的是深度學習平台與現有資源整合的難易程度。這裡我們将回答下面的問題:

  • 是否需要專門為此學習一種新語言?
  • 是否能與目前已有的程式設計語言結合?

标準 2: 和相關機器學習、資料處理生态整合的緊密程度

我們做深度學習研究最後總離不開各種資料處理、可視化、統計推斷等軟體包。這裡我們要回答問題:

  • 模組化之前,是否具有友善的資料預處理工具?當然大多平台都自身帶了圖像、文本等預處理工具。
  • 模組化之後,是否具有友善的工具進行結果分析,例如可視化、統計推斷、資料分析?

标準 3:通過此平台做深度學習之外,還能做什麼?

上面我們提到的不少平台是專門為深度學習研究和應用進行開發的,不少平台對分布式計算、GPU 等構架都有強大的優化,能否用這些平台/軟體做其他事情?

比如有些深度學習軟體是可以用來求解二次型優化;有些深度學習平台很容易被擴充,被運用在強化學習的應用中。哪些平台具備這樣的特點?

這個問題可以涉及到現今深度學習平台的一個方面,就是圖像計算和自動化求導。

标準 4:對資料量、硬體的要求和支援

當然,深度學習在不同應用場景的資料量是不一樣的,這也就導緻我們可能需要考慮分布式計算、多 GPU 計算的問題。例如,對計算機圖像處理研究的人員往往需要将圖像檔案和計算任務分部到多台計算機節點上進行執行。

當下每個深度學習平台都在快速發展,每個平台對分布式計算等場景的支援也在不斷演進。今天提到的部分内容可能在幾個月後就不再适用。

标準 5:深度學習平台的成熟程度

成熟程度的考量是一個比較主觀的考量因素,我個人考量的因素包括:社群的活躍程度;是否容易和開發人員進行交流;目前應用的勢頭。

講了 5 個參考标準後,接下來我們用上面的這些标準對各個深度學習平台進行評價:

二、深度學習平台評價

評判1:與現有程式設計平台、技能整合的難易程度

标準1 考量的是深度學習平台與現有資源整合的難易程度。這裡我們将回答下面的問題:是否需要專門為此學習一種新語言?是否能與目前已有的程式設計語言結合?

這一個問題的幹貨在下面這個表格。這裡我們按照每個深度學習平台的底層語言和使用者語言進行總結,可以得到下表。

AI 從業者該如何選擇深度學習開源架構

其中 Keras 通過 Theano, TensorFlow 作為底層進行模組化。

我們可以看到這樣的趨勢:

  • 深度學習底層語言多是 C++ / C 這樣可以達到高運作效率的語言。
  • 操作語言往往會切近實際,我們大緻可以斷定 Python 是未來深度學習的操作平台語言,微軟在 CNTK 2.0 加入了對 Python 的支援。
  • 當然,還有不少平台可以通過腳本的方式配置網絡并且訓練模型。

從格局上來說,Python 作為深度學習模組化的基本語言是可以确定的。如果你最喜歡程式設計語言是 Python,恭喜您,大多數平台都可以和你的技術無縫銜接。如果是 Java 也不用擔心,不少平台也具有 Java 支援,Deeplearning4J 還是一個原生的 Java 深度學習平台。

标準 2: 和相關機器學習、資料處理生态整合的緊密程度

這裡我們要提一下現在主要的資料處理工具,比較全面的資料分析工具包括 R 及其相關生态,Python 及其相關生态,小衆一點的還包括 Julia 及其相關生态。

完成深度學習模組化等任務之後,和生态的整合也尤為重要。

我們可以發現,上面和 Python, R, 整合較為緊密,這裡 Keras 生态(TensorFlow, Theano), CNTK, MXNet, Caffe 等占有大量優勢。

同時 Caffe 具有大量圖像處理包,對資料觀察也具有非常大的優勢。

标準 3:通過此平台做深度學習之外,還能做什麼?

下圖是本次公開課的核心:

AI 從業者該如何選擇深度學習開源架構

其實深度學習平台在創造和設計時的側重點有所不同,我們按照功能可以将深度學習平台分為上面六個方面:

 CPU+GPU控制,通信:這一個最低的層次是深度學習計算的基本層面。

  • 記憶體、變量管理層:這一層包含對于具體單個中間變量的定義,如定義向量、矩陣,進行記憶體空間配置設定。
  • 基本運算層:這一層主要包含加減乘除、正弦、餘弦函數,最大最小值等基本算數運算操作。
  • 基本簡單函數:

         ○     包含各種激發函數(activation function),例如 sigmoid, ReLU 等。

         ○     同時也包含求導子產品

  • 神經網絡基本子產品,包括 Dense Layer, Convolution Layer (卷積層), LSTM 等常用子產品。
  • 最後一層是對所有神經網絡子產品的整合以及優化求解。

衆多機器學習平台在功能側重上是不一樣的,我将他們分成了四大類:

1.    第一類是以 Caffe, Torch, MXNet, CNTK 為主的深度學習功能性平台。這類平台提供了非常完備的基本子產品,可以讓開發人員快速建立深度神經網絡模型并且開始訓練,可以解決現今深度學習中的大多數問題。但是這些子產品很少将底層運算功能直接暴露給使用者。

2.    第二類是以 Keras 為主的深度學習抽象化平台。Keras 本身并不具有底層運算協調的能力,Keras 依托于 TensorFlow 或者 Theano 進行底層運算,而 Keras 自身提供神經網絡子產品抽象化和訓練中的流程優化。可以讓使用者享受快速模組化的同時,具有很友善的二次開發能力,加入自身喜歡的子產品。

3.    第三類是 TensorFlow。TensorFlow 吸取了已有平台的長處,既能讓使用者觸碰底層資料,又具有現成的神經網絡子產品,可以讓使用者非常快速的實作模組化。TensorFlow 是非常優秀的跨界平台。

4.    第四類是 Theano, Theano 是深度學習界最早的平台軟體,專注底層基本的運算。 

是以對平台選擇可以對照上圖按照自己的需求選用:

  • 如果任務目标非常确定,隻需要短平快出結果,那麼第 1 類平台會适合你。
  • 如果您需要進行一些底層開發,又不想失去現有子產品的友善,那麼第 2、3 類平台會适合你。
  • 如果你有統計、計算數學等背景,想利用已有工具進行一些計算性開發,那麼第 3, 4 類會适合你。

這裡我介紹下深度學習的一些副産品,其中一個比較重要的功能就是符号求導。

圖計算和符号求導:深度學習對開源社群的巨大貢獻

大家可能會有疑問:我能訓練出來深度學習模型就蠻好的了,為什麼需要接觸底層呢?

這裡我先介紹下深度學習的一些副産品,其中一個比較重要的功能就是符号求導。符号求導英文是 Symbolic Differentiation,現在有很多有關的文獻和教程可以使用。

符号求導是什麼意思?

以前我們做機器學習等研究,如果要求導往往需要手動把目标函數的導數求出來。最近一些深度學習工具,如 Theano, 推出了自動化符号求導功能,這大大減少了開發人員的工作量。

當然,商業軟體如 MatLab, Mathematica 在多年前就已具有符号計算的功能,但鑒于其商業軟體的限制,符号計算并沒有在機器學習應用中被大量采用。

深度學習由于其網絡的複雜性,必須采用符号求導的方法才能解決目标函數過于複雜的問題。另外一些非深度學習問題,例如:二次型優化等問題,也都可以用這些深度學習工具來求解了。

更為優秀的是,Theano 符号求導結果可以直接通過 C程式編譯,成為底層語言,高效運作。

這裡我們給一個 Theano 的例子:

>>> import numpy

>>> import theano

>>> import theano.tensor as T

>>> from theano import pp

>>> x = T.dscalar('x')

>>> y = x ** 2

>>> gy = T.grad(y, x)

>>> f = theano.function([x], gy)

>>> f(4)

8

上面我們通過符号求導的方法,很容易的求出 y 關于 x 的導數在 4 這個點的數值。

标準 4:對資料量、硬體的要求和支援

對于多 GPU 支援和多伺服器支援,我們上面提到的所有平台都聲稱自己能夠完成任務。同時也有大量文獻說某個平台的效果更為優秀。我們這裡把具體平台的選擇留給在座各位,提供下面這些資訊:

首先想想你想要幹什麼。現在深度學習應用中,需要運用到多伺服器訓練模型的場景往往隻有圖像處理一個,如果是自然語言處理,其工作往往可以在一台配置優秀的伺服器上面完成。如果資料量大,往往可以通過 hadoop 等工具進行資料預處理,将其縮小到單機可以處理的範圍内。

本人是比較傳統的人,從小就開始自己折騰各種科學計算軟體的編譯。現在主流的文獻看到的結果是,單機使用 GPU 能比 CPU 效率提高數十倍左右。

但是其實有些問題,在 Linux 環境下,編譯 Numpy 的時候将線性函數包換為 Intel MLK 往往也可以得到類似的提高。

當然現在很多評測,往往在不同硬體環境、網絡配置情況下,都會得到不一樣的結果。

就算在亞馬遜雲平台上面進行測試,也可能因為網絡環境、配置等原因,造成完全不同的結果。是以對于各種測評,基于我的經驗,給的建議是:take it with a grain of salt,自己要留個心眼。前面我們提到的主要工具平台,現在都對多 GPU、多節點模型訓練有不同程度的支援,而且現在也都在快速的發展中,我們建議聽衆自己按照需求進行鑒别。

标準 5:深度學習平台的成熟程度

對于成熟程度的評判往往會比較主觀,結論大多具有争議。我在這裡也隻列出資料,具體如何選擇,大家自己判斷。

這裡我們通過 Github 上面幾個比較受歡迎的數量來判斷平台的活躍程度。這些資料擷取于今天下午(2016-11-25)。我們用黑體标出了每個因子排名前三的平台:

  • 第一個因子是貢獻者數量,貢獻者這裡定義非常寬泛,在 Github issues 裡面提過問題的都被算作是 Contributor,但是還是能作為一個平台受歡迎程度的度量。我們可以看到 Keras, Theano, TensorFlow 三個以 Python 為原生平台的深度學習平台是貢獻者最多的平台。
  • 第二個因子是 Pull Request 的數量,Pull Request 衡量的是一個平台的開發活躍程度。我們可以看到 Caffe 的 Pull Request 最高,這可能得益于它在圖像領域得天獨厚的優勢,另外 Keras 和 Theano 也再次登榜。
AI 從業者該如何選擇深度學習開源架構

另外,這些平台在應用場景上有側重:

  • 自然語言處理,當然要首推 CNTK,微軟MSR(A) 多年對自然語言處理的貢獻非常巨大,CNTK 的不少開發者也是分布式計算牛人,其中所運用的方法非常獨到。
  • 當然,對于非常廣義的應用、學習,Keras/TensorFlow/Theano 生态可能是您最好的選擇。
  • 對于計算機圖像處理,Caffe 可能是你的不二選擇。

 關于深度學習平台的未來:

  • 微軟在對 CNTK 很有決心,Python API 加的好,大家可以多多關注。
  • 有觀點認為深度學習模型是戰略資産,應該用國産軟體,防止壟斷。我認為這樣的問題不用擔心,首先 TensorFlow 等軟體是開源的,可以通過代碼審查的方法進行品質把關。另外訓練的模型可以儲存成為 HDF5 格式,跨平台分享,是以成為谷歌壟斷的機率非常小。
  • 很有可能在未來的某一天,大家訓練出來一些非常厲害的卷積層(convolution layer),基本上能非常優秀地解決所有計算機圖像相關問題,這個時候我們隻需要調用這些卷積層即可,不需要大規模卷積層訓練。另外這些卷積層可能會硬體化,成為我們手機晶片的一個小子產品,這樣我們的照片拍好的時候,就已經完成了卷積操作。

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

繼續閱讀