天天看點

(讀書筆記)各深度學習架構簡要介紹1.Tensorflow2.Caffe3.Theano4.Torch5.Keras6.CNTK7.其他深度學習架構

1.Tensorflow

官網:http://www.tensorflow.org

GitHub 網址:http://github.com/tensorflow/tensorflow

模型倉庫網址:http://github.com/tensorflow/models

Tensorflow是由Google Brain開發并開源的相對高階的機器學習庫,使用者可以友善地用它設計神經網絡結構,而不必為了追求高效率的實作親自寫C++或CUDA代碼。Tensorflow支援自動求導。Tensorflow核心代碼由C++編寫,簡化了線上部署的複雜度,使之能在手機這類記憶體和CPU資源都很緊張的裝置上也可運作複雜模型。除了支援C++之外,Tensorflow還有Python、Go、Java、Julia、Node.js、R等語音的接口支援。不過使用Python時有一個影響效率的問題,每一個mini-batch要從Python中feed到網絡中,這個過程在mini-batch的資料量很小或者運作時間很短時,可能會帶來比較大的延遲。

Tensorflow是一種資料流式的架構,這使得它支援非常自由的算法表達,除了深度學習以及機器學習的算法外,還可以實作偏微分方程求解之類的方法。事實上,隻要可以将計算表示成計算圖形式,就可以使用Tensorflow。使用者可以寫内層循環代碼控制計算圖分支的計算,Tensorflow會自動将相關的分支轉化為子圖并執行疊代運算。

在資料并行模式上,Tensorflow和Parameter Server很像,但Tensorflow有獨立的Variable node,不想其他架構有一個全局統一的參數伺服器,是以參數同步更加自由。

Tensorflow另外一個重要特點是它靈活的移植性,可以經過很少的修改甚至不需要修改就可以輕松部署到有任意數量CPU或GPU的PC、伺服器或者移動裝置上。相比于Theano,Tensorflow還有一個優勢就是它極快的編譯速度,在定義新網絡結構時代價會很小。

Tensorflow還具有十分強大的可視化元件Tensorboard,可以幫助可視化網絡結構和訓練過程,對于觀察複雜的網絡結構和監控長時間、大規模的訓練很有幫助。Tensorboard目前支援5種可視化:标量(scalars)、圖檔(images)、音頻(audio)、直方圖(histgrams)和計算圖(computation graph)。标量可以用來監控loss、學習率、準确率等值的變化趨勢;圖檔可以用來展示訓練過程使用者設定儲存的圖檔,如重建效果圖或者matplotlib繪制的圖檔等;計算圖則可以完全展示全部的計算圖,并且支援縮放拖拽和檢視節點屬性。

Tensorflow的一個薄弱地方在于計算圖必須建構為靜态圖,這讓很多計算變得難以實作,尤其是序列預測中經常使用的beam search。

2.Caffe

官網:http://caffe.berkeleyvision.org

GitHub:http://github.com/BVLC/Caffe

Caffe全稱為Convolutional Architecture for Fast Feature Embedding,由伯克利視覺學中心(BVLC)釋出和維護。有事主要包括以下幾點:

(1)容易上手,網絡結構都是以配置檔案形式定義,不需要用代碼涉及網絡

(2)訓練速度快,能夠訓練state-of-the-art的模型與大規模的資料

(3)組模組化塊化,可以友善地拓展到新的網絡模型和學習任務上

Caffe的核心概念是layer,每一個神經網絡的子產品都是一個layer。layer接收輸入資料,并通過内部計算産生輸出資料。在設計網絡結構時,通過寫protobuf配置檔案把各個layer拼接在一起即可構成完整的網絡。每一個layer需要定義兩種運算:正向傳播的預測過程和反向傳播的訓練過程。實作新的layer時,需要将兩種計算過程的函數都實作,這部分計算需要使用者自己編寫C++或CUDA(運用GPU計算時)代碼。Caffe最開始設計的目标隻針對圖像,沒有考慮文本、語音或時間序列資料,是以Caffe對于卷積神經網絡的支援很好,但對時間序列RNN、LSTM等支援不是特别充分。同時,基于layer的模式在定義RNN結構時也比較麻煩。

Caffe的一大優勢是擁有大量訓練好的經典模型(ALexNet、VGG、Inception)乃至其他state-of-the-art的模型(ResNet等),收藏在其Model Zoo(http://github.com/BVLC/caffe/wiki/Model-Zoo)。由于Caffe的底層是基于C++的,是以其移植性也十分良好。Caffe也提供了python語言接口pycaffe,不過,通常使用者還是使用protobuf配置檔案定義神經網絡結構,在使用指令行進行訓練或預測。protobuf檔案是一個類似JSON類型的.prototxt檔案,其中使用許多順序連接配接的layer來描述神經網絡結構,Caffe的執行程式會提取這些檔案并按其定義來訓練網絡。不過在.prototxt檔案内部設計網絡結構可能會比較受限,沒有像Tensorflow或者Keras那麼友善自由。而且,Caffe的配置檔案不能用程式設計的方式調整超參數,也沒有提供像Scikit-learn那樣好用的estimator可以友善地進行交叉驗證、超參數的Grid Search等操作。

3.Theano

官網:http://www.deeplearning.net/software/theano/

GitHub:http://github.com/Theano/Theano

Theano誕生于2008年,由蒙特利爾大學Lisa Lab團隊開發并維護,是一個高性能的符号計算及深度學習庫,被認為是這類庫的始祖之一。Theano的核心是一個數學表達式的編譯器,專門為處理大規模神經網絡訓練的計算而設計。Theano的主要優勢如下:

(1)內建Numpy,可以直接使用Numpy的ndarray,API接口學習成本低

(2)計算穩定性好,比如可以精準地計算輸出值很小的函數(如log(1+x))

(3)動态地生成C或者CUDA代碼,用以編譯成高效的機器代碼,并連結各種可以加速的庫,如BLAS、CUDA等

雖然Theano支援Linux、Mac和Windows,但是沒有底層C++的接口,是以模型的部署十分不友善,依賴于各種python庫,并且不吃隻各種移動裝置,是以幾乎沒有在工業生産環境的應用,更多地被當作一個研究工具。

Theano在運算時需要将使用者的python代碼轉換成CUDA代碼,再編譯為二進制可執行檔案,編譯複雜模型的時間非常久。此外,導入過程也很慢,而且一旦選擇了某塊GPU,就無法切換到其他裝置。不過,Theano在訓練簡單網絡(如很淺的MLP)時性能可能比Tensorflow好,因為全部代碼都是運作時編譯,不需要想Tensorflow那樣每次feed mini-batch時都得通過低效的python循環來實作。

Theano是完全基于python的符号計算庫,使用者定義的各種運算,Theano可以自動求導。Theano對CNN和RNN的支援都很好,實作起來簡單高效,這讓Theano可以支援大部分state-of-the-art的網絡。Theano派生出了大量基于它的深度學習庫,其中就有Keras、Lassage等,展現了Theano在深度學習屆的基石作用。盡管其十分重要,但直接使用Theano設計大型神經網絡還是太繁瑣了。

4.Torch

官網:http://torch.ch

GitHub:http://github.com/torch/torch7

Torch的定位就是LuaJIT上的一個高效科學計算哭,支援大量的機器學習算法,同時以GPU上的計算優先。Torch包含大量的機器學習、計算機視覺、信号處理、并行運算、圖像、視訊、音頻、網絡處理的庫,并且擁有大量訓練好的深度學習模型。同時,它還支援設計非常複雜的神經網絡的拓撲圖結構,在并行化到CPU和GPU上,在Torch上設計新的layer是相對簡單的。Torch使用的語言是Lua,官方給出了一下幾點使用LuaJIT而不使用Python的理由:

(1)LuaJIT的通用計算性能遠勝于Python,而且可以直接在LuaJIT中操作C的pointers

(2)Torch的架構,包含Lua是自洽的,而完全基于Python的程式對不同平台、系統移植性較差,依賴的外部庫較多

(3)LuaJIT的FFI拓展接口非常易學,可以友善地連結其他庫到Torch中

Torch的nn庫支援神經網絡、自編碼器、線性回歸、CNN、RNN等,同時支援定制的損失函數及梯度計算。Lua做資料預處理等操作可以随意使用循環等,而不必像Python那樣擔心性能問題,也不需要學習Python中各種加速運算的庫。但Lua流行度不比Python,學習成本較大。Torch和Caffe一樣也是基于layer的連接配接來定義網絡,其新的layer依然需要使用者自己實作,但方式和定義網絡的方式類似,非常簡便,這點和Caffe不同。同時,Torch屬于指令式程式設計模式,不想Theano、Tensorflow屬于聲明式程式設計(計算圖是預定義的靜态的結構),是以用它實作某些複雜操作(如beam search)要更為友善。

5.Keras

官網:http://keras.io

GitHub:http://github.com/fchollet/keras

Keras是一個崇尚極簡、高度子產品化的神經網絡庫,使用Python實作,并可以同時運作在Tensorflow和Theano後端上。它旨在讓使用者進行最快速的原型試驗,讓想法變為結果的過程最短,相比Theano和Tensorflow的通用性,Keras則專精于深度學習。它提供目前為止最友善的API,使用者隻需要将進階的子產品拼在一起,就可以設計神經網絡。他同時支援CNN和RNN,支援級聯的模型或任意的圖結構模型(可以讓某些資料跳過某些layer和後面的layer對接,使得建立Inception等複雜網絡更為容易),從CPU上計算切換到GPU加速無須任何代碼改動。

Keras的所有子產品都是簡潔、易懂、完全可配置、可随意插拔的,并且基本上沒有任何使用限制,神經網絡、損失函數、優化器、初始化方法、激活函數和正則化等子產品都是可以随便組合的。同時,新的子產品也很容易添加,這使得Keras非常适合最前沿的研究。Keras最大的問題可能是目前無法直接使用多GPU,是以對大規模資料處理速度沒有其他支援多GPU或分布式的架構塊。Keras的程式設計模型設計和Torch很想,但相比Torch,Keras建構在Python上,有一套完整的科學計算工具鍊。

6.CNTK

官網:http://cntk.ai

GitHub:http://github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微軟研究院(MSR)開源的深度學習架構,在語音識别領域的應用尤其廣泛。CNTK通過一個有向圖将神經網絡描述為一系列的運算操作,這個有向圖中子節點代表輸入或網絡參數,其他節點代表各種矩陣運算。CNN支援各類前饋網絡,也支援自動求導。

CNTK設計是性能導向的,在CPU、單/多GPU以及GPU叢集上都有優異的表現。CNTK擁有很高的靈活度,可以和Caffe一樣通過配置檔案定義網絡結構,且支援建構任意的計算圖,支援AdaGrad、RmsProp等優化方法。同時,CNTK還将支援其他語言的綁定,包括Python,C++和C#,使得使用者可以用程式設計的方式涉及網絡結構。PC上支援Linux、Mac和Windows,但是目前不支援ARM架構,限制了在移動裝置上的發揮。

7.其他深度學習架構

I.Lasagne

官網:http://lasagne.readthedocs.io

GitHub:http://github.com/Lasagne/Lasagne

II.MXNet

官網:http://mxnet.io

GitHub:http://github.com/dmlc/mxnet

III.DIGITS

官網:http://developer.nvidia.com/digits

GitHub:http://github.com/NVIDIA/DIGITS

IV.Deeplearning4J

官網:http://deeplearning4j.org

GitHub:http://github.com/deeplearning4j/deeplearning4j

V.Chainer

官網:http://chainer.org

GitHub:http://github.com/pfnet/chainer

VI.Leaf

官網:http://autumnai.com/leaf/book

GitHub:http://github.com/autumnai/leaf

VII.DSSTNE

GitHub:http://github.com/amznlabs/amazon-dsstne

繼續閱讀