对抗学习常见方法代码实现篇
对抗学习的基本概念要认识对抗训练,首先要了解 “对抗样本”,在论文 Intriguing properties of neural networks 之中有关于对抗样本的阐述。简单来说,它是指对于人类来说 “看起来” 几乎一样,但对于模型来说预测结果却完全不一样的样本,比如下面的经典例子(一只熊猫加了点扰动就被识别成了长臂猿)
Min-Max公式:
FGSM(Fast Gradient Sign Method)max函数指的是,我们要找到一组在样本空间内、使Loss最大的的对抗样本(该对抗样本由原样本x和经过某种手段得到的扰动项r_adv共同组合得到)。这样一组样本组成的对抗样本集,它们所体现出的数据分布,就是该中括号中所体现的。
min()函数指的是,我们面对这种数据分布的样本集,要通过对模型参数的更新,使模型在该对抗样本集上的期望loss最小。
Goodfellow等人在这篇论文中提出了FGSM对抗方法:
EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
论文主要结论:
- 对抗样本可以被解释为高维点积运算的一个属性,是模型过于线性,而非过于非线性导致的;
- 围绕不同模型之间的对抗样本泛化可以被解释为和模型权重向量高度对齐的对抗干扰,在相同任务上训练的不同模型学习了相似的功能;
- 干扰的方向,而不是空间中的一个具体的点,才是最重要的。空间中的对抗样例是不足的,不能像有理数那样表示实数;
- 因为它是最重要的方向,对抗性扰动在不同干净样本之间起到泛化的作用;
- 介绍了一些列快速生成对抗样本的方法;
- 对抗性训练可以起到正则化的作用,且比dropout正则化作用更大;
- 易于优化的模型更容易受到对抗干扰;
- 线性模型缺乏抵抗干扰的能力,仅带有隐藏层的网络,通过训练后可以抵抗干扰;
- RBF网络可以抵抗干扰;
- 对输入分布进行建模的模型没有抵抗干扰的能力;
- 组合模型无法对抗干扰;
FGSM是一种白箱攻击方法,该方法认为攻击就是添加扰动使得模型的loss增大,所以沿着梯度方向生成攻击样本应该是最佳的(注意:传统情况下我们是固定样本,通过梯度改变权值,现在就是固定权值,通过梯度改变样本。),具体公式如下图所示:
ADVERSARIAL TRAINING METHODS FOR SEMI-SUPERVISED TEXT CLASSIFICATION
对于 CV 领域的任务,在输入上添加一个连续的扰动,这种对抗训练的流程可以顺利执行下来,因为图像可以视为普通的连续实数向量, Δ x \Delta x Δx也是一个实数向量,因此 x + Δ x x + \Delta x x+Δx依然可以是有意义的图像。但 NLP 不一样,NLP 的输入是文本,它本质上是 one-hot 向量,而两个不同的 one-hot 向量,其欧式距离恒为 ,因此对于理论上不存在什么 “小扰动”,因此本文中提出将扰动添加到Embedding层。
For text classification, the input is discrete, and usually represented as a series of highdimensional one-hot vectors. Because the set of high-dimensional one-hot vectors does not admit infinitesimal perturbation, we define the perturbation on continuous word embeddings instead of discrete word inputs.
此外,为避免出现不合理的优化解,在应用对抗训练前,先对embedding进行正则化处理,
v
k
,
v
‾
k
分
别
表
示
r
a
w
e
m
b
e
d
d
i
n
g
、
n
o
r
m
a
l
i
z
e
d
e
m
b
e
d
d
i
n
g
v_k,\overline v_k分别表示raw \ embedding、normalized \ embedding
vk,vk分别表示raw embedding、normalized embedding如下:
FSGM是每个方向上都走相同的一步,Goodfellow后续提出的FGM则是根据具体的梯度进行scale,得到更好的对抗样本:
FGSM&FGM 对抗步骤:
- 一切照常,计算前向loss,然后反向传播计算grad(注意这里不要更新梯度,即没有optimizer.step());
- 拿到embedding层的梯度,计算其norm,然后根据公式计算出r_adv,再将r_adv累加到原始embedding的样本上,即 x+r ,得到对抗样本;
- 根据新对抗样本 x+r ,计算新loss,在backward()得到对抗样本的梯度。由于是在step(1)之后又做了一次反向传播,所以该对抗样本的梯度是累加在原始样本的梯度上的;
- 将被修改的embedding恢复到原始状态(没加上r_adv 的时候);
- 使用step(3)的梯度(原始梯度+对抗梯度),对模型参数进行更新(optimizer.step()/scheduler.step()).
Paper:Towards Deep Learning Models Resistant to Adversarial Attacks
FGM 的思路是梯度上升,本质上来说没有什么问题,但是 FGM 简单粗暴的 “一步到位” 是不是有可能并不能走到约束内的最优点呢?当然是有可能的。于是,一个新的想法诞生了,Madry 在 18 年的 ICLR 中提出了 Projected Gradient Descent(PGD)方法,简单的说,就是 “小步走,多走几步”,如果走出了扰动半径为 的空间,就重新映射回 “球面” 上,以保证扰动不要过大:
PGD对抗具体步骤:
FreeAT (Free Adversarial Training)对于每个x:
1.计算x的前向loss,反向传播得到梯度并备份;
对于每步t:
a)根据Embedding矩阵的梯度计算出r,并加到当前Embedding上,相当于x+r(超出范围则投影回epsilon内)
b)t不是最后一步: 将梯度归0,根据(1)的x+r计算前后向并得到梯度
c)t是最后一步: 恢复(1)的梯度,计算最后的x+r并将梯度累加到(1)上
2.将Embedding恢复为(1)时的值;
3.根据©的梯度对参数进行更新;
Adversarial Training for Free!
FREELB: ENHANCED ADVERSARIAL TRAINING FOR NATURAL LANGUAGE UNDERSTANDING
You Only Propagate Once: Accelerating Adversarial Training Using Maximal Principle
Adversarial Training for Large Neural Language Models
SMART
Virtual Adversarial Training: A Regularization Method for Supervised and Semi-Supervised Learning
下一篇,我们来看几种对抗方法的具体代码实现。
参考文献:
https://wmathor.com/index.php/archives/1537/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)