【機器學習的Tricks】隨機權值平均優化器swa與pseudo-label僞標籤

文章來自公衆號【機器學習煉丹術】python

1 stochastic weight averaging(swa)

  • 隨機權值平均
  • 這是一種全新的優化器,目前常見的有SGB,ADAM,

【概述】:這是一種經過梯度降低改善深度學習泛化能力的方法,並且不會要求額外的計算量,能夠用到Pytorch的優化器中。算法

隨機權重平均和隨機梯度降低SGD類似,因此我通常吧SWa當作SGD的進階版本。框架

1.1 原理與算法

swa算法流程:
機器學習

【怎麼理解】:ide

  • 對$w_{swa}$作了一個週期爲c的滑動平均。每迭代c次,就會對這個$w_{swa}$作一次滑動平均。其餘的時間使用SGD進行更新。
  • 簡單的說,整個流程是模型初始化參數以後,使用SGD進行梯度降低,迭代了c個epoch以後,將模型的參數用加權平均,獲得$w_{SWA}$,而後如今模型的參數就是$w_{SWA}$,而後再用SGD去梯度降低c個epoch,而後再加權平均出來一個新的$w_{SWA}$.

SWA加入了週期性滑動平均來限制權重的變化,解決了傳統SGD在反向過程當中的權重震盪問題。SGD是依靠當前的batch數據進行更新,尋找隨機梯度降低隨機尋找的樣本的梯度降低方向極可能並非咱們想要的方向。oop

論文中給出了一個圖片:
學習

  • 綠線是恆定學習率的SGD,效果並很差,直到SGD在訓練的過程當中所見了學習率,才能夠獲得一個收斂的結果;
  • 而使用Stochastic weight averaging能夠在學習率恆定的狀況下,快速收斂,並且過程平穩。

1.2 python與實現

這裏講如何在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)

來封裝原來的優化器。

  • swa_start:是一個整數,表示通過swa_start個steps後,將學習率切換爲固定值swa_lr。(在swa_start以前的step中,lr是0.1,在10個steps以後,lr變成0.05)
  • swa_freq:在swa_freq個step優化以後,會將對應的權重加到swa滑動平均的結果上,至關於算法中的c;
  • 使用opt.swap_swa_sgd()以後,能夠將模型的權重替換爲swa的滑動平均的權重。

1.3 關於BN

這裏有一個問題就是在BatchNorm層訓練的時候,BN層中也是有兩個訓練參數的,使用$w_{swa}$重置了模型參數,可是並無更新BN層的參數,因此若是有bn層的話,還須要加上:

opt.bn_update(train_loader,model)

2 Pseudo-Label

  • 僞標籤
  • 這是一種半監督的方法。其實很是簡單,就是對於未標記的數據,許納澤預測機率最大的標記做爲該樣本的pseudo-label,而後給未標記數據設置一個權重,在訓練過程當中慢慢增長未標記數據的權重。

這個方法的loss以下:

很是好理解了,前面一項就是訓練集的loss,後面是測試集的loss,而後用一個$\alpha(t)$來作權重。

而後這個$\alpha(t)$就是隨着訓練的迭代次數增長而慢慢的線性增長(若是按照原來的論文中的描述):

【一些關於pseudo-label的雜談】

這個方法提出在2013年,而後再2015年做者用entropy信息熵來證實這個方法的有效性。可是證實過程較爲牽強。這個僞標籤我在2017年的一個項目中想到了,可是不知道可行不可行本身當時也沒法進行證實,就做罷了,沒想到如今看到一樣的方法在2013年就提出來了。有點五味雜陳哈哈。

參考文獻:

  1. Izmailov, Pavel, et al. "Averaging weights leads to wider optima and better generalization." arXiv preprint arXiv:1803.05407 (2018).
  2. Grandvalet, Yves, and Yoshua Bengio. "Semi-supervised learning by entropy minimization." Advances in neural information processing systems. 2005.
相關文章
相關標籤/搜索