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

    文章

    4457

    浏览量

    90761
  • nlp
    nlp
    +关注

    关注

    1

    文章

    464

    浏览量

    21826

原文标题:炼丹之道 | NLP中的对抗训练

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    gensim增量训练方法

    使用gensim训练词向量
    发表于 07-31 14:12

    常用几种接地方法

    简单列举几种常用的接地方法
    发表于 03-29 08:20

    简述电子对抗综合模拟训练平台

    电子对抗综合模拟训练平台以电子战部队指挥机构为主要训练对象,开展集电子对抗、指挥干预、战术使用、仿真推演、训练监控与评估等功能的综合电子
    发表于 09-01 10:50

    优化神经网络训练方法有哪些?

    优化神经网络训练方法有哪些?
    发表于 09-06 09:52

    新的预训练方法——MASS!MASS预训练几大优势!

    专门针对序列到序列的自然语言生成任务,微软亚洲研究院提出了新的预训练方法:屏蔽序列到序列预训练(MASS: Masked Sequence to Sequence Pre-training)。MASS对句子随机屏蔽一个长度为k的连续片段,然后通过编码器-注意力-解码器模型
    的头像 发表于 05-11 09:34 6805次阅读
    新的预<b class='flag-5'>训练方法</b>——MASS!MASS预<b class='flag-5'>训练</b>几大优势!

    关于语言模型和对抗训练的工作

    训练方法不仅能够在BERT上有提高,而且在RoBERTa这种已经预训练好的模型上也能有所提高,说明对抗训练的确可以帮助模型纠正易错点。 方法
    的头像 发表于 11-02 15:26 1855次阅读
    关于语言模型和<b class='flag-5'>对抗</b><b class='flag-5'>训练</b>的工作

    NLP中的对抗训练到底是什么

    简介 对抗训练是一种引入噪声的训练方式,可以对参数进行正则化,提升模型鲁棒性和泛化能力。 对抗训练的假设是:给输入加上扰动之后,输出分布和原
    的头像 发表于 01-18 17:17 3203次阅读

    一种侧重于学习情感特征的预训练方法

    transformers编码表示)的基础上,提岀了一种侧重学习情感特征的预训练方法。在目标领域的预练阶段,利用情感词典改进了BERT的预训练任务。同时,使用基于上下文的词粒度情感预测任务对掩盖词情感极性进行分类,获取偏向情感特征的文本表
    发表于 04-13 11:40 4次下载
    一种侧重于学习情感特征的预<b class='flag-5'>训练方法</b>

    现代交互技术下的儿童语言表达训练方法

    现代交互技术下的儿童语言表达训练方法
    发表于 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 1138次阅读

    几种常用NLP数据增强方法

    因为直接对原是文本进行数据增强,很难保证维持原始的文本语义,因此可以通过在语义空间上进行隐式数据增强,简单列出几种方法
    的头像 发表于 09-15 14:54 1480次阅读

    传感器使用中几种常用简单处理方法

      在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用简单处理方法
    的头像 发表于 11-30 10:40 791次阅读

    浅谈传感器几种常用简单处理方法

    在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用简单处理方法
    发表于 03-02 09:35 408次阅读

    混合专家模型 (MoE)核心组件和训练方法介绍

    ) 的 Transformer 模型在开源人工智能社区引起了广泛关注。在本篇博文中,我们将深入探讨 MoEs 的核心组件、训练方法,以及在推理过程中需要考量的各种因素。 让我们开始吧! 简短总结 混合专家模型 (MoEs
    的头像 发表于 01-13 09:37 497次阅读
    混合专家模型 (MoE)核心组件和<b class='flag-5'>训练方法</b>介绍