ZFNet(2013)及可視化的開端
- 2019 年 10 月 3 日
- 筆記
[TOC]
部落格:blog.shinelee.me | 部落格園 | CSDN
寫在前面
ZFNet出自論文《 Visualizing and Understanding Convolutional Networks》,作者Matthew D. Zeiler和Rob Fergus——顯然ZFNet是以兩位作者名字的首字母命名的,截止20190911,論文引用量為4207。ZFNet通常被認為是ILSVRC 2013的冠軍方法,但實際上ZFNet排在第3名,前兩名分別是Clarifai和NUS,不過Clarifai和ZFNet都出自Matthew D. Zeiler之手,見ILSVRC2013 results。
ZFNet(2013)在AlexNet(2012)的基礎上,性能再次提升,如下圖所示,圖片來自cs231n_2019_lecture09。
論文最大的貢獻有2個:
- 提出了ZFNet,一種比AlexNet性能更好的網路架構
- 提出了一種特徵可視化的方法,並據此來分析和理解網路
本文將圍繞上述2點展開,先介紹網路架構,再介紹特徵可視化的方法。
網路架構與動機
ZFNet的網路架構如下
ZFNet的網路架構是在AlexNet基礎上修改而來,與AlexNet相比,差異不大:
- 第1個卷積層,kernel size從11減小為7,將stride從4減小為2(這將導致feature map增大1倍)
- 為了讓後續feature map的尺寸保持一致,第2個卷積層的stride從1變為2
僅這2項修改,就獲得了幾個點的性能提升。所以,重要的是**為什麼這樣修改?這樣修改的動機是什麼?**文中這樣敘述:
通過對AlexNet的特徵進行可視化,文章作者發現第2層出現了aliasing。在數字訊號處理中,aliasing是指在取樣頻率過低時出現的不同訊號混淆的現象,作者認為這是第1個卷積層stride過大引起的,為了解決這個問題,可以提高取樣頻率,所以將stride從4調整為2,與之相應的將kernel size也縮小(可以認為stride變小了,kernel沒有必要看那麼大範圍了),這樣修改前後,特徵的變化情況如下圖所示,第1層呈現了更多更具區分力的特徵,第二2層的特徵也更加清晰,沒有aliasing現象。更多關於aliasing的內容,可以參見Nyquist–Shannon sampling theorem和Aliasing。
這就引出了另外一個問題,如何將特徵可視化?正如論文標題Visualizing and Understanding Convolutional Networks所顯示的那樣,與提出一個性能更好的網路結構相比,這篇論文更大的貢獻在於提出一種將卷積神經網路深層特徵可視化的方法。
特徵可視化
在博文《卷積神經萬絡之卷積計算、作用與思想》 部落格園 | CSDN | blog.shinelee.me 中,我們講到卷積神經網路通過逐層卷積將原始像素空間逐層映射到特徵空間,深層feature map上每個位置的值都代表與某種模式的相似程度,但因為其位於特徵空間,不利於人眼直接觀察對應的模式,為了便於觀察理解,需要將其映射回像素空間,「從群眾中來,到群眾中去」,論文《 Visualizing and Understanding Convolutional Networks》就重點介紹了如何「到群眾中去」。
可視化操作,針對的是已經訓練好的網路,或者訓練過程中的網路快照,可視化操作不會改變網路的權重,只是用於分析和理解在給定輸入影像時網路觀察到了什麼樣的特徵,以及訓練過程中特徵發生了什麼變化。
下面這張圖截自論文同款talk:
給定1張輸入影像,先前向傳播,得到每一層的feature map,如果想可視化第$i$層學到的特徵,保留該層feature map的最大值,將其他位置和其他feature map置0,將其反向映射回原始輸入所在的像素空間。對於一般的卷積神經網路,前向傳播時不斷經歷 input image→conv → rectification → pooling →……,可視化時,則從某一層的feature map開始,依次反向經歷 unpooling → rectification → deconv → …… → input space,如下圖所示,上方對應更深層,下方對應更淺層,前向傳播過程在右半側從下至上,特徵可視化過程在左半側從上至下:
可視化時每一層的操作如下:
- Unpooling:在前向傳播時,記錄相應max pooling層每個最大值來自的位置,在unpooling時,根據來自上層的map直接填在相應位置上,如上圖所示,Max Locations 「Switches」是一個與pooling層輸入等大小的二值map,標記了每個局部極值的位置。
- Rectification:因為使用的ReLU激活函數,前向傳播時只將正值原封不動輸出,負值置0,「反激活」過程與激活過程沒什麼分別,直接將來自上層的map通過ReLU。
- Deconvolution:可能稱為transposed convolution更合適,卷積操作output map的尺寸一般小於等於input map的尺寸,transposed convolution可以將尺寸恢復到與輸入相同,相當於上取樣過程,該操作的做法是,與convolution共享同樣的卷積核,但需要將其左右上下翻轉(即中心對稱),然後作用在來自上層的feature map進行卷積,結果繼續向下傳遞。關於Deconvolution的更細緻介紹,可以參見博文《一文搞懂 deconvolution、transposed convolution、sub-pixel or fractional convolution》 部落格園 | CSDN | blog.shinelee.me。
不斷經歷上述過程,將特徵映射回輸入所在的像素空間,就可以呈現出人眼可以理解的特徵。給定不同的輸入影像,看看每一層關注到最顯著的特徵是什麼,如下圖所示:
其他
除了網路架構和可視化方法,論文中還有其他一些值得留意的點,限於篇幅就不展開了,這裡僅做記錄,詳細內容可以讀一讀論文:
- Occlusion Sensitivity 實驗:使用一個灰色的小塊,遮擋輸入影像的不同區域,觀察對正類輸出概率的影響,以此來分析哪個區域對分類結果的影響最大,即對當前輸入影像,網路最關注哪個區域。結果發現,feature map最強響應可視化後對應的區域影響最大。
- Feature Generalization:在ImageNet上預訓練,固定權重,然後遷移到其他庫上(Caltech-101、Caltech-256),重新訓練最後的softmax classifier,只需要很少的樣本就能快速收斂,且性能不錯。
- Feature Analysis:對訓練好的網路,基於每一層的特徵單獨訓練SVM或Softmax分類器,來評估不同層特徵的區分能力,發現越深層的特徵區分能力越強。
以上。
參考
- paper: Visualizing and Understanding Convolutional Networks
- talk: Visualizing and Understanding Deep Neural Networks by Matt Zeiler
- Aliasing
- A guide to convolution arithmetic for deep learning