核心概念:对抗攻击是指通过在输入数据中添加人眼几乎不可察觉的微小扰动,使得模型做出错误的预测。这种攻击揭示了深度学习模型的一个根本性弱点:它们往往学习到的是训练数据中的"捷径"模式,而非真正的语义理解。
对抗攻击的核心思想是利用模型的梯度信息来构造对抗样本。这些微小扰动让模型"看见"了与原始图像不同但分类器会出错的东西。
微小噪声(人眼难察觉)→ 模型分类错误
闪避攻击(Evasion Attack)是最常见的对抗攻击类型,攻击者在测试/推理阶段对输入进行扰动来躲避检测。
FGSM攻击: ε × sign(∇J) 生成对抗样本
PGD攻击: 多次迭代,小步更新
# FGSM (Fast Gradient Sign Method) 对抗样本生成
def fgsm_attack(image, epsilon, gradient):
# 获取扰动方向(梯度的符号)
sign_gradient = torch.sign(gradient)
# 在原始图像上添加扰动
perturbed_image = image + epsilon * sign_gradient
# 裁剪到有效范围
return torch.clamp(perturbed_image, 0, 1)
# PGD (Projected Gradient Descent) - 更强的攻击
def pgd_attack(model, image, epsilon, alpha, iters):
x = image.clone()
for i in range(iters):
x.requires_grad = True
outputs = model(x)
loss = F.cross_entropy(outputs, target)
model.zero_grad()
loss.backward()
x = x + alpha * x.grad.sign() # 小步更新
x = torch.clamp(x, image-epsilon, image+epsilon) # 投影回约束
x = torch.clamp(x, 0, 1)
return x
白盒攻击是指攻击者完全了解目标模型的结构和参数,可以直接利用梯度信息进行高效攻击。
黑盒攻击是指攻击者无法访问模型内部,只能通过查询输入观察输出来进行攻击。
# 黑盒攻击 - 替代模型方法
class BlackBoxAttack:
def __init__(self, target_model, surrogate_model):
self.target = target_model
self.surrogate = surrogate_model
def generate_adversarial(self, image, target_class):
# 1. 用查询收集训练替代模型的数据
queries = self.collect_queries(image, n=1000)
self.surrogate.train(queries)
# 2. 在替代模型上生成对抗样本
adv = self.fgsm_attack(self.surrogate, image, target_class)
# 3. 对抗样本转移攻击目标模型
return adv
def collect_queries(self, image, n):
# 生成各种扰动并查询目标模型
pass
基于模型的攻击利用模型本身(而非直接修改输入)来生成对抗样本或发现模型弱点。
模型反演攻击旨在通过访问模型输出,反推训练数据的敏感特征或重建原始输入。
# 成员推断攻击 (Membership Inference Attack)
class MembershipInference:
def __init__(self, target_model):
self.model = target_model
def infer_membership(self, data):
# 训练数据往往有更高的置信度(过拟合)
outputs = self.model(data)
probs = F.softmax(outputs, dim=-1)
# 高置信度 → 更可能是训练数据
max_probs = probs.max(dim=-1)[0]
return max_probs > threshold
def attack(self, shadow_models, target_data, non_target_data):
# 使用 shadow model 训练攻击分类器
# shadow model 需要与目标模型相似
pass
模型抽取攻击是指通过查询目标模型来窃取其功能,构建一个功能相近的复制模型。