0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)單總結(jié)幾種NLP常用的對(duì)抗訓(xùn)練方法

深度學(xué)習(xí)自然語(yǔ)言處理 ? 來(lái)源:CSDN ? 作者:華師數(shù)據(jù)學(xué)院·王 ? 2022-11-09 10:17 ? 次閱讀

對(duì)抗訓(xùn)練本質(zhì)是為了提高模型的魯棒性,一般情況下在傳統(tǒng)訓(xùn)練的基礎(chǔ)上,添加了對(duì)抗訓(xùn)練是可以進(jìn)一步提升效果的,在比賽打榜、調(diào)參時(shí)是非常重要的一個(gè)trick。對(duì)抗訓(xùn)練在CV領(lǐng)域內(nèi)非常常用,那么在NLP領(lǐng)域如何使用呢?本文簡(jiǎn)單總結(jié)幾種常用的對(duì)抗訓(xùn)練方法。

pYYBAGNrDnKANIzNAABY9I90INA711.jpg

公式理解:

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

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

這個(gè)被構(gòu)造出來(lái)的“對(duì)抗樣本”并不能具體對(duì)應(yīng)到某個(gè)單詞,因此,反過(guò)來(lái)在推理階段是沒(méi)有辦法通過(guò)修改原始輸入得到這樣的對(duì)抗樣本。

對(duì)抗訓(xùn)練有兩個(gè)作用,一是 提高模型對(duì)惡意攻擊的魯棒性 ,二是 提高模型的泛化能力

在CV任務(wù),根據(jù)經(jīng)驗(yàn)性的結(jié)論,對(duì)抗訓(xùn)練往往會(huì)使得模型在非對(duì)抗樣本上的表現(xiàn)變差,然而神奇的是,在NLP任務(wù)中,模型的泛化能力反而變強(qiáng)了。

常用的幾種對(duì)抗訓(xùn)練方法有FGSM、FGM、PGD、FreeAT、YOPO、FreeLB、SMART。本文暫時(shí)只介紹博主常用的3個(gè)方法,分別是 FGM PGD FreeLB 。

具體實(shí)現(xiàn)時(shí),不同的對(duì)抗方法會(huì)有差異,但是 從訓(xùn)練速度和代碼編輯難易程度的角度考慮,推薦使用FGM和迭代次數(shù)較少的PGD 。

一、FGM算法

poYBAGNrDqaAH8pMAADC8BhOztE465.jpg

FGM的代碼量很少,只需要自行實(shí)現(xiàn)簡(jiǎn)單的類即可:

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

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

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

在訓(xùn)練時(shí),只需要額外添加5行代碼:

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

二、PGD算法

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

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

代碼實(shí)現(xiàn)如下所示:

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:
#正常訓(xùn)練
loss=model(batch_input,batch_label)
loss.backward()#反向傳播,得到正常的grad
pgd.backup_grad()
#累積多次對(duì)抗訓(xùn)練——每次生成對(duì)抗樣本后,進(jìn)行一次對(duì)抗訓(xùn)練,并不斷累積梯度
fortinrange(K):
pgd.attack(is_first_attack=(t==0))#在embedding上添加對(duì)抗擾動(dòng),firstattack時(shí)備份param.data
ift!=K-1:
model.zero_grad()
else:
pgd.restore_grad()
loss_adv=model(batch_input,batch_label)
loss_adv.backward()#反向傳播,并在正常的grad基礎(chǔ)上,累加對(duì)抗訓(xùn)練的梯度
pgd.restore()#恢復(fù)embedding參數(shù)
#梯度下降,更新參數(shù)
optimizer.step()
model.zero_grad()

三、FreeLB算法

poYBAGNrDuqAAZznAACeioX217Y489.jpg


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

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

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

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

實(shí)現(xiàn)流程如下圖所示:
77bcbba0-5f58-11ed-8abf-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4552

    瀏覽量

    92024
  • nlp
    nlp
    +關(guān)注

    關(guān)注

    1

    文章

    481

    瀏覽量

    21935

原文標(biāo)題:煉丹之道 | NLP中的對(duì)抗訓(xùn)練

文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常用幾種接地方法?

    簡(jiǎn)單列舉幾種常用的接地方法
    發(fā)表于 03-29 08:20

    簡(jiǎn)述電子對(duì)抗綜合模擬訓(xùn)練平臺(tái)

    電子對(duì)抗綜合模擬訓(xùn)練平臺(tái)以電子戰(zhàn)部隊(duì)指揮機(jī)構(gòu)為主要訓(xùn)練對(duì)象,開(kāi)展集電子對(duì)抗、指揮干預(yù)、戰(zhàn)術(shù)使用、仿真推演、訓(xùn)練監(jiān)控與評(píng)估等功能的綜合電子
    發(fā)表于 09-01 10:50

    優(yōu)化神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法有哪些?

    優(yōu)化神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法有哪些?
    發(fā)表于 09-06 09:52

    微軟在ICML 2019上提出了一個(gè)全新的通用預(yù)訓(xùn)練方法MASS

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

    新的預(yù)訓(xùn)練方法——MASS!MASS預(yù)訓(xùn)練幾大優(yōu)勢(shì)!

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

    關(guān)于語(yǔ)言模型和對(duì)抗訓(xùn)練的工作

    訓(xùn)練方法不僅能夠在BERT上有提高,而且在RoBERTa這種已經(jīng)預(yù)訓(xùn)練好的模型上也能有所提高,說(shuō)明對(duì)抗訓(xùn)練的確可以幫助模型糾正易錯(cuò)點(diǎn)。 方法
    的頭像 發(fā)表于 11-02 15:26 ?2006次閱讀
    關(guān)于語(yǔ)言模型和<b class='flag-5'>對(duì)抗</b><b class='flag-5'>訓(xùn)練</b>的工作

    NLP中的對(duì)抗訓(xùn)練到底是什么

    簡(jiǎn)介 對(duì)抗訓(xùn)練是一種引入噪聲的訓(xùn)練方式,可以對(duì)參數(shù)進(jìn)行正則化,提升模型魯棒性和泛化能力。 對(duì)抗訓(xùn)練的假設(shè)是:給輸入加上擾動(dòng)之后,輸出分布和原
    的頭像 發(fā)表于 01-18 17:17 ?3408次閱讀

    現(xiàn)代交互技術(shù)下的兒童語(yǔ)言表達(dá)訓(xùn)練方法

    現(xiàn)代交互技術(shù)下的兒童語(yǔ)言表達(dá)訓(xùn)練方法
    發(fā)表于 06-27 11:27 ?3次下載

    總結(jié)幾種常用的單片機(jī)加密方法

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

    時(shí)識(shí)科技提出新脈沖神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法 助推類腦智能產(chǎn)業(yè)落地

    近日,SynSense時(shí)識(shí)科技技術(shù)團(tuán)隊(duì)發(fā)表題為“EXODUS: Stable and Efficient Training of Spiking Neural Networks”的文章,在文章中提出了新的脈沖神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法EXODUS。
    的頭像 發(fā)表于 06-20 14:21 ?1305次閱讀

    幾種常用NLP數(shù)據(jù)增強(qiáng)方法

    因?yàn)橹苯訉?duì)原是文本進(jìn)行數(shù)據(jù)增強(qiáng),很難保證維持原始的文本語(yǔ)義,因此可以通過(guò)在語(yǔ)義空間上進(jìn)行隱式數(shù)據(jù)增強(qiáng),簡(jiǎn)單列出幾種方法
    的頭像 發(fā)表于 09-15 14:54 ?1634次閱讀

    傳感器使用中幾種常用簡(jiǎn)單處理方法

      在傳感器使用中,我們常常需要對(duì)傳感器數(shù)據(jù)進(jìn)行各種整理,讓應(yīng)用獲得更好的效果,以下介紹幾種常用簡(jiǎn)單處理方法
    的頭像 發(fā)表于 11-30 10:40 ?959次閱讀

    淺談傳感器幾種常用簡(jiǎn)單處理方法

    在傳感器使用中,我們常常需要對(duì)傳感器數(shù)據(jù)進(jìn)行各種整理,讓應(yīng)用獲得更好的效果,以下介紹幾種常用簡(jiǎn)單處理方法。
    發(fā)表于 03-02 09:35 ?523次閱讀

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

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

    ai大模型訓(xùn)練方法有哪些?

    AI大模型訓(xùn)練方法是一個(gè)復(fù)雜且不斷發(fā)展的領(lǐng)域。以下是ai大模型訓(xùn)練方法: 數(shù)據(jù)預(yù)處理和增強(qiáng) 數(shù)據(jù)清洗:去除噪聲和不完整的數(shù)據(jù)。 數(shù)據(jù)標(biāo)準(zhǔn)化:將數(shù)據(jù)縮放到統(tǒng)一的范圍。 數(shù)據(jù)增強(qiáng):通過(guò)旋轉(zhuǎn)、縮放、裁剪等
    的頭像 發(fā)表于 07-16 10:11 ?753次閱讀