{"notes":[{"id":"classic-cnns/zfnet","category":"classic-cnns","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ZFNet","subtitle":"黑盒里的风景","author":"Z. Yuan","paperDate":"2013-11-12","publishedOn":"2025-09-06","world":"external/zfnet","paperTitle":"Visualizing and Understanding Convolutional Networks","paperUrl":"https://arxiv.org/abs/1311.2901","bibliography":{"title":"Visualizing and Understanding Convolutional Networks","authors":["Matthew D Zeiler","Rob Fergus"],"url":"https://arxiv.org/abs/1311.2901","pdfUrl":"https://arxiv.org/pdf/1311.2901v3","codeUrl":null,"preprint":{"id":"1311.2901","submittedOn":"2013-11-12","url":"https://arxiv.org/abs/1311.2901"},"publication":null,"citation":"@misc{classiccnnszfnet2013,\n  title = {{Visualizing and Understanding Convolutional Networks}},\n  author = {Matthew D Zeiler and Rob Fergus},\n  year = {2013},\n  eprint = {1311.2901},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1311.2901}\n}\n","citationPath":"/content/papers/citations/classic-cnns/zfnet.6d4dd35e9f91.bib"},"thumbnail":{"src":"/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png","width":1200,"height":1329},"locale":"zh-hans","path":"/content/papers/zh-hans/classic-cnns/zfnet.d3507051f65f.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"反向走一遍卷积网络","text":"反向走一遍卷积网络","depth":3},{"id":"反池化要记住最大值在哪里","text":"反池化要记住最大值在哪里","depth":3},{"id":"被观察的模型","text":"被观察的模型","depth":3},{"id":"各层看到了什么","text":"各层看到了什么","depth":3},{"id":"根据看到的问题改架构","text":"根据看到的问题改架构","depth":3},{"id":"遮住一块看分类器怎么反应","text":"遮住一块，看分类器怎么反应","depth":3},{"id":"不同图像之间的对应","text":"不同图像之间的对应","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"imagenet-2012","text":"ImageNet 2012","depth":3},{"id":"拆掉哪几层影响最大","text":"拆掉哪几层影响最大？","depth":3},{"id":"换一个数据集","text":"换一个数据集","depth":3},{"id":"越高层越好用吗","text":"越高层越好用吗？","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/alexnet","relation":"referenced","topic":""},{"id":"classic-cnns/vgg","relation":"referenced","topic":""},{"id":"classic-cnns/resnet","relation":"referenced","topic":""}]},{"id":"classic-cnns/alexnet","category":"classic-cnns","legacyPath":"classic-cnns/1209-alexnet","legacySlug":"1209-alexnet","legacyPaths":[],"title":"AlexNet","subtitle":"卷积网络的崛起","author":"Z. Yuan","paperDate":"2012","publishedOn":"2024-06-30","paperTitle":"ImageNet Classification with Deep Convolutional Neural Networks","paperUrl":"https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html","bibliography":{"title":"ImageNet Classification with Deep Convolutional Neural Networks","authors":["Alex Krizhevsky","Ilya Sutskever","Geoffrey E. Hinton"],"url":"https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html","pdfUrl":"https://proceedings.neurips.cc/paper_files/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf","codeUrl":null,"preprint":null,"publication":{"venue":"NeurIPS (NIPS)","year":2012,"kind":"conference","url":"https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html"},"citation":"@inproceedings{classiccnnsalexnet2012,\n  title = {{ImageNet Classification with Deep Convolutional Neural Networks}},\n  author = {Alex Krizhevsky and Ilya Sutskever and Geoffrey E. Hinton},\n  year = {2012},\n  booktitle = {NeurIPS (NIPS)},\n  url = {https://proceedings.neurips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html}\n}\n","citationPath":"/content/papers/citations/classic-cnns/alexnet.b38d2879f7bc.bib"},"thumbnail":{"src":"/content/papers/assets/87a5a48ff82989d4d78cc4d47a083f292fd7e249c1880c00ac4b31d8a042650d.jpg","width":1630,"height":570},"locale":"zh-hans","path":"/content/papers/zh-hans/classic-cnns/alexnet.37944dde1b24.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"模型架构","text":"模型架构","depth":3},{"id":"relu-启动函数","text":"ReLU 启动函数","depth":3},{"id":"多-gpu-训练","text":"多 GPU 训练","depth":3},{"id":"local-response-normalization","text":"Local Response Normalization","depth":3},{"id":"重叠最大池化","text":"重叠最大池化","depth":3},{"id":"dropout","text":"Dropout","depth":3},{"id":"模型实作","text":"模型实作","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"卷积网络学到什么","text":"卷积网络学到什么？","depth":3},{"id":"ilsvrc-2010-结果","text":"ILSVRC-2010 结果","depth":3},{"id":"ilsvrc-2012-结果","text":"ILSVRC-2012 结果","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/vgg","relation":"next","topic":"如何训练更深的卷积网络"}]},{"id":"classic-cnns/vgg","category":"classic-cnns","legacyPath":"classic-cnns/1409-vgg","legacySlug":"1409-vgg","legacyPaths":[],"title":"VGG","subtitle":"很深，还要更深","author":"Z. Yuan","paperDate":"2014-09-04","publishedOn":"2024-07-11","paperTitle":"Very Deep Convolutional Networks for Large-Scale Image Recognition","paperUrl":"https://arxiv.org/abs/1409.1556","bibliography":{"title":"Very Deep Convolutional Networks for Large-Scale Image Recognition","authors":["Karen Simonyan","Andrew Zisserman"],"url":"https://arxiv.org/abs/1409.1556","pdfUrl":"https://arxiv.org/pdf/1409.1556","codeUrl":null,"preprint":{"id":"1409.1556","submittedOn":"2014-09-04","url":"https://arxiv.org/abs/1409.1556"},"publication":{"venue":"ICLR","year":2015,"kind":"conference","url":"https://arxiv.org/pdf/1409.1556"},"citation":"@misc{classiccnnsvgg2014,\n  title = {{Very Deep Convolutional Networks for Large-Scale Image Recognition}},\n  author = {Karen Simonyan and Andrew Zisserman},\n  year = {2014},\n  eprint = {1409.1556},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1409.1556}\n}\n","citationPath":"/content/papers/citations/classic-cnns/vgg.6d704fc68256.bib"},"thumbnail":{"src":"/content/papers/assets/f8c8263e4970f0d994107c8084552e778e2f8f3cee14e213551fb6b0942568c2.jpg","width":968,"height":980},"locale":"zh-hans","path":"/content/papers/zh-hans/classic-cnns/vgg.3dca24cd4690.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"网络架构","text":"网络架构","depth":3},{"id":"训练细节","text":"训练细节","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"lrn-没有贡献","text":"LRN 没有贡献","depth":3},{"id":"imagenet-上的表现","text":"ImageNet 上的表现","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/alexnet","relation":"background","topic":"如何训练更深的卷积网络"},{"id":"classic-cnns/resnet","relation":"next","topic":"如何训练更深的卷积网络"},{"id":"reparameterization/vanillanet","relation":"next","topic":"简化卷积网络的设计"}]},{"id":"classic-cnns/resnet","category":"classic-cnns","legacyPath":"classic-cnns/1512-resnet","legacySlug":"1512-resnet","legacyPaths":[],"title":"ResNet","subtitle":"卷积网络 100 层","author":"Z. Yuan","paperDate":"2015-12-10","publishedOn":"2024-08-08","paperTitle":"Deep Residual Learning for Image Recognition","paperUrl":"https://arxiv.org/abs/1512.03385","bibliography":{"title":"Deep Residual Learning for Image Recognition","authors":["Kaiming He","Xiangyu Zhang","Shaoqing Ren","Jian Sun"],"url":"https://arxiv.org/abs/1512.03385","pdfUrl":"https://arxiv.org/pdf/1512.03385","codeUrl":null,"preprint":{"id":"1512.03385","submittedOn":"2015-12-10","url":"https://arxiv.org/abs/1512.03385"},"publication":{"venue":"CVPR","year":2016,"kind":"conference","url":"https://doi.org/10.1109/cvpr.2016.90"},"citation":"@misc{classiccnnsresnet2015,\n  title = {{Deep Residual Learning for Image Recognition}},\n  author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun},\n  year = {2015},\n  eprint = {1512.03385},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1512.03385}\n}\n","citationPath":"/content/papers/citations/classic-cnns/resnet.cf4014e8baae.bib"},"thumbnail":{"src":"/content/papers/assets/b8fe87fe757249ea6d7bb667fef3196754b9f80e28bf842a69b540ca94585d08.jpg","width":1224,"height":408},"locale":"zh-hans","path":"/content/papers/zh-hans/classic-cnns/resnet.98d0474f71e6.md","headings":[{"id":"定义问题","text":"定义问题","depth":2},{"id":"解决问题","text":"解决问题","depth":2},{"id":"什么是残差","text":"什么是残差？","depth":3},{"id":"残差学习","text":"残差学习","depth":3},{"id":"残差模块","text":"残差模块","depth":3},{"id":"网络架构","text":"网络架构","depth":3},{"id":"参数配置","text":"参数配置","depth":3},{"id":"讨论","text":"讨论","depth":2},{"id":"resnet-18-vs-resnet-34","text":"ResNet-18 vs ResNet-34","depth":3},{"id":"更深的瓶颈架构","text":"更深的瓶颈架构","depth":3},{"id":"在-imagenet-上的表现","text":"在 ImageNet 上的表现","depth":3},{"id":"结论","text":"结论","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"classic-cnns/vgg","relation":"background","topic":"如何训练更深的卷积网络"},{"id":"classic-cnns/densenet","relation":"next","topic":"如何训练更深的卷积网络"}]}],"text":"2012 年的 ImageNet 竞赛，AlexNet 把 top-5 错误率压到 16.4%，第二名是 26.2%。\n\n差了将近十个百分点，卷积网络一夜之间从冷门技术变成了每个实验室都想试一试的东西。\n\n接着大家发现了一件尴尬的事：模型很准，却没有人说得清它为什么准。想改进它，只能换个层数、调一下滤波器大小，训练一两个星期，再看分数有没有变好。\n\n纽约大学的 Matthew Zeiler 与 Rob Fergus 在 2013 年 11 月发布了这篇论文，在引言里直接把这种状态称为 trial-and-error。他们想先看懂模型，再根据看到的问题去改它。\n\n\n> [!TIP]\n> \n> 这篇常被叫做 ZFNet，取自两位作者姓氏的首字母。如果你还没读过 AlexNet，可以先看我们的笔记：\n> \n> - **[[12.09] AlexNet：卷积网络的崛起](/blog/papers/classic-cnns/alexnet)**\n\n\n## 定义问题\n\n看懂卷积网络的第一层不难。第一层的滤波器直接作用在像素上，把权重画成小图片，就能看出它在找什么：横线、斜线、某种颜色的斑点。\n\n从第二层开始就不行了。第二层的滤波器作用在第一层的输出上，权重画出来只是一堆看不出意义的数字；越往上，每个单元看到的东西越抽象，也越难回推到原图。\n\n当时已经有几种做法。Erhan 等人在图像空间做梯度上升，找出让某个单元激活最大的输入，但结果依赖初始化，也看不出这个单元能容忍哪些变化。Le 等人在最优输入附近用数值方法计算 Hessian 来估计不变性，可是高层的不变性很复杂，二次近似抓不住。Donahue 等人则直接找出让高层强烈激活的图像块，只是图像块里哪些结构才是关键，还是看不出来。\n\n作者想要的是另一种东西：给一张真实图像、一个中间层的激活，把它投影回像素空间，看清楚**是这张图的哪些结构**让它亮起来。\n\n## 解决问题\n\n### 反向走一遍卷积网络\n\n作者借用了自己 2011 年提出的 Deconvolutional Network（deconvnet）。原本的 deconvnet 是一种无监督学习模型；这里完全不训练它，只把它当作探针，接在一个已经训练好的卷积网络旁边。\n\n[![上半部分是两个并排的流程。右边是卷积网络的一层，自下而上：下层池化后的输入经过卷积滤波 F、ReLU、最大池化，最大值的位置记为 switches；左边是 deconvnet 层，自上而下：上层的重建经过反池化、ReLU、转置滤波 F 的转置，得到下层的重建。下半部分示意反池化：池化时记下每个色块中最大值的位置，反池化时把上层的值放回这些位置](/content/papers/assets/e846238b05c91faf3e65cc41d18380f105ef60fd65ec5ceaef64d428b9897b31.png)](/content/papers/assets/e846238b05c91faf3e65cc41d18380f105ef60fd65ec5ceaef64d428b9897b31.png)\n\n*原论文 Figure 1，取自 [**v3 PDF 第 3 页**](https://arxiv.org/pdf/1311.2901v3#page=3)。上半部分右边是卷积网络的一层，左边是接在它旁边的 deconvnet 层；下半部分是反池化的示意。*\n\n先看上半部分的右边：卷积网络的一层自下而上，依次是滤波（$F$）、ReLU、最大池化。左边的 deconvnet 自上而下，把这三步倒过来：反池化、ReLU、用转置的滤波器（$F^T$）滤波。\n\n用法是这样的：\n\n1. 送一张图进卷积网络，算出每一层的特征图。\n2. 选定某一层的某个激活，把同一层其他激活全部置零。\n3. 把这张只剩一个激活的特征图交给 deconvnet，一层一层往下重建，直到像素空间。\n\n三个反向步骤中，最需要解释的是反池化。\n\n### 反池化要记住最大值在哪里\n\n最大池化会丢信息：$2\\times2$ 的区域只留下最大值，其他三个数就没了。这个操作没有反函数。\n\n作者的办法是在往上算的时候，顺手记下每个区域的最大值落在哪一格，称为 switches。我们拿一个 $4\\times4$ 的特征图试一次：\n\n```python\nimport numpy as np\n\nx = np.array([[1, 3, 2, 0],\n              [4, 2, 1, 5],\n              [0, 1, 7, 2],\n              [2, 6, 3, 1]])\n\npooled = np.zeros((2, 2), dtype=int)\nswitches = {}\nfor i in range(2):\n    for j in range(2):\n        block = x[2*i:2*i+2, 2*j:2*j+2]\n        r, c = np.unravel_index(block.argmax(), block.shape)\n        pooled[i, j] = block[r, c]\n        switches[(i, j)] = (2*i + r, 2*j + c)\n\nprint(pooled)\nprint(switches)\n```\n\n```text\n[[4 5]\n [6 7]]\n{(0, 0): (1, 0), (0, 1): (1, 3), (1, 0): (3, 1), (1, 1): (2, 2)}\n```\n\n池化后剩下 $2\\times2$。`switches` 记录了每个输出来自原来的哪一格，例如右下角的 7 来自 `(2, 2)`。\n\n假设我们要追踪的是右下角这个激活。把其他三个置零，再按 switches 放回原位：\n\n```python\nreconstruction = np.array([[0, 0],\n                           [0, 9]])   # 上一层只保留要追踪的那个激活\nunpooled = np.zeros((4, 4), dtype=int)\nfor (i, j), (r, c) in switches.items():\n    unpooled[r, c] = reconstruction[i, j]\nprint(unpooled)\n```\n\n```text\n[[0 0 0 0]\n [0 0 0 0]\n [0 0 9 0]\n [0 0 0 0]]\n```\n\n上一层重建出来的 9，落在当初 7 所在的位置；其他位置都是零。\n\n这就是反池化：用往上走时记下的位置，把上层的重建放回正确的地方。switches 属于这一张输入图像，所以一路重建下去，结果会像原图中的一小块，保留了让这个激活亮起来的结构。\n\n另外两步比较直接：\n\n- **ReLU**：卷积网络的特征图经过 ReLU 一定是非负的，所以每一层的重建也再过一次 ReLU，保持非负。\n- **滤波**：用同一组滤波器的转置，实现上就是把每个滤波器上下、左右翻转。它作用在经过 ReLU 的重建上，而不是作用在下一层原本的输出上。\n\n\n> [!NOTE]\n> \n> 这里的 deconvnet 并没有在求解数学意义上的反卷积问题，只是把同一组滤波器转置后再用一次。现在深度学习框架里的 `ConvTranspose2d` 也常被叫成 deconvolution，做的同样是转置卷积。\n\n\n作者也特别提醒，这些投影不是模型生成的样本，整个过程中没有生成模型；它们只回答一件事：这张输入的哪些部分，对选定的激活有贡献。\n\n### 被观察的模型\n\n作者观察的模型和 AlexNet 很像，共八层：五层卷积、两层全连接，最后接 softmax。AlexNet 为了拆到两张 GPU 上，有几层卷积只连接同一张 GPU 上的特征图；这里改成全部相连，用一张 GTX 580 训练 70 个 epoch，大约 12 天。\n\n训练时，可视化就先派上了用场：第一层有少数几个滤波器的数值特别大，主导了整层（见后面 Figure 6 的 (a)）。作者的对策是限制滤波器的大小：只要某个卷积滤波器的 RMS 超过 $10^{-1}$，就把它缩回到这个半径。作者说这在第一层尤其重要，因为输入像素大约落在 $[-128, 128]$。\n\n### 各层看到了什么\n\n[![第 1 层是几组滤波器图样；第 2 到 5 层各有许多 3×3 的小方格，每格左边是灰底的 deconvnet 投影，右边是对应的彩色原图图块。第 2 层多是边缘与色块，第 3 层出现网格、文字等纹理，第 4 层有狗脸、鸟腿，第 5 层是键盘、狗等完整物体](/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png)](/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png)\n\n*原论文 Figure 2，取自 [**v3 PDF 第 4 页**](https://arxiv.org/pdf/1311.2901v3#page=4)。第 2 到 5 层的每个特征图，取验证集中激活最强的 9 个；灰底小图是 deconvnet 投影，旁边的彩色小图是对应的原始图像块。*\n\n这张图要成对看：灰底的投影只画出让激活亮起来的结构，旁边的图像块则是原图。\n\n作者是这样描述各层的：\n\n- **第 2 层**：角点，以及边缘与颜色的组合。\n- **第 3 层**：更复杂的不变性，会捕捉相似的纹理，例如网格、文字。\n- **第 4 层**：开始和类别相关，例如狗脸、鸟腿。\n- **第 5 层**：完整的物体，而且能容忍很大的姿态变化，例如键盘、狗。\n\n成对看的好处，在第 5 层第 1 行第 2 列最明显：那 9 个图像块看起来毫无共同点，投影却显示这个特征图其实在看背景的草，而不是前景的物体。只看图像块，会以为这个单元在乱看。\n\n作者也追踪了训练过程中特征怎么变化：低层几个 epoch 就收敛了，高层要到第 40、50 个 epoch 才成形。他们的结论是模型要训练到完全收敛。\n\n另一组实验测量了平移、缩放、旋转对特征的影响。很小的变换就让第 1 层的特征向量大幅改变，到了第 7 层影响就小得多，而且对平移和缩放近似线性；最后的输出对平移和缩放是稳定的，对旋转则不稳定，除非物体本身旋转对称。\n\n### 根据看到的问题改架构\n\n可视化最实用的地方就在这里。作者把 AlexNet 的第 1、2 层拿出来看：\n\n[![五组滤波器可视化。(a) 是没有限制滤波器大小时的第 1 层，有一个特别亮的方块；(b) 是 AlexNet 的第 1 层，(c) 是修改后的第 1 层；(d) 是 AlexNet 第 2 层的投影，(e) 是修改后第 2 层的投影](/content/papers/assets/416e3ce07fbed24c5bda83322fd60820ab4098de4d461a714d914793f63f41a4.png)](/content/papers/assets/416e3ce07fbed24c5bda83322fd60820ab4098de4d461a714d914793f63f41a4.png)\n\n*原论文 Figure 6，取自 [**v3 PDF 第 7 页**](https://arxiv.org/pdf/1311.2901v3#page=7)。(a) 没有限制滤波器大小时的第 1 层；(b) AlexNet 的第 1 层；(c) 修改后的第 1 层；(d) AlexNet 的第 2 层；(e) 修改后的第 2 层。*\n\n先比较 (b) 与 (c)。AlexNet 的第一层滤波器混杂着极高频与极低频的图样，中频很少，还有一些几乎不起作用的「死」滤波器。再比较 (d) 与 (e)：AlexNet 第 2 层的投影出现了混叠（aliasing）的痕迹。\n\n作者把问题归到第一层：AlexNet 用 $11\\times11$ 的滤波器、步幅 4；他们改成 $7\\times7$、步幅 2。\n\n步幅怎么会造成混叠？步幅就是采样的间隔。我们用一条一维的条纹试试：一个每 5 个像素重复一次的图样，分别每 2 个、每 4 个像素采样一次：\n\n```python\nimport numpy as np\n\nx = np.arange(40)\nstripe = np.round(np.cos(2 * np.pi * x / 5), 1)   # 每 5 个像素重复一次的条纹\n\nprint(\"步幅 2：\", stripe[::2][:10])\nprint(\"步幅 4：\", stripe[::4][:10])\n```\n\n```text\n步幅 2： [ 1.  -0.8  0.3  0.3 -0.8  1.  -0.8  0.3  0.3 -0.8]\n步幅 4： [ 1.   0.3 -0.8 -0.8  0.3  1.   0.3 -0.8 -0.8  0.3]\n```\n\n步幅 2 的结果大约每采一两个样就上下翻转一次，还留得住这种快速变化。步幅 4 的结果却变成了平缓的起伏，每 5 个样本转一圈，也就是每 20 个像素一圈的宽条纹。原图里没有这种条纹，它是采样太稀疏造成的假图样。\n\nAlexNet 的第一层滤波器本来就带着不少高频成分，滤出来的特征图再以步幅 4 采样，高频部分就可能折叠成假的低频图样，交给下一层。这个一维例子是本文自己的示意；论文本身是靠投影图指出这个现象的，改架构后的第 2 层 (e) 干净了许多，也看不到混叠的痕迹。\n\n更重要的是，分类成绩也跟着变好了，后面的讨论会看到具体数字。\n\n\n> [!TIP]\n> \n> 之后几年，第一层的设定再也没有回到 AlexNet 那种大滤波器加大步幅。VGG 从第一层起全面改用 $3\\times3$；ResNet 的第一层则是 $7\\times7$、步幅 2，正好和这里相同。\n> \n> - **[[14.09] VGG：很深，还要更深](/blog/papers/classic-cnns/vgg)**\n> - **[[15.12] ResNet：卷积网络 100 层](/blog/papers/classic-cnns/resnet)**\n\n\n### 遮住一块，看分类器怎么反应\n\n投影回答的是「这个特征在看什么」。作者还想回答另一个问题：分类器真的是在找物体，还是只靠背景来猜？\n\n他们拿一块灰色方块，在图像上逐格滑动、遮住不同的位置。每个位置都记录两件事：第 5 层最强那张特征图的总激活，以及分类器的输出。\n\n[![一排五张图。(a) 是一只叼着网球的博美犬，画面上有灰色遮挡方块；(b) 是遮挡位置对第 5 层最强特征图总激活的热力图，狗脸位置呈蓝色；(c) 是这张特征图的投影；(d) 是正确类别概率的热力图，狗脸位置的概率最低；(e) 是每个遮挡位置下最可能的类别，大部分是博美，狗脸附近有几格变成网球、北京犬或荷兰毛狮犬](/content/papers/assets/a17219e0ee699c0d36ceeb892c3a304fe106143afa91432c0caaaaf91fefbb8b.png)](/content/papers/assets/a17219e0ee699c0d36ceeb892c3a304fe106143afa91432c0caaaaf91fefbb8b.png)\n\n*原论文 Figure 7 第一行，取自 [**v3 PDF 第 7 页**](https://arxiv.org/pdf/1311.2901v3#page=7)。(a) 输入图像与灰色遮挡方块；(b) 遮挡位置对第 5 层最强特征图总激活的影响；(c) 这张特征图的投影；(d) 正确类别的概率；(e) 各遮挡位置下最可能的类别。*\n\n这是一只叼着网球的博美犬。(b) 与 (d) 的蓝色区域都落在狗脸上：遮住狗脸，第 5 层最强的特征就变弱，「博美」的概率也明显下降。(e) 更有意思：大部分位置的预测都是博美，但遮住狗脸、网球还露在外面时，模型改口说「网球」。\n\n同一张图的另外两行提醒我们，最强的特征和分类器的依据不一定在同一个地方。第二行是一辆赛车，第 5 层最强的特征落在车身的文字上，分类器最敏感的却是车轮；第三行的画面里有好几个物体，最强特征选中了人脸，分类器却对狗最敏感，作者的解释是分类器同时用到了许多张特征图。\n\n### 不同图像之间的对应\n\n最后一个分析比较少被提起。传统的识别方法常有明确的对应机制，例如知道人脸上眼睛和鼻子的相对位置。深度模型没有这种设计，作者想知道它内部是否隐式地建立了对应关系。\n\n他们取 5 张正面的狗，在每张图上遮住同一个部位（例如都遮住左眼），计算遮挡前后的特征差异，再比较这 5 张图之间，差异的正负号是否一致。指标是两两之间符号差异的 Hamming 距离，越低说明遮住同一部位引起的变化越一致：\n\n| 遮挡位置 | 第 5 层 | 第 7 层 |\n| --- | ---: | ---: |\n| 右眼 | 0.067 ± 0.007 | 0.069 ± 0.015 |\n| 左眼 | 0.069 ± 0.007 | 0.068 ± 0.013 |\n| 鼻子 | 0.079 ± 0.017 | 0.069 ± 0.011 |\n| 随机位置 | 0.107 ± 0.017 | 0.073 ± 0.014 |\n\n*表：数字取自原论文 Table 1。*\n\n在第 5 层，眼睛和鼻子的分数都比随机位置低，作者认为模型在这一层建立了某种程度的部位对应。第 7 层的分数彼此接近，作者推测高层忙着区分不同的狗品种。\n\n## 讨论\n\n### ImageNet 2012\n\n作者先用 AlexNet 的原始架构复现结果，验证集错误率和原论文的差距在 0.1% 以内。接着换上修改后的架构：\n\n| 模型 | 验证 top-1 | 验证 top-5 | 测试 top-5 |\n| --- | ---: | ---: | ---: |\n| AlexNet，1 个模型 | 40.7 | 18.2 | — |\n| AlexNet，5 个模型 | 38.1 | 16.4 | 16.4 |\n| 本文，1 个模型 | 38.4 | 16.5 | — |\n| 本文，5 个模型 | 36.7 | 15.3 | 15.3 |\n| 本文，6 个模型（含加宽中间层的版本） | 36.0 | 14.7 | 14.8 |\n\n*表：错误率（%）摘自原论文 Table 2，省略了同时使用 2011 与 2012 年训练数据的 AlexNet。*\n\n单个模型在验证集上的 top-5 错误率从 18.2% 降到 16.5%；合并 6 个模型，测试集的 top-5 错误率是 14.8%。作者在脚注中也提到，这个成绩已经被同年 ILSVRC 2013 的参赛队伍超越。\n\n### 拆掉哪几层影响最大？\n\n作者接着在 AlexNet 的架构上，把某些层整个拿掉，从头重新训练：\n\n| 修改 | 训练 top-1 | 验证 top-1 | 验证 top-5 |\n| --- | ---: | ---: | ---: |\n| 原架构（复现） | 35.1 | 40.5 | 18.1 |\n| 拿掉第 3、4 层 | 41.8 | 45.4 | 22.1 |\n| 拿掉第 7 层 | 27.4 | 40.0 | 18.4 |\n| 拿掉第 6、7 层 | 27.4 | 44.8 | 22.4 |\n| 拿掉第 3、4、6、7 层 | 71.1 | 71.3 | 50.1 |\n\n*表：错误率（%）摘自原论文 Table 3 上半部分。*\n\n全连接的第 6、7 层装着模型的大部分参数，拿掉它们，验证 top-1 错误率从 40.5% 升到 44.8%；拿掉中间的两层卷积，升到 45.4%。单独看这两组，代价都比预想的小。两组一起拿掉，网络只剩 4 层，错误率一下子升到 71.3%。作者因此认为，重要的是网络要有一定的深度，而不是某一段特别的层。\n\n在 ZFNet 自己的架构上做同样的实验：全连接层变大或变小，影响都不大；把第 3、4、5 层的特征图数加宽到 512、1024、512，验证 top-1 从 38.4% 降到 37.5%；如果同时把全连接层加到 8192 个单元，训练错误率降到 10.0%，验证错误率却回升到 38.3%，开始过拟合。\n\n### 换一个数据集\n\n作者也想知道，ImageNet 上学到的特征能不能迁移到别的数据集。他们固定第 1 到 7 层，只在新数据集上重新训练最后的 softmax。为了避免测试数据混进训练集，他们先找出 Caltech-101 与 ImageNet 重复的 44 张、Caltech-256 重复的 243 张，从 ImageNet 训练集中移除后，重新训练 ImageNet 模型。\n\n- **Caltech-101**（每类 30 张训练图像）：86.5%，当时最好的 Bo 等人是 81.4%。同样的网络在 Caltech-101 上从头训练，只有 46.5%。\n- **Caltech-256**（每类 60 张）：74.2%，对比 55.2%。每类只要 6 张训练图像，就超过了 Bo 等人用 60 张的结果。\n- **PASCAL VOC 2012**：平均 79.0%，比当时最好的方法低 3.2 个百分点，但在 5 个类别上胜过它。PASCAL 的图像多是包含好几个物体的完整场景，模型却只能输出一个类别，作者认为这是吃亏的原因之一。\n\n同一时期，Donahue 等人的研究也在探讨卷积特征的泛化能力。作者据此提出一个疑问：训练集少于一万张的基准，还能不能好好比较方法的优劣？\n\n### 越高层越好用吗？\n\n原论文 Table 7 把预训练模型截断到不同的层，在上面接线性 SVM 或 softmax：\n\n- **Caltech-101**：只用第 1 层是 44.8%，接着依次是 66.2%、72.3%、76.6%，第 5 层到 86.2%，第 7 层是 85.5%。\n- **Caltech-256**：从第 1 层的 24.6% 一路升到第 7 层的 71.7%。\n\n大致上越高层越好。Caltech-101 的第 5 层与第 7 层相差不大，Caltech-256 则一直到第 7 层都还在进步。\n\n## 结论\n\n这篇论文做了两件事：用 deconvnet 把中间层的激活投影回像素，再用这些图去诊断 AlexNet。第一层的混叠与死滤波器，都是先在图上看到的，修改后分类成绩也跟着变好；可视化在这里成了调整架构的工具。\n\n同年的 ILSVRC 2013 分类赛，Zeiler 与 Fergus 以「ZF」的名义参赛，top-5 错误率 13.5%，排名第三；冠军是 Zeiler 带领的 Clarifai，不用额外数据的成绩是 11.7%。\n\n可视化方法本身后来也被拿出来检验。2014 年，Springenberg 等人在 [Striving for Simplicity](https://arxiv.org/abs/1412.6806) 中把 deconvnet 与普通的反向传播结合成 guided backpropagation。2018 年，Adebayo 等人的 [Sanity Checks for Saliency Maps](https://arxiv.org/abs/1810.03292) 发现，把模型权重随机打乱之后，guided backpropagation 生成的图几乎没变，看起来很像单纯的边缘检测。投影图再清楚，也要另外确认它真的会随着模型改变。\n\n回头看这篇论文，架构修改的效果有分类成绩作证；至于每张投影图究竟忠实到什么程度，就留给后来的研究去回答了。\n","imageSizes":{"/content/papers/assets/e846238b05c91faf3e65cc41d18380f105ef60fd65ec5ceaef64d428b9897b31.png":{"width":696,"height":677},"/content/papers/assets/6c45d745e8a2f4b60cc45bea1029353e303d5e3bbee1e62f438c71874fddf883.png":{"width":1200,"height":1329},"/content/papers/assets/416e3ce07fbed24c5bda83322fd60820ab4098de4d461a714d914793f63f41a4.png":{"width":1280,"height":400},"/content/papers/assets/a17219e0ee699c0d36ceeb892c3a304fe106143afa91432c0caaaaf91fefbb8b.png":{"width":1397,"height":292}}}
