Adversarial Attack

核心概念:对抗攻击是指通过在输入数据中添加人眼几乎不可察觉的微小扰动,使得模型做出错误的预测。这种攻击揭示了深度学习模型的一个根本性弱点:它们往往学习到的是训练数据中的"捷径"模式,而非真正的语义理解。

Understanding (理解对抗攻击)

对抗攻击的核心思想是利用模型的梯度信息来构造对抗样本。这些微小扰动让模型"看见"了与原始图像不同但分类器会出错的东西。

🎯 对抗攻击原理动画演示
🐱
正确: 猫 98%
+++
🐱
错误: 狗 97%

微小噪声(人眼难察觉)→ 模型分类错误

Evasion Adversarial Attacks

闪避攻击(Evasion Attack)是最常见的对抗攻击类型,攻击者在测试/推理阶段对输入进行扰动来躲避检测。

⚡ 攻击过程动画演示
🚗
原始输入
--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

White-box Attacks (白盒攻击)

白盒攻击是指攻击者完全了解目标模型的结构和参数,可以直接利用梯度信息进行高效攻击。

Black-box Attacks (黑盒攻击)

黑盒攻击是指攻击者无法访问模型内部,只能通过查询输入观察输出来进行攻击。

# 黑盒攻击 - 替代模型方法
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

Model-based Adversarial Attacks

基于模型的攻击利用模型本身(而非直接修改输入)来生成对抗样本或发现模型弱点。

Model Inversion (模型反演攻击)

模型反演攻击旨在通过访问模型输出,反推训练数据的敏感特征或重建原始输入。

# 成员推断攻击 (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

Model Extraction (模型抽取)

模型抽取攻击是指通过查询目标模型来窃取其功能,构建一个功能相近的复制模型。

🛡️ 对抗防御方法动画演示
🔀
输入预处理 随机缩放/裁剪
🛡️
对抗训练 加入对抗样本
🎯
检测异常 识别攻击

📚 本章复习要点