# FGSM→FGM→PGD

# 原理

深度学习通过梯度下降更新模型参数,因此有

weightnew=weightoldlrgradientsweight_{new} = weight_{old}-lr*gradients

其中的减号使得无论当前梯度是正还是负,最终新权重的方向必然是使得loss下降的方向移动;如果反过来改成加号,并且将weight改为输入x,就相当于给输入加一个小的扰动,从而进行对抗学习

x=x+Δxx = x+\Delta x

对于CV来说,直接在原始输入上添加一个小扰动,不会特别影响图片,但是在文本上,本质上是one-hot向量,而两个one-hot向量距离为2\sqrt2,因此不存在什么扰动,因此将扰动添加到embedding层。

FGM相对于FGSM主要是对计算扰动的地方进行了改变,FGSM中, 使用sgn函数(控制扰动在-1~1内),因此扰动肯定沿着梯度的方向往损失函数的极大值移动

Δx=ϵsign(g)\Delta x=\epsilon * sign(g)

而在FGM中,根据梯度用L2进行scale,这样保留了各个维度的相对大小,不至于直接转为-1~1,获得更好的样本

Δx=ϵg/norm(g)\Delta x=\epsilon * g/ norm(g)

FGM通过ϵ\epsilon一步计算出对抗扰动,但这样得到的可能不是最优的,因此PGD进行了改动,改为小步走,多走几步,如果走出ϵ\epsilon的区间,就映射ϵ\epsilon范围内,保证扰动不会太大

# 训练代码

https://github.com/lianyongxing/text-classification-nlp-pytorch/blob/main/model/fgm.py

# References

Adversarial Training Methods for Semi-Supervised Text Classification (ICLR2017)