Machine Can See 2018 图像对抗攻击大赛比赛心得
雷锋网 (公众号:雷锋网) AI 科技评论按:这篇文章来自俄罗斯数据科学家、机器学习爱好者、创业公司的计算机视觉研究员 Alexander Aveysov。他参加了 2018 年度的「Machine Can See」的对抗性样本攻防大赛,并在比赛中获得了第二名。这篇文章是他对这次比赛的个人感想以及经验总结。雷锋网 AI 科技评论编译如下。
所有的对抗性攻击的简单范式
全文梗概
前不久,我有幸参加了「Machine Can See 2018」的对抗性样本攻防大赛。事实上,我参加比赛的时候已经很晚了(幸运的是,我在比赛结束时获得了第二名),最终我们的队伍由4 个人组成,其中包括我在内的 3 个人为夺取胜利作出了突出的贡献(去掉其中的任何一个人,我们都不会取得这样的成绩)。
本次比赛旨在对人脸图片进行修改(结构相似度 SSIM的下限为 0.95),从而使黑盒的 CNN 无法将源人像(source person)和目标人像(target person)区分开来。
简而言之,比赛的要求就是:修改一张人脸图像,使得黑盒模型不能将两张人脸图像区分开来(至少从「L2 范数/欧氏距离」的层面上来说是这样)。
在对抗性攻击中起作用的是什么?我们采用了哪些方法?
1. 快速梯度符号法(FGSM)确实有效。加入启发式方法可以略微提升其性能;
2. 快速梯度值法(FGVM)。加入启发式方法可以大幅度提升其性能;
3. 梯度差分进化算法(这里为大家提供一篇关于该算法的精彩的文章: https://pablormier.github.io/2017/09/05/a-tutorial-on-differential-evolution-with-python/ )+像素级攻击;
4. 模型集成(将最优秀的解决方案对叠起来,例如 6 个ResNet-34);
5. 目标图像组合的智能化遍历;
6. 在进行 FGVM 攻击时充分使用早停止(early stopping)技术。
对我们不起作用的做法是:
1. 为 FGVM 算法添加动量(这种方法仅仅能够提升排名较低的队伍的模型性能。因此,也许仅仅使用模型集成+启发式方法就能获得比动量更好的性能?);
2. C&W攻击(本质上是一种端到端的攻击方法,他着眼于白盒模型中的「logits」(一个事件发生与该事件不发生的比值的对数), https://arxiv.org/abs/1705.07263 );
3. 端到端的基于「Siamese」连接网络(一种类似于 UNet 的架构,但是是基于 RenNet 开发而来)的方法。这种方法对于 WB 有效,但是不适用于 BB。
我们还没有尝试的做法(由于缺乏时间、努力或意志力):
1. 为学生网络的学习适当地测试数据增强(我们同时还需要修改描述符);
2. 在攻击时进行数据增强;
竞赛概览:
1. 竞赛提供的数据是一个由 1000 组 5+5(分别为source person 和 target person)的图片组合组成的小型数据集;
2. 用来训练学生网络的数据集规模相对较大——超过 1M的图片;
3. BB 是作为许多预编译好的 Caffe 模型提供的(由于BB在这种环境下运行,这些模型当然不能使用合适的最新的版本的软件,这个问题最终将由主机解决)。这个问题确实有些令人痛苦,因为这个BB 并不接受图像的批量处理;
4. 该比赛设置了一个极高的对比基线(老实说,我相信没有这个基线就不会有人登上排行榜了);
核心资源:
1. 一个最终的模型副本的代码仓库( https://github.com/snakers4/msc-2018-final );
2. 我们的模型演示( https://drive.google.com/file/d/1P-4AdCqw81nOK79vU_m7IsCVzogdeSNq/view );
3. 所有获奖者的模型演示( https://drive.google.com/file/d/1aIUSVFBHYabBRdolBRR-1RKhTMg-v-3f/view );
详细叙述 - 「Machine Can See 2018」大赛概览,看我如何取得最终的成绩
1. 比赛流程及解决方案
老实说,我被这项有趣的比赛所吸引了,比赛的奖品为英伟达 GTX 1080Ti 公版显卡并且我认为比赛的竞争水平相对较低(它远远不能和那些有 4000 个参赛者的 Kaggle 比赛+整个 ODS 团队相提并论)。
如上文所述,比赛的目标是欺骗 BB 模型,使其无法区分连个不同的人的图像(使用 L2范数或欧氏距离度量)。该比赛是一个「黑盒」竞赛,因此我们不得不利用比赛提供给我们的数据“蒸馏”(知识提取)出学生网络,并希望 BB 和 WB 模型的梯度能够足够相似,从而进行攻击。
事实上,如果你充分阅读了学术文献(例如,这一篇( https://arxiv.org/abs/1712.07107 )和这一篇( https://arxiv.org/abs/1801.00553 ),尽管这些论文并未讨论真实生活中的情况如何)并且提炼出那些顶尖的团队所获得的知识,你可以很容易地发现下面的模式:
1. 最容易实现的攻击手段(在现在流行的框架上)涉及白盒攻击或者了解卷积神经网络(CNN)的内部结构(或仅仅是一个架构);
1.1 有人在和我聊天时竟然建议我记录黑盒模型进行推断的时间,从而反推它的架构,真是太搞笑了!
2. 如果能够获得足够的数据,你可以使用一个经过恰当训练的白盒模型对黑盒模型进行模拟;
3. 根据推测,目前最先进的方法是:
3.1 端到端的 C&W 攻击(在这里效果并不好);
3.2 巧妙的 FGSM 算法的扩展( https://arxiv.org/pdf/1710.06081.pdf ),例如:动量+模型集成;
说实话,我们曾一度陷入困惑之中,因为我们团队中有两个人实现了截然不同的两套端到端的解决方案(而他们之间互相并不知道这一点,也就是说分别完成了两套系统),而他们都没有采用黑盒模型。这本质上意味着在我们的任务中,我们的模型设定中漏掉了一些隐藏的因素,而我们没有注意到这一点。正如许多现在流行的完全端到端的计算机视觉应用一样,它们要么为你提供非常好的结果(例如:风格迁移,深度分水岭算法(用于图像分割),图像生成,图像去噪),要么就基本上不起作用。
梯度方法是如何工作的
事实上,你可以利用知识蒸馏技术通过一个白盒模型模拟一个黑盒模型,接着你值用计算输入图像关于模型输出的梯度。而这一切的奥秘都在启发式算法中。
2. 目标度量
目标的度量标准是一个所有 25 种(5*5=25)源图像和目标图像组合的平均 L2 范数(欧氏距离)。
由于 CodaLab(赛事组织者)的限制,我认为个人得分(以及团队分数合并的过程)是由管理员手动完成的,这就有些尴尬了。
3. 团队
当我比排行榜(AFAIK)上的其他人都取得了更好的学生网络的训练结果,并且和 Atmyre( https://github.com/atmyre )进行了一番讨论之后(她帮助我使用了正确编译的黑盒模型,因为她自己也面临这样的问题),我加入了现在的团队。在比赛结束前的 2-3 天,我们在不用分享我们的算法和代码的情况下共享了本地分数:
1. 我的端到端的模型失败了(她的也是);
2. 我的学生模型性能更好;
3. 他们拥有更好的 FGVM 启发式算法的变体(他们的代码是基于基线修改而来);
4. 起初,我开始着手处理基于梯度的模型,并且获得了大约 1.1 的本地分数。一开始,由于某些我个人的原因(认为太没有挑战)我不愿意使用基线的代码;
5. 他们当时不具备足够的计算能力;
6. 在最后,我们赌了一把,将各自的策略结合了起来——我贡献了我的 devbox 工作站/卷积神经网络/模型简化实验及观测结果,他们贡献了他们修改了好几个星期的代码。
这一次,她为她自己卓越的组织能力和无价的组队建议而欢呼!我们取得了不错的成绩。
团队的成员包括:
1. https://github.com/atmyre ——她是我们团队的队长(我从她的所作所为中推断出来的)。她为我们最中提交的版本贡献了基因差分进化攻击算法;
2. https://github.com/mortido ——他用精妙的启发式算法以及他利用基线代码训练好的两个模型实现了最佳的 FGVM 攻击算法;
3. https://github.com/snakers4 ;除了一些模型简化测试,我还贡献了 3 个具有领先的分数的学生模型、计算能力,并且我还需要在模型演示和最终提交的阶段不断提升模型性能;
4. https://github.com/stalkermustang ;
在最后,我们从彼此身上学到了很多东西,我很庆幸我们赌了这一把。如果缺少上述 3 个贡献中的任意一项,我们都不会胜出。
4. 学生卷积神经网络知识蒸馏
我在训练学生模型时获得了最高的分数,因为我使用了自己的代码而不是基线代码。
关键点和起作用的因素:
1. 为每个架构都分别开发一个逻辑回归(LR)模型体系;
2. 一开始只需要使用 Adam 算法和 LR 衰减技术进行训练;
3. 接下来使用折叠或/和其他甚至更巧妙的像循环学习率或权重集成等做法(我在这里并没有这样做);
4. 仔细监控欠拟合、过拟合以及模型的容量;
5. 手动调整你的训练进度,不要依赖全自动的方案。它们也可以正常工作,但是如果你合适地调整了所有的训练细节,你的训练时间可以缩短 2-3 倍。特别是对于 DenseNet 这样求解梯度过程很深的模型来说,这一点非常重要;
6. 最好的模型往往都很深;
7. 使用 L2 损失代替均方误差损失(MSE)也是同样有效的,但是这样做却不够精确。在运行使用均方误差损失训练的测试模型时,显示出它与 BB 模型的输出之间的 L2 距离小于使用 L2 损失训练的模型。这可能是因为均方误差,如果我们使用创造性的方法单独处理每个 batch 中的 B*512 的样本(它允许更多的参数调优,并且共享图像之间的信息),而 L2 范数则单独处理每个 2*512 的向量组合。
不起作用的是:
1. 基于 inception 的架构(由于高的下采样率和更高需求的分辨率而不适用)。而不知为何,第三名的队伍设法使用了 inception-v1 架构和全分辨率图像(大约 250*250);
2. 基于 VGG 模型的架构(发生过拟合);
3.「轻量化」架构(SqueezeNet / MobileNet——欠拟合);
4. 图像增强(没有修改描述符——尽管第三名队伍的人努力实现了这一点);
5. 使用全尺寸图像;
6. 此外,我们在竞赛的主办者提供的网络的最后也加入了一个批量归一化层。这并没有对我的队友起到帮助,我最后使用了自己的代码,因为我不太明白为什么会出现这种情况。;
7. 同时使用显著性映射(saliency maps)和单像素攻击。假设这对于全尺寸图像更有用(只需比较 112*112 的搜索空间和 299*299 的搜索空间);
我们最好的模型。可以看到,最佳得分是 3*1e-4(越低越好)。根据模型的复杂度,你可以在某种程度上猜测出 BB 模型是 ResNet-34.在我的测试中,ResNet-50 的表现比 ResNet-34 要差。
第一名的均方误差损失示意图
5. 最终得分和模型简化分析
我们的模型简化分析结果如下图所示:
最佳的解决方案如下图所示(是的,还有人开玩笑说要将 ResNet 堆叠起来,他们猜测 ResNet 就是黑盒模型架构):
其它队伍提供的其它的巧妙、使用的技术:
1. 自适应的 epsilon 参数;
2. 数据增强;
3. 训练时使用动量;
4. Nesterov 动量( http://ruder.io/optimizing-gradient-descent/index.html#momentum );
5. 攻击镜面翻转图像;
6. 修改数据——比赛中仅仅提供 5000 个图像组合中的 1000 张独特的图像,你可以生成更多的训练数据;
实用的 FGVM 启发式算法:
1. Noise = eps * clamp(grad / grad.std(), -2, 2);
2. 通过梯度加权将几个卷积神经网络(CNN)集成起来;
3. 只在模型的平均损失减小时保存变化;
4. 使用目标组合来实现更鲁棒的目标选择;
5. 只使用比均值加标准差更大的梯度(对于 FGSM 算法来说);
简单概括一下:
1. 第一名是最「具有黑客精神的解决方案」;
2. 我们团队拥有最多样化的解决方案;
3. 第三名的解决方案是最「漂亮」的;
6. 端到端的模型
尽管在这次比赛中,这种方法失败了,但是它仍然值得在未来被尝试。详情请参阅上文提供的代码仓库,但是,简而言之我们尝试了:
1. C&W 攻击;
2. 有两个目标的,受到 Siamese 连接网络启发的模型;
端到端模型
端到端模型的工作流
7. 参考文献及进一步的阅读资料
1. 竞赛官网: https://competitions.codalab.org/competitions/19090#participate
2. 我们的代码仓库: https://github.com/snakers4/msc-2018-final
3. 关于变分自编码器(VAE)的系列文章——看上去和这个主题十分相关: https://habr.com/post/331552/
4. 关于结构相似性的资料:
4.1 维基百科: https://en.wikipedia.org/wiki/Structural_similarity
4.2「可用来反推概念」的 Pytorch 实现: https://github.com/Po-Hsun-Su/pytorch-ssim
5. 关于差分进化算法的资料:
5.1 精彩的博文: https://pablormier.github.io/2017/09/05/a-tutorial-on-differential-evolution-with-python/
5.2 SciPy实现: https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.differential_evolution.html
6. 模型演示
6.1 我们的模型演示: https://drive.google.com/open?id=1P-4AdCqw81nOK79vU_m7IsCVzogdeSNq
6.2 所有的模型演示: https://drive.google.com/open?id=1aIUSVFBHYabBRdolBRR-1RKhTMg-v-3f
7. 两篇最有用的论文:
7.1 https://arxiv.org/pdf/1710.06081.pdf
7.2 https://arxiv.org/abs/1708.03999
8. 两篇广为推崇的论文:
8.1 https://arxiv.org/abs/1712.07107
8.2 https://arxiv.org/abs/1801.00553
via spark-in ,雷锋网 AI 科技评论编译
。