趋近智
仅凭对抗PGD或FGSM等一套标准攻击来评估防御机制可能具有误导性。设想你在门上安装了一把新的高安全锁。你可能会感到安全,因为它能抵御常见的撬锁技术。然而,一个坚定的入侵者可能会分析该锁的特定机制,并找出一种新的绕过方法,或许是利用其独特的设计特点。类似地,在对抗性机器学习中,防御措施通常对它们为之设计的攻击表现良好,但它们可能容易受到专门为针对其弱点而设计的攻击。这正是自适应攻击发挥作用的地方。
自适应攻击是一种专门设计用于规避特定防御机制的对抗性攻击策略。与一般性操作的标准攻击不同,自适应攻击者拥有关于防御机制的信息(通常是完全白盒细节),并相应地调整他们的攻击策略。进行自适应攻击评估对于真实理解模型的安全状态必不可少。若无此评估,报告的鲁棒性数据可能代表一种虚假的安全感。
许多防御技术是为了应对现有已知攻击而开发的。例如,一种防御措施可能成功缓解具有L∞约束的标准PGD攻击。然而,这种成功并不能确保抵御以下情况的鲁棒性:
梯度混淆(有时称为梯度遮蔽)是评估防御措施时的一个重要难题。它发生在防御机制有意或无意地阻碍许多强大攻击所需的梯度计算或有效性时。
考虑一个标准攻击,如PGD:
xadv(t+1)=ΠB(x,ϵ)(xadv(t)+α⋅sign(∇xadv(t)L(θ,xadv(t),y)))此更新严重依赖损失L相对于输入xadv(t)的梯度。如果防御措施导致ablaxL接近零、高度随机化或数值不稳定,PGD攻击将无法找到有效的扰动,即使模型不具备鲁棒性。
可能导致梯度混淆的技术包括:
检测梯度混淆非常重要。迹象包括:
正确评估防御措施需要设身处地地站在了解防御机制的知识型攻击者角度。该过程通常包括以下步骤:
彻底理解防御机制:
识别潜在的绕过策略: 基于对机制的理解,集思广益绕过防御的方法。
def compute_eot_gradient(model_with_defense, x, y, num_samples=10):
grads = []
for _ in range(num_samples):
# 在前向传播内部应用随机防御
logits = model_with_defense(x)
loss = compute_loss(logits, y)
# 计算此随机实例的梯度
grad = compute_gradient(loss, x)
grads.append(grad)
# 平均梯度
return np.mean(grads, axis=0)
# 在PGD/其他攻击中使用此平均梯度
eot_grad = compute_eot_gradient(model, x_adv, y_true)
x_adv = x_adv + alpha * np.sign(eot_grad)
# ... 投影步骤 ...
```
* **梯度混淆:** 使用不依赖精确梯度的攻击。实例包括:
* **边界攻击:** 一种仅需要最终分类标签的决策型攻击。
* **HopSkipJumpAttack:** 另一种有效的决策型攻击。
* **同步扰动随机近似(SPSA):** 仅使用两次函数评估来估计梯度,适用于嘈杂或不存在的梯度。
* **后向传播微分近似(BPDA):** 对于具有不可微分组件的防御,将有问题的后向传播操作替换为近似的、可微分的操作(例如,恒等函数)。
* **检测机制:** 如果防御措施尝试检测对抗性样本,自适应攻击可能会尝试制作低于检测阈值或模仿良性输入的扰动。
* **对抗训练:** 尽管对抗训练是一种强大的防御,自适应攻击可能涉及在攻击阶段使用比训练时更多的PGD步骤、不同的步长、随机重启或不同的损失函数(如C&W损失)。
3. 实施并测试自适应攻击: 修改现有的攻击实现(例如,来自ART、CleverHans或Foolbox等库),或开发新代码以整合绕过策略。对防御模型运行攻击,仔细调整攻击参数(迭代次数、步长、EOT样本数等)。
示意图显示了可能被防御措施阻止的标准攻击与旨在规避防御的自适应攻击之间的区别。自适应攻击者根据防御机制的了解来制作更有效的扰动。
总而言之,不考虑自适应攻击而评估防御措施,就像在平静的池塘中测试一艘船,并宣称它适合远洋航行一样。真正的韧性只能通过对抗专门设计来破坏系统的挑战来评估。将自适应攻击纳入你的评估流程,不仅仅是良好做法,对于构建真正安全的机器学习系统而言也是必要的。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造