{"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-hant","path":"/content/papers/zh-hant/classic-cnns/zfnet.5180edea6fef.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-hant","path":"/content/papers/zh-hant/classic-cnns/alexnet.15c7dd9cec3c.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-hant","path":"/content/papers/zh-hant/classic-cnns/vgg.6a54029f20fb.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-hant","path":"/content/papers/zh-hant/classic-cnns/resnet.859f62e9e37d.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}}}
