2025强网拟态人工智能内生安全挑战赛 - 赛题一面向目标分类任务的对抗攻击 - 题解报告

本文最后更新于:2025年10月27日 下午

队伍名称: Polaris

1. 赛题分析与核心挑战

1.1 赛题目标

本次竞赛的目标是针对主办方提供的 ResNet-50 交通标志分类模型进行白盒对抗攻击。我们需要生成1000张对抗样本图片,核心目标是:

  1. 有效性 (Effectiveness):诱导模型产生错误的分类结果。
  2. 隐蔽性 (Stealth):添加的扰动“尽可能小”。

1.2 评分机制分析

评分机制是本题的关键。得分由两部分组成:

  1. 成功率门槛:只有攻击成功(Validity=1)的样本才会参与后续的隐蔽性得分累计。攻击失败的样本,得分为0。
  2. 隐蔽性得分:成功样本的得分由四个隐蔽性指标(最大扰动、均方扰动、稀疏性、结构相似性)加权累计。

1.3 核心挑战

通过分析,我们确定了本题的三个核心挑战,并按优先级排序:

  1. 攻击成功率 (ASR) 优先:由于攻击失败得0分,我们的首要任务是确保本地验证的攻击成功率(ASR)尽可能接近100%。
  2. 100MB 文件大小限制:这是一个非常严格的物理约束。PNG是无损压缩,添加的对抗性噪声(高熵)会使PNG文件体积剧增。这实质上是对我们添加总扰动量的一个硬性限制。
  3. 隐蔽性指标平衡:在满足前两个条件后,我们才需要考虑如何微调扰动,以在四个未知的加权指标上获得高分。

2. 核心攻击方法与策略

2.1 算法选择:PGD (投影梯度下降)

鉴于白盒条件(模型权重、结构已知),我们选择了迭代式的投影梯度下降 (Projected Gradient Descent, PGD) 攻击。

  • 原因:相比于 FGSM 等一步法,PGD 能够以更小的扰动、更稳定地找到通向决策边界的路径,更适合“最小扰动”这一目标。
  • 范数选择:我们选用 (无穷范数) 进行约束。这使我们能通过超参数 EPSILON 直接控制每个像素点的最大改动量,便于调优。
  • 优化方向:我们执行梯度上升。计算模型对真实标签 (True Label) 的交叉熵损失 (CrossEntropyLoss),然后将梯度加到输入图像上,从而最大化损失,使模型远离正确答案。

2.2 实施流程

我们的攻击脚本 (attack.py) 遵循以下流程:

  1. 加载模型与数据:加载主办方提供的 model.pth 权重和 resnet50 结构。
  2. 建立标签映射:读取 class_indices.json 和 paths_and_labels.txt,建立一个从类别名称(如 “Pedestrian”)到类别索引(如 0)的反向查找字典。
  3. 图像预处理:使用 transforms.ToTensor() 将 [0, 255] 的 PIL 图像转换为 [0, 1] 的 PyTorch 张量,攻击在此空间进行。
  4. PGD 迭代攻击:对1000张图片中的每一张执行 PGD 梯度上升循环。

核心 PGD 逻辑伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 攻击超参数
EPSILON = 8/255 # 示例值
ALPHA = 2/255
STEPS = 20

# 保存原始图像用于裁剪
original_img_data = img.data.clone()

# 启用梯度
img.requires_grad = True

for _ in range(STEPS):
# 1. 计算对真实标签的损失
loss = criterion(model(img), true_label)

# 2. 反向传播,获取梯度
model.zero_grad()
loss.backward()

# 3. 梯度上升 (添加梯度)
adv_data = img.data + ALPHA * img.grad.data.sign()

# 4. 投影 (Clipping) 扰动
eta = torch.clamp(adv_data - original_img_data, -EPSILON, EPSILON)

# 5. 应用扰动并裁剪图像范围
img.data = torch.clamp(original_img_data + eta, 0.0, 1.0)

img.grad.zero_()

2.3 关键技术点:文件大小控制

在实验中,我们发现生成的 advimages 文件夹体积巨大。这是因为对抗噪声破坏了 PNG 的压缩效率。

解决方案:在保存图像时,使用 PIL 的最大无损压缩等级。

1
2
3
4
5
# 从 [0, 1] Tensor 转回 PIL Image
adv_pil_img = transforms.ToPILImage()(img.data.squeeze(0).cpu())

# 使用 compress_level=9 (最高) 进行无损压缩
adv_pil_img.save(save_path, "PNG", compress_level=9)

此举大幅减小了文件夹体积,是满足 100MB 限制的必要前提。

3. 迭代调优与策略演进(核心)

我们的求解过程是一个不断调优和权衡的过程,主要分为三个阶段:

阶段一:以 ASR 为目标的初步攻击

  • 尝试:使用 EPSILON = 8/255 和 STEPS = 10。
  • 结果:本地 verify.py 脚本验证,ASR 仅为 18.40%。
  • 分析:ASR 太低,导致 81.6% 的样本得分为0,总分必然很低。必须优先提升 ASR。
  • 对策:
    1. 增加 STEPS 到 30,以在相同预算内找到更优解。
    2. STEPS 提升后 ASR 增长有限,证明 EPSILON = 8/255 的扰动预算本身太低。
    3. 逐步提升 EPSILON 到 12/255、16/255,同时保持 STEPS = 20 或 30。

阶段二:遭遇 100MB 文件大小“红线”

  • 问题:当我们将 EPSILON 提高到 12/255(ASR > 98%)并使用 compress_level=9 压缩后,advimages 文件夹总大小依然超过了 100MB(例如 105.8MB,即 105,861,827 字节)。
  • 分析:
    1. 我们尝试了有损压缩“攻击失败”的图片,但失败样本太少(ASR > 98%),节省的空间杯水车薪。
    2. 这证明 100MB 的限制,实质上是对总扰动信息熵的硬性约束。
  • 对策:唯一的办法是降低总扰动量。我们必须在“高ASR”和“文件大小”之间做出权衡。

阶段三:寻找“黄金平衡点”的精细调优

  • 策略:我们认识到,ASR 从 99% 降到 98%(损失1%的样本得分),远比文件超限导致提交失败(损失100%得分)要好。
  • 执行:
    1. 我们从一个导致超限的 EPSILON 值(例如 10/255)开始。
    2. 逐步微调降低 EPSILON,例如降至 9/255。
    3. 重新运行完整的 attack.py(必须包含 compress_level=9)。
    4. 检查 advimages 文件夹的精确字节数(例如 100,000,000 字节)。
    5. 如果仍超限,重复此过程(例如降至 8/255)。
  • 最终方案:我们找到了一个临界 EPSILON 值(例如 X/255),它既能保证 ASR 维持在 95% 以上,又能使 advimages 文件夹在使用 compress_level=9 压缩后的总字节数刚好低于 100,000,000 字节。

4. 总结

result

本次赛题的核心并非单一的 PGD 算法实现,而是一个涉及攻击有效性、隐蔽性指标和物理文件限制的多目标优化问题。

我们的解决方案通过 PGD 梯度上升来保证有效性,通过范数和精细的 EPSILON 调优来平衡隐蔽性,并通过 compress_level=9 压缩策略来满足严格的文件大小限制,最终在三者的权衡中找到了一个可提交的最优解。


2025强网拟态人工智能内生安全挑战赛 - 赛题一面向目标分类任务的对抗攻击 - 题解报告
https://www.0error.net/2025/10/50604.html
作者
Jason Chen
发布于
2025年10月27日
许可协议