跳转到内容

Szegedy 对抗样本 — 图片只改一点点,模型却会彻底看错

待复核

Szegedy 这篇论文第一次系统展示:深度神经网络可以被肉眼几乎看不出的微小扰动骗到任意误分类。日常类比:像你在门禁照片上只多贴一层透明胶,人看还是你,门禁却把你认成别人。

它有两个发现:第一,神经网络高层里的“单个神经元”并没有想象中那么像一个独立概念;随机方向也能挑出有语义相似性的图片。第二,也是后来影响最大的发现:只要沿着模型最脆弱的方向稍微推一下输入,模型就会把一张本来分类正确的图看成完全错误的类别。

这类被故意构造出来的输入,论文称为 adversarial examples,中文常叫“对抗样本”。它不是随机噪声,而是专门针对模型损失函数找出来的最坏小改动。

换句话说,这篇论文把一个很朴素的问题摆到台面上:

  • 人类判断图片时,主要看物体本身有没有变
  • 模型判断图片时,可能被高维像素空间里的某个方向牵着走
  • 安全评估要同时关心这两套判断标准之间的缝隙

不理解这篇论文,下面这些事会很难解释:

  • 为什么一个 ImageNet 模型看起来很准,却可能把一张几乎没变的图判成“鸵鸟”
  • 为什么机器学习安全不能只看平均准确率,还要看“有没有人故意找漏洞”
  • 为什么后来的 FGSM、PGD、DeepFool 都在研究“怎么更快找到骗模型的小扰动”
  • 为什么模型可解释性不能只盯单个神经元,很多语义可能藏在整个向量空间里
  1. 对抗样本是“最坏方向的小推力”。类比:桌子平放时很稳,但你如果正好推到最容易翻的角,力不大也能出事。论文用优化方法找一个很小的 r,让 x + r 仍像原图,却被模型判成目标标签。

  2. 脆弱性会跨模型迁移。类比:一把钥匙不只开一把相似的锁,而是能开一串同类锁。作者发现,用一个网络生成的对抗样本,换到不同层数、不同正则、甚至不同训练集训练出的网络上,也常常还能骗过。

  3. 语义不一定在单个神经元里。类比:合唱的意思不一定属于某一个人的声音,而在整个和声里。论文比较了单个高层单元和随机线性组合,发现两者都能挑出语义相近的图片,说明“一个神经元一个概念”的说法太简单。

案例 1:把“找漏洞”写成一个优化问题

Section titled “案例 1:把“找漏洞”写成一个优化问题”
target = "ostrich"
r = random_small_noise()
while model(x + r) != target:
r = update_to_increase_loss(x, r, target)
r = keep_pixels_between_0_and_1(r)

逐部分解释

  • x 是原始图片,r 是要加上去的小扰动
  • model(x + r) != target 表示还没有骗到指定类别
  • update_to_increase_loss 不是乱改像素,而是顺着模型更容易出错的方向改
  • keep_pixels_between_0_and_1 对应论文里的盒约束,保证图片像素仍在合法范围

案例 2:为什么随机噪声不是同一件事

Section titled “案例 2:为什么随机噪声不是同一件事”
clean = load_digit("7")
random_noise = clean + gaussian_noise(std=0.1)
adversarial = clean + optimized_noise(std=0.06)
print(model(random_noise), model(adversarial))

逐部分解释

  • gaussian_noise 像随手摇晃相机,方向随机,很多能量浪费在无关像素上
  • optimized_noise 像专门按模型痛点下手,幅度更小也更有效
  • 论文在 MNIST 上对比过:随机噪声很大时还常能认对,而对抗扰动很小时能把对应模型打到 0% 准确率

案例 3:迁移性为什么让它变成安全问题

Section titled “案例 3:迁移性为什么让它变成安全问题”
attack = make_adversarial(model_a, image)
print(model_a(attack))
print(model_b(attack))
print(model_c(attack))

逐部分解释

  • model_a 是攻击者手里的模型,用来生成对抗样本
  • model_b 可以是结构不同、超参数不同的模型
  • model_c 甚至可以是用另一半训练数据训练出来的模型
  • 如果三者都容易受影响,攻击者就不必完全知道线上模型细节,这就是“迁移攻击”的雏形
  1. 把对抗样本当随机噪声:随机噪声没有目标,而对抗扰动是沿损失函数专门优化出来的,所以小得多也更危险。

  2. 以为只要测试集准确率高就安全:测试集通常不是攻击者构造的最坏输入,所以平均表现好不等于局部没有洞。

  3. 以为单个神经元就等于一个概念:论文发现随机方向也能激活有语义关系的图片,说明概念常分布在整个表示空间里。

  4. 以为换模型就能躲开攻击:跨模型、跨训练集实验说明,对抗样本不是某一次训练的偶然毛刺,而可能来自数据和模型共同形成的脆弱方向。

适用

  • 解释对抗机器学习的起点:为什么“人看没变,模型看错了”会发生
  • 评估图像分类模型的安全性,尤其是有攻击者参与的场景
  • 理解后续 FGSM、PGD、DeepFool 等攻击方法在解决什么问题
  • 反思神经网络可解释性:不要把全部语义寄托在单个神经元上

不适用

  • 想要最快生成攻击样本时,这篇的 L-BFGS 方法太慢,后续 FGSM / PGD 更常用
  • 想证明所有模型都会被攻击时,这篇主要给出经验发现,不是完整定理
  • 想直接防御攻击时,这篇只有初步的对抗训练想法,不是成熟防御方案
  • 想研究文本或语音攻击时,这篇主要实验材料是图像任务
  • 2012 年:AlexNet 在 ImageNet 上大幅刷新成绩,大家开始相信深度网络真的能“看懂”图片。
  • 2013 年:Szegedy 等人反过来问:这些网络到底在看什么?单个神经元可靠吗?局部输入空间平滑吗?
  • 2014 年 ICLR:论文展示 L-BFGS 构造的对抗样本,开启“对抗样本”这一研究方向。
  • 2014 年底:Goodfellow、Shlens、Szegedy 提出 FGSM,用线性解释和一次梯度符号攻击把这条线推向主流。
  • 之后:攻击、迁移、防御、鲁棒训练、认证鲁棒性成为机器学习安全的一条长期主线。
  • 高准确率不是高可靠性:模型在普通测试集上表现好,仍可能在输入附近存在极窄但密集的错误口袋。
  • 安全要看最坏情况:对抗样本把评估从“随机样本平均怎样”推进到“有人故意找茬会怎样”。
  • 表示空间比单个神经元更重要:语义可能存在于方向、子空间和整体几何结构中。
  • 迁移性是关键威胁:如果一个模型的漏洞能迁移到另一个模型,黑盒攻击就变得现实。
  • dropout-2014 —— 同期常用正则化方法,但它解决过拟合,不直接解决最坏扰动
  • batchnorm-2015 —— 让深层网络更好训练,却不自动保证输入局部平滑
  • resnet —— 更深的图像模型后来也必须面对对抗鲁棒性问题
  • word2vec —— 论文借用“语义在向量空间方向中”的直觉来理解高层表示
  • trustrank-2004 —— 搜索排序里的对抗思想,和机器学习安全同样关注恶意输入
  • sleeper-agents —— 都提醒我们:模型表面表现好,不代表隐藏行为已经安全