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