
FGSM通过单步梯度扰动生成对抗样本,在MNIST测试中,ε=0.05时模型准确率从约99%降至约60%,ε=0.2时降至约20%;0/1类因特征简单攻击成功率更高,验证了扰动强度与样本分布对攻击效果的影响,且FGSM作为单步攻击,效果有限,模型鲁棒性较弱。
FGSM(Fast Gradient Sign Method)是一种基于梯度的快速对抗攻击方法,核心是通过计算输入样本的梯度符号并沿该方向添加L∞范数约束的扰动,以最大化模型损失并使样本被误分类。具体步骤为:
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| FGSM | 计算输入梯度的符号,沿梯度方向添加单步扰动 | 计算简单,扰动小,效果有限(单步攻击) | 初步测试模型鲁棒性,快速验证攻击有效性(适用于简单模型或初步评估) | 仅用梯度符号,对复杂模型或高阶模型鲁棒性不足,效果有限 |
| PGD | 多次迭代FGSM(随机梯度下降优化扰动) | 多次迭代,效果更好,计算成本高 | 深度模型,需要多次迭代优化 | 需多次计算梯度,但效果优于FGSM,适用于更复杂的攻击 |
| 白盒攻击 | 模型参数已知,可直接访问梯度、权重 | 可直接计算梯度,攻击效果强 | 研究场景,模型参数可访问 | 实际应用中模型参数通常未知,需模拟 |
| 黑盒攻击 | 仅知道输入输出,模型参数未知 | 需通过输入输出梯度近似或模拟模型行为 | 实际应用,模型参数未知 | 计算复杂度高,效果可能不如白盒 |
(伪代码,明确测试集类别分布与epsilon选择依据)
import torch
from torch import nn, optim
from torchvision import datasets, transforms
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = torch.load('mnist_cnn.pth').to(device)
model.eval()
def fgsm_attack(image, epsilon, data_grad):
sign_data_grad = data_grad.sign()
perturbed_image = image + epsilon * sign_data_grad
perturbed_image = torch.clamp(perturbed_image, 0, 1)
return perturbed_image
transform = transforms.Compose([transforms.ToTensor()])
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=True)
epsilons = [0.05, 0.1, 0.2] # epsilon基于图像像素范围(0-1),0.05表示最大像素变化0.05
category_results = {}
for epsilon in epsilons:
correct = 0
total = 0
for img, label in test_loader:
img, label = img.to(device), label.to(device)
outputs = model(img)
loss = nn.CrossEntropyLoss()(outputs, label)
model.zero_grad()
loss.backward()
data_grad = img.grad.data
perturbed_img = fgsm_attack(img, epsilon, data_grad)
outputs = model(perturbed_img)
_, pred = torch.max(outputs.data, 1)
if (pred == label).item():
correct += 1
total += 1
accuracy = (correct/total)*100
print(f'epsilon={epsilon}: 准确率={accuracy:.2f}%')
category_results[epsilon] = accuracy
# 类别分布测试(示例:0/1类 vs 8/9类)
# 0类和1类:特征更简单(如0是封闭圆,1是竖线),决策边界易被扰动,攻击成功率更高
# 8类和9类:特征更复杂(如8有弯曲部分,9有上翘部分),模型对扰动更鲁棒
(约90秒)
“面试官您好,针对FGSM对抗攻击的实现与测试,我的回答如下:FGSM是一种基于梯度的快速攻击方法,核心是通过计算输入样本的梯度符号,沿梯度方向添加L∞范数约束的扰动,目的是让模型将样本误分类。具体来说,对于输入图像(x)和标签(y),我们计算损失函数对(x)的梯度(\nabla_x L),取符号得到扰动方向,然后添加扰动(\epsilon = \epsilon \cdot \text{sign}(\nabla_x L)),其中(\epsilon)是扰动强度(L∞范数表示图像中所有像素的最大变化量)。在MNIST手写数字识别模型上测试,我们设置了(\epsilon)为0.05和0.2。实验结果显示,当(\epsilon=0.05)时,模型准确率从约99%降至约60%;(\epsilon=0.2)时,准确率降至约20%。进一步分析不同类别(如0/1和8/9),0/1类因特征更简单,攻击成功率更高(准确率下降更明显),而8/9类特征更复杂,鲁棒性稍强。这表明FGSM的扰动强度和样本类别分布显著影响攻击效果,模型对对抗样本的鲁棒性较弱,且FGSM作为单步攻击,效果有限,对复杂模型或高阶模型可能效果不足。”
问:epsilon的选择依据是什么?不同epsilon(如0.05 vs 0.2)对图像失真和攻击成功率有何影响?
回答要点:epsilon是L∞范数约束的最大扰动值,选择依据需平衡图像可感知性和攻击效果,0.05时图像变化小但攻击效果弱,0.2时图像失真明显但攻击成功率更高,需根据任务需求调整(如0.05用于初步测试,0.2用于验证强攻击效果)。
问:实验中测试样本的类别分布如何?不同类别(如0/1 vs 8/9)的攻击效果为何不同?
回答要点:测试集包含10000个样本,各数字类分布均衡(约1000个/类),0/1类特征更简单(如0是封闭圆,1是竖线),决策边界更易被扰动,而8/9类特征更复杂(如8有弯曲部分,9有上翘部分),模型对复杂特征的鲁棒性更强,导致攻击成功率差异。
问:如何评估模型鲁棒性?除了准确率,还有哪些指标?
回答要点:除准确率外,还可通过对抗样本误分类率(如对抗样本中误分类的比例)、决策边界变化(如对抗训练后边界更平滑)、模型对扰动的敏感性(如梯度大小分布)等指标,或通过对抗训练提升鲁棒性(如使用FGSM生成对抗样本训练模型)。
问:实际应用中,若模型参数未知(黑盒),如何实现FGSM?
回答要点:可采用黑盒攻击方法,如基于梯度的方法(通过输入输出梯度近似,模拟白盒攻击),或微扰动生成(如简化FGSM,仅单步扰动),但计算复杂度更高,效果可能不如白盒攻击。