當前位置:
首頁 > 最新 > 演算法解析之LARS

演算法解析之LARS

讓1+1=2也並非一蹴而就……

——子棐

說在前面

對深度學習熟悉的小夥伴肯定知道,模型的訓練是採用Mini-Batch的方法來實現的,通過對一個個Mini-Batch的學習,來使整個模型達到全局的最優,隨著網路規模和數據量的增加,這是一個冗長的迭代過程,那如何能加速整個訓練過程呢?簡單粗暴的方法就是使用更大的batchsize,但是每個GPU的顯存是有限的,因此單個GPU上batchsize的增加也是有限的。這時候就需要使用多個GPU來進行訓練,而訓練的方法分為兩種:模型並行和數據並行。前者是通過在batchsize增加的同時將模型拆分成幾部分,分別放在若干個GPU上來實現模型更大的batchsize的訓練,但是這種方法對於網路通信要求較高,實現較難且收斂性較難保證。後者是單GPU訓練的橫向擴展,每個GPU的計算流程仍然一樣,但在每次完成一次Mini-Batch訓練之後對多個GPU模型參數更新部分進行融合(具體實現方法可能略有區別,原理大體一致),這種方法較易實現且對網路需求沒有模型並行那麼高,但是在超大batchsize的訓練時容易出現學習不穩定或者divergence的問題。而LARS演算法就是為了解決在超大batchsize數據並行訓練時的穩定性問題。

巨人的肩膀

使用更多的GPU進行並行計算是為了加快整個訓練流程,在全局batchsize增加一倍的情況下,執行相同的epoch(整體訓練時間相同)意味著總iteration數需要減半,也就是模型總更新的次數減半。為了彌補總更新次數的減少需要增加每次更新時模型的學習率,這裡Alex大神提出了通過線性增加學習率的方式來提高模型訓練效率。但是這種訓練方法在訓練的初期容易出現不穩定甚至divergence的問題,因此Goyal提出了使用warm-up的方法來解決這個問題,具體就是在初期使用較小的學習率,讓模型能穩定的學習,之後將學習率逐步調整至目標學習率(線性擴展),這種方法雖然在訓練初期的學習效率不高,但是能有效的解決超大學習率的穩定性問題。

原作者基於Alexnet驗證了以上訓練方法,實驗證明:

採用線性增加學習率和warm-up的方式,Alexnet在2K batchsize的時候開始出現divergence的問題;

對於batchsize 4K,相同的epochs前提下,最後模型的準確度為53.1%,相較於batchsize 256的基線版本有4.5%的性能損失;

對於batchsize 8K,最後模型準確度只有44.8%。

有果必有因,而這需要進一步對訓練過程進行觀察。

遠觀亦需近查

原作者這裡主要針對Alexnet超大Batchsize的訓練情況進行分析。

如上圖所示,圖左為原版Alexnet的實驗結果,實驗證明了在不使用BN的時候,即使使用warm-up也只能一定程度上增加學習率,並無法線性的提高學習率,在相同的epoch數的前提下,8192 batchsize獲得最好的訓練結果僅為44.8%。通過在Alexnet採用Batch Normalization層可以選擇更大的學習率,即使在不使用warm-up的情況下使用8192的batchsize也能取得58%的準確度。

同時原作者還分析了batchsize分別為512和8192的情況下,Training和Testing Loss的差值數據如下圖所示:

圖中的兩個曲線反應了兩種batchsize的情況下的性能差距並非是由 「Generalization gap」 造成的,而是由於較低的學習效率造成的。

而為什麼warm-up和BN能一定程度上解決高學習率的divergence問題呢?那有沒有辦法使用更高的學習率且能更穩定的訓練呢?

讓我們在回到梯度更新的原理wt+1 = wt ?λ?L(wt),當學習率λ很大的時候,||λ ??L(wt)|| 可能會大於||w||,而這種情況就會導致divergence,也就解釋了為什麼網路權值的初始化以及初始學習率會極大的影響網路的學習效率。不僅如此,原作者還觀察到權重和梯度的歐幾里得距離的比值在權值、梯度、網路層不同時變化較大,如下圖是Alexnet-BN網路在第一次迭代之後的分別各層的權值、梯度和比值的統計數據:

上圖中最大的比值為1345,而最小的僅為5.76,如果採用相同的學習率且較大時,整個訓練非常容易不穩定,甚至會出現divergence。又由於兩者比值的數據隨著訓練的迭代在前幾次迭代之後迅速降低,因此warm-up在一定程度上能緩解這個問題。但是效果在前面的實驗中就已經驗證過了,因此原作提出了新的LARS演算法用來解決這個問題。

LARS

上圖為原作者提出的新的演算法,主要步驟如下:

對於每一個mini-batch計算梯度;

計算全局學習率;

計算本地學習率,通過計算權重和梯度的歐幾里得距離的比值並乘以η(係數);

更新momentum;

更新權值。

其中這裡大部分的計算都是自動的,但增加了一個參數η——係數,其是隨著batchsize的增加單調遞增的。例如,對於Alexnet來說,batchsize為1K時,最優的η為0.002;而batchsize為4K時,最優的η為0.005;8K的時候最優η為0.008。

通過LARS演算法能有效的控制每一層的訓練的更新情況,有效的提高了訓練的穩定的,並為使用更大的batchsize進行訓練創造了可能性。

大考~~~

上圖分別是使用和不使用LARS演算法訓練Alexnet-BN網路的曲線圖,很明顯的可以看到在使用了LARS演算法能有效的解決batchsize為8K時學習效率太低的問題。而且使用LARS演算法在相同的epoch的、batchsize 8K的情況下可以取得和batchsize 512相同的準確度,這就意味著batchsize的線性增加可以線性的減少總的訓練時間。

不僅如此,LARS演算法同樣可以適用於與不使用BN層的Alexnet網路,兩者比較結果如上圖所示。儘管其最後的準確度不如Alexnet-BN,但是也為這種訓練方法提供了一種可能。

此外對於Alexnet-BN網路的訓練,和理論不一樣的是,最優學習率並非理論中所說的與batchsize成線性關係。如上圖所示,對於Alexnet-BN網路,batchsize為16K來說,學習率從13到22都取得了幾乎相同的準確度為59.3。

上圖是Resnet50網路分別採用兩種不同的數據增強方法時的訓練實驗結果。其中可以看到在batchsize 16K且相同epoch的前提下,相較於baseline的準確度有大約0.7%到1.4%的精度損失。為了達到和baseline相同的性能就需要進一步增加訓練的epoch數量。

上圖是通過進一步增加訓練迭代次數來達到Baseline的模型準確度的實驗結果。如圖所示,對於Alexnet-BN、Alexnet和Resnet50網路需要增加1倍的迭代次數才能達到完全相同的模型準確度.

以上為Googlenet的實驗結果圖。使用LARS演算法時並沒有使用auxiliary loss來加速隨機梯度更新,且由於原始網路沒有BN層因此使用了數據增強來增加regularization。使用LARS演算法的Baseline結果為70.3%,但是實驗證明Googlenet非常難以訓練,在超大Batchsize的情況下仍然會有一定的性能損失。

說在後面

LARS在原作者的大量實驗中已經驗證了在部分網路中超大batchsize訓練時的有效性,通過使用大的batchsize能通過利用更多的GPU來減少模型的訓練時間。LARS演算法的實現也已經開源並整合在了nvcaffe中,更多實現的細節可以訪問:

https://github.com/NVIDIA/caffe/blob/caffe-0.16/src/caffe/solvers/sgd_solver.cpp

其中在nvcaffe中LARS演算法已經更新為LARC(Layer-wise Adaptive Rate Control)演算法,利用LARC演算法只需要在solver.prototxt中配置參數:

larc: true —— 定義是否使能LARC演算法;

larc_policy: "clip" —— 包括兩種配置「Clip」 「Scale」,前者是在本地學習率和全局學習率選擇較小的一個作為更新時的學習率,後者是將本地學習率乘以全局學習率作為更新時的學習率;

larc_eta: 0.002 —— 為演算法中提及的係數。

以上

子棐


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

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


請您繼續閱讀更多來自 子棐之GPGPU 的精彩文章:

TensorRT 4 之TF-TRT

TAG:子棐之GPGPU |