
本文是分布式訓練神經網絡模型三篇系列文章的第一篇。
在第一篇文章,我們首先了解一下如何使用GPU分布式計算來顯著提高深度學習模型的訓練速度,以及會討論其中面臨的一些挑戰和當前的研究方向。我們還會討論在何種場景下適合(或不適合)采用分布式算法來訓練神經網絡模型。
第二篇文章,我們會從Apache Spark的網絡模型訓練工具Deeplearning4j入手,來討論其實現細節,以及提供一個端到端訓練的實際案例。
最后,我們深入探討Deeplearning4j的Spark實現,并且討論一些在最大化訓練性能的過程中,所遇到的性能和架構設計上的挑戰問題。我們也會討論Spark如何與Deeplearning4j所使用的本地高性能計算函數庫交互協作。
概述 在大數據集上訓練的現代神經網絡模型在許許多多領域都取得了顯著的效果,從語音和圖像識別到自然語言處理,再到工業界的應用,比如欺詐檢測和推薦系統。但是這些神經網絡的訓練過程非常耗時。盡管近些年GPU的硬件技術、網絡模型結構和訓練方法均取得了很大的突破,但是單機訓練耗時過久的事實仍無法回避。好在我們并不局限于單機訓練:人們投入了大量的工作和研究來提升分布式訓練神經網絡模型的效率。
我們首先介紹兩種并行化/分布式訓練的方法。

在模型并行化( model parallelism )方法里,分布式系統中的不同機器負責單個網絡模型的不同部分 —— 例如,神經網絡模型的不同網絡層被分配到不同的機器。
在數據并行化( data parallelism )方法里,不同的機器有同一個模型的多個副本,每個機器分配到數據的一部分,然后將所有機器的計算結果按照某種方式合并。
當然,這些方法并不是完全互斥的。假設有一個多GPU集群系統。我們可以在同一臺機器上采用模型并行化(在GPU之間切分模型),在機器之間采用數據并行化。

盡管在實際應用中模型并行化的效果還不錯,數據并行化卻是多數分布式系統的首選,后者投入了大量的研究。一方面,數據并行化在實現難度、容錯率和集群利用率方面都優于模型并行化。分布式系統背景下的模型并行化挺有意思,有不少優勢(例如擴展性),但在本文中我們主要討論數據并行化。
數據并行化 數據并行化式的分布式訓練在每個工作節點上都存儲一個模型的備份,在各臺機器上處理數據集的不同部分。數據并行化式訓練方法需要組合各個工作節點的結果,并且在節點之間同步模型參數。文獻中討論了各種方法,各種方法之間的主要區別在于:
● 參數平均法 vs. 更新式方法 ● 同步方法 vs. 異步方法 ● 中心化同步 vs. 分布式同步 ● 目前Deeplearning4j實現的方式是同步的參數平均法。
參數平均 參數平均是最簡單的一種數據并行化。若采用參數平均法,訓練的過程如下所示:
1.基于模型的配置隨機初始化網絡模型參數 2.將當前這組參數分發到各個工作節點 3.在每個工作節點,用數據集的一部分數據進行訓練 4.將各個工作節點的參數的均值作為全局參數值 5.若還有訓練數據沒有參與訓練,則繼續從第二步開始
上述第二步到第四步的過程如下圖所示。在圖中,W表示神經網絡模型的參數(權重值和偏置值)。下標表示參數的更新版本,需要在各個工作節點加以區分。

事實上,很容易證明參數平均法的結果在數學意義上等同于用單個機器進行訓練;每個工作節點處理的數據量是相等的。數學的證明過程如下。
假設該集群有n個工作節點,每個節點處理m個樣本,則總共是對nxm個樣本求均值。如果我們在單臺機器上處理所有nxm個樣本,學習率設置為α,權重更新的方程為:

現在,假設我們把樣本分配到n個工作節點,每個節點在m個樣本上進行學習(節點1處理樣本1,……,m,節點2處理樣本m+1,……,2m,以此類推),則得到:

當然,上述結果在實際應用中可能并不嚴格一致(從性能和收斂性的角度來說,對所有minibatch進行平均和不采用諸如momentum和RMSProp之類的updater的建議都較為偏頗),但是它從直覺上告訴了我們為啥參數平均法是一種可行的做法,尤其是當參數被頻繁的求均值。
參數平均法聽上去非常簡單,但事實上并沒有我們看上去這么容易。
什么是2016年最值得學習的編程語言?
漫畫 | “你有病,人工智能有藥。”等等!這是什么藥?
深度長文,大數據風控那點事?
利用一點機器學習來加速你的網站
你足夠優秀嗎?程序員每天自省的十個問題
普通程序員如何向人工智能靠攏?
深度學習概述:從感知機到深度網絡(上)
Zynq—Linux移植學習筆記(五)
21頁PPT重磅發布:Mariana——騰訊深度學習平臺的進展與應用