擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

雷锋网(公众号:雷锋网)按:本文为雷锋字幕组编译的技术博客,原标题 Playing with adversarial attacks on Machines Can See 2018 competition ,作者为 snakers41 。

翻译 | 廖颖 整理 | MY

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

对抗攻击比赛的简介

TLDR;

我偶然地参加了 MCS2018 对抗比赛。参加这项比赛的时候已经很晚了(加入的时候距离截止只有差不多一周的时间),但最后还是组成了一个四人小组。其中,小组中三个成员(加上我)的付出是这次胜利的必然条件(去掉其中任意一个,我们都可能与胜利擦身而过)。

这项比赛的目标是改变人脸(要求结构相似度 SSIM 不低于 0.95),使得卷积神经网络这个黑箱不能区分源人脸和目标人脸的差别。

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

简单描述比赛的主旨——修改人脸,使得黑箱不能区分两张脸的差别(至少从 L2 范数表示的欧氏距离的距离度量上来看)。

对抗攻击需要的工作以及对我们有用的东西:

· 快速梯度标记法(FGSM)是有用的,加入启发式会使得它更好一点;

· 快速梯度取值方法(FGVM),添加启发式会大大改善效果;

· 生成式差分进化(恒星网 Stellar 的一篇文章讲到这个方法) 一个像素值的攻击;

· 模型融合(最好的网络结构是 6 个 34 层 ResNet 模型);

· 目标图像组合的巧妙遍历;

· 基本上在进行 FGVM 攻击时就尽早停止。

对我们没用的东西:

· 向 FGVM 添加动量(这对那些排名较低的队伍有效,或许融合 启发式的组合比动量更有效?);

·Carlini 和 Wagner 提出的攻击方法(CW 攻击,基本上是一种端到端的攻击,关注白箱模型的 logits)——这种方法对白箱(WB)有用,但对黑箱(BB)没用;

· 端到端的基于 Siamese LinkNet(一种类似于 UNet 的架构,但是基于 ResNet 的)的方法。同样是对白箱有用,而对黑箱无用。

我们还没有来得及尝试的(时间不够,也或者是不够努力和坚持):

· 对学生学习适当增强测试(我们也会修改描述器);

·在攻击的时候进行增强。

比赛的大致介绍:

· 比赛包含了 1000 张 5 5 图像组合的小型数据集;

· 提供给学生网络学习的数据集相当大——超过 1 万张图片;

· 黑箱是作为大量预编译的 Caffe 模型(因为使用了这些,不能很好地在现在的软件版本上使用——但最终还是由主办方处理了)。这还是有点痛苦的,因为黑箱不接受批量图像;

· 这个比赛提供 baseline 代码(实话说,没有这个开源代码,我想可能没什么人了)。

核心材料:

· 结果复现的代码库;

· 我们的演示;

· 所有优胜者的演示。

1、MCS2018 比赛概览以及我是如何入选的

比赛和方法

实话说,我为这个有趣的领域着迷。我以为奖品里有 GTX 1080 Ti FE 版本显卡,就显得比赛等级相对「低」(远远赶不上用 Kaggle 整个 ODS 团队与 4000 人竞争)。

像上面提到的,比赛的目标是要混淆黑箱模型,使它不能区分两个人的差别(用 L2 范式或欧式距离)。这项比赛是「黑箱」比赛,所以我们不得不在给定的数据上对学生网络进行蒸馏,也希望黑箱梯度和白箱梯度在攻击性能上足够相似。

事实上如果你阅读了学术文献(比如这篇和这篇,即使它们并不会真正告诉你在实际操作中什么是有用的),并对顶级团队实现模型进行蒸馏,你就可以轻易发现以下一些规律:

· 最简单的执行攻击(在现代的框架上)包括白箱或者了解你正攻击的卷积神经网络 CNN 的内部结构(或仅仅是一个架构);

聊天中有人提出建议 ... 计算出黑箱进行推断的时间,从而压缩它的结构;

· 考虑到给定了足够多的数据,你可以用正确训练的白箱来模拟黑箱;

· 当下最经典的方法有:

端到端的 CW 攻击(在这里并没有用);

FGSV 的巧妙扩展(比如动量 集成)。

实话说我们也曾百思不得其解,队伍里两个人采用了完全不同的端到端解决方案(彼此不了解,即完全独立的),但他们对黑箱都不起作用。这可能意味着在我们的任务设置中,存在一些隐藏的设置泄漏,而我们并没注意到。像很多完全采用端到端的现代机器视觉应用可以给出很好的结果(比如风格转换、深部分水岭算法、图像生成、减少噪声和伪影等),但在这没用。

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

梯度方法是如何工作的

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

基本上你可以通过蒸馏,用白箱来模拟黑箱,然后计算出输入图像对模型输出的梯度。秘密还是像往常一样藏在启发式中。

目标矩阵

目标矩阵是一个 L2 范式(欧氏距离)的均值,是对源图像和目标图像(5*5)的 25 个组合取平均。

由于 CodaLab 的限制,我认为个人得分(和团队总分)都是由管理员手动操控的,这就有点后怕了。

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

团队

我在训练了学生网络之后效果比其他人都好(目前为止),和 Atmyre 讨论后(因为她之前遇到一些类似的问题,她帮助我使用正确编译的黑箱),我们分享了彼此的分数,当然在比赛截止前 2、3 天我们没有分享方法和代码:

· 我的端到端模型失败了(她的也是);

· 我有很棒的学生模型;

·他们具有 FGVM 启发式的优秀差分(他们的代码是基于 baseline 的);

· 我只是刚刚开始处理基于梯度的模型,本地上实现接近 1.1——最初因为个人原因,我是拒绝使用 baseline 代码的(毫无挑战);

·那时候他们还没有太强的计算能力;

· 最后我们冒了一个险,结合了其他力量——我献出了我的 devbox / CNNs / ablation 实验和观测,他们提供了发布了数周的代码库。

再一次向她的组织能力及无私建议表达深深的感谢。

队伍成员如下:

· github/atmyre——她当时是队长(我从她的表现猜想的)。她提交了最终版的遗传差分进化攻击;

·
github/mortido——他用 stellar 启发式最好地实现了 FGVM 攻击 用 baseline code 训练了 2 个模型;

·
github/snakers4 - 除了一些消融测试,我提供了 3 个高分的学生模型 计算能力 演示期间和 最后提交版的加班;

· github/stalkermustang;

最后,我们在彼此身上学到很多,很开心有这次经历。缺少上面三位中哪一位对贡献,我们都不能取得胜利。

2、学生卷积神经网络蒸馏

我用学生模型在训练中实现了最好的分数,因为我用了自己的代码而不是 baseline 里的。

关键点 /有效点:

·对每一个架构单独设计 LR regime;

· 开始时用 Adam LR 衰减进行训练;

· 然后使用折叠 与/或,甚至更聪明的(我并没有采用)像周期性学习率或权重集成;

· 仔细监控欠拟合和过拟合以及模型容量;

· 手动调节你的日志,不要完全依赖自动日记。虽然它们也可以很好的工作,但如果你每一个都正确调节,则训练时间可以缩短 2 到 3 倍。尤其是遇到像 DenseNet 这样重梯度的模型;

·最好的架构都是适当笨重的;

· 训练 L2 损失而不是均方差也是可以的,但没有那么精确。运行用均方差训练的模型比用 L2 损失训练模型表现出 L2 距离更接近黑箱模型输出。大概是因为均方差,我们使用的箱是批量分别训练每个 Bx512 的对象(允许更多的微调和图像间的信息共享),而 L2 范式是分别训练 2x512 的向量。

没有用的:

· 基于 Inception 的架构(并不合适,因为高的下采样和更高的所需分辨率)。虽然第三名试图采用 Inception-v1 和 全分辨率图像(大约是 250x250);

· 基于 VGG 的架构(过拟合);

·「轻」架构(SqueezeNet / MobileNet——欠拟合);

· 图像增强(不修改描述器——即使第三名的朋友关掉了);

·在全尺寸图像上操作;

·富有挑战精神的主办方在网络最后还是提供了批量规范。不过这对我的队伍并没有什么用,我使用的是自己的代码,但我不太明白为什么它也在这儿;

· 使用特征图和单像素攻击。假定这对全尺寸图像更有用(仅仅比较 112x112x search_space 和 299x299xseach_space)。

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

我们最好的模型——注意最高分数是 3 * 1e-4。同时也考虑模型的复杂性,不难猜到黑箱模型是 ResNet34。在我的测试中,ResNet50 表现不如 ResNet34。

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

第一名的均方差损失

3、最终得分和消融分析

我们的消融分析就像这样:

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

顶级解决方案就像这样(好吧,这是对堆叠 ResNet 开了玩笑,他认为 ResNet 是黑箱架构):

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

其他队伍的一些巧妙有用的技巧:

·自适应的 epsilon 参数;

·增强数据;

· 动量;

· 牛顿动量;

·攻击镜像反射;

· 破解数据——5000 张组合图像中只有 1000 张特有的图像,也就是说你可以生成更多的训练数据。

对 FGVM 有用的启发式:

· 噪声= eps * clamp(grad / grad.std, -2, 2);

·通过梯度集成几个卷积神经网络 CNN;

· 仅当平均损失降低时保存变化;

· 使用目标组合实现更鲁邦的目标;

· 仅使用超过标准均方差的梯度(对 FGSV)。

简单总结:

· 第一名是最不优雅的解决方案;

· 我们有最多样化的解决方案;

· 第三名是最优雅的解决方案。

4、端到端模型

即使他们失败了,在未来也是值得一试的。更多细节请参考官网,简言之,我们尝试了:

· CW 攻击;

·2 个目标激励的 Siamese LinkNet;

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

端到端模型

擦身而过的胜利(手把手教你如何取得MSC对抗赛的胜利)

端到端模型流程

我还是认为我的损失是相当优美的。

5、参考文献和进一步阅读

1、比赛主页

2、我们的公共库

3、一个与这个主题接近的关于变分自编码(VAE)的文章系列

4、关于结构相似性(SSIM)的材料

1、维基百科

2、"Backpropable" PyTorch 实现

5、差分进化算法的材料

1、 Stellar 的博客

2、 SciPy

6、演示

1、我们的

2、所有的

7、最有用的两篇文章

1、
arxiv/pdf/1710.06081.pdf

2、
arxiv/abs/1708.03999

8、2 all over the place papers:

1、
arxiv/abs/1712.07107

2、
arxiv/abs/1801.00553

原文链接:
spark-in.me/post/playing-with-mcs2018-adversarial-attacks

雷锋网雷锋网