需要源码请点赞关注收藏后评论区留言私信~~~
黑盒攻击
人们发现结构类似的神经网络模型在面对相同的对抗样本攻击时,会有类似的表现。也就是说,基于类似已知模型,采用白盒攻击来产生对抗样本,可能对未知模型也有攻击作用,称之为对抗样本的迁移能力(transferable)。
下表中左侧列表表示生成对抗样本的模型,最上面行表示被迁移攻击的模型,表格中的数据表示被迁移攻击模型对生成模型基于优化的方法产生的迁移攻击样本的识别率
从左上角到右下角对角线的数据为0,表明针对本模型的白盒攻击能够在本模型上做到全部攻击成功,当生成模型和迁移攻击模型不同时,对抗样本被识别率大约为百分之十到百分之四十
基于集成的对抗样本生成方法
基本思想是用多个白盒模型共同产生具有高迁移性的对抗样本。 假设有k个白盒模型,它们的输出层采用softmax激活函数,输出向量记为J_1,J_2,…,J_k。原始图像记为x,它的真实标签记为y。记对抗样本为x^∗,定向攻击的标签为y^∗。 基于集成的方法的优化目标为:
优化目标是尽量减少模型输出与定向攻击标签之间和对抗样本与原始样本之间的差异,常量λ用来调节两个差异的重要性。
通用对抗扰动
通用对抗扰动是可以用来以较大概率成功攻击某模型的所有样本的扰动。 记分类模型为k,对d维实数空间中服从分布u的样本x,分类模型的预测标签为k ̂(x)。
d维实数空间中的通用对抗扰动v是满足以下两个条件的扰动:
1)‖v‖_p≤ϵ。 ‖v‖_p是v的p范数(范数的定义见式4‑17),此条件即要求扰动v的大小要限制在常量ϵ以内。
2)P_x~u(k ̂(x+v)≠k ̂(x))≥1−δ。此条件要求添加扰动后的样本的误判率要大于指定的值1−δ。
生成通用对抗扰动的算法先从所有样本中抽样出一批分类均衡的有代表性的测试样本。将通用对抗扰动v设为0初值。然后,从第一个测试样本开始迭代直至最后一个测试样本:如果当前测试样本x_i添加扰动v后不能使模型判断错误,则计算x_i+v到最近分类超平面的向量∆v_i,并更新v←v+∆v_i。∆v_i常通过DeepFool算法得到。
对于上述条件1),在每次更新v后,都要检测p范数是否超出限制ϵ。如果超出了,则按范数的含义进行收缩。比如,对于2范数,则按把2范数收缩到1的比例缩小v的每一维。
对于上述条件2),在每一轮全部测试样本迭代完后,将扰动v添加到所有测试样本上进行预测,并计算成功率,如果达不到1−δ,则继续新一轮迭代。
UPA通用对抗样本下结果如下图
可见成功率还是不低的
部分代码如下
# 时间原因,只取小部分样本进行实验 X_val1 = X_val[:100] delta = 0.2 # 1-delta为对抗成功率 max_iter = 10 # 最多训练轮数 xi = 10 # 扰动的幅度 fooling_rate = 0.0 n_samples = np.shape(X_val1)[0] v = 0 # 通用对抗扰动 itr = 0 # 迭代次数 while itr < max_iter: np.random.shuffle(X_val1) # 打乱顺序 # 遍历所有测试样本,计算通用对抗扰动v for k in range(n_samples): print('序号:', k, '开始调整扰动...') cur_img = X_val1[k].reshape(1, 28, 28, 1) cur_label = model(cur_img) v_label = model(cur_img + v) if np.argmax(cur_label) == np.argmax(v_label): # 如果当前扰动不起作用。。。 succ, adv, r_tot, epochs, label1 = deepfool(cur_img+v, v_label, model, 600) # 找到到最近分类超平面的向量r_tot #print('itr:', itr, 'k:', k, 'succ', succ, 'epochs:', epochs) if succ: v = v + r_tot v = proj_l2(v, xi) # 限制v的大小 # 验证通用对抗扰动v的效果 X_perturbed = X_val1 + v # 所有样本加上扰动 est_labels_pert = np.argmax( model(X_perturbed), axis=1 ) # 扰动后的标签 est_labels_orig = np.argmax( model(X_val1), axis=1 ) # 扰动前的标签 fooling_rate = float(np.sum(est_labels_pert != est_labels_orig) / float(n_samples)) # 计算成功率 if fooling_rate < 1 - delta: print('轮次:', itr, '成功率 = ', fooling_rate) else: print('完成。成功率 = ', fooling_rate) break; itr += 1
创作不易 觉得有帮助请点赞关注收藏~~~