初學(xué)者在學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的時候往往會有不知道從何處入手的困難,甚至可能不知道選擇什么工具入手才合適。近日,來自意大利的四位研究者發(fā)布了一篇題為《神經(jīng)網(wǎng)絡(luò)初學(xué)者:在 MATLAB、Torch 和 TensorFlow 中的快速實現(xiàn)(Neural Networks for Beginners A fast implementation in Matlab, Torch, TensorFlow)》的論文,對 MATLAB、Torch 和 TensorFlow 這三種神經(jīng)網(wǎng)絡(luò)工具進行了介紹和比較。
本報告提供了最常見的開發(fā)環(huán)境內(nèi)一些機器學(xué)習(xí)工具的介紹。本報告主要關(guān)注實際問題,跳過了任何理論介紹。本報告面向的讀者是想要進入機器學(xué)習(xí)領(lǐng)域的學(xué)生和正在尋找新框架的專家。
這篇論文是關(guān)于人工神經(jīng)網(wǎng)絡(luò)(ANN,[1,2])的,因為這是目前最熱門的主題,并且在許多人工智能任務(wù)上都達(dá)到了當(dāng)前最佳的水平。在單獨介紹了每一種框架之后,我們同時也給出實現(xiàn)一些一般常見問題的設(shè)置方法,從而使它們的比較更簡單。
因為這個主題已經(jīng)得到了廣泛的研究,而且還在持續(xù)快速地增長,所以我們將這個文檔和一個 GitHub 庫進行了配對,這個庫中的文檔是動態(tài)更新的,而且以后可能還會擴大規(guī)模。
1 Matlab:一個統(tǒng)一的友好環(huán)境
1.1 介紹
Matlab 是一個強大的工具,能夠?qū)Υ蟛糠诸愋偷臄?shù)值運算、算法、編程和測試進行簡單又快速的處理。其直觀且友好的交互式接口使得它能簡單地對數(shù)據(jù)進行處理、可視化與分析。針對各種類型的任務(wù),該軟件提供了大量的內(nèi)置數(shù)學(xué)函數(shù),以及豐富的、易于獲取的文檔。其主要設(shè)計是處理矩陣的,因此,幾乎所有的函數(shù)和運算都向量化了,也就是說它們可以管理標(biāo)量以及向量、矩陣和張量(往往會有)。因此,其能更高效地避免循環(huán)(可能的時候),以及建立利用矩陣乘法的運算。
在此文檔中,我們只展現(xiàn)了一些簡單的用于上手人工神經(jīng)網(wǎng)絡(luò)(ANN)的機器學(xué)習(xí)相關(guān)的工具。我們假設(shè)讀者有基礎(chǔ)知識,并把重點放在了進一步信息的官方文檔上。例如,你可以從 Matlab 的官網(wǎng)發(fā)現(xiàn)如何掌握該軟件的相關(guān)信息。確實,其許可證并非免費的,雖然大部分大學(xué)會為學(xué)生提供教學(xué)用許可證,但可能也無法獲取目前所有的程序包。特別是 Statistic and Machine Learning Toolbox 和 Neural Network Toolbox 提供了大量內(nèi)置函數(shù)和模型,可用于實現(xiàn)適用于各類任務(wù)的不同 ANN 架構(gòu)。
即使我們參考一些簡單獨立的案例,這兩個工具也是基本所需的。最容易理解的是 nnstart 函數(shù),其能激活一個簡單的 GUI 并通過簡單的 2 層架構(gòu)來引導(dǎo)用戶。它能允許加載可用的數(shù)據(jù)樣本或使用用戶自定義數(shù)據(jù)(即輸入數(shù)據(jù)和對應(yīng)目標(biāo)的兩個矩陣),還能訓(xùn)練網(wǎng)絡(luò)并分析結(jié)果(誤差趨勢、混淆矩陣、ROC 曲線等)。
然而,還有更多可用于特定任務(wù)的函數(shù)。比如說,patternnet 函數(shù)是專為模式識別問題而設(shè)計的、newfit 函數(shù)適用于回歸問題,而 feedforwardnet 函數(shù)是最靈活的,其允許構(gòu)建自定義的和復(fù)雜的網(wǎng)絡(luò)。所有的版本都以類似方式實現(xiàn),主要的選項和方法適用于所有函數(shù)。在下一章節(jié)中,我們展示了如何管理可定制架構(gòu),并開始解決非?;A(chǔ)的問題。相關(guān)詳細(xì)信息可以在官方網(wǎng)站找到:
2 Torch 和 Lua 環(huán)境
2.1 介紹
Torch7 是一個易于使用并十分高效的科學(xué)計算框架,本質(zhì)上是面向機器學(xué)習(xí)算法的。Torch7 以 C 語言寫成,這就保證了高效性。然而,通過 LuaJIT 接口(其提供了一種快速和直觀的腳本語言),我們可以進行完全地交互(通常很方便)。此外,它還集成了支持 GPU 計算的 CUDA 環(huán)境的必要庫。截至目前,Torch7 是構(gòu)建任何種類拓?fù)浣Y(jié)構(gòu)的 ANN 原型上最常用的工具之一。事實上,Torch7 現(xiàn)在有很多軟件包,有很大的社區(qū)和不斷的更新和改進,這些都讓我們可以非常簡單地開發(fā)幾乎任何種類的架構(gòu)。
有關(guān)安裝信息可以在官方網(wǎng)站入門部分找到: 。對基于 UNIX 的操作系統(tǒng),這一過程非常簡單直接,而 Windows 系統(tǒng)即使有替代方法( https://github.com/torch/torch7/wiki/Windows ),但還沒有官方支持。如果已經(jīng)安裝了 CUDA,那么就會自動添加 cutorch 和 cunn 包,其中包含了處理 Nvidia GPU 的所有必要工具。
3 TensorFlow
3.1 簡介
TensorFlow [5] 是一個用于數(shù)值計算的開源軟件庫,其相比于其它機器學(xué)習(xí)框架是最年輕的。TensorFlow 最初由谷歌大腦團隊的研究員和工程師開發(fā),其目的是鼓勵對深度架構(gòu)的研究。然而,該環(huán)境對一些數(shù)值編程領(lǐng)域提供了大量的合適的工具。其計算方式是在數(shù)據(jù)流圖(Data Flow Graphs)概念下構(gòu)想的。圖的結(jié)點表示數(shù)學(xué)運算,圖的邊表示張量(多維數(shù)據(jù)數(shù)組)。該機器學(xué)習(xí)包的核心是用 C++寫的,但其提供了一個優(yōu)良的 Python API,而且有很好的文檔支持。TensorFlow 主要的特征是其符號方法,該方法允許對前向模型做出一般性定義,而將對應(yīng)的衍生計算留給該環(huán)境本身執(zhí)行。
4 MNIST 手寫字符識別
在本章節(jié)中,我們將討論如何建立一個 2 層 ANN 以解決 MNIST [6] 分類問題,MNIST 是一個著名的手寫字體識別數(shù)據(jù)集。其廣泛用于測試和比較一般機器學(xué)習(xí)算法和計算視覺方法。該數(shù)據(jù)集提供 28×28 像素(灰度)的手寫數(shù)字圖像。訓(xùn)練和測試集分別包含 6 萬與 1 萬條樣本。壓縮文件可以在官網(wǎng)獲得: ,同時還有大多數(shù)常見算法的性能測評列表。
我們展示了構(gòu)建的標(biāo)準(zhǔn) 2 層 ANN,其每一個隱藏層包含 300 個神經(jīng)元。如圖 4 所示,因為該網(wǎng)絡(luò)是在官方網(wǎng)站上測評報告的架構(gòu)之一,我們可以輕松地比較所得到的結(jié)果。其輸入需要重塑為包含 28 · 28 = 784 個元素的一維向量以滿足神經(jīng)網(wǎng)絡(luò)。每個圖像最初由包含灰度像素值 [0, 255] 的矩陣所表征,并將歸一化為 [0, 1] 之內(nèi)。輸出將是包含 10 個元素的預(yù)測向量,因為每個元素的標(biāo)簽將由 one-hot 編碼的 10 空位二元向量組成。激活和懲罰函數(shù)在不同的環(huán)境中并不相同,這樣以提供一個不同方法的概覽。
圖 4:面向 MNIST 數(shù)據(jù)的 2 層網(wǎng)絡(luò)模型的一般架構(gòu)
5 卷積神經(jīng)網(wǎng)絡(luò)
在本章節(jié)中,我們將介紹卷積神經(jīng)網(wǎng)絡(luò)(CNN [7, 6, 8]),該神經(jīng)網(wǎng)絡(luò)是一種重要和強大的學(xué)習(xí)架構(gòu),其廣泛用于計算機視覺應(yīng)用。卷積神經(jīng)網(wǎng)絡(luò)目前代表著用于圖像分類任務(wù)的最先進算法,并構(gòu)成了深度學(xué)習(xí)中的主要架構(gòu)。我們展示了在所有提到的框架內(nèi)如何構(gòu)建和訓(xùn)練這樣一個神經(jīng)網(wǎng)絡(luò),并且還探索了其最常用的功能和在 MNIST 上進行一些試驗以指出一些重要的特征。
圖 8:面向 MNIST 數(shù)據(jù)的 CNN 模型的一般架構(gòu)
圖 9:在 MNIST 圖像上用 Matlab 訓(xùn)練后的第一個卷積層的 5 × 5 濾波器。
圖 11:在 2 × 2 最大池化的 MNIST 圖像上用 Torch 訓(xùn)練的第一個卷積層的 5 × 5 濾波器。
圖 12:在 MNIST 圖像上用 TensorFlow 和所述的架構(gòu)訓(xùn)練的第一個卷積層的 5 × 5 濾波器。
6 關(guān)鍵比較
在這一節(jié),我們將提供對這些環(huán)境的整體概覽。即使我們在表 1 中提供了基于一些我們認(rèn)為和機器學(xué)習(xí)軟件開發(fā)主要相關(guān)的特征的分?jǐn)?shù)比較,但本研究的目的并不是通過這樣簡單的評估來完成分析。相反,我們希望提出一個有用的引導(dǎo),可幫助人們進入廣義上的 ANN 和機器學(xué)習(xí)領(lǐng)域,從而根據(jù)個人背景和要求來在環(huán)境中自我定位。更完整的和統(tǒng)計相關(guān)的比較可參閱:,這里我們進行了總結(jié),以幫助人們加速單個和全局的任務(wù)開發(fā)。
我們首先給出了每個環(huán)境的一般描述,然后我們嘗試在一些具體要求上比較了它們的優(yōu)缺點。最后,我們在不同的任務(wù)上進行了計算性能的指示性數(shù)值分析,這也可以作為一個比較和討論的主題。
6.1 MATLAB
該編程語言是直觀的,并且該軟件也提供了完整的軟件包——讓用戶可以無需編寫任何特定的代碼就能定義和訓(xùn)練幾乎所有類型的人工神經(jīng)網(wǎng)絡(luò)架構(gòu)。其代碼并行化(code parallelization)是自動完成的,而且與 CUDA 的集成也很直接。其可用的內(nèi)置函數(shù)是高度可自定義和可優(yōu)化的,從而提供了快速的和可擴展的實驗設(shè)置方式,讓你可以輕松獲取網(wǎng)絡(luò)的變量以進行深度分析。但是,擴展和集成 Matlab 工具需要對于該環(huán)境的高階知識。這可能會驅(qū)使用戶開始從頭編寫其代碼,導(dǎo)致計算表現(xiàn)的普遍衰減。這些功能讓其成為了一個完美的統(tǒng)計和分析工具箱,但是作為開發(fā)環(huán)境來說還是慢了一點。其 GUI 需要一些重量級的計算,但另一方面,這對用戶很友好,而且還提供了最好的圖形數(shù)據(jù)可視化。MATLAB 的文檔很完整,在官網(wǎng)上也組織得非常好。
6.2 Torch
Torch 的編程語言(Lua)有時候有一點難,但它應(yīng)該比這些語言中其它一些要快一點。其提供了所有所需的 CUDA 集成和 CPU 并行自動化。其基于模塊的結(jié)構(gòu)允許靈活的 ANN 架構(gòu),而且擴展其提供的軟件包也相對容易。而且其還有其它強大的軟件包,但一般而言它們需要一定的專業(yè)知識才能實現(xiàn)有意識的操作。Torch 可被輕松用于特定和一般算法測試的原型設(shè)計環(huán)境。其文檔遍布于整個 Torch 的 GitHub 庫,有時候不能立即解決一些特定的問題。
6.3 Tensor Flow
其使用了非常動態(tài)的語言 Python,讓用戶可以輕松地編寫腳本。其 CPU 并行化是自動的,而且其使用了計算圖結(jié)構(gòu),可以輕松利用 GPU 計算。其提供了很好的數(shù)據(jù)可視化,并且讓初學(xué)者也可以輕松地獲取已經(jīng)準(zhǔn)備好的軟件包,盡管本文并沒有涉及到這方面。其符號計算(symbolic computation)的力量僅在前向步驟中涉及到用戶,而其反向步驟完全是由 TensorFlow 環(huán)境導(dǎo)出的。這樣的靈活性讓任何知識水平的用戶都可以非??焖俚剡M行開發(fā)。
6.4 整體比較情況概覽
就像之前說過的,我們嘗試在表 1 中總結(jié)出全局對比,根據(jù)不同的視角進行 1-5 的評分。下面介紹了主要的對比指標(biāo):
編程語言:它們所有的基本語言都非常直觀
GPU 集成:Matlab 因為需要額外的工具包而得分較低
CPU 并行化:所有的環(huán)境都可利用盡可能多的核(core)
函數(shù)可定制性:Matlab 得分較低,因為要將良好優(yōu)化的函數(shù)與已有的函數(shù)整合起來很困難
符號運算:Lua 不支持
網(wǎng)絡(luò)結(jié)構(gòu)可定制性:每種網(wǎng)絡(luò)都是可能的
數(shù)據(jù)可視化:交互式的 Matlab 優(yōu)于其它
安裝:所有都相當(dāng)簡單,但 Matlab 的交互式 GUI 是個加分項
操作系統(tǒng)兼容性:Torch 在 Windows 上不容易安裝
語言性能:Matlab 接口有時候很沉重
開發(fā)靈活性:同樣,Matlab 得分低,因為其會迫使中等用戶精通其語言,才能有能力整合已有的工具或編寫出合適的代碼,一般來說,這會拖慢軟件開發(fā)速度。
表 1:三種環(huán)境的各項得分
6.5 計算問題
在表 2 中,我們比較了不同任務(wù)的運行時間,分析了 CPU 和 GPU 計算的優(yōu)點和不同之處。結(jié)果是 5 次實驗的平均得分,而且實驗都是在同一臺計算機上完成的,該計算機的配置是:32 核的英特爾 Xeon CPU E5-2650 v2 @ 2.60GHz、66 GB RAM、4 GB 內(nèi)存的 Geforce GTX 960。操作系統(tǒng)是 Debian GNU/Linux 8 (jessie)。我們在不同的網(wǎng)絡(luò)框架、批大?。òS機梯度下降(SGD)、1000 樣本批和完全批(Full Bacth))和硬件(在 HW 列說明)上測試了標(biāo)準(zhǔn)的梯度下降流程。這里用到的 CNN 架構(gòu)和圖 8 中給出的一樣。結(jié)果是通過嘗試使用盡可能相似的優(yōu)化流程而得到的。在實際中,我們很難在 Matlab 內(nèi)置的工具箱中應(yīng)用特定的優(yōu)化技術(shù)。我們?yōu)?Torch 的第二個架構(gòu)(第 8 行)跳過了 SGD 的案例,因為其第一個架構(gòu)獲得了大量的計算時間。我們也跳過了使用 GPU 的 Matlab 在 ANN 上的 SGD,因為其訓(xùn)練函數(shù)不支持 GPU 計算(第 4 和 10 行)。實際上,這可能是一個不常見的研究案例,但為了最好的完整性,我們還是報告其結(jié)果。我們跳過了在 GPU 上的 CNN Full Batch 的實驗,因為其內(nèi)存需求實在太高了。
表 2:給定環(huán)境在 MNIST 數(shù)據(jù)上用不同架構(gòu)訓(xùn)練 10 epoch 5 次后的平均時間(秒)。所有架構(gòu)都使用了 ReLU 作為激活函數(shù),softmax 作為輸出函數(shù),交叉熵作為懲罰
-
matlab
+關(guān)注
關(guān)注
185文章
2976瀏覽量
230464 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60535
發(fā)布評論請先 登錄
相關(guān)推薦
評論