CVPR 2021大赛, 安全AI 之防御模型的「白盒对抗攻击」解析
1 引言
2021年的安全AI挑战者计划的第六期由阿里和CVPR联合推出的竞赛一共分为两个赛道,赛道1是 防御模型的白盒对抗攻击,赛道2是 ImageNet无限制对抗攻击。
比赛链接:
https://tianchi.aliyun.com/s/cb2b6280f50dd95a685e9bb4ce840f4a
(点击文末阅读原文直达)
评估平台:
https://github.com/thu-ml/ares/tree/contest
参与比赛的粉丝,欢迎加入52CV组织的交流群
本文主要是对赛道1的赛题的一些讲解。要知道目前很多对抗防御方法被提出以减轻对抗样本的威胁。但是,其中一些防御可以被更强大或更具针对性的攻击攻破,这使得很难判断和评估当前防御和未来防御的有效性。
本次比赛的目的就是对防御模型进行全面而正确的鲁棒性评估。
挑战者计划第二季总奖金池为200万元,本期总奖金为10万美金,并包含近10万元的奖品福利,奖励如下:
赛事节点:
2 题目赛况
2.1 赛题简介
2.2 数据介绍
比赛方通过15个防御模型测试选手提交的攻击算法,其中包括13个在CIFAR-10上训练的模型和2个在ImageNet上训练的模型,比赛方将会利用CIFAR-10测试集的前1000个数据和ImageNetILSVRC2012验证集中随机挑选的1000个数据进行测试。为了方便查阅我将其整理成如下表格:
表1 模型介绍
举办的比赛方很贴心,他们已经将这些模型链接的下载程序https://github.com/thu-ml/ares/tree/contest 中,如下图所示,为各个模型下载的程序。
需要注意的一点是这些预训练好的模型大部分存储在google的Drive云端中,所以需要梯子来进行下载。
为了能够让大家更加方便的去获取模型我将这13个Cifar-10模型和2个Imagenet模型存放到百度云盘中。下载模型的链接和密码分别为:
链接:https://pan.baidu.com/s/13Je6K5TjNeGiReAtOUBfew
密码:CVPR
2.3 评价指标
本次比赛的提交评测,在主办方提供的ARES评测平台上进行。
平台的链接为:
https://github.com/thu-ml/ares/tree/contest
选手需要提交白盒攻击算法的源代码(不同于以往,之前需要提交对抗样本)。这些提交将会在范数扰动下进行评测。对于CIFAR-10上的模型,对抗扰动规模是,对于ImageNet上的模型,扰动规模是。提交的攻击算法可以获取到白盒模型的信息,但是仅仅可以获得模型的logits输出,然后在此输出的基础上设计攻击目标函数或者梯度更新方式。
需要注意的是基于模型特征上的白盒攻击算法不被允许。本次比赛鼓励参赛者开发出“通用”的攻击算法,使得它们不是针对某一个模型特制的,而是对于所有模型都可以达到很好的攻击效果。
通过防御模型的分类错误率作为提交攻击的得分(越高越好)。计算公式如下:
其中是所有待攻击模型,是评测数据集。选手需要保证攻击算法返回的对抗样本距离原始样本小于,否则平台将会自动进行clip裁剪。
3 提交文件介绍
本次比赛提交的是攻击代码,而不是在本地生成的对抗样本。每个提交都是一个名为 Attacker.zip (或者是attacker.zip )的Python软件包的zip压缩包。在__init__.py中实现自己的对抗攻击类,主办方为了实现接口的统一,需要调用ares.attack.base中的抽象类BatchAttack对其进行改写,类中共包含3个函数,分别是 __init__(),config(),batch_attack() 。
__init__() 函数接受4个参数:model, batch_size, dataset, session。
model是ares.model.base.ClassifierWithLogits的实例。可以用过调用
model.logits(xs)得到模型的logits输出,进而通过调用tf.gradients()计算模型梯度。其还提供了模型的其他信息,比如模型的输入数据范围[model.x_min,model.x_max], 模型输入数据的维度model.x_shape。batch_size是对于模型建议的batch_ size。需要通过此batch_ size对模型进行调用。我们保证了充足的GPU内存。batch_size在CIFAR-10上是100;在ImageNet上是20。
dataset是“imagenet”或“cifar10”的字符串。
session是tf.Session的实例。模型将会读入此session。需要通过此session运行模型。
config函数接受关键词参数kwargs,将扰动通过kwargs[“magnitude”]传入,此函数的返回值被忽略。
batch_attack函数接受3个参数: xs, ys, ys_target。
xs是原始样本。需要对其产生对抗样本。xs是numpy格式的数组,其维度为(batch_size, *model.x_shape)。
ys是对应的真实类别。
ys_target用于目标攻击,在此次比赛中没有用到,将被设置为None。
主办方在评测的过程中需要对提交的攻击限制时长:
每个数据的平均梯度计算次数应少于100次
平均模型预测次数应少于200次
所有模型的总运行时间应少于3小时
4 实际提交
在提交自己的代码之前一定需要现在本地的实验环境中先跑通否则就会各种报错,如下图所示:
我提交的是PGD攻击的样例代码,可以得到44.07的分数,进一步的攻击还在尝试中。
总体的排行榜如下所示,最高分是52.36分。
2月25日将有一场赛事直播,欢迎围观~
备注:对抗
对抗学习交流群
扫码备注拉你入群。