簡介
對抗訓練是一種引入噪聲的訓練方式,可以對參數進行正則化,提升模型魯棒性和泛化能力。
對抗訓練的假設是:給輸入加上擾動之后,輸出分布和原Y的分布一致
有監督的數據下使用交叉熵作為損失:
半監督數據下可計算KL散度:
擾動如何得來呢?這需要對抗的思想,即往增大損失的方向增加擾動
有監督下:
半監督下:
theta上面一個尖兒代表的是常數。目的是說在計算對抗擾動時雖然計算了梯度,但不對參數進行更新,因為當前得到的對抗擾動是對舊參數最優的。不理解的同學可以自己看下偽代碼體會一下。
用一句話形容對抗訓練的思路,就是在輸入上進行梯度上升(增大loss),在參數上進行梯度下降(減小loss)。由于輸入會進行embedding lookup,所以實際的做法是在embedding table上進行梯度上升。
接下來介紹不同的方法,后續方法優化的主要方向有兩點:得到更優的擾動 & 提升訓練速度
FGSM (Fast Gradient Sign Method): ICLR2015
FGSM是Goodfellow提出對抗訓練時的方法,假設對于輸入的梯度為:
那擾動肯定是沿著梯度的方向往損失函數的極大值走:
FGM (Fast Gradient Method): ICLR2017
FSGM是每個方向上都走相同的一步,Goodfellow后續提出的FGM則是根據具體的梯度進行scale,得到更好的對抗樣本:
偽代碼:
對于每個x: 1.計算x的前向loss、反向傳播得到梯度 2.根據embedding矩陣的梯度計算出r,并加到當前embedding上,相當于x+r 3.計算x+r的前向loss,反向傳播得到對抗的梯度,累加到(1)的梯度上 4.將embedding恢復為(1)時的值 5.根據(3)的梯度對參數進行更新
PGD (Projected Gradient Descent): ICLR2018
FGM直接通過epsilon參數一下子算出了對抗擾動,這樣得到的可能不是最優的。因此PGD進行了改進,多迭代幾次,慢慢找到最優的擾動。
引用[1]:
FGM簡單粗暴的“一步到位”,可能走不到約束內的最優點。PGD則是“小步走,多走幾步”,如果走出了擾動半徑為epsilon的空間,就映射回“球面”上,以保證擾動不要過大
且
偽代碼:
對于每個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的更新公式為:
偽代碼:
初始化r=0對于epoch=1...N/m: 對于每個x: 對于每步m: 1.利用上一步的r,計算x+r的前后向,得到梯度 2.根據梯度更新參數 3.根據梯度更新r
缺點: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的梯度下降版本:
對于每個樣本x初始化r(1,0)對于j=1,2,...,m: 1.根據r(j,0),計算p 對于s=0,1,...,n-1: 2.計算r(j,s+1) 3.另r(j+1,0)=r(j,n)
作者又提出了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]拼接而成。具體的公式為:
為了方便對比,再貼下論文中PGD的公式:
FreeLB和PGD主要有兩點區別:
1.PGD是迭代K次r后取最后一次擾動的梯度更新參數,FreeLB是取K次迭代中的平均梯度
2.PGD的擾動范圍都在epsilon內,因為偽代碼第3步將梯度歸0了,每次投影都會回到以第1步x為圓心,半徑是epsilon的圓內,而FreeLB每次的x都會迭代,所以r的范圍更加靈活,更可能接近局部最優:
FreeLB的偽代碼為:
對于每個x: 1.通過均勻分布初始化r,梯度g為0 對于每步t=1...K: 2.根據x+r計算前后向,累計梯度g 3.更新r 4.根據g/K更新梯度
論文中還指出了很重要的一點,就是對抗訓練和dropout不能同時使用,加上dropout相當于改變了網絡結構,會影響r的計算。如果要用的話需要在K步中都使用同一個mask。
SMART (SMoothness-inducing Adversarial Regularization)
SMART論文中提出了兩個方法:
1.對抗正則 SMoothness-inducing Adversarial Regularization,提升模型魯棒性
2.優化算法 Bregman proximal point optimization,避免災難性遺忘
本文只介紹其中的對抗正則方法。
SMART提出了兩種對抗正則損失,加到損失函數中:
第一種參考了半監督對抗訓練,對抗的目標是最大化擾動前后的輸出,在分類任務時loss采用對稱的KL散度,回歸任務時使用平方損失損失:
第二種方法來自DeepMind的NIPS2019[8],核心思想是讓模型學習到的流行更光滑,即讓loss在訓練數據呈線性變化,增強對擾動的抵抗能力。作者認為,如果loss流行足夠平滑,那l(x+r)可以用一階泰勒展開進行近似,因此用來對抗的擾動需要最大化l(x+r)和一階泰勒展開的距離:
SMART的算法和PGD相似,也是迭代K步找到最優r,然后更新梯度。
總結
把最近的一些對抗訓練方法總結出來,可以看到趨勢從“優化PGD的速度”又回到了“找尋最優擾動”,個人也比較認同,訓練速度慢一些對于普通模型還是可以接受的,主要還是看最終的效果有沒有提升。之前自己試過FGM和PGD,FGM有輕微提升,但PGD沒有,應該需要在超參數上進行調整。FreeLB和SMART在GLUE榜單上都有出現過,相信之后對抗訓練也是標配了,坐等微軟放出源碼。
參考文獻:
[1]. 知乎:【煉丹技巧】功守道:NLP中的對抗訓練 + PyTorch實現
[2]. FGSM: Explaining and Harnessing Adversarial Examples
[3]. FGM: Adversarial Training Methods for Semi-Supervised Text Classification
[4]. FreeAT: Adversarial Training for Free!
[5]. YOPO: You Only Propagate Once: Accelerating Adversarial Training via Maximal Principle
[6]. FreeLB: Enhanced Adversarial Training for Language Understanding
[7]. SMART: Robust and Efficient Fine-Tuning for Pre-trained Natural
[8]. Adversarial Robustness through Local Linearization
[9]. 知乎:加速對抗訓練——YOPO算法淺析
責任編輯:xj
原文標題:一文搞懂NLP中的對抗訓練
文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
-
自然語言處理
+關注
關注
1文章
619瀏覽量
13581 -
nlp
+關注
關注
1文章
489瀏覽量
22053
原文標題:一文搞懂NLP中的對抗訓練
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論