【算法】Bandit Attack算法手稿

原文链接及源码链接

原文:https://arxiv.org/abs/1807.07978v3
源码:https://github.com/MadryLab/blackbox-bandits

论文中相关方法

image-20211007221737817

image-20211007221751067
image-20211007210259502
注意:算法2中,由于化简,我们可以仅对L进行两次查询就可估计△

image-20211007221758129

image-20211007221815955

算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while(total_queries > args.max_queries) :   
#对lt函数的梯度求估计量,方式是算法2,求得估计量△
exp_noise = args.exploration*ch.randn_like(prior)/(dim**0.5)
# Query deltas for finite difference estimator
q1 = upsampler(prior + exp_noise) #关键就是这个prior vt隐向量,这个prior也会更新,把梯度累加上去
q2 = upsampler(prior - exp_noise) # prior 相当于累积的更新量,用这个更新量,再去修改image,就会变得非常准
# Loss points for finite difference estimator
l1 = L(image + args.fd_eta*q1/norm(q1))
l2 = L(image + args.fd_eta*q2/norm(q2))
# Finite differences estimate of directional derivative
est_deriv = (l1 - l2)/(args.fd_eta*args.exploration)
# 2-query gradient estimate #估计的梯度
est_grad = est_deriv.view(-1, 1, 1, 1)*exp_noise
######以上7行代码##对应######算法3中的line 8
# Update the prior with the estimated gradient 通过△更新潜在向量vt,这是bandit的机制
prior = prior_step(prior, est_grad, args.online_lr)
######以上1代码##对应######算法3中的line 9
#使用估计的这个梯度prior 来进行PGD攻击
代码略
如果攻击成功结束本张图片的迭代。