AI+网络安全是当前网络攻击与防御方向比较热门和前沿的领域。同时网络安全中的漏洞挖掘、入侵检测、异常流量等传统任务也已经出现了大量基于深度学习的实现方法。然而当以深度学习为主流的人工智能应用越来越广泛之后,陆续又出现了对于人工智能应用的攻击,主要分为两种:一是白盒测试,即深度学习的模型架构和参数都已经的情况下,这种场景的攻击一般可以进行参数的修改来达到攻击的效果;二是黑盒测试,即上述情况未知的情况下进行攻击,这时候采用的攻击手段主要是对抗样本,对抗样本(adversarial examples)这一概念在Szegedy et al. (2014b)中被提出:对输入样本故意添加一些人无法察觉的细微的干扰,导致模型以高置信度给出一个错误的输出。对抗样本现在已经广泛应用于人脸识别、声纹识别等相关应用场景。
(一)论文原理
本文的DeepFool模型(https://arxiv.org/pdf/1511.04599.pdf)是对抗样本方法之一,它主要用以生成针对模型的minimal perturbation,且因为生成的是(近似)最小的干扰,所以可以用来估量模型的鲁棒性。
论文中,其原理首先从二分类推导,再进一步推广到多分类中。
二分类 多分类
即在二分类问题中,超平面是实现分类的基础 ,那么要改变某个样本X0的分类,那么最小的扰动就是将X0挪到超平面上,这个距离的代价最小。多分类的问题也是类似。
(二)实验测试
https://github.com/LTS4/DeepFool/blob/master/Python/test_deepfool.py从这个Pytorch代码进行测试,其代码写得非常简洁,其核心算法如下:
while k_i == label and loop_i < max_iter:
pert = np.inf
fs[0, I[0]].backward(retain_graph=True)
grad_orig = x.grad.data.cpu().numpy().copy()
for k in range(1, num_classes):
zero_gradients(x)
fs[0, I[k]].backward(retain_graph=True)
cur_grad = x.grad.data.cpu().numpy().copy()
# set new w_k and new f_k
w_k = cur_grad - grad_orig
f_k = (fs[0, I[k]] - fs[0, I[0]]).data.cpu().numpy()
pert_k = abs(f_k)/np.linalg.norm(w_k.flatten())
# determine which w_k to use
if pert_k < pert:
pert = pert_k
w = w_k
# compute r_i and r_tot
# Added 1e-4 for numerical stability
r_i = (pert+1e-4) * w / np.linalg.norm(w)
r_tot = np.float32(r_tot + r_i)
pert_image = image + (1+overshoot)*torch.from_numpy(r_tot)
x = Variable(pert_image, requires_grad=True)
fs = net.forward(x)
k_i = np.argmax(fs.data.cpu().numpy().flatten())
loop_i += 1
代码测试:
(1) 输入熊猫的照片,得到的结果indri(大狐猴)
(2)大灰狼,扰动之后为:red wolf (红狼)
(3)野兔,扰动之后为:Angora(安哥拉兔)
从上面可见,这种深度学习模型的应用设计 需要考虑到这种攻击的情况 。