1. 程式人生 > >常見深度學習框架簡介

常見深度學習框架簡介

一、Caffe

(Convolutional Architecture for Fast Feature Embedding) BVLC
官網:http://caffe.berkeleyvision.org/

Caffe是一個清晰而高效的深度學習框架,其作者是博士畢業於UC Berkeley的賈揚清,目前在Google工作。

Caffe是純粹的C++/CUDA架構,支援命令列、Python和MATLAB介面;可以在CPU和GPU直接無縫切換:Caffe::set_mode(Caffe::GPU); 在Caffe中圖層需要使用C++定義,而網路則使用Protobuf定義。Caffe是一個深度卷積神經網路的學習框架,使用Caffe可以比較方便地進行CNN模型的訓練和測試,精於CV領域。

Caffe作為快速開發和工程應用是非常適合的。caffe官方提供了大量examples,照著examples寫,caffe只要求會寫prototxt就行,它的訓練過程、梯度下降演算法等等都實現封裝好了,懂了prototxt的語法了,基本就能自己構造神經網路了。caffe作為C++語言以及配合了CUDA開發的框架,訓練效率也有保證,這也是caffe適合於工業應用的原因。程式碼易懂好理解,高效、實用。上手簡單,使用方便,比較成熟和完善,實現基礎演算法方便快捷,開發新演算法不是特別靈活,適合工業快速應用實現.

Caffe的優勢:

  1. 一方面是調參,改網路很方便,開源做得很好,另一方面CNN在CV裡用的很多,這也是Caffe的優勢。

  2. 上手快:配置檔案簡單,易上手,文件齊全,模型與相應優化都是以文字形式而非程式碼形式給出。

Caffe給出了模型的定義、最優化設定以及預訓練的權重,方便立即上手。

  1. 速度快:Google Protocol Buffer資料標準為Caffe提升了效率,能夠執行最棒的模型與海量的資料。Caffe與cuDNN結合使用,測試AlexNet模型,在K40上處理每張圖片只需要1.17ms.

  2. 模組化:允許對新資料格式、網路層和損失函式進行擴充套件,方便擴充套件到新的任務和設定上。

可以使用Caffe提供的各層型別來定義自己的模型。

  1. 開放性:公開的程式碼和參考模型用於再現。

  2. 社群好:可以通過BSD-2參與開發與討論。

學術論文采用此模型較多。不少論文都與Caffe有關(R-CNN,DSN,最近還有人用Caffe實現LSTM)

缺點:

靈活性差,不同版本介面不相容, 可定製性較低,不能很方便得擴充套件到其它模型。

Caffe可能是第一個主流的工業級深度學習工具,它開始於2013年底,具有出色的卷積神經網路實現。在計算機視覺領域Caffe依然是最流行的工具包,它有很多擴充套件,但是由於一些遺留的架構問題,它對遞迴網路和語言建模的支援很差。

二、MXNet

出自CXXNet、Minerva、Purine 等專案的開發者之手,主要用C++ 編寫。MXNet 強調提高記憶體使用的效率,甚至能在智慧手機上執行諸如影象識別等任務。

記憶體優化做得好

MXNet結合命令式和宣告式程式設計的優點,既可以對系統做大量的優化,又可以方便除錯。資源和計算的排程、記憶體分配資源管理、資料的表示、計算優化等都很值得學習的,原生支援分散式訓練的。

對於一個優秀的深度學習系統,或者更廣來說優秀的科學計算系統,最重要的是程式設計介面的設計。他們都採用將一個領域特定語言(domain specific language)嵌入到一個主語言中。例如numpy將矩陣運算嵌入到python中。這類嵌入一般分為兩種,其中一種嵌入的較淺,其中每個語句都按原來的意思執行,且通常採用指令式程式設計(imperative programming),其中numpy和Torch就是屬於這種。而另一種則用一種深的嵌入方式,提供一整套針對具體應用的迷你語言。這一種通常使用宣告式語言(declarative programing),既使用者只需要宣告要做什麼,而具體執行則由系統完成。這類系統包括Caffe,theano和TensorFlow。

這兩種方式各有利弊,總結如下。

指令式程式設計:

如何執行 a=b+1: 需要b已經被賦值。立即執行加法,將結果儲存在a中。

優點: 語義上容易理解,靈活,可以精確控制行為。通常可以無縫地和主語言互動,方便地利用主語言的各類演算法,工具包,debug和效能偵錯程式。

缺點: 實現統一的輔助函式和提供整體優化都很困難。

宣告式程式設計:

如何執行 a=b+1: 返回對應的計算圖(computation graph),我們可以之後對b進行賦值,然後再執行加法運算

優點: 在真正開始計算的時候已經拿到了整個計算圖,所以我們可以做一系列優化來提升效能。實現輔助函式也容易,例如對任何計算圖都提供forward和backward函式,對計算圖進行視覺化,將圖儲存到硬碟和從硬碟讀取。

缺點: 很多主語言的特性都用不上。某些在主語言中實現簡單,但在這裡卻經常麻煩,例如if-else語句 。debug也不容易,例如監視一個複雜的計算圖中的某個節點的中間結果並不簡單。

目前現有的系統大部分都採用上兩種程式設計模式的一種。與它們不同的是,MXNet嘗試將兩種模式無縫的結合起來。在指令式程式設計上MXNet提供張量運算,而宣告式程式設計中MXNet支援符號表達式。使用者可以自由的混合它們來快速實現自己的想法。例如我們可以用宣告式程式設計來描述神經網路,並利用系統提供的自動求導來訓練模型。另一方便,模型的迭代訓練和更新模型法則中可能涉及大量的控制邏輯,因此我們可以用指令式程式設計來實現。同時我們用它來進行方便地調式和與主語言互動資料。

下表我們比較MXNet和其他流行的深度學習系統

框架 Caffe Torch Theano TensorFlow MXNet
主語言 C++ Lua Python C++ C++
從語言 Python, Matlab x x Python Python, R, Julia, Scala, Javascript, Matlab, Go
硬體 CPU, GPU, CPU, GPU, FPGA CPU, GPU, CPU, GPU, mobile CPU, GPU,mobile
分散式 x x x v v
命令式 x v v x v
宣告式 v x x v v

Symbol: 宣告式的符號表達式

MXNet使用多值輸出的符號表達式來宣告計算圖。符號是由操作子構建而來。一個操作子可以是一個簡單的矩陣運算“+”,也可以是一個複雜的神經網路裡面的層,例如卷積層。一個操作子可以有多個輸入變數和多個輸出變數,還可以有內部狀態變數。一個變數既可以是自由的,我們可以之後對其賦值;也可以是某個操作子的輸出。在執行一個符號表達式前,我們需要對所有的自由變數進行賦值。

NDArray:命令式的張量計算

MXNet提供命令式的張量計算來橋接主語言的和符號表達式。另一方面,NDArray可以無縫和符號表達式進行對接。

KVStore:多裝置間的資料互動

MXNet提供一個分散式的key-value儲存來進行資料交換。它主要有兩個函式,push: 將key-value對從一個裝置push進儲存,pull:將某個key上的值從儲存中pull出來此外,KVStore還接受自定義的更新函式來控制收到的值如何寫入到儲存中。最後KVStore提供數種包含最終一致性模型和順序一致性模型在內的資料一致性模型。

讀入資料模組

資料讀取在整體系統效能上佔重要地位。MXNet提供工具能將任意大小的樣本壓縮打包成單個或者數個檔案來加速順序和隨機讀取。

訓練模組

MXNet實現了常用的優化演算法來訓練模型。使用者只需要提供資料資料迭代器和神經網路的Symbol便可。此外,使用者可以提供額外的KVStore來進行分散式的訓練。

過去,現狀,和未來

大半年數個優秀的C++機器學習系統的開發人員成立了DMLC,本意是更方便共享各自專案的程式碼,並給使用者提供一致的體驗。當時我們有兩個深度學習的專案,一個是CXXNet,其通過配置來定義和訓練神經網路。另一個是Minerva,提供類似numpy一樣的張量計算介面。前者在圖片分類等使用卷積網路上很方便,而後者更靈活。那時候我們想能不能做一個兩者功能都具備的系統,於是這樣就有了MXNet。其名字來自Minerva的M和CXXNet的XNet。其中Symbol的想法來自CXXNet,而NDArray的想法來自Minerva。我們也常把MXNet叫“mix net”。

MXNet的目的是做一個有意思的系統,能夠讓大家用著方便的系統,一個輕量的和可以快速測試系統和演算法想法的系統。未來主要關注下面四個方向:

  1. 支援更多的硬體,目前在積極考慮支援AMD GPU,高通GPU,Intel Phi,FPGA,和更多智慧裝置。相信MXNet的輕量和記憶體節省可以在這些上大有作為。
  2. 更加完善的操作子。目前不論是Symbol還是NDArray支援的操作還是有限,我們希望能夠儘快的擴充他們。
  3. 更多程式語言。除了C++,目前MXNet對Python,R和Julia的支援比較完善。但我們希望還能有很多的語言,例如javascript。
  4. 更多的應用。我們之前花了很多精力在圖片分類上,下面我們會考慮很多的應用。

三、Torch

Facebook Google DeepMind Twitter FAIR

核心的計算單元使用C或者cuda做了很好的優化。在此基礎之上,使用lua構建了常見的模型。另外,torch7構建的是一個生態系統,安裝新的模型實現模組只需要luarocks install package. 比如:luarocks install rnn。之後就可以歡樂地使用rnn模型了。torch7的缺點可能就是1. wrapper是lua語言,需要一點時間來學習。2. 優化新的計算單元可能會比較麻煩,backend修改起來會比較麻煩.

核心特徵的總結:

  1. 一個強大的n維陣列
  2. 很多實現索引,切片,移調transposing的例程
    3.驚人的通過LuaJIT的C介面
    4.線性代數例程
    5.神經網路,並基於能量的模型
    6.數值優化例程
    7.快速高效的GPU支援
    8.可嵌入,可移植到iOS,Android和FPGA的後臺

優勢:

  1. 構建模型簡單,一層層搭積木即可。
  2. 高度模組化,一層就是一個模組,寫新模組也方便,套用介面就行,用tensor運算不必寫cuda也能用GPU。
  3. 底層的tensor由C和cuda實現,速度不會比caffe差,甚至某些運算可能更快。
  4. 使用GPU方便,把tensor資料送到GPU只要簡單的 “tensor:cuda()”。
  5. lua入門快,堪比python。
  6. 很重要的一點,nngraph,理論上可以用nn裡的模組實現任何DAG構造的網路,當然也包括RNN、LSTM之類的。

劣勢:

  1. 對於不少人來說,lua要新學。
  2. 除了deep learning方面,其他好用的機器學習library較少。
  3. 資料檔案格式比較麻煩,一般原始資料沒有torch專用的t7格式檔案,需要通過mat等格式中轉轉換。

四、Theano

 the LISA group at the University of Montreal(蒙特利爾)

Theano是一個Python庫,用來定義、優化和計算數學表示式,用於高效的解決多維陣列的計算問題。

優點:

  • 整合NumPy-使用numpy.ndarray
  • 使用GPU加速計算-比CPU快140倍(只針對32位float型別)
  • 有效的符號微分-計算一元或多元函式的導數
  • 速度和穩定性優化-比如能計算很小的x的函式log(1+x)的值
  • 動態地生成C程式碼-更快地計算
  • 廣泛地單元測試和自我驗證-檢測和診斷多種錯誤
  • 靈活性好

缺點:

  1. scan 中糟糕引數的傳遞限制,immutable 機制導致 function compile 時候的時間過長。
  2. theano 定義 function 時缺乏靈活的多型機制。
  3. 困難的除錯方法

五、TensorFlow

Google

TensorFlow是谷歌基於DistBelief進行研發的第二代人工智慧學習系統,其命名來源於本身的執行原理。Tensor(張量)意味著N維陣列,Flow(流)意味著基於資料流圖的計算,TensorFlow為張量從圖象的一端流動到另一端計算過程。TensorFlow是將複雜的資料結構傳輸至人工智慧神經網中進行分析和處理過程的系統。

TensorFlow 表達了高層次的機器學習計算,大幅簡化了第一代系統,並且具備更好的靈活性和可延展性。TensorFlow一大亮點是支援異構裝置分散式計算,它能夠在各個平臺上自動執行模型,從電話、單個CPU / GPU到成百上千GPU卡組成的分散式系統。從目前的文件看,TensorFlow支援CNN、RNN和LSTM演算法,擁有C++/Python程式設計介面,這都是目前在Image,Speech和NLP最流行的深度神經網路模型。

TensorFlow的資料結構tensor,它相當於N維的array或者list,與MXNet類似,都是採用了以python呼叫的形式展現出來。某個定義好的tensor的資料型別是不變的,但是維數可以動態改變。用tensor rank和TensorShape來表示它的維數(例如rank為2可以看成矩陣,rank為1可以看成向量)。tensor是個比較中規中矩的型別。唯一特別的地方在於在TensorFlow構成的網路中,tensor是唯一能夠傳遞的型別,而類似於array、list這種不能當成輸入。

TensorFlow的網路實現方式選擇的是符號計算方式,它的程式分為計算構造階段和執行階段,構造階段是構造出computation graph,computation graph就是包含一系列符號操作Operation和Tensor資料物件的流程圖,跟mxnet的symbol類似,它定義好了如何進行計算(加減乘除等)、資料通過不同計算的順序(也就是flow,資料在符號操作之間流動的感覺)。但是暫時並不讀取輸入來計算獲得輸出,而是由後面的執行階段啟動session的run來執行已經定義好的graph。這樣的方式跟mxnet很相似,應該都是借鑑了theano的想法。其中TensorFlow還引入了Variable型別,它不像mxnet的Variable屬於symbol(tf的operation類似mxnet的symbol),而是一個單獨的型別,主要作用是儲存網路權重引數,從而能夠在執行過程中動態改變。tf將每一個操作抽象成了一個符號Operation,它能夠讀取0個或者多個Tensor物件作為輸入(輸出),操作內容包括基本的數學運算、支援reduce、segment(對tensor中部分進行運算。

TensorFlow的優點:

  1. TensorFlow則是功能很齊全,能夠搭建的網路更豐富而不是像caffe僅僅侷限在CNN
  2. TensorFlow的深度學習部分能夠在一個模型中堆積了許多不同的模型和轉換,你能夠在一個模型中方便地處理文字 圖片和規則分類以及連續變數,同時實現多目標和多損失工作
  3. TensorFlow的管道部分能夠將資料處理和機器學習放在一個框架中,TensorFlow指引了方向。

TensorFlow是一個理想的RNN(遞迴神經網路) API和實現,TensorFlow使用了向量運算的符號圖方法,使得新網路的指定變得相當容易,但TensorFlow並不支援雙向RNN和3D卷積,同時公共版本的圖定義也不支援迴圈和條件控制,這使得RNN的實現並不理想,因為必須要使用Python迴圈且無法進行圖編譯優化。

六、CNTK 微軟深度學習工具包

微軟將人工智慧成果 CNTK 開源放上 GitHub,稱是運算速度最快的 Toolkit

是一個統一的深度學習工具包,它將神經網路描述成在有向圖上的一系列計算步驟。在這個有向圖中,葉子結點表示輸入層或網路引數,其它的結點表示成在輸入層上的矩陣操作。在CNTK上可以很容易的實現及結合當今流行的模型,例如前饋神經網路DNNs, 卷積神經網路(CNNs), 迴圈神經網路 (RNNs/LSTMs)。在實現隨機梯度下降學習時能夠自動計算梯度,而且還能通過多個GPUs或伺服器實現平行計算。CNTK是微軟在Cortana 數字助理和Skype 翻譯應用中使用的語音識別的系統框架。

CNTK最大的優點是可以並行多個GPU或伺服器。微軟首席科學家黃學東說“谷歌公開的TensorFlow並沒有這個功能”。

CNTK的另外一個優點是支援Microsoft Windows。但是這個開源工具是用C++寫的。微軟計劃將盡快公開對應的Python和C#版本。

七、Deeplearning4j

顧名思義,Deeplearning4j是“for Java”的深度學習框架,也是首個商用級別的深度學習開源庫。Deeplearning4j由創業公司Skymind於2014年6月釋出,使用 Deeplearning4j的不乏埃森哲、雪弗蘭、博斯諮詢和IBM等明星企業。DeepLearning4j是一個面向生產環境和商業應用的高成熟度深度學習開源庫,可與Hadoop和Spark整合,即插即用,方便開發者在APP中快速整合深度學習功能,可應用於以下深度學習領域:

  • 人臉/影象識別
  • 語音搜尋
  • 語音轉文字(Speech to text)
  • 垃圾資訊過濾(異常偵測)
  • 電商欺詐偵測