1. 程式人生 > >開始入坑深度學習(DeepLearning)

開始入坑深度學習(DeepLearning)

       現在遊戲越來越難做,國家廣電總局稽核越來越變態,國家各種打壓遊戲,遊戲產業也成為教育失敗的背鍋俠,所以本人現在開始做深度學習方向。 

   深度學習研究的熱潮持續高漲,各種開源深度學習框架也層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlow卻殺出重圍,在關注度和使用者數上都佔據絕對優勢,大有一統江湖之勢。表2-1所示為各個開源框架在GitHub上的資料統計(資料統計於2017年1月3日),可以看到TensorFlow在star數量、fork數量、contributor數量這三個資料上都完勝其他對手。

    圖片描述

TensorFlow

TensorFlow是相對高階的機器學習庫,使用者可以方便地用它設計神經網路結構,而不必為了追求高效率的實現親自寫C++或CUDA程式碼。它和Theano一樣都支援自動求導,使用者不需要再通過反向傳播求解梯度。其核心程式碼和Caffe一樣是用C++編寫的,使用C++簡化了線上部署的複雜度,並讓手機這種記憶體和CPU資源都緊張的裝置可以運行復雜模型(Python則會比較消耗資源,並且執行效率不高)。除了核心程式碼的C++介面,TensorFlow還有官方的Python、Go和Java介面,是通過SWIG(Simplified Wrapper and Interface Generator)實現的,這樣使用者就可以在一個硬體配置較好的機器中用Python進行實驗,並在資源比較緊張的嵌入式環境或需要低延遲的環境中用C++部署模型。SWIG支援給C/C++程式碼提供各種語言的介面,因此其他指令碼語言的介面未來也可以通過SWIG方便地新增。不過使用Python時有一個影響效率的問題是,每一個mini-batch要從Python中feed到網路中,這個過程在mini-batch的資料量很小或者運算時間很短時,可能會帶來影響比較大的延遲。現在TensorFlow還有非官方的Julia、Node.js、R的介面支援,地址如下。

Julia: github.com/malmaud/TensorFlow.jl  Node.js: github.com/node-tensorflow/node-tensorflow  R: github.com/rstudio/tensorflow

在資料並行模式上,TensorFlow和Parameter Server很像,但TensorFlow有獨立的Variable node,不像其他框架有一個全域性統一的引數伺服器,因此引數同步更自由。TensorFlow和Spark的核心都是一個數據計算的流式圖,Spark面向的是大規模的資料,支援SQL等操作,而TensorFlow主要面向記憶體足以裝載模型引數的環境,這樣可以最大化計算效率。

TensorFlow的另外一個重要特點是它靈活的移植性,可以將同一份程式碼幾乎不經過修改就輕鬆地部署到有任意數量CPU或GPU的PC、伺服器或者移動裝置上。相比於Theano,TensorFlow還有一個優勢就是它極快的編譯速度,在定義新網路結構時,Theano通常需要長時間的編譯,因此嘗試新模型需要比較大的代價,而TensorFlow完全沒有這個問題。TensorFlow還有功能強大的視覺化元件TensorBoard,能視覺化網路結構和訓練過程,對於觀察複雜的網路結構和監控長時間、大規模的訓練很有幫助。TensorFlow針對生產環境高度優化,它產品級的高質量程式碼和設計都可以保證在生產環境中穩定執行,同時一旦TensorFlow廣泛地被工業界使用,將產生良性迴圈,成為深度學習領域的事實標準。

除了支援常見的網路結構[卷積神經網路(Convolutional Neural Network,CNN)、迴圈神經網路(Recurent Neural Network,RNN)]外,TensorFlow還支援深度強化學習乃至其他計算密集的科學計算(如偏微分方程求解等)。TensorFlow此前不支援symbolic loop,需要使用Python迴圈而無法進行圖編譯優化,但最近新加入的XLA已經開始支援JIT和AOT,另外它使用bucketing trick也可以比較高效地實現迴圈神經網路。TensorFlow的一個薄弱地方可能在於計算圖必須構建為靜態圖,這讓很多計算變得難以實現,尤其是序列預測中經常使用的beam search。

TensorFlow的使用者能夠將訓練好的模型方便地部署到多種硬體、作業系統平臺上,支援Intel和AMD的CPU,通過CUDA支援NVIDIA的GPU(最近也開始通過OpenCL支援AMD的GPU,但沒有CUDA成熟),支援Linux和Mac,最近在0.12版本中也開始嘗試支援Windows。在工業生產環境中,硬體裝置有些是最新款的,有些是用了幾年的老機型,來源可能比較複雜,TensorFlow的異構性讓它能夠全面地支援各種硬體和作業系統。同時,其在CPU上的矩陣運算庫使用了Eigen而不是BLAS庫,能夠基於ARM架構編譯和優化,因此在移動裝置(Android和iOS)上表現得很好。

TensorFlow在最開始釋出時只支援單機,而且只支援CUDA 6.5和cuDNN v2,並且沒有官方和其他深度學習框架的對比結果。在2015年年底,許多其他框架做了各種效能對比評測,每次TensorFlow都會作為較差的對照組出現。那個時期的TensorFlow真的不快,效能上僅和普遍認為很慢的Theano比肩,在各個框架中可以算是墊底。但是憑藉Google強大的開發實力,很快支援了新版的cuDNN(目前支援cuDNN v5.1),在單GPU上的效能追上了其他框架。表2-3所示為https://github.com/soumith/convnet-benchmarks給出的各個框架在AlexNet上單GPU的效能評測

Caffe

官方網址:caffe.berkeleyvision.org/  GitHub:github.com/BVLC/caffe

Caffe全稱為Convolutional Architecture for Fast Feature Embedding,是一個被廣泛使用的開源深度學習框架(在TensorFlow出現之前一直是深度學習領域GitHub star最多的專案),目前由伯克利視覺學中心(Berkeley Vision and Learning Center,BVLC)進行維護。Caffe的創始人是加州大學伯克利的Ph.D.賈揚清,他同時也是TensorFlow的作者之一,曾工作於MSRA、NEC和Google Brain,目前就職於Facebook FAIR實驗室。Caffe的主要優勢包括如下幾點。

  • 容易上手,網路結構都是以配置檔案形式定義,不需要用程式碼設計網路。
  • 訓練速度快,能夠訓練state-of-the-art的模型與大規模的資料。
  • 元件模組化,可以方便地拓展到新的模型和學習任務上。

Caffe的核心概念是Layer,每一個神經網路的模組都是一個Layer。Layer接收輸入資料,同時經過內部計算產生輸出資料。設計網路結構時,只需要把各個Layer拼接在一起構成完整的網路(通過寫protobuf配置檔案定義)。比如卷積的Layer,它的輸入就是圖片的全部畫素點,內部進行的操作是各種畫素值與Layer引數的convolution操作,最後輸出的是所有卷積核filter的結果。每一個Layer需要定義兩種運算,一種是正向(forward)的運算,即從輸入資料計算輸出結果,也就是模型的預測過程;另一種是反向(backward)的運算,從輸出端的gradient求解相對於輸入的gradient,即反向傳播演算法,這部分也就是模型的訓練過程。實現新Layer時,需要將正向和反向兩種計算過程的函式都實現,這部分計算需要使用者自己寫C++或者CUDA(當需要執行在GPU時)程式碼,對普通使用者來說還是非常難上手的。正如它的名字Convolutional Architecture for Fast Feature Embedding所描述的,Caffe最開始設計時的目標只針對於影象,沒有考慮文字、語音或者時間序列的資料,因此Caffe對卷積神經網路的支援非常好,但對時間序列RNN、LSTM等支援得不是特別充分。同時,基於Layer的模式也對RNN不是非常友好,定義RNN結構時比較麻煩。在模型結構非常複雜時,可能需要寫非常冗長的配置檔案才能設計好網路,而且閱讀時也比較費力。

Caffe的一大優勢是擁有大量的訓練好的經典模型(AlexNet、VGG、Inception)乃至其他state-of-the-art(ResNet等)的模型,收藏在它的Model Zoo(github.com/BVLC/ caffe/wiki/Model-Zoo)。因為知名度較高,Caffe被廣泛地應用於前沿的工業界和學術界,許多提供原始碼的深度學習的論文都是使用Caffe來實現其模型的。在計算機視覺領域Caffe應用尤其多,可以用來做人臉識別、圖片分類、位置檢測、目標追蹤等。雖然Caffe主要是面向學術圈和研究者的,但它的程式執行非常穩定,程式碼質量比較高,所以也很適合對穩定性要求嚴格的生產環境,可以算是第一個主流的工業級深度學習框架。因為Caffe的底層是基於C++的,因此可以在各種硬體環境編譯並具有良好的移植性,支援Linux、Mac和Windows系統,也可以編譯部署到移動裝置系統如Android和iOS上。和其他主流深度學習庫類似,Caffe也提供了Python語言介面pycaffe,在接觸新任務,設計新網路時可以使用其Python介面簡化操作。不過,通常使用者還是使用Protobuf配置檔案定義神經網路結構,再使用command line進行訓練或者預測。Caffe的配置檔案是一個JSON型別的.prototxt檔案,其中使用許多順序連線的Layer來描述神經網路結構。Caffe的二進位制可執行程式會提取這些.prototxt檔案並按其定義來訓練神經網路。理論上,Caffe的使用者可以完全不寫程式碼,只是定義網路結構就可以完成模型訓練了。Caffe完成訓練之後,使用者可以把模型檔案打包製作成簡單易用的介面,比如可以封裝成Python或MATLAB的API。不過在.prototxt檔案內部設計網路節構可能會比較受限,沒有像TensorFlow或者Keras那樣在Python中設計網路結構方便、自由。更重要的是,Caffe的配置檔案不能用程式設計的方式調整超引數,也沒有提供像Scikit-learn那樣好用的estimator可以方便地進行交叉驗證、超引數的Grid Search等操作。Caffe在GPU上訓練的效能很好(使用單塊GTX 1080訓練AlexNet時一天可以訓練上百萬張圖片),但是目前僅支援單機多GPU的訓練,沒有原生支援分散式的訓練。慶幸的是,現在有很多第三方的支援,比如雅虎開源的CaffeOnSpark,可以藉助Spark的分散式框架實現Caffe的大規模分散式訓練。