位于波士頓的數(shù)據(jù)科學(xué)團(tuán)隊(duì)正在利用前沿的工具和算法,通過對用戶數(shù)據(jù)的分析來優(yōu)化業(yè)務(wù)行為。 數(shù)據(jù)科學(xué)很大程度上依賴機(jī)器算法,它能幫助我們發(fā)現(xiàn)數(shù)據(jù)的特征。要想洞察互聯(lián)網(wǎng)般規(guī)模的數(shù)據(jù)還是很有挑戰(zhàn)的,因此能夠大規(guī)模的運(yùn)行算法成為了我們的關(guān)鍵需求。隨著數(shù)據(jù)的爆炸性增長,以及隨之而來的上千節(jié)點(diǎn)集群,我們需要將算法的運(yùn)行適配到分布式環(huán)境。在通用的分布式計(jì)算環(huán)境中運(yùn)行機(jī)器學(xué)習(xí)算法,這本身有它自己的挑戰(zhàn)。
下面我們就將一起探討如何將深度學(xué)習(xí)(最前沿的機(jī)器學(xué)習(xí)框架)部署到Hadoop的集群中。還將提供如何對算法進(jìn)行修改以便適應(yīng)分布式環(huán)境。同時(shí)還將展示在標(biāo)準(zhǔn)數(shù)據(jù)集下的運(yùn)行結(jié)果。
深度信念網(wǎng)
深度信念網(wǎng)(DBN)是一種圖模型,可以通過對受限玻爾茲曼機(jī)(RBM)以貪婪和無監(jiān)督的方式進(jìn)行疊加和訓(xùn)練獲得。采用對被觀察的x向量和第I隱層的接點(diǎn)進(jìn)行建模的方式,我們可以訓(xùn)練DBN來提取訓(xùn)練數(shù)據(jù)的深度層級(jí)表示, 這里每個(gè)隱層的分布基于它緊鄰的上一層的條件。
可以從下圖中觀察輸入層和隱層的關(guān)系。從總體上看,第一層被訓(xùn)練成RBM,它為x的原始輸入建模。一個(gè)輸入是指代表一組未分類數(shù)據(jù)的稀疏二進(jìn)制向量,比如一個(gè)數(shù)字的二進(jìn)制圖像。接下來的層采用變換后的數(shù)據(jù)(sample or mean activations)進(jìn)行訓(xùn)練,這些數(shù)據(jù)來自于上一層。層的數(shù)量可以基于經(jīng)驗(yàn)來選取以便獲得最好的模型效果,而且DBN也支持任意數(shù)量的層。
下面的代碼段展示了進(jìn)入RBM的訓(xùn)練。對于RBM的輸入數(shù)據(jù),這里有多次預(yù)定義的迭代(epochs). 輸入數(shù)據(jù)被分成小的批次,并計(jì)算出每一層的權(quán)重(weight),激活值(activations)和增量(deltas)。
每一層的訓(xùn)練都完成后,深度網(wǎng)絡(luò)的參數(shù)都采用受監(jiān)督的訓(xùn)練標(biāo)準(zhǔn)進(jìn)行了調(diào)優(yōu)。舉例來說,受監(jiān)督的標(biāo)準(zhǔn)(criterion), 可以分解為一個(gè)分類問題,然后可以用深度網(wǎng)絡(luò)來解決分類問題。也可以使用更復(fù)雜的受監(jiān)督標(biāo)準(zhǔn),通過它我們可以獲得諸如場景解析的有趣結(jié)果,比如可以解釋圖片上出現(xiàn)了那些對象。
Infrastructure
深度學(xué)習(xí)獲得的廣泛關(guān)注,不僅因?yàn)樗芴峁﹥?yōu)于其他學(xué)習(xí)算法的結(jié)果,還因?yàn)樗苓\(yùn)行在一個(gè)分布式環(huán)境從而能處理大規(guī)模的數(shù)據(jù)。深度網(wǎng)絡(luò)主要從兩個(gè)級(jí)別來并行化 – 層級(jí)和數(shù)據(jù)級(jí)。對于層級(jí)的并行化實(shí)現(xiàn),大多數(shù)采用GPU陣列來并行計(jì)算層激活值并對它們進(jìn)行頻繁的同步。然而這種方式對于集群環(huán)境不合適,因?yàn)楫?dāng)數(shù)據(jù)分散在多個(gè)通過網(wǎng)絡(luò)連接節(jié)點(diǎn)時(shí),會(huì)產(chǎn)生較高的網(wǎng)絡(luò)開銷。數(shù)據(jù)并行化是指通過將數(shù)據(jù)拆分來進(jìn)行并行訓(xùn)練,分布式環(huán)境更適合采用這種方式。Paypal的大部分?jǐn)?shù)據(jù)存放在hadoop集群里,因此我們的首要需求是能夠在集群里運(yùn)行算法。對集群的針對性維護(hù)和支持也是我們要考慮的因素。鑒于深度學(xué)習(xí)天生就繼承了迭代性,MapReduce模式可能不太適合運(yùn)行這些算法。然而Hadoop 2.0 和 基于Yarn的資源管理出現(xiàn)后,我們就可以寫出迭代式應(yīng)用,因?yàn)槲覀兛梢院芎玫目刂茟?yīng)用占用的資源。我們使用了IterativeReduce, 它是一個(gè)在Hadoop YARN里寫迭代式算法的一個(gè)簡單抽象,然后我們就能把它部署到某個(gè)運(yùn)行Hadoop 2.4.1的Paypal集群里。
方法論
我們實(shí)現(xiàn)了Hinton的核心深度學(xué)習(xí)算法。這是因?yàn)榭紤]到我們需要把算法分布到多個(gè)機(jī)器中去。對于多臺(tái)機(jī)器的算法分布過程,我們采用了Grazia推薦的手冊。下面是對我們實(shí)現(xiàn)的一個(gè)大概總結(jié):
主節(jié)點(diǎn)初始化RBM權(quán)重。
主節(jié)點(diǎn)把權(quán)重和分配推送到工作節(jié)點(diǎn)
工作節(jié)點(diǎn)對一個(gè)數(shù)據(jù)段進(jìn)行RBM訓(xùn)練,也就是執(zhí)行完整個(gè)分片,將更新后的權(quán)重返回給主節(jié)點(diǎn)
主節(jié)點(diǎn)針對某個(gè)數(shù)據(jù)段把所有工作接點(diǎn)的權(quán)重進(jìn)行平均。
對于預(yù)先定于的分段重復(fù)3-5步(我們采用的是50)
等到第6步完成后,一個(gè)層就訓(xùn)練完了。對后面的RBM層重復(fù)以上步驟。
等到所有層的訓(xùn)練完成后,深度網(wǎng)絡(luò)就已經(jīng)采用Error Back-propagation進(jìn)行了調(diào)優(yōu)。
下圖展示了單個(gè)數(shù)據(jù)段在運(yùn)行深度學(xué)習(xí)時(shí)的過程。我們注意到可以采用這套概念來實(shí)現(xiàn)一個(gè)本質(zhì)上具有迭代性的機(jī)器學(xué)習(xí)主機(jī):
下面的代碼段展示了單機(jī)訓(xùn)練DBN的步驟。數(shù)據(jù)集首先被分批,然后初始化多個(gè)RBM層,接著進(jìn)行訓(xùn)練。RBM訓(xùn)練完成后,采用error back propagation進(jìn)行調(diào)優(yōu)。
我們使用IterativeReduce的實(shí)現(xiàn)與YARN進(jìn)行了大量適配。并且對實(shí)現(xiàn)進(jìn)行了很多修改以便適用于深度學(xué)習(xí)。 IterativeReduce實(shí)現(xiàn)是為Cloudera Hadoop 寫的, 我們將它改造成適用于通用的Apache Hadoop 平臺(tái)。 我們還重寫了標(biāo)準(zhǔn)程序模型。特別要提到的是,客戶端程序和ResourceManager之間通信采用了YarnClient API。還采用了AMRMClient和AMNMClient在ApplicationMaster和ResourceManager以及 NodeManager之間通信。
首先我們使用YarnClient API將程序提交給YARN resource manager
提交之后,YARN resource manager 運(yùn)行 application master,它將根據(jù)需要負(fù)責(zé)分配和釋放工作節(jié)點(diǎn)容器。 application master采用AMRMClient與resource manager進(jìn)行通信。
application master 采用 NMClient API在容器中運(yùn)行來自application master的命令。
application master運(yùn)行工作節(jié)點(diǎn)容器后,它會(huì)立即設(shè)置端口用來和工作節(jié)點(diǎn)通信。對于我們的深度學(xué)習(xí)來說,我們給原本的IterativeReduce接口添加了一些方法,用來實(shí)現(xiàn)參數(shù)初始化,逐層訓(xùn)練和微調(diào)信號(hào)。IterativeReduce采用Apache Avro IPC進(jìn)行主節(jié)點(diǎn)-工作節(jié)點(diǎn)通信。
下面的代碼段展示了主節(jié)點(diǎn)-工作節(jié)點(diǎn)在分布式訓(xùn)練中的一系列步驟。主節(jié)點(diǎn)把初始參數(shù)發(fā)送給工作節(jié)點(diǎn),然后工作節(jié)點(diǎn)基于自己的數(shù)據(jù)對RBM進(jìn)行訓(xùn)練。訓(xùn)練完成后,它將結(jié)果發(fā)送給主節(jié)點(diǎn),主節(jié)點(diǎn)會(huì)將結(jié)果進(jìn)行合并。整個(gè)迭代完成后,主節(jié)點(diǎn)開始back propagation(反向傳播算法)微調(diào)階段,標(biāo)志著主節(jié)點(diǎn)流程結(jié)束。
結(jié)果
我們采用MNIST手寫數(shù)字識(shí)別來評估深度學(xué)習(xí)的性能。 數(shù)據(jù)集包含介于0-9之間的手寫數(shù)字,它們都已經(jīng)包含一個(gè)標(biāo)簽。訓(xùn)練數(shù)據(jù)包含 60,000張圖片,測試數(shù)據(jù)包含10,000張圖片。
為了對結(jié)果進(jìn)行評估, DBN事先進(jìn)行了訓(xùn)練,然后用60000張訓(xùn)練圖片進(jìn)行微調(diào)。進(jìn)過上述步驟后,用10000張測試圖片來進(jìn)行評估。 在訓(xùn)練和測試過程中,圖片沒進(jìn)行任何預(yù)處理。 通過分類錯(cuò)誤的圖片和圖片總數(shù)就能獲得錯(cuò)誤率。
通過采用每層RBM還有500-500-2000 隱藏units的RBM以及10個(gè)節(jié)點(diǎn)的分布式設(shè)置,我們能達(dá)到最優(yōu)的1.66%的錯(cuò)誤率。把這個(gè)錯(cuò)誤率和算法的原作者報(bào)告的1.2%錯(cuò)誤率進(jìn)行對比,以及其他一些類似的結(jié)果對比,我們注意到原本的實(shí)現(xiàn)是基于單機(jī)的,而我們的實(shí)現(xiàn)是基于分布式環(huán)境的。參數(shù)平均化(parameter-averaging)步驟稍微降低了性能,然而多臺(tái)機(jī)器的分布式計(jì)算帶來的優(yōu)勢遠(yuǎn)遠(yuǎn)超過其瑕疵。下表總結(jié)了基于10個(gè)節(jié)點(diǎn)時(shí)每層含有的隱藏單位數(shù)與錯(cuò)誤率之間的變化關(guān)系。
下一步想法
我們已經(jīng)成功部署了一個(gè)分布式的深度學(xué)習(xí)系統(tǒng)。我相信這有助于我們解決機(jī)器學(xué)習(xí)的一些問題。更進(jìn)一步,可以利用iterative reduce abstraction來將任何適合的機(jī)器學(xué)習(xí)算法進(jìn)行分布計(jì)算。能夠利用通用的Hadoop集群平臺(tái)將極大的利于在大數(shù)據(jù)上運(yùn)行可擴(kuò)展的機(jī)器學(xué)習(xí)算法。我們注意到目前的框架還有很多值得改進(jìn)的地方,主要集中在降低網(wǎng)絡(luò)延遲和更高級(jí)的資源管理。另外像我們希望優(yōu)化DBN框架以便減少節(jié)點(diǎn)內(nèi)通信。 Hadoop Yarn框架帶有更精細(xì)的集群資源控制,它能為我們提供這種靈活性。
英文出處:Paypal Engineering
文章出處:http://www.hotpost.co/12835.html