天天看點

Spark與深度學習架構——H2O、deeplearning4j、SparkNetH2Odeeplearning4jSparkNet

引言:你可能對使用spark服務比較感興趣。spark已經提供了很多功能,也有一個好用的界面,而且背後有強大的社群,開發者十分活躍,這也是人們對spark寄予厚望的原因。深度學習是目前正在進行中的spark項目之一。本文我們将介紹一些spark能用的深度學習架構。 本文選自《spark:大資料叢集計算的生産實踐》。

  深度學習因其高準确率及通用性,成為機器學習中最受關注的領域。這種算法在2011—2012年期間出現,并超過了很多競争對手。最開始,深度學習在音頻及圖像識别方面取得了成功。此外,像機器翻譯之類的自然語言處理或者畫圖也能使用深度學習算法來完成。深度學習是自1980年以來就開始被使用的一種神經網絡。神經網絡被看作能進行普适近似(universal approximation)的一種機器。換句話說,這種網絡能模仿任何其他函數。例如,深度學習算法能建立一個識别動物圖檔的函數:給一張動物的圖檔,它能分辨出圖檔上的動物是一隻貓還是一隻狗。深度學習可以看作是組合了許多神經網絡的一種深度結構。

  與其他已有的機器學習算法相比,深度學習需要大量參數及訓練資料。這也是我們介紹能在spark上運作的深度學習架構的原因。要想在企業環境中穩定地進行深度學習的訓練,必須要有一個可靠而快速的分布式引擎。

  spark被視為目前最适合運作深度學習算法的平台,是因為:

基于記憶體的處理架構對于使用機器學習的疊代計算,特别是深度學習,十分适合。

spark的幾個生态系統如mllib及tachyon對于開發深度學習模型很有用。

本文我們将介紹一些spark能用的深度學習架構。這些架構和深度學習一樣,都是比較新的庫。很可能你在使用它們的過程中遇到一些bug或者缺少一些操作工具,但是報告問題(issue)及發送更新檔将會使它更加成熟。

1.首先需要從h2o網站下載下傳最新的sparking-water。

2.把它指向spark的安裝目錄。

3.啟動sparkling-shell,這個接口與spark-shell類似。

  sparkling-water源碼中包含幾個例子。不幸的是,有些例子在spark 1.5.2版本上無法正常運作。深度學習的demo也有相同的問題。你得等待這些問題被解決,或者自己寫幾個能在spark運作的更新檔。

  deeplearning4j是由skymind開發的,skymind是一家緻力于為企業進行商業化深度學習的公司。deeplearning4j架構是建立來在hadoop及spark上運作的。這個設計用于商業環境而不是許多深度學習架構及庫目前所大量應用的研究領域。skymind是主要的支援者,但deeplearning4j是開源軟體,是以也歡迎大家送出更新檔。deeplearning4j架構中實作了如下算法:

受限玻爾茲曼機(restricted boltzmann machine)

卷積神經網絡(convolutional neural network)

循環神經網絡(recurrent neural network)

遞歸自編碼器(recursive autoencoder)

深度信念網絡(deep-belief network)

深度自編碼器(deep autoencoder)

棧式降噪自編碼(stacked denoising autoencoder)

這裡要注意的是,這些模型能在細粒度級别進行配置。你可以設定隐藏的層數、每個神經元的激活函數以及疊代的次數。deeplearning4j提供了不同種類的網絡實作及靈活的模型參數。skymind也開發了許多工具,對于更穩定地運作機器學習算法很有幫助。下面列出了其中的一些工具。

-- csv

--原始文本格式(推文、文檔)

--圖像(圖檔、圖畫)

--定制檔案格式(例如mnist)

由于canova主要是用java編寫的,是以它能運作在所有的jvm平台上。是以,可以在spark叢集上使用它。即使你不做機器學習,canova對你的機器學習任務可能也會有所裨益。

  編譯類位于target目錄下,但是可以通過bin/run-example腳本運作這些例子。目前有三種類型的例子:

ml.javairisclassfication——鸢尾花(iris flower)資料集分類。

ml.javalfwclassfication——lfw人臉資料庫分類。

ml.javamnistclassfication——mnist手寫資料分類。

  差不多可以開始運作訓練程序了。你需要注意的最後一點是spark executor及driver的記憶體大小,因為 mnist資料集和它的訓練模型将會很大。它們要用到大量記憶體,是以我們建議你提前修改bin/run-example腳本中設定的記憶體大小。可以通過如下指令修改bin/run-example腳本的最後一行:

  現在開始訓練:

  為了指定本地spark的master配置,我們已經在bin/run-example腳本的前面設定了master環境變量。這種訓練需要花一些時間,由你的環境及機器規格決定。這個例子運作了一種叫作“卷積神經網絡”的神經網絡。其參數細節是通過multilayerconfiguration類設定的。由于deeplearning4j有一個java接口,就算你不習慣spark的scala語言也沒關系,它是很容易引入的。下面簡單解釋一下這個例子中的卷積神經網絡參數。

seed——此神經網絡會使用像初始網絡參數這樣的随機參數,這個種子就用于産生這些參數。有了這個種子參數,在開發機器學習模型的過程中更容易進行測試與調試。

batchsize——像遞度下降之類的疊代算法,在更新模型之前會彙總一些更新值,batchsize指定進行更新值計算的樣本數。

iterations——由一個疊代程序保持模型參數的更新。這個參數決定了此疊代處理的次數。通常來說,疊代越長,收斂的機率越高。

optimizationalgo——運作前述的疊代程序,必須用到幾種方法。随機梯度下降(stochastic gradient

descent,sgd)是目前為止最先進的方法,這種方法相對來講不會落入局部最小值,還能持續搜尋全局最小值。

layer——它是深度學習算法的核心配置。這個深度學習神經網絡有幾個名為layer的網絡組。這個參數決定了在每一層中使用哪種類型的層。例如,在卷積神經網絡的案例中,convolutionlayer被用于從輸入的圖像中提取出特征。這個層能學習一個給定的圖檔有哪種類型的特征。在一開始就放置這個層,将改善整個神經網絡預測的精确性。每個層也能用給定的參數進行配置。

            

Spark與深度學習架構——H2O、deeplearning4j、SparkNetH2Odeeplearning4jSparkNet

  上圖展現了神經網絡的通用結構。由于convolutionallayer也是一種神經網絡,兩種網絡的部件基本上是相同的。神經網絡有一個輸入(x)及輸出(y)。它們都是向量格式的資料。在上圖中,輸入為一個四維向量,而輸出也是一個四維向量。輸出向量y是怎樣計算出來的呢?每層都有一個參數矩陣。在本例中,它們用w表示。x與w相乘得到下一個向量。為了增強這個模型的表達,這個向量被傳給某個非線性激活函數(σ),例如邏輯sigmoid函數(logistic sigmoid function)、softmax函數。使用這個非線性函數,神經網絡就能逼近任意類型的函數。然後用z與另一個參數矩陣w相乘,并再次應用激活函數σ 。

  你可以看到convolutionlayer的每個配置。nin及nout是輸入向量vector(x)及輸出向量vector(z)的次元。activation是這個層的激活函數,由邏輯sigmoid函數與修正線性單元所選擇。根據你的問題,輸入及輸出的次元能被立即确定。其他參數應當通過網格搜尋來優化,這一點将在後面講述。

backprop——反向傳播(backpropagation)是目前用于更新模型參數(w)最先進的方法。是以,這個參數應當總是true。

pretrain——由于有預訓練(pretraining),多層網絡能從輸入資料提取出特征,獲得經過優化的初始參數。也推薦把它設為true。

  sparknet的架構很簡單。sparknet負責分布式處理,而核心的學習過程則委托給caffe架構。sparknet通過java native通路caffee架構提供的c api。caffee是用c++實作的,caffe的c包裝器寫在sparknet的libcaffe目錄下。是以sparknet的整體代碼庫相對較小。java代碼(caffelibrary.java)進一步包裝了這個庫。為了在scala世界裡使用caffelibrary,caffe還提供了caffenet。下圖展現了caffenet的層級。

           

Spark與深度學習架構——H2O、deeplearning4j、SparkNetH2Odeeplearning4jSparkNet

  如果你熟悉scala,那麼開發sparknet的應用程式時隻需要考慮caffenet。而且你也可以使用spark rdd。它是通過一個javadatalayer c++代碼的包裝器來實作的。除此之外,sparknet能加載caffe格式的模型檔案。這個擴充通常是通過.prototxt來設定的:

  替換模型的輸入,你可以在spark上訓練自己的資料。sparknet還提供了實用程式:

                      

Spark與深度學習架構——H2O、deeplearning4j、SparkNetH2Odeeplearning4jSparkNet

                 

  想及時獲得更多精彩文章,可在微信中搜尋“博文視點”或者掃描下方二維碼并關注。

                         

Spark與深度學習架構——H2O、deeplearning4j、SparkNetH2Odeeplearning4jSparkNet