1. 程式人生 > >SWA(隨機權重平均)——一種全新的模型優化方法

SWA(隨機權重平均)——一種全新的模型優化方法

這兩天被朋友推薦看了一篇熱乎的新型優化器的文章,文章目前還只掛在arxiv上,還沒發表到頂會上。本著探索的目的,把這個論文給復現了一下,順便彌補自己在優化器方面鮮有探索的不足。

論文標題:Averaging Weights Leads to Wider Optima and Better Generalization

論文連結:https://arxiv.org/abs/1803.05407.pdf

官方程式碼:https://github.com/timgaripov/swa


隨機權重平均(SWA)和隨機梯度下降(SGD)有很多相似之處,準確來說SWA是基於SGD的改進版本。文章的主要比較物件也是SGD。

。典型的深度神經網路訓練過程就是用 SGD 來優化一個損失函式,同時使用一個衰減的學習率,直到收斂為止。SWA 論文的結果證明,取 SGD 軌跡的多點簡單平均值,以一個週期或者不變的學習 率,會比傳統訓練有更好的泛化效果。論文的結果同樣了證明了,隨機權重平均 (SWA)相比可以找到更廣的最優值域。

SWA的靈感來自於實際觀察,每次學習率迴圈結束時產生的區域性最小值趨向於在損失面的邊緣區域累積,這些邊緣區域上的損失值較小(上面左圖中,顯示低損失的紅色區域上的點W1,W2和W3)。通過對幾個這樣的點取平均,很有可能得到一個甚至更低損失的、全域性化的通用解(上面左圖上的Wswa)。

看一下swa的演算法流程:

對 WSWA做了一個週期性的滑動平均,週期為 c,即每 c 步進行一次滑動平均, 其他時間就按普通 SGD 進行更新。可見,計算操作也是十分的簡便。
 

就論文中的結果而言,可以看出 SWA相對於 SGD 來說有以下優點:1,不依賴學 習率的變化,設定恆定學習率的時候依然可以達到很好的收斂效果。而對於 SGD 而言,恆定學習率會導致收斂情況變差。2,收斂速度十分快,在原測試集上可 以在 150 個 epoch 就收斂得非常好,也非常平穩振盪幅度非常小。

個人主觀分析:SWA 加入了週期性滑動平均操作來限制權重的變化,解決 了傳統 SGD 在反向過程中的權重振盪問題。 SGD 是依靠當前 batch 的資料來更新 引數,每一個 epoch 都會調整一次引數,隨機挑選的梯度方向極有可能不是最佳 梯度方向,甚至與最佳梯度方向有一個很大的夾角,這樣大刀闊斧調整的引數, 極其容易振盪。而 SWA限制更新頻率,對週期內參數取滑動均值,這樣就解決 了 SGD 的問題。 


關於復現 

 這次並沒有用作者給的官方程式碼實現,而是用keras框架搭的一個自己的網路,用自己的資料集,來比較SGD和SWA的差異。程式碼暫時不方便上傳,不過估計也沒人care。。。不過對於SWA優化器的keras實現參考了https://github.com/kristpapadopoulos/keras-stochastic-weight-averaging

先看SGD的結果:

train loss和val loss大相徑庭的原因跟資料集有關係,不用太care,主要關注的是train loss。 

再看SWA的結果:

對 SGD 而言,每個 epoch 都會大刀闊斧調整引數(因為我設定的是恆定學習率)。 所以 SGD 的 loss 曲線抖動會比較大,而且要接近 200 個 epoch 才有比較好的收 斂效果。 對於 SWA而言,抖動幅度會比 SGD 小很多,而且 cycle 設定越大抖動會越小。大 概 150 個 epoch 就有比較好的收斂情況。這也是作者分析的,SWA 可以更容易 找到最優值域。 


總結

SGD 的出現就是為了解決 mini-BatchGD 計算比較費時的問題,然而 SGD 的收斂 結果不會太好,往往不會好於 mini-batchGD。SGD 為了計算節省時間,捨棄了訓 練穩定、最優收斂結果等性質。然而,SWA 剛好補充了 SGD 的這幾點不足,在 計算方面,SWA 相對於 SGD 的計算量的增長可以忽略不記,只多了一個週期性 的權重平均而已。但是在穩定性和最優值域的尋找方面,SWA 是要遠好於 SGD 的。尤其是這種訓練時的穩定性,使得 SWA 比 SGD 更適合用於線上學習等模型 要求穩定性的領域。