文章來自公衆號【機器學習煉丹術】python
【概述】:這是一種經過梯度降低改善深度學習泛化能力的方法,並且不會要求額外的計算量,能夠用到Pytorch的優化器中。算法
隨機權重平均和隨機梯度降低SGD類似,因此我通常吧SWa當作SGD的進階版本。框架
【怎麼理解】:ide
SWA加入了週期性滑動平均來限制權重的變化,解決了傳統SGD在反向過程當中的權重震盪問題。SGD是依靠當前的batch數據進行更新,尋找隨機梯度降低隨機尋找的樣本的梯度降低方向極可能並非咱們想要的方向。oop
論文中給出了一個圖片:學習
這裏講如何在pytorch深度學習框架中加入swa做爲優化器:測試
from torchcontrib.optim import SWA # training loop base_opt = torch.optim.SGD(model.parameters(), lr=0.1) opt = torchcontrib.optim.SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05) for _ in range(100): opt.zero_grad() loss_fn(model(input), target).backward() opt.step() opt.swap_swa_sgd()
若是使用了swa的話,那麼lr_schedule這個方法就不須要在使用了,很是的方便。優化
【關於參數】:
使用swa的時候,就直接經過spa
torchcontrib.optim.SWA(base_opt,swa_start,swa_greq,swa_lr)
來封裝原來的優化器。
這裏有一個問題就是在BatchNorm層訓練的時候,BN層中也是有兩個訓練參數的,使用$w_{swa}$重置了模型參數,可是並無更新BN層的參數,因此若是有bn層的話,還須要加上:
opt.bn_update(train_loader,model)
這個方法的loss以下:
很是好理解了,前面一項就是訓練集的loss,後面是測試集的loss,而後用一個$\alpha(t)$來作權重。
而後這個$\alpha(t)$就是隨着訓練的迭代次數增長而慢慢的線性增長(若是按照原來的論文中的描述):
【一些關於pseudo-label的雜談】
這個方法提出在2013年,而後再2015年做者用entropy信息熵來證實這個方法的有效性。可是證實過程較爲牽強。這個僞標籤我在2017年的一個項目中想到了,可是不知道可行不可行本身當時也沒法進行證實,就做罷了,沒想到如今看到一樣的方法在2013年就提出來了。有點五味雜陳哈哈。
參考文獻: