精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單總結幾種NLP常用的對抗訓練方法

深度學習自然語言處理 ? 來源:CSDN ? 作者:華師數據學院·王 ? 2022-11-09 10:17 ? 次閱讀

對抗訓練本質是為了提高模型的魯棒性,一般情況下在傳統訓練的基礎上,添加了對抗訓練是可以進一步提升效果的,在比賽打榜、調參時是非常重要的一個trick。對抗訓練在CV領域內非常常用,那么在NLP領域如何使用呢?本文簡單總結幾種常用的對抗訓練方法。

pYYBAGNrDnKANIzNAABY9I90INA711.jpg

公式理解:

最大化擾動:挑選一個能使得模型產生更大損失(梯度較大)的擾動量,作為攻擊;

最小化損失:根據最大的擾動量,添加到輸入樣本后,朝著最小化含有擾動的損失(梯度下降)方向更新參數

這個被構造出來的“對抗樣本”并不能具體對應到某個單詞,因此,反過來在推理階段是沒有辦法通過修改原始輸入得到這樣的對抗樣本。

對抗訓練有兩個作用,一是 提高模型對惡意攻擊的魯棒性 ,二是 提高模型的泛化能力

在CV任務,根據經驗性的結論,對抗訓練往往會使得模型在非對抗樣本上的表現變差,然而神奇的是,在NLP任務中,模型的泛化能力反而變強了。

常用的幾種對抗訓練方法有FGSM、FGM、PGD、FreeAT、YOPO、FreeLB、SMART。本文暫時只介紹博主常用的3個方法,分別是 FGM PGD FreeLB

具體實現時,不同的對抗方法會有差異,但是 從訓練速度和代碼編輯難易程度的角度考慮,推薦使用FGM和迭代次數較少的PGD

一、FGM算法

poYBAGNrDqaAH8pMAADC8BhOztE465.jpg

FGM的代碼量很少,只需要自行實現簡單的類即可:

importtorch
classFGM():
def__init__(self,model):
self.model=model
self.backup={}#用于保存模型擾動前的參數

defattack(
self,
epsilon=1.,
emb_name='word_embeddings'#emb_name表示模型中embedding的參數名
):
'''
生成擾動和對抗樣本
'''
forname,paraminself.model.named_parameters():#遍歷模型的所有參數
ifparam.requires_gradandemb_nameinname:#只取wordembedding層的參數
self.backup[name]=param.data.clone()#保存參數值
norm=torch.norm(param.grad)#對參數梯度進行二范式歸一化
ifnorm!=0andnottorch.isnan(norm):#計算擾動,并在輸入參數值上添加擾動
r_at=epsilon*param.grad/norm
param.data.add_(r_at)

defrestore(
self,
emb_name='word_embeddings'#emb_name表示模型中embedding的參數名
):
'''
恢復添加擾動的參數
'''
forname,paraminself.model.named_parameters():#遍歷模型的所有參數
ifparam.requires_gradandemb_nameinname:#只取wordembedding層的參數
assertnameinself.backup
param.data=self.backup[name]#重新加載保存的參數值
self.backup={}

在訓練時,只需要額外添加5行代碼:

fgm=FGM(model)#(#1)初始化
forbatch_input,batch_labelindata:
loss=model(batch_input,batch_label)#正常訓練
loss.backward()#反向傳播,得到正常的grad
#對抗訓練
fgm.attack()#(#2)在embedding上添加對抗擾動
loss_adv=model(batch_input,batch_label)#(#3)計算含有擾動的對抗樣本的loss
loss_adv.backward()#(#4)反向傳播,并在正常的grad基礎上,累加對抗訓練的梯度
fgm.restore()#(#5)恢復embedding參數
#梯度下降,更新參數
optimizer.step()
model.zero_grad()

二、PGD算法

Project Gradient Descent(PGD)是一種迭代攻擊算法,相比于普通的FGM 僅做一次迭代,PGD是做多次迭代,每次走一小步,每次迭代都會將擾動投射到規定范圍內。形式化描述為:

poYBAGNrDseAXbIQAACNumfmjYY222.jpg
7757b28c-5f58-11ed-8abf-dac502259ad0.png

代碼實現如下所示:

importtorch
classPGD():
def__init__(self,model):
self.model=model
self.emb_backup={}
self.grad_backup={}

defattack(self,epsilon=1.,alpha=0.3,emb_name='word_embeddings',is_first_attack=False):
forname,paraminself.model.named_parameters():
ifparam.requires_gradandemb_nameinname:
ifis_first_attack:
self.emb_backup[name]=param.data.clone()
norm=torch.norm(param.grad)
ifnorm!=0andnottorch.isnan(norm):
r_at=alpha*param.grad/norm
param.data.add_(r_at)
param.data=self.project(name,param.data,epsilon)

defrestore(self,emb_name='word_embeddings'):
forname,paraminself.model.named_parameters():
ifparam.requires_gradandemb_nameinname:
assertnameinself.emb_backup
param.data=self.emb_backup[name]
self.emb_backup={}

defproject(self,param_name,param_data,epsilon):
r=param_data-self.emb_backup[param_name]
iftorch.norm(r)>epsilon:
r=epsilon*r/torch.norm(r)
returnself.emb_backup[param_name]+r

defbackup_grad(self):
forname,paraminself.model.named_parameters():
ifparam.requires_grad:
self.grad_backup[name]=param.grad.clone()

defrestore_grad(self):
forname,paraminself.model.named_parameters():
ifparam.requires_grad:
param.grad=self.grad_backup[name]
pgd=PGD(model)
K=3
forbatch_input,batch_labelindata:
#正常訓練
loss=model(batch_input,batch_label)
loss.backward()#反向傳播,得到正常的grad
pgd.backup_grad()
#累積多次對抗訓練——每次生成對抗樣本后,進行一次對抗訓練,并不斷累積梯度
fortinrange(K):
pgd.attack(is_first_attack=(t==0))#在embedding上添加對抗擾動,firstattack時備份param.data
ift!=K-1:
model.zero_grad()
else:
pgd.restore_grad()
loss_adv=model(batch_input,batch_label)
loss_adv.backward()#反向傳播,并在正常的grad基礎上,累加對抗訓練的梯度
pgd.restore()#恢復embedding參數
#梯度下降,更新參數
optimizer.step()
model.zero_grad()

三、FreeLB算法

poYBAGNrDuqAAZznAACeioX217Y489.jpg


776dce96-5f58-11ed-8abf-dac502259ad0.png

很明顯找到FreeLB與PGD的區別在于累積的方式:

FreeLB:通過對 K K K 次梯度的平均累積作為擾動更新
778a189e-5f58-11ed-8abf-dac502259ad0.png

PGD:只取最后一次的梯度進行更新
779ea57a-5f58-11ed-8abf-dac502259ad0.png

實現流程如下圖所示:
77bcbba0-5f58-11ed-8abf-dac502259ad0.png






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4600

    瀏覽量

    92646
  • nlp
    nlp
    +關注

    關注

    1

    文章

    487

    瀏覽量

    22012

原文標題:煉丹之道 | NLP中的對抗訓練

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    常用幾種接地方法

    簡單列舉幾種常用的接地方法
    發表于 03-29 08:20

    簡述電子對抗綜合模擬訓練平臺

    電子對抗綜合模擬訓練平臺以電子戰部隊指揮機構為主要訓練對象,開展集電子對抗、指揮干預、戰術使用、仿真推演、訓練監控與評估等功能的綜合電子
    發表于 09-01 10:50

    優化神經網絡訓練方法有哪些?

    優化神經網絡訓練方法有哪些?
    發表于 09-06 09:52

    微軟在ICML 2019上提出了一個全新的通用預訓練方法MASS

    專門針對序列到序列的自然語言生成任務,微軟亞洲研究院提出了新的預訓練方法:屏蔽序列到序列預訓練(MASS: Masked Sequence to Sequence Pre-training
    的頭像 發表于 05-11 09:19 ?3466次閱讀
    微軟在ICML 2019上提出了一個全新的通用預<b class='flag-5'>訓練方法</b>MASS

    新的預訓練方法——MASS!MASS預訓練幾大優勢!

    專門針對序列到序列的自然語言生成任務,微軟亞洲研究院提出了新的預訓練方法:屏蔽序列到序列預訓練(MASS: Masked Sequence to Sequence Pre-training)。MASS對句子隨機屏蔽一個長度為k的連續片段,然后通過編碼器-注意力-解碼器模型
    的頭像 發表于 05-11 09:34 ?7061次閱讀
    新的預<b class='flag-5'>訓練方法</b>——MASS!MASS預<b class='flag-5'>訓練</b>幾大優勢!

    關于語言模型和對抗訓練的工作

    訓練方法不僅能夠在BERT上有提高,而且在RoBERTa這種已經預訓練好的模型上也能有所提高,說明對抗訓練的確可以幫助模型糾正易錯點。 方法
    的頭像 發表于 11-02 15:26 ?2062次閱讀
    關于語言模型和<b class='flag-5'>對抗</b><b class='flag-5'>訓練</b>的工作

    NLP中的對抗訓練到底是什么

    簡介 對抗訓練是一種引入噪聲的訓練方式,可以對參數進行正則化,提升模型魯棒性和泛化能力。 對抗訓練的假設是:給輸入加上擾動之后,輸出分布和原
    的頭像 發表于 01-18 17:17 ?3511次閱讀

    現代交互技術下的兒童語言表達訓練方法

    現代交互技術下的兒童語言表達訓練方法
    發表于 06-27 11:27 ?3次下載

    總結幾種常用的單片機加密方法

    總結前人的經驗,摸索著寫一點實用的方法,供大家參考:在這里不講加密算法,只討論結合軟硬件的加密方法總結了一下大該有以下幾種......
    發表于 02-09 11:23 ?0次下載
    <b class='flag-5'>總結</b><b class='flag-5'>幾種</b><b class='flag-5'>常用</b>的單片機加密<b class='flag-5'>方法</b>

    時識科技提出新脈沖神經網絡訓練方法 助推類腦智能產業落地

    近日,SynSense時識科技技術團隊發表題為“EXODUS: Stable and Efficient Training of Spiking Neural Networks”的文章,在文章中提出了新的脈沖神經網絡訓練方法EXODUS。
    的頭像 發表于 06-20 14:21 ?1375次閱讀

    幾種常用NLP數據增強方法

    因為直接對原是文本進行數據增強,很難保證維持原始的文本語義,因此可以通過在語義空間上進行隱式數據增強,簡單列出幾種方法
    的頭像 發表于 09-15 14:54 ?1711次閱讀

    傳感器使用中幾種常用簡單處理方法

      在傳感器使用中,我們常常需要對傳感器數據進行各種整理,讓應用獲得更好的效果,以下介紹幾種常用簡單處理方法
    的頭像 發表于 11-30 10:40 ?1038次閱讀

    淺談傳感器幾種常用簡單處理方法

    在傳感器使用中,我們常常需要對傳感器數據進行各種整理,讓應用獲得更好的效果,以下介紹幾種常用簡單處理方法
    發表于 03-02 09:35 ?576次閱讀

    混合專家模型 (MoE)核心組件和訓練方法介紹

    ) 的 Transformer 模型在開源人工智能社區引起了廣泛關注。在本篇博文中,我們將深入探討 MoEs 的核心組件、訓練方法,以及在推理過程中需要考量的各種因素。 讓我們開始吧! 簡短總結 混合專家模型 (MoEs
    的頭像 發表于 01-13 09:37 ?1175次閱讀
    混合專家模型 (MoE)核心組件和<b class='flag-5'>訓練方法</b>介紹

    ai大模型訓練方法有哪些?

    AI大模型訓練方法是一個復雜且不斷發展的領域。以下是ai大模型訓練方法: 數據預處理和增強 數據清洗:去除噪聲和不完整的數據。 數據標準化:將數據縮放到統一的范圍。 數據增強:通過旋轉、縮放、裁剪等
    的頭像 發表于 07-16 10:11 ?1349次閱讀