对抗样本简单小结

  • 2021 年 4 月 19 日
  • AI

之前看了一篇很不错的文章,

Nicolas:【炼丹技巧】功守道:NLP中的对抗训练 + PyTorch实现zhuanlan.zhihu.com图标

这里对 对抗样本做了很好的总结:

然后沿着作者大佬的思路,看了两本书和李宏毅以及cs231n的相关课程,跑了几个demo,算是对这个领域有一些了解了。

对于实际投产的模型,我们会从3个角度去评估模型的好坏:

1、最基本的,模型的精度,模型预测的精度必须达到一定的标准才有上线的机会,没有精度的model,一切无从谈起;

2、模型的泛化能力,即模型对未知样本的预测精度,要达到高精度不难,过拟合就行,但是要达到高精度+好的泛化能力则相对难一些,需要通过增加数据,约束模型等手段来提升,这部分讲烂了就不废话了;(个人认为模型的鲁棒性和泛化能力其实说的差不多是一个东西)

3、模型的对抗性:模型对于来自于人类的恶意攻击不敏感,不会被人类的恶意攻击愚弄而输出错误的预测。

对抗样本这个领域主要是做两件事:

1、研究怎么去攻击模型,从而检验模型的抗击打能力并尝试对模型进行改进;

2、研究怎么防御攻击,提高模型的抗“击打”能力,但是在nlp中,对抗样本的防御手段也常常用来提升模型的泛化性能。


为什么需要对抗样本?

想起来以前有人做过一些很有意思的测试,使用伪造的人脸面具来破解面部识别系统,这样的例子还有很多,例如绕过垃圾邮件检测的恶意攻击手段,简单来说,就是人工智能系统对于而恶意攻击的脆弱性催生了对抗学习的研究。

之前的一个很有意思的例子,在图像识别中简单的让受试者戴上 某个特殊的眼镜,模型就会误判成另一个人。

对抗样本和过拟合有什么关系?

对抗样本和过拟合确实有一些类似,特别是对抗训练在nlp中也能够作为一种正则化手段提高模型的泛化能力,但是实际上二者存在本质的区别。

形态,

如上图,这是一个比较典型的过拟合的例子,复杂的模型其分类的超平面投影到二维空间的结果如上图,我们可以看到实际上通过一个简单的线性分类超平面就可以正确的分类,而因为过拟合的问题,模型进行了错误的分类。这种情况下我们对模型进行正则化约束,或者是重新训练一个新的模型,那么分类的超平面就会发生改变,重新得到的分类超平面很有可能不会再犯同样的错误,但是可能会误分类其它的样本。

如果是过拟合,那么最终模型的输出误差将是随机的,但是奇怪的现象在于:

1、imagenet这样在大量的数据上训练得到的直觉上过拟合不太可能发生的模型也很容易产生类似过拟合的现象,例如

仅仅对输入做微小的改动就能轻易的让模型误判;

2、发现存在一些完全相同的特殊的样本,能够同时使得不同的预训练的视觉模型都发生错判(Transferable Features of Adversarial Examples )

我们发现这类的问题不是随机产生的而是具有一定规律,一定系统性的。

实际上,问题是这样的:

上图中曲线为真实的分类超平面,直线为模型的分类超平面,二者之间的部分是对抗样本所在的区域。这里的前提假设是,因为实际上真实的分类超平面我们是难以确定的,模型只能不断地接近这个真实超平面所在的上限而无法真正到达它,所以模型的决策平面和真实的决策平面总会存在一定的gap,那么这些gap之间的样本就是我们的对抗样本。

这实际上,个人认为可以上升到一个非常普遍的现象——

1、我们难以穷尽真实的数据,通过增加越来越多的样本我们能够提高模型的泛化能力,但是我们并不知道我们收集到的数据是不是具有足够的代表性,是否能够充分的反应真实的决策平面;

2、即使我们能够收集到所有的数据,模型学习到的决策平面,难以完全契合真实存在的决策平面,二者之间大概率存在着一定的gap;


简而言之,我们难以通过常规的模型训练施加正则化或者特征选择或者增加更多样本等方式来提升模型对这类样本的预测准确程度。因此,需要使用到对抗学习。

攻击层面上的分类如图,这里并不打算深入研究,因为我仅仅对对抗训练比较感兴趣。

目前看到的关于攻击的文章,基本上是在研究怎么生成对抗样本去检测模型在对应恶意攻击时的脆弱程度,当然,攻击和防守是不可割裂的,防守的方法常常需要根据模型收到攻击的时候暴露出来的缺陷进行设计。

目前对抗样本的研究领域大部分集中在cv上,这个我不感兴趣也不懂,除此之外在传统的机器学习中,也有很多的research,这个暂时用不上,也不感兴趣。。。感兴趣的可以参考一下这本书。

我感兴趣的主要是,对抗样本中的对抗训练机制在nlp问题中能够作为一种新的正则化约束来提高模型的泛化能力。至于其他的部分,就简单理解知道是什么就好。关于对抗训练的总结可见:

李rumor:一文搞懂NLP中的对抗训练FGSM/FGM/PGD/FreeAT/YOPO/FreeLB/SMARTzhuanlan.zhihu.com图标

关于工具:

Trusted-AI/adversarial-robustness-toolboxgithub.com图标

看了一下,其中涉及到了不少非深度学习部分,包括了针对lgb和xgb等tree模型的对抗学习的例子,吐血。。。算了算了,干好nlp就好。。其它的有需要再学好了

thunlp/OpenAttackgithub.com图标QData/TextAttackgithub.com图标

不过其实针对不同算法去找对应的作者的实现的话更方便一点,灵活性比较高,比较好融合到自己的代码里,fgsm基本上几行就搞定了。

还有一个是关于nlp 数据增强的:

//github.com/makcedward/nlpauggithub.com