Adversarial Attacks
对抗攻击通过构造细微且通常难以察觉的输入变化,让 AI 模型以很高的置信度出错。本文介绍 FGSM 的工作原理、攻击类型和防御方法。
对抗攻击是对机器学习(ML)模型输入进行的刻意操纵,目的是让模型产生错误输出,通常还会带有高置信度。在计算机视觉中,被操纵的输入称为对抗样本;它与原始输入之间的差异可能小到人无法察觉,但原本能识别熊猫的分类器却会将其判为长臂猿。研究人员在 2013 年的论文《神经网络的有趣特性》中描述了深度神经网络中的这一现象,同样的弱点也存在于语音识别、恶意软件检测和大型语言模型(LLM)中。如果模型的决策会触发行动,对抗攻击就尤其重要,例如汽车制动、门锁解锁或批准交易。
对抗样本的工作原理#
训练好的模型的损失函数会衡量模型在某个输入上的错误程度。反向传播通常会计算损失相对于权重的梯度;攻击者则会计算损失相对于输入像素的梯度,并沿着使损失增大的方向修改像素。在 2014 年的论文《解释并利用对抗样本》中,Ian Goodfellow 及其同事认为,问题源于神经网络在高维空间中的大体线性行为:每个像素只改变不到一个灰度级的几分之一,但这种变化累积到数十万个像素后,就会导致输出发生巨大变化。快速梯度符号法(FGSM)沿输入梯度的符号迈出一个固定大小的步长;步长为 0.007 时,模型原本 57.7% 的“熊猫”预测变成了 99.3% 的“长臂猿”预测。投影梯度下降(PGD)会重复进行较小步长的更新,同时将总变化限制在指定范围内,因此攻击效果更强。
使用 TorchVision 的 ResNet-18分类器执行 FGSM 攻击,只需一次反向传播:
import torch
import torch.nn.functional as F
from torchvision.io import decode_image
from torchvision.models import ResNet18_Weights, resnet18
from torchvision.transforms import v2
weights = ResNet18_Weights.DEFAULT
model = resnet18(weights=weights).eval()
torch.hub.download_url_to_file("https://ultralytics.com/images/bus.jpg", "bus.jpg")
# Keep pixels in [0, 1] and normalize inside each forward pass, so the attack edits real pixel values
image = v2.Compose([v2.Resize(256), v2.CenterCrop(224), v2.ToDtype(torch.float32, scale=True)])(decode_image("bus.jpg"))
normalize = v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
x = image.unsqueeze(0).requires_grad_(True)
logits = model(normalize(x))
# FGSM: move every pixel by one intensity level (1/255) in the direction that increases the loss
F.cross_entropy(logits, logits.argmax(1)).backward()
x_adv = (x + x.grad.sign() / 255).clamp(0, 1)
for name, batch in [("clean", x), ("adversarial", x_adv)]:
probs = model(normalize(batch)).softmax(1)
print(f"{name}: {weights.meta['categories'][probs.argmax()]} ({probs.max():.2f})")干净图像被分类为 minibus (0.83),受攻击图像则被分类为 police van (0.94):只需将每个像素最多改变 255 个强度级别中的 1 个,模型对新的错误标签的置信度就会超过它对原始标签的置信度。
攻击类型#
攻击可以根据攻击者何时行动、掌握多少模型信息以及攻击者的目标进行分类。非定向攻击试图让模型产生任意错误输出,定向攻击则强迫模型给出特定输出,例如让模型把停车标志识别为限速标志。数字攻击直接修改输入数据;物理攻击则通过贴纸、贴片或印刷图案改变真实物体,并确保这些改动在视角、距离和光照变化下仍然有效。美国国家标准与技术研究院的对抗性机器学习分类法根据攻击针对机器学习生命周期的哪个阶段对攻击进行分类:
迁移攻击之所以有效,是因为针对一个模型构造的对抗样本往往也能欺骗其他针对相同任务训练的模型,因此攻击者可以训练一个替代模型,以白盒模式攻击它,再将攻击结果用于无法检查的系统。
现实世界中的风险#
- 自动驾驶车辆:在《针对深度学习模型的鲁棒物理世界攻击》中,真实停车标志上的黑白贴纸导致实验室图像中的定向误分类率达到 100%,而从行驶中的汽车拍摄的视频帧中达到 84.8%。
- 人员检测:一块约 40 厘米见方、拿在身体前方的打印补丁,显著降低了针对其优化的 YOLOv2 人员检测器的准确率。这类补丁会威胁到由检测到的人触发的警报,例如 Ultralytics 安全警报系统:当 YOLO26 在一帧中检测到设定数量的目标时,该系统会发送电子邮件警报;能抑制人员检测的补丁也会抑制警报。
- 人脸识别:研究人员在眼镜框上打印了对抗图案,让佩戴者能够躲过人脸识别系统,或被识别为某个特定的其他人。
- 语言模型:自动优化的对抗后缀是附加到请求末尾的 token 字符串,它们使经过对齐的聊天机器人遵从有害请求;在开源模型上优化的后缀也能迁移到商业模型上。针对 LLM 的手写攻击更常称为越狱和提示注入。
对抗攻击与相关术语#
- 数据投毒:通过污染训练数据,让训练后的模型出现异常行为,且通常只有输入包含隐藏触发器时才会如此。狭义上的对抗样本不会改变模型,而是在推理时操纵输入。
- 成员推断攻击:旨在提取信息,即判断某条记录是否属于训练集,而不是让模型产生错误输出。
- 生成对抗网络(GANs):其中的“对抗”指两个网络相互对抗地训练,这是一种没有攻击者参与的训练方法。
- AI 红队测试:在系统发布前攻击自己的系统的实践,其中会用到对抗攻击等技术。
防御措施#
在《迈向能够抵御对抗攻击的深度学习模型》中,研究人员用 PGD 将对抗训练形式化:在训练过程中生成攻击,并让模型学会正确分类这些样本;这种方法仍是最可靠的经验性防御,但计算开销是常规训练的数倍,而且会降低模型在干净输入上的准确率。随机平滑等可认证防御能够证明,在设定半径内的扰动无法改变预测结果,不过这种保证仅适用于较小半径。对输入进行预处理或隐藏梯度的防御记录不佳:《梯度混淆会带来虚假的安全感》考察了 ICLR 2018 上发表的九种防御,发现其中七种依赖梯度混淆,并完全绕过了其中六种,部分绕过了第七种。










