我这个人有一个毛病,就是逮着一个问题不放。继上一篇文章分享了FGSM攻击的代码实践后,我遇到了一个让我自己也很困惑的问题:为什么加了那么一点点几乎看不见的噪声,CNN就彻底认错了? 我想了很久,总觉得不能只停留在“调包成功”的层面。
于是我用了一个上午去查资料、看论文、厚着脸皮请教了几位群里的技术大佬,下午把它整理成了这篇文章。这篇文章不写一行代码,纯聊原理。我试着用自己粗浅的理解来解释对抗样本为什么会必然成功。因为水平有限,文中肯定有讲得不对或者不够准确的地方,恳请各位路过的大佬斧正,非常感谢。
导语
上一篇文章里,我们亲手用FGSM算法让CNN把“7”认成了“1”,人眼却看不出任何变化。我当时的第一反应是震惊:为什么只加了那么一丁点噪声,这个在训练集上表现优异的模型就崩溃了?今天这篇文章,我想试着从数学和几何的角度,扒开CNN的“大脑”,看看到底发生了什么。
声明:这篇文章是个人学习笔记,不是为了教大家攻击,而是为了理解AI的脆弱性。所有内容只用于学术讨论。
一、重新审视CNN的决策:它不是“看懂”,是“算”出来的
在聊攻击为什么成功之前,我得先确认CNN到底是怎么工作的。人类看数字“7”是通过形状、笔画、语义来判断。但CNN的本质,其实是一个超复杂的数学函数:
y = f(x; θ)
输入一张图像x(一个高维向量,比如28×28=784个像素值),经过层层矩阵乘法和激活函数,输出一个概率分布y。训练过程其实就是找一组参数θ,让这个函数在见过的数据上犯错最少。
关键认识:CNN并没有“理解”图像内容。 它只是学会了一个从像素空间到类别标签的高维映射。这个映射在局部可能非常不光滑,甚至脆弱到一根针都站不住。
二、线性假设:对抗样本存在的第一个根源
2015年,Goodfellow等人提出了一个让我当时觉得很新奇的“线性假说”。他们说:虽然深度网络看起来很非