當前位置:
首頁 > 科技 > 幾千億數據多到無法處理?微軟大牛來幫你搞定

幾千億數據多到無法處理?微軟大牛來幫你搞定

關鍵時刻,第一時間送達

來源 / 微軟研究院AI頭條(ID:wowjiemian)

文 / 陳薇

歡迎下載騰訊新聞客戶端,關注科技頁卡,查看更多科技熱點新聞

導讀:

近年來,作為人工智慧發展迅速的領域之一的深度學習在NLP、圖像識別、語音識別、機器翻譯等方面都取得了驚人的成果。但是,深度學習的應用範圍卻日益受到數據量和模型規模的限制。如何才能高效地進行深度學習模型訓練?

微軟亞洲研究院機器學習組主管研究員陳薇和她的團隊基於對機器學習的完整理解,將分散式技術和深度學習緊密結合在一起,探索全新的真正合二為一「分散式深度學習」演算法。

(噓~文末有贈書福利)

隨著大數據和高效計算資源的出現,深度學習在人工智慧的很多領域中都取得了重大突破。然而,面對越來越複雜的任務,數據和深度學習模型的規模都變得日益龐大。例如,用來訓練圖像分類器的有標籤的圖像數據量達數百萬、甚至上千萬張。

大規模訓練數據的出現為訓練大模型提供了物質基礎,因此近年來湧現出了很多大規模的機器學習模型,例如2015年微軟亞洲研究院開發出的擁有超過兩百億個參數的LightLDA主題模型。

然而,當訓練數據詞表增大到成百上千萬時,如果不做任何剪枝處理,深度學習模型可能會擁有上百億、甚至是幾千億個參數。

為了提高深度學習模型的訓練效率,減少訓練時間,我們普遍會採用分散式技術來執行訓練任務——同時利用多個工作節點,分散式地、高效地訓練出性能優良的神經網路模型。分散式技術是深度學習技術的加速器,能夠顯著提高深度學習的訓練效率、進一步增大其應用範圍。

深度學習的目標是從數據中挖掘出規律,幫助我們進行預測。深度學習演算法的一般框架是,利用優化演算法迭代地最小化訓練數據上的經驗風險。

由於數據的統計性質、優化的收斂性質、以及學習的泛化性質在多機執行時的靈活度更高,相比於其它的計算任務,深度學習演算法在並行化執行過程中實際上並不需要計算節點通過通信嚴格地執行單機版本演算法。

因而,當「分散式」遇到「深度學習」,不應只局限在對串列演算法進行多機實現以及底層實現方面的技術,我們更應該基於對機器學習的完整理解,將分散式和深度學習緊密結合在一起,結合深度學習的特點,設計全新的真正合二為一的「分散式深度學習」演算法。

圖1 分散式深度學習框架

分散式深度學習框架中,包括數據/模型切分、本地單機優化演算法訓練、通信機制、和數據/模型聚合等模塊。現有的演算法一般採用隨機置亂切分的數據分配方式,隨機優化演算法(例如隨機梯度法)的本地訓練演算法,同步或者非同步通信機制,以及參數平均的模型聚合方式。

結合深度學習演算法的特點,微軟亞洲研究院機器學習組重新設計/理解了這些模塊,我們在分散式深度學習領域主要做了三個方面的工作:

第一個工作,針對非同步機制中的梯度延遲問題,我們為深度學習設計了「帶有延遲補償的非同步演算法」;

第二個工作,注意到神經網路的非凸性質,我們提出了比參數平均更加有效的集成聚合方式,並設計了「集成-壓縮」並行深度學習演算法;

第三個工作,我們首次分析了隨機置亂切分方式下分散式深度學習演算法的收斂速率,為演算法設計提供了理論指導。

01 DC-ASGD演算法:

補償非同步通信中梯度的延遲

隨機梯度下降法(SGD)是目前最流行的深度學習的優化演算法之一,更新公式為:

公式 1

其中,wt為當前模型,(xt, yt)為隨機抽取的數據,g(wt; xt, yt)為(xt, yt)所對應的經驗損失函數關於當前模型wt的梯度,η為步長/學習率。

假設系統中有多個工作節點並行地利用隨機梯度法優化神經網路模型,同步和非同步是兩種常用的通信同步機制。

同步隨機梯度下降法(Synchronous SGD)在優化的每輪迭代中,會等待所有的計算節點完成梯度計算,然後將每個工作節點上計算的隨機梯度進行匯總、平均並按照公式1更新模型。之後,工作節點接收更新之後的模型,並進入下一輪迭代。

由於Sync SGD要等待所有的計算節點完成梯度計算,因此好比木桶效應,Sync SGD的計算速度會被運算效率最低的工作節點所拖累。

非同步隨機梯度下降法(Asynchronous SGD)在每輪迭代中,每個工作節點在計算出隨機梯度後直接更新到模型上,不再等待所有的計算節點完成梯度計算。因此,非同步隨機梯度下降法的迭代速度較快,也被廣泛應用到深度神經網路的訓練中。

然而,Async SGD雖然快,但是用以更新模型的梯度是有延遲的,會對演算法的精度帶來影響。什麼是「延遲梯度」?我們來看下圖。

圖2 非同步隨機梯度下降法

在Async SGD運行過程中,某個工作節點Worker(m)在第t次迭代開始時獲取到模型的最新參數wt和數據(xt, yt),計算出相應的隨機梯度gt,並將其返回並更新到全局模型w上。

由於計算梯度需要一定的時間,當這個工作節點傳回隨機梯度gt時,模型wt已經被其他工作節點更新了τ輪,變為了wt+τ。也就是說,Async SGD的更新公式為:

公式 2

對比公式1,公式2中對模型wt+τ上更新時所使用的隨機梯度是g(wt; xt, yt),相比SGD中應該使用的隨機梯度g(wt+τ; xt+τ, yt+τ)產生了τ步的延遲。因而,我們稱Async SGD中隨機梯度為「延遲梯度」。

延遲梯度所帶來的最大問題是,由於每次用以更新模型的梯度並非是正確的梯度(請注意g(wt; xt, yt) ≠ g(wt+τ; xt+τ, yt+τ)),所以導致Async SGD會損傷模型的準確率,並且這種現象隨著機器數量的增加會越來越嚴重。如下圖所示,隨著計算節點數目的增加,Async SGD的精度逐漸變差。

圖3 非同步隨機梯度下降法的性能

那麼,如何能讓非同步隨機梯度下降法在保持訓練速度的同時,獲得更高的精度呢?我們設計了可以補償梯度延遲的DC-ASGD(Delay-compensated Async SGD)演算法。

為了研究正確梯度g(wt+τ)和延遲梯度g(wt)之間的關係,我們將g(wt+τ)在wt處進行泰勒展開:

其中,?g(wt)為梯度的梯度,也就是損失函數的Hessian矩陣,H(g(wt))為梯度的Hessian矩陣。顯然,延遲梯度實則為真實梯度的零階近似,而其餘各項造成了延遲。

於是,一個自然的想法是,如果我們將所有的高階項都計算出來,就可以修正延遲梯度為準確梯度了。然而,由於余項擁有無窮項,所以無法被準確計算。因此,我們選擇用上述公式中的一階項進行延遲補償:

眾所周知,在現代的深度神經網路模型中有上百萬甚至更多的參數,計算和存儲Hessian矩陣?g(wt)成為了一件幾乎無法完成的事情。因此,尋找Hessian矩陣的一個良好近似是能否補償梯度延遲的關鍵。根據費舍爾信息矩陣的定義,梯度的外積矩陣

是Hessian矩陣的一個漸近無偏估計,因此我們選擇用G(wt)來近似估計Hessian矩陣。根據前人的研究,如果在神經網路模型中用Hessian矩陣的對角元來近似Hessian矩陣,在顯著降低運算和存儲複雜度的同事還可以保持演算法精度,於是我們採用diag(G(wt))作為Hessian矩陣的近似。

為了進一步降低近似的方差,我們使用一個(0,1]之間參數λ來對偏差和方差進行調節。綜上,我們設計了如下帶有延遲補償的非同步隨機梯度下降法(DC-ASGD),

其中,對延遲梯度g(wt)的補償項中只包含一階梯度信息,幾乎不增加計算和存儲代價。

我們在CIFAR10數據集和ImageNet數據集上對DC-ASGD演算法進行了評估,實驗結果見以下兩圖。

圖4 DC-ASGD的訓練/測試誤差_CIFAR-10

圖5 DC-ASGD的訓練/測試誤差_ImageNet

可以觀察到,DC-ASGD演算法與Async SGD演算法相比,在相同的時間內獲得的模型準確率有顯著的提升,並且也高於Sync SGD,基本可以達到SGD相同的模型準確率。

02 Ensemble-Compression演算法:

改進非凸模型的聚合方法

參數平均是現有的分散式深度學習演算法中非常普遍的模型聚合方法。如果損失函數關於模型參數是凸的,以下不等式成立:

其中,K為計算節點個數,wk是局部模型,為參數平均後的模型,(x, y)為任意樣本數據。該不等式的左端是平均模型所對應的損失函數,右端是各個局部模型的損失函數值的平均值。可見,凸問題中參數平均可以保持模型的性能。

但是,對於非凸的神經網路模型,以上不等式將不再成立,因而平均模型的性能不再具有保證。這一點在實驗上也得到了驗證:如圖6所示,對於不同的交互頻率(尤其是較低頻的交互),參數平均通常會大幅度拉低訓練精度,使得訓練的過程極不穩定。

圖6 基於參數平均的分散式演算法訓練曲線(DNN模型)

為了解決這個問題,我們提出用模型集成替代模型平均,作為分散式深度學習中的模型聚合方式。雖然神經網路的損失函數關於模型參數是非凸的,但是關於模型的輸出一般是凸的(比如深度學習中常用的交叉熵損失)。這時,利用凸性可以得到如下不等式:

其中,不等式左側是集成(ensemble)模型的損失函數取值。可見,對於非凸模型,集成模型可以保持性能。

然而,每經過一次集成,神經網路模型的規模就會增加倍,從而出現模型規模爆炸的問題。那麼,有沒有一種既能利用模型集成的優點,又能避免增大模型的方法呢?我們提出了一種同時基於模型集成和模型壓縮的模型聚合方法, 即集成-壓縮(ensemble-compression)方法。在每次集成之後,我們對集成所得的模型進行一次壓縮。

演算法具體分為三個步驟:

各個計算節點依照本地優化演算法訓練和局部數據訓練出局部模型;

計算節點之間相互通信局部模型得到集成模型,並對(一部分)局部數據標註上集成模型對它們的輸出值;

利用模型壓縮技術(比如知識蒸餾),結合數據的再標註信息,在每個工作節點上分別進行模型壓縮,獲得與局部模型大小相同的新模型作為最終的聚合模型。為了進一步節省計算量,可以將蒸餾的過程和本地模型訓練的過程結合在一起。

這種集成-壓縮的聚合方法,既可以通過集成獲得性能提升,又可以在學習的迭代過程中保持全局模型的規模。CIFA-10和ImageNet上的實驗結果也很好地驗證了集成-壓縮聚合方法的有效性(見圖7和圖8)。

當工作節點之間相互通信的頻率較低時,參數平均方法表現會很差,但模型集成-壓縮的方法卻依然能取得理想的效果。這是因為集成學習在子模型具有多樣性時效果更好,而較低的通信頻率會導致各個局部模型更加分散,多樣性更強;同時,較低的通信頻率意味著較低的通信代價。

因此,模型集成-壓縮的方法更適用於網路環境比較差的場景。

圖7 CIFAR數據集上對比各種分散式演算法

圖8 ImageNet數據集上對比各種分散式演算法

基於模型集成的分散式演算法是一個比較新的研究領域,還存在很多沒有解決的問題。比如說當工作節點非常多的時候或者本地模型本身就很大的時候,集成模型的規模會變得非常大,這會帶來較大的網路開銷。

另外,當集成模型較大時,模型壓縮也會變成一個較大的開銷。值得注意的是,在ICLR 2018上,Hinton等人提出的Co-distillation方法,儘管在動機上和這個工作不同,但是其演算法和這個工作非常相似。如何理解這些關聯和解決這些局限性將催生新的研究,感興趣的讀者可以對此進行思考。

03 隨機重排下演算法的收斂性分析:

改進分散式深度學習理論

最後,簡單介紹一個我們最近在改進分散式深度學習理論方面的工作。

分散式深度學習中常用的數據分配策略是隨機重排之後均等切分。具體來說,是將所有訓練數據隨機地打亂順序,得到數據的一個重排列,然後將數據集按順序等分,並將每一份存放在計算節點上。

在數據被過完一輪後,如果收集所有的局部數據並重複上述過程,一般被稱為「全局重排」,如果只是對局部數據進行隨機重排,一般被稱為「局部重排」。

現有的絕大部分分散式深度學習理論中都假定數據是獨立同分布的。然而,基於Fisher-Yates演算法的隨機重排實際上與無放回抽樣等價,訓練數據之間不再是獨立同分布的了。

於是,每一輪所計算的隨機梯度也不再是精確梯度的無偏估計,所以以往分散式隨機優化演算法的理論分析方法不再適用,已有的收斂性結果也不一定仍然成立。

我們利用Transductive Rademancher Complexity作為工具,給出了隨機梯度相對於精確梯度的偏差上界,證明了隨機重排下分散式深度學習演算法的收斂性分析。

假設目標函數光滑(不一定是凸函數),系統中有K個計算節點,訓練輪數(epoch)為S,總訓練數據有n個,考慮分散式SGD演算法。

(1)如果採用全局隨機重排數據分配策略,演算法的收斂速率為,其中非i.i.d.性質帶來的額外誤差為。因此,當過數據的輪數遠遠小於訓練樣本數目時(S ?n),額外誤差的影響可以忽略。考慮到現有的分散式深度學習任務中,S ?n是很容易滿足的,所以全局隨機重排不會影響分散式演算法的收斂速率。

(2)如果採用局部重排策略數據分配策略,演算法的收斂速率為,其中非i.i.d.性質帶來的更大的額外誤差。原因是,由於隨機重排是本地局部進行的,不同計算節點之間的數據沒有進行交互,數據的差異性更大,隨機梯度的偏差也更大。

當過數據的輪數S?n/K2時,額外誤差的影響可以忽略。也就是說,使用局部重排數據分配策略時,演算法中過數據的輪數要收到計算節點數目的影響。如果計算節點數比較多,過的輪數不能太大。

目前,分散式深度學習領域的發展非常迅速,而以上工作只是我們研究組所做的一些初步探索。希望本文能夠讓更多的研究人員了解「分散式」需要與「深度學習」進行深度融合,大家一起推動分散式深度學習的新發展!

騰訊科技福利時間

是的!繼上次1024贈書活動後,騰訊科技今天又聯合機械工業出版社華章科技為大家發福利啦~!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 騰訊科技 的精彩文章:

800天即上市 首日大漲128% 這裡有趣頭條異軍突起的秘密
蔚來市值要比肩百年車企 但產量仍是其最大挑戰

TAG:騰訊科技 |