一文搞懂NLP中的對抗訓練

簡介

對抗訓練是一種引入噪聲的訓練方式,可以對參數進行正則化,提升模型魯棒性和泛化能力。

對抗訓練的假設是:給輸入加上擾動之後,輸出分佈和原Y的分佈一致

一文搞懂NLP中的對抗訓練

theta上面一個尖兒代表的是常數。目的是說在計算對抗擾動時雖然計算了梯度,但不對參數進行更新,因為當前得到的對抗擾動是對舊參數最優的。不理解的同學可以自己看下偽代碼體會一下。

用一句話形容對抗訓練的思路,就是在輸入上進行梯度上升(增大loss),在參數上進行梯度下降(減小loss)。由於輸入會進行embedding lookup,所以實際的做法是在embedding table上進行梯度上升

接下來介紹不同的方法,後續方法優化的主要方向有兩點:得到更優的擾動 & 提升訓練速度

FGSM (Fast Gradient Sign Method): ICLR2015

一文搞懂NLP中的對抗訓練

一文搞懂NLP中的對抗訓練


PGD (Projected Gradient Descent): ICLR2018

FGM直接通過epsilon參數一下子算出了對抗擾動,這樣得到的可能不是最優的。因此PGD進行了改進,多迭代幾次,慢慢找到最優的擾動。

引用[1]:

FGM簡單粗暴的“一步到位”,可能走不到約束內的最優點。PGD則是“小步走,多走幾步”,如果走出了擾動半徑為epsilon的空間,就映射回“球面”上,以保證擾動不要過大


一文搞懂NLP中的對抗訓練

偽代碼:

對於每個x:

1.計算x的前向loss、反向傳播得到梯度並備份

對於每步t:

2.根據embedding矩陣的梯度計算出r,並加到當前embedding上,相當於x+r(超出範圍則投影回epsilon內)

3.t不是最後一步:將梯度歸0,根據1的x+r計算前後向並得到梯度

4.t是最後一步:恢復(1)的梯度,計算最後的x+r並將梯度累加到(1).上

5.將embedding|恢復為(1)時的值

6.根據(4)的梯度對參數進行更新

可以看到,在循環中r是逐漸累加的,要注意的是最後更新參數只使用最後一個x+r算出來的梯度

FreeAT (Free Adversarial Training): NIPS2019

從FGSM到PGD,主要是優化對抗擾動的計算,雖然取得了更好的效果,但計算量也一步步增加。對於每個樣本,FGSM和FGM都只用計算兩次,一次是計算x的前後向,一次是計算x+r的前後向。而PGD則計算了K+1次,消耗了更多的計算資源。因此FreeAT被提了出來,在PGD的基礎上進行訓練速度的優化。

FreeAT的思想是在對每個樣本x連續重複m次訓練,計算r時複用上一步的梯度,為了保證速度,整體epoch會除以m。r的更新公式為:

偽代碼:

一文搞懂NLP中的對抗訓練

缺點:FreeLB指出,FreeAT的問題在於每次的r對於當前的參數都是次優的(無法最大化loss),因為當前r是由r(t-1)和theta(t-1)計算出來的,是對於theta(t-1)的最優。

注:

1.論文中提供偽代碼,但源碼中好像對1步輸入做了歸一化論文中並沒有提到

2.個人認為可以把FreeAT當成執行m次的FGSM,最開始r=0,第一次更新的是x的梯度,之後開始迭代更新r,則根據x+r的梯度更新參數。但代碼中有個問題是r只在最開始初始化,如果迭代到新的樣本x2,也是根據上個樣本的r進行更新的,這裡我有些疑問,希望懂的大佬賜教下~

代碼:https://github.com/mahyarnajibi/FreeAdversarialTraining/blob/d70774030871fa3207e09ce8528c1b84cd690603/main_free.py#L160

YOPO (You Only Propagate Once): NIPS2019

代碼:https://github.com/a1600012888/YOPO-You-Only-Propagate-Once

YOPO的目標也是提升PGD的效率,這篇文章需要的理論知識比較雄厚,這裡只簡要介紹一下。

感興趣又啃不下來原論文的同學(比如我)可以參考[9],如有解讀錯誤歡迎指出~

極大值原理PMP(Pontryagin's maximum principle)是optimizer的一種,它將神經網絡看作動力學系統。這個方法的優點是在優化網絡參數時,層之間是解藕的。通過這個思想,我們可以想到,既然擾動是加在embedding層的,為什麼每次還要計算完整的前後向傳播呢?

基於這個想法,作者想複用後幾層的梯度,假設p為定值:

則對r的更新就可以變為

我們可以先寫出YOPO的梯度下降版本:

一文搞懂NLP中的對抗訓練

作者又提出了PMP版本的YOPO,並證明SGD的YOPO是PMP版的一種特殊形式。這樣每次迭代r就只用到embedding的梯度就可以了。

引用[9]:

雖然YOPO-m-n只完成了m次完整的正反向傳播,但是卻實現了m*n次梯度下降。而PGD-r算法完成r次完整的正反向傳播卻只能實現r次梯度下降。這樣看來,YOPO-m-n算法的效率明顯更高,而實驗也表明,只要使得m*n略大於r,YOPO-m-n的效果就能夠與PGD-r相媲美

然而故事的反轉來的太快,FreeLB指出YOPO使用的假設對於ReLU-based網絡不成立:

Interestingly, the analysis backing the extra update steps assumes a twice continuously differentiable loss, which does not hold for ReLU-based neural networks they experimented with, and thus the reasons for the success of such an algorithm remains obscure.

別問了,問就是PMP,來跟我一起進入下一部份的學習。

FreeLB (Free Large-Batch): ICLR2020

FreeLB認為,FreeAT和YOPO對於獲得最優r (inner max)的計算都存在問題,因此提出了一種類似PGD的方法。只不過PGD只使用了最後一步x+r輸出的梯度,而FreeLB取了每次迭代r輸出梯度的平均值,相當於把輸入看作一個K倍大的虛擬batch,由[X+r1, X+r2, ..., X+rk]拼接而成。具體的公式為:

一文搞懂NLP中的對抗訓練


FreeLB和PGD主要有兩點區別:

1.PGD是迭代K次r後取最後一次擾動的梯度更新參數,FreeLB是取K次迭代中的平均梯度

2.PGD的擾動範圍都在epsilon內,因為偽代碼第3步將梯度歸0了,每次投影都會回到以第1步x為圓心,半徑是epsilon的圓內,而FreeLB每次的x都會迭代,所以r的範圍更加靈活,更可能接近局部最優:

一文搞懂NLP中的對抗訓練

FreeLB的偽代碼為:

一文搞懂NLP中的對抗訓練

論文中還指出了很重要的一點,就是對抗訓練和dropout不能同時使用,加上dropout相當於改變了網絡結構,會影響r的計算。如果要用的話需要在K步中都使用同一個mask

SMART (SMoothness-inducing Adversarial Regularization)

SMART論文中提出了兩個方法:

1.對抗正則 SMoothness-inducing Adversarial Regularization,提升模型魯棒性

2.優化算法 Bregman proximal point optimization,避免災難性遺忘

本文只介紹其中的對抗正則方法。

SMART提出了兩種對抗正則損失,加到損失函數中:

一文搞懂NLP中的對抗訓練

第一種參考了半監督對抗訓練,對抗的目標是最大化擾動前後的輸出,在分類任務時loss採用對稱的KL散度,迴歸任務時使用平方損失損失:

一文搞懂NLP中的對抗訓練

第二種方法來自DeepMind的NIPS2019[8],核心思想是讓模型學習到的流行更光滑,即讓loss在訓練數據呈線性變化,增強對擾動的抵抗能力。作者認為,如果loss流行足夠平滑,那l(x+r)可以用一階泰勒展開進行近似,因此用來對抗的擾動需要最大化l(x+r)和一階泰勒展開的距離:

一文搞懂NLP中的對抗訓練

SMART的算法和PGD相似,也是迭代K步找到最優r,然後更新梯度。


分享到:


相關文章: