读论文系列:Intriguing properties of neural networks
资料
- 论文原文
- dblp:https://dblp.uni-trier.de/rec/journals/corr/SzegedyZSBEGF13.html
- arxiv:https://arxiv.org/abs/1312.6199
- 大佬笔记,写的比较详细,中文翻译得当:https://zhuanlan.zhihu.com/p/217683614
- 社区中对论文中扰动部分的 pytorch 版复现:https://github.com/Harry24k/IPNN-pytorch
- 外国人网课讲论文:https://www.bilibili.com/video/BV1Ev411E7ZG/?p=14
- 小姐姐给自己讲论文:https://www.bilibili.com/video/BV1ZT4y1r7Rv
论文笔记
主要内容
- 网络的空间信息包含着语义信息
- 扰动可以导致错误分类
实验内容
- MNIST数据集,FC 网络
- ImageNet数据集,AlexNet 网络
- 数据来自 Youtube 的数据集,QuocNet网络,详见论文(arXiv:1112.6209, 2011)
语义信息部分的实验
本文主要以 MNIST 实验为案例(请配合 https://github.com/Harry24k/IPNN-pytorch)
- 网络结构:其实就是全连接+ReLU、全连接+ReLU、全连接。选取第二个ReLU 输出的是隐节点的特征图。本实验为了证明在网络为到达终点时就已经可以表示一定的信息。
class FC(nn.Module): def __init__(self): super(FC, self).__init__() self.layer_1 = nn.Sequential( nn.Linear(28*28, 100), nn.ReLU() ) self.layer_2 = nn.Sequential( nn.Linear(100, 100), nn.ReLU() ) self.layer_3 = nn.Sequential( nn.Linear(100, 10) ) def forward(self, x): x = x.view(-1, 28*28) out_1 = self.layer_1(x) out_2 = self.layer_2(out_1) out_3 = self.layer_3(out_2) return out_3, out_2, out_1 ```
- 自然基向量
model.eval() for i in range(5) : unit_vector = torch.eye(100)[i,:] for images, labels in test_loader: _, phi_x, _ = model(images.to(device)) values = torch.mv(phi_x.cpu(), unit_vector) top_idx = np.argsort(values.data.numpy())[-8:] # 选最大值 top_img = images[top_idx] imshow(torchvision.utils.make_grid(top_img, normalize=True), "Direction to :" + str(i+1) + "th vector")
- 随机基向量
model.eval() for i in range(5) : random_vector = torch.rand(100) for images, labels in test_loader: _, phi_x, _ = model(images.to(device)) values = torch.mv(phi_x.cpu(), random_vector) top_idx = np.argsort(values.data.numpy())[-8:] top_img = images[top_idx] imshow(torchvision.utils.make_grid(top_img, normalize=True), "Direction to :" + str(i+1) + "th vector")
- 解释:
- 把向量空间想象成一个线性空间,这个 ReLU 输出的空间可以投影到很多基向量上边。其中,自然基向量和随机基向量是两种不同类型的基向量。
- 自然基向量通常指的是在标准坐标系中,与坐标轴对齐的一组基向量。例如,在三维空间中,自然基向量通常表示为:
- e 1 = ( 1 , 0 , 0 ) \mathbf{e}_1 = (1, 0, 0) e1=(1,0,0)
- e 2 = ( 0 , 1 , 0 ) \mathbf{e}_2 = (0, 1, 0) e2=(0,1,0)
- e 3 = ( 0 , 0 , 1 ) \mathbf{e}_3 = (0, 0, 1) e3=(0,0,1)
- 随机基向量则不是固定的,它们是通过某种随机过程生成的向量。在数学和计算机科学中,随机基向量通常用于构建随机矩阵或者作为随机算法的一部分。随机基向量不必是正交的,也不必有单位长度,它们仅仅需要满足线性无关的条件,即没有任何一个向量可以被其他向量线性表示。生成随机基向量的一个简单方法是,从一个随机矩阵中提取一组线性无关的列(或行)。
- 在本案例中,
unit_vector = torch.eye(100)[i,:]
是生成了一个单位阵,单位阵的第 i i i 列代表了第 i i i 个自然基向量。第二个特征图大小是 100x100,一共有 100 个维度。 - 然后,
torch.mv(phi_x.cpu(), unit_vector)
是矩阵乘法,进行了将ReLU 输出的特征矩阵投影到基向量上的过程。 - 接着,
top_idx = np.argsort(values.data.numpy())[-8:]
的意思是,按照大小排序,选 8 个最大的值,方便画图。 - 🤔这一步没太懂,
top_img = images[top_idx]
,最大的 8 个值,为什么就变成了图片的索引。 - 总的来说,每一个维度输出的图片,看起来有一定的相似性,说明了隐节点机会已经有了一定的信息。
扰动导致错误分类实验
-
论文中,通过微小的扰动,叠加在要分类的图片上,再输入网络就可以导致网络发生严重的错误。这种扰动的设计通过优化完成,在保证网络发生错误的前提下,尽量减少扰动的幅度。
-
论文中使用L-BFGS优化方法,L-BFGS介绍:https://blog.csdn.net/xian0710830114/article/details/128419401,本处就略过了
-
https://github.com/Harry24k/IPNN-pytorch,使用了剃度下降替代L-BFGS,效果如下(7识别成了 0)