怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

機器學習 編程語言 數據挖掘 軟件 機器之心 2017-04-13

選自arXiv

機器之心編譯

參與:吳攀、蔣思源、李亞洲

初學者在學習神經網絡的時候往往會有不知道從何處入手的困難,甚至可能不知道選擇什麼工具入手才合適。近日,來自意大利的四位研究者發佈了一篇題為《神經網絡初學者:在 MATLAB、Torch 和 TensorFlow 中的快速實現(Neural Networks for Beginners A fast implementation in Matlab, Torch, TensorFlow)》的論文,對 MATLAB、Torch 和 TensorFlow 這三種神經網絡工具進行了介紹和比較。機器之心對其中部分內容進行了編譯介紹(其中第 6 節比較結論部分進行了全部介紹),論文原文請點擊文末「閱讀原文」查閱。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

本報告的目的

本報告提供了最常見的開發環境內一些機器學習工具的介紹。本報告主要關注實際問題,跳過了任何理論介紹。本報告面向的讀者是想要進入機器學習領域的學生和正在尋找新框架的專家。

這篇論文是關於人工神經網絡(ANN,[1,2])的,因為這是目前最熱門的主題,並且在許多人工智能任務上都達到了當前最佳的水平。在單獨介紹了每一種框架之後,我們同時也給出實現一些一般常見問題的設置方法,從而使它們的比較更簡單。

因為這個主題已經得到了廣泛的研究,而且還在持續快速地增長,所以我們將這個文檔和一個 GitHub 庫進行了配對,這個庫中的文檔是動態更新的,而且以後可能還會擴大規模。

GitHub 地址:https://github.com/AILabUSiena/NeuralNetworksForBeginners

目錄

1 MATLAB:一個統一友好的環境

1.1 介紹

1.2 設置異或實驗

1.3 停止準則和正則化

1.4 繪製分離面

2 Torch 和 Lua 環境

2.1 介紹

2.2 起步

2.2.1 Lua

2.2.2 Torch 環境

2.3 設置異或實驗

2.4 停止準則和正則化

2.5 繪製分離面

3 TensorFlow

3.1 介紹

3.2 起步

3.2.1 Python

3.2.2 TensorFlow 環境

3.2.3 安裝

3.3 設置異或實驗

4 MNIST 手寫字符識別

4.1 MATLAB 上的 MNIST

4.2 Torch 上的 MNIST

4.3 TensorFlow 上的 MNIST

5 卷積神經網絡

5.1 MATLAB

5.2 Torch

5.3 TensorFlow

6 關鍵比較

6.1 MATLAB

6.2 Torch

6.3 TensorFlow

6.4 比較總體概覽

6.5 計算問題


1 Matlab:一個統一的友好環境

1.1 介紹

Matlab 是一個強大的工具,能夠對大部分類型的數值運算、算法、編程和測試進行簡單又快速的處理。其直觀且友好的交互式接口使得它能簡單地對數據進行處理、可視化與分析。針對各種類型的任務,該軟件提供了大量的內置數學函數,以及豐富的、易於獲取的文檔。其主要設計是處理矩陣的,因此,幾乎所有的函數和運算都向量化了,也就是說它們可以管理標量以及向量、矩陣和張量(往往會有)。因此,其能更高效地避免循環(可能的時候),以及建立利用矩陣乘法的運算。

在此文檔中,我們只展現了一些簡單的用於上手人工神經網絡(ANN)的機器學習相關的工具。我們假設讀者有基礎知識,並把重點放在了進一步信息的官方文檔上。例如,你可以從 Matlab 的官網發現如何掌握該軟件的相關信息。確實,其許可證並非免費的,雖然大部分大學會為學生提供教學用許可證,但可能也無法獲取目前所有的程序包。特別是 Statistic and Machine Learning Toolbox 和 Neural Network Toolbox 提供了大量內置函數和模型,可用於實現適用於各類任務的不同 ANN 架構。

即使我們參考一些簡單獨立的案例,這兩個工具也是基本所需的。最容易理解的是 nnstart 函數,其能激活一個簡單的 GUI 並通過簡單的 2 層架構來引導用戶。它能允許加載可用的數據樣本或使用用戶自定義數據(即輸入數據和對應目標的兩個矩陣),還能訓練網絡並分析結果(誤差趨勢、混淆矩陣、ROC 曲線等)。

然而,還有更多可用於特定任務的函數。比如說,patternnet 函數是專為模式識別問題而設計的、newfit 函數適用於迴歸問題,而 feedforwardnet 函數是最靈活的,其允許構建自定義的和複雜的網絡。所有的版本都以類似方式實現,主要的選項和方法適用於所有函數。在下一章節中,我們展示瞭如何管理可定製架構,並開始解決非常基礎的問題。相關詳細信息可以在官方網站找到:http://ch.mathworks.com/help/nnet/getting-started-with-neural-network-toolbox.html


2 Torch 和 Lua 環境

2.1 介紹

Torch7 是一個易於使用並十分高效的科學計算框架,本質上是面向機器學習算法的。Torch7 以 C 語言寫成,這就保證了高效性。然而,通過 LuaJIT 接口(其提供了一種快速和直觀的腳本語言),我們可以進行完全地交互(通常很方便)。此外,它還集成了支持 GPU 計算的 CUDA 環境的必要庫。截至目前,Torch7 是構建任何種類拓撲結構的 ANN 原型上最常用的工具之一。事實上,Torch7 現在有很多軟件包,有很大的社區和不斷的更新和改進,這些都讓我們可以非常簡單地開發幾乎任何種類的架構。

有關安裝信息可以在官方網站入門部分找到:http://torch.ch/docs/getting-started.html。對基於 UNIX 的操作系統,這一過程非常簡單直接,而 Windows 系統即使有替代方法(https://github.com/torch/torch7/wiki/Windows),但還沒有官方支持。如果已經安裝了 CUDA,那麼就會自動添加 cutorch 和 cunn 包,其中包含了處理 Nvidia GPU 的所有必要工具。


3 TensorFlow

3.1 簡介

TensorFlow [5] 是一個用於數值計算的開源軟件庫,其相比於其它機器學習框架是最年輕的。TensorFlow 最初由谷歌大腦團隊的研究員和工程師開發,其目的是鼓勵對深度架構的研究。然而,該環境對一些數值編程領域提供了大量的合適的工具。其計算方式是在數據流圖(Data Flow Graphs)概念下構想的。圖的結點表示數學運算,圖的邊表示張量(多維數據數組)。該機器學習包的核心是用 C++寫的,但其提供了一個優良的 Python API,而且有很好的文檔支持。TensorFlow 主要的特徵是其符號方法,該方法允許對前向模型做出一般性定義,而將對應的衍生計算留給該環境本身執行。


4 MNIST 手寫字符識別

在本章節中,我們將討論如何建立一個 2 層 ANN 以解決 MNIST [6] 分類問題,MNIST 是一個著名的手寫字體識別數據集。其廣泛用於測試和比較一般機器學習算法和計算視覺方法。該數據集提供 28×28 像素(灰度)的手寫數字圖像。訓練和測試集分別包含 6 萬與 1 萬條樣本。壓縮文件可以在官網獲得:http://yann.lecun.com/exdb/mnist/,同時還有大多數常見算法的性能測評列表。

我們展示了構建的標準 2 層 ANN,其每一個隱藏層包含 300 個神經元。如圖 4 所示,因為該網絡是在官方網站上測評報告的架構之一,我們可以輕鬆地比較所得到的結果。其輸入需要重塑為包含 28 · 28 = 784 個元素的一維向量以滿足神經網絡。每個圖像最初由包含灰度像素值 [0, 255] 的矩陣所表徵,並將歸一化為 [0, 1] 之內。輸出將是包含 10 個元素的預測向量,因為每個元素的標籤將由 one-hot 編碼的 10 空位二元向量組成。激活和懲罰函數在不同的環境中並不相同,這樣以提供一個不同方法的概覽。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

圖 4:面向 MNIST 數據的 2 層網絡模型的一般架構


5 卷積神經網絡

在本章節中,我們將介紹卷積神經網絡(CNN [7, 6, 8]),該神經網絡是一種重要和強大的學習架構,其廣泛用於計算機視覺應用。卷積神經網絡目前代表著用於圖像分類任務的最先進算法,並構成了深度學習中的主要架構。我們展示了在所有提到的框架內如何構建和訓練這樣一個神經網絡,並且還探索了其最常用的功能和在 MNIST 上進行一些試驗以指出一些重要的特徵。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

圖 8:面向 MNIST 數據的 CNN 模型的一般架構

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

圖 9:在 MNIST 圖像上用 Matlab 訓練後的第一個卷積層的 5 × 5 濾波器。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

圖 11:在 2 × 2 最大池化的 MNIST 圖像上用 Torch 訓練的第一個卷積層的 5 × 5 濾波器。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

圖 12:在 MNIST 圖像上用 TensorFlow 和所述的架構訓練的第一個卷積層的 5 × 5 濾波器。


6 關鍵比較

在這一節,我們將提供對這些環境的整體概覽。即使我們在表 1 中提供了基於一些我們認為和機器學習軟件開發主要相關的特徵的分數比較,但本研究的目的並不是通過這樣簡單的評估來完成分析。相反,我們希望提出一個有用的引導,可幫助人們進入廣義上的 ANN 和機器學習領域,從而根據個人背景和要求來在環境中自我定位。更完整的和統計相關的比較可參閱:http://hammerprinciple.com/therighttool,這裡我們進行了總結,以幫助人們加速單個和全局的任務開發。

我們首先給出了每個環境的一般描述,然後我們嘗試在一些具體要求上比較了它們的優缺點。最後,我們在不同的任務上進行了計算性能的指示性數值分析,這也可以作為一個比較和討論的主題。


6.1 MATLAB

該編程語言是直觀的,並且該軟件也提供了完整的軟件包——讓用戶可以無需編寫任何特定的代碼就能定義和訓練幾乎所有類型的人工神經網絡架構。其代碼並行化(code parallelization)是自動完成的,而且與 CUDA 的集成也很直接。其可用的內置函數是高度可自定義和可優化的,從而提供了快速的和可擴展的實驗設置方式,讓你可以輕鬆獲取網絡的變量以進行深度分析。但是,擴展和集成 Matlab 工具需要對於該環境的高階知識。這可能會驅使用戶開始從頭編寫其代碼,導致計算表現的普遍衰減。這些功能讓其成為了一個完美的統計和分析工具箱,但是作為開發環境來說還是慢了一點。其 GUI 需要一些重量級的計算,但另一方面,這對用戶很友好,而且還提供了最好的圖形數據可視化。MATLAB 的文檔很完整,在官網上也組織得非常好。


6.2 Torch

Torch 的編程語言(Lua)有時候有一點難,但它應該比這些語言中其它一些要快一點。其提供了所有所需的 CUDA 集成和 CPU 並行自動化。其基於模塊的結構允許靈活的 ANN 架構,而且擴展其提供的軟件包也相對容易。而且其還有其它強大的軟件包,但一般而言它們需要一定的專業知識才能實現有意識的操作。Torch 可被輕鬆用於特定和一般算法測試的原型設計環境。其文檔遍佈於整個 Torch 的 GitHub 庫,有時候不能立即解決一些特定的問題。


6.3 Tensor Flow

其使用了非常動態的語言 Python,讓用戶可以輕鬆地編寫腳本。其 CPU 並行化是自動的,而且其使用了計算圖結構,可以輕鬆利用 GPU 計算。其提供了很好的數據可視化,並且讓初學者也可以輕鬆地獲取已經準備好的軟件包,儘管本文並沒有涉及到這方面。其符號計算(symbolic computation)的力量僅在前向步驟中涉及到用戶,而其反向步驟完全是由 TensorFlow 環境導出的。這樣的靈活性讓任何知識水平的用戶都可以非常快速地進行開發。


6.4 整體比較情況概覽

就像之前說過的,我們嘗試在表 1 中總結出全局對比,根據不同的視角進行 1-5 的評分。下面介紹了主要的對比指標:

  • 編程語言:它們所有的基本語言都非常直觀

  • GPU 集成:Matlab 因為需要額外的工具包而得分較低

  • CPU 並行化:所有的環境都可利用盡可能多的核(core)

  • 函數可定製性:Matlab 得分較低,因為要將良好優化的函數與已有的函數整合起來很困難

  • 符號運算:Lua 不支持

  • 網絡結構可定製性:每種網絡都是可能的

  • 數據可視化:交互式的 Matlab 優於其它

  • 安裝:所有都相當簡單,但 Matlab 的交互式 GUI 是個加分項

  • 操作系統兼容性:Torch 在 Windows 上不容易安裝

  • 語言性能:Matlab 接口有時候很沉重

  • 開發靈活性:同樣,Matlab 得分低,因為其會迫使中等用戶精通其語言,才能有能力整合已有的工具或編寫出合適的代碼,一般來說,這會拖慢軟件開發速度。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

表 1:三種環境的各項得分


6.5 計算問題

在表 2 中,我們比較了不同任務的運行時間,分析了 CPU 和 GPU 計算的優點和不同之處。結果是 5 次實驗的平均得分,而且實驗都是在同一臺計算機上完成的,該計算機的配置是:32 核的英特爾 Xeon CPU E5-2650 v2 @ 2.60GHz、66 GB RAM、4 GB 內存的 Geforce GTX 960。操作系統是 Debian GNU/Linux 8 (jessie)。我們在不同的網絡框架、批大小(包括隨機梯度下降(SGD)、1000 樣本批和完全批(Full Bacth))和硬件(在 HW 列說明)上測試了標準的梯度下降流程。這裡用到的 CNN 架構和圖 8 中給出的一樣。結果是通過嘗試使用盡可能相似的優化流程而得到的。在實際中,我們很難在 Matlab 內置的工具箱中應用特定的優化技術。我們為 Torch 的第二個架構(第 8 行)跳過了 SGD 的案例,因為其第一個架構獲得了大量的計算時間。我們也跳過了使用 GPU 的 Matlab 在 ANN 上的 SGD,因為其訓練函數不支持 GPU 計算(第 4 和 10 行)。實際上,這可能是一個不常見的研究案例,但為了最好的完整性,我們還是報告其結果。我們跳過了在 GPU 上的 CNN Full Batch 的實驗,因為其內存需求實在太高了。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

表 2:給定環境在 MNIST 數據上用不同架構訓練 10 epoch 5 次後的平均時間(秒)。所有架構都使用了 ReLU 作為激活函數,softmax 作為輸出函數,交叉熵作為懲罰。

怎樣選擇神經網絡環境?對比MATLAB、Torch和TF

相關推薦

推薦中...