[論文速速讀]Visualizing and Understanding Convolutional Networks

Posted by John on 2020-07-21
Words 3.3k and Reading Time 12 Minutes
Viewed Times

〖想觀看更多中文論文導讀,至[論文速速讀]系列文章介紹可以看到目前已發布的所有文章!〗

paper: https://arxiv.org/pdf/1311.2901.pdf

ZFNet可說是CNN可視化的開山始祖,儘管AlexNet中作者也簡單地拿出第一層的feature map做出了可視化(看我看我),不過這種簡單的方法只能用在第一層,因為後面層隨著Conv和Pooling維度降低,此時就沒辦法輕易的看出來feature map是什麼東西了。

ZFNet這篇文章中透過反卷積,或者叫做DeConvnet(或者Transpose Convolution…網路上很多種叫法…)來做到可以對每一層的Conv layer進行可視化,並透過此技術來觀察並調整AlexNet的架構,然後就贏下了ILSVRC 2013年的冠軍,恭喜恭喜!

並且,除了這些還做了一堆實驗,真的是很用心ㄋㄟ,所以我才會看這麼久(ヾノ・ω・`)

Abstract

Large Convolutional Network models have recently demonstrated impressive classification performance on the ImageNet benchmark (Krizhevsky et al., 2012). However there is no clear understanding of why they perform so well, or how they might be improved. In this paper we address both issues.

CNN架構在圖像分類領域上取得了巨大的成功,但是,還沒有研究去說他們為何可以有如此好的表現,以及應該如何針對模型架構去改進。

這篇文章中主要解決了這兩個問題,第一是提出了一種新的可視化技術可以更加了解中間層的運作,透過這個技術他們去微調了AlexNet的模型並得到了更好的結果。此外他們也透過ablation study找出不同層對於model的貢獻。

Introduction

近年來CNN興起的三個因素:

  1. 越來越多的有label的圖片訓練資料集
  2. 越來越強的GPU
  3. 更好的正則化策略,例如dropout

但是對於CNN背後的原理其實還不是很明瞭,就像個黑盒子一樣。

這篇文章透過反卷積(DeConv)的技術提出了一種視覺化方法,使得可以去觀察每一層的Conv layer。

此外這篇文章還透過遮擋圖片的一部分來觀察模型輸出,藉此找出圖片中哪些區塊對於模型分類是比較重要的部分。

Approach

一開始對CNN model做了一下介紹,大部分的設置都與AlexNet相同

Visualization with a Deconvnet

We present a novel way to map these activities back to the input pixel space, showing what input pattern originally caused a given activation in the feature maps.

要去解釋CNN的一種方式就是看中間層的feature map哪些被激活了,作者透過Deconvnet來將特定的feature map映射回到輸入層,這樣就可以看到feature map和input layer之間的對應關係。

反卷積最早由(Zeiler et al., 2011)提出,一開始適用在unsupervisied learning上,不過這邊是將訓練完成的model使用Deconvnet已做出視覺化的效果,所以並沒有訓練的效果。

先上paper中重點架構圖,然後再來細講每一個部分:

這張圖分成上下兩個部分:

  • 上半部中,右半部分是Conv的過程: Conv -> ReLU -> MaxPool
  • 上半部中,左半部是DeConvnet的過程: MaxUnPool -> ReLU -> DeConv
  • 下半部中則是介紹了Unpooling的概念(文章後面會介紹)

To examine a given convnet activation, we set all other activations in the layer to zero and pass the feature maps as input to the attached deconvnet layer.

此外,為了檢查在某一層feature map中某一個點(activation)對於input的關聯,他們會先將這個點之外的值都設成0然後再傳到DeConvnet層裡面。

Unpooling

Maxpool的運算是不可逆的,但可以想辦法逼近他。

方法就是在每次Maxpool的時候將最大的位置都記錄下來,Unpool的時候把值放回到feature map對應的最大位置上。

  • paper中稱之switch,在流程圖中也可以看到,灰色的代表最大值的位置,其他沒有填的位置則都是黑色(0)

Rectification

在Conv時,為了確保feature map的值都是正的,會使用ReLU

在DeConvnet時也為了讓值都是正的,所以也使用ReLU

看似簡單,我在這一塊卡了很久…囧

我一直在想: 既然Conv完會經過ReLU和Pool,確保了feature map值都是正的,那從feature map拿回來的也都是正的,為何需要再加上ReLU呢?

後來想到的原因是,第一回DeConvnet的feature map的確沒這個問題(此時的Unpool是從Convnet的最後一次feature map取得,所以一定是正的,所以經過ReLU後也必然是正的),問題在經過了一回後就不保證值還都是正的了(因為經過了一次DeConv可能會產生負值),所以才要加上ReLU來限制

Filtering

To invert this, the deconvnet uses transposed versions of the same filters, but applied to the rectified maps, not the output of the layer beneath. In practice this means flipping each filter vertically and horizontally.

Conv是對上一層的feature map來做卷積,Deconvnet為了逆這個操作,則是對經過ReLU的output使用Conv矩陣的轉置(Transposed Convolution)來做卷積(也就是將原始的參數垂直和水平翻轉),並且這個部分並不干涉模型的訓練過程。

阿勒…? 為什麼這裡突然跑出了一個Conv矩陣的轉置呢?用卷積的轉置矩陣就可以做出逆矩陣的效果嗎???

我覺得如何理解深度学习中的deconvolution networks?講的蠻詳細的,下面根據內文的解釋和我的理解簡單整理一遍:

DeConv,或是逆卷積,在做的事情做出和Conv(卷積)在正向/反向傳播中相反的運算,主要的目標是使得shape是可以被上下層給對應起來的。

首先想一下正常的卷積在正向/反向傳播的時候的行為:
考慮一個$4\times4$的input經過一個$3\times3$的kernel做卷積後,在沒有pooling和stride=1的情況下,output shape=$2\times2$

  • input可以看成一個16維的向量$x$
  • output則是4維的向量$y$
  • 卷積運算用$C$表示

那其實一次的Conv就是下面這個式子:

$C$其實是一個$4\times16$的matrix:

那為了從$y$還原$x$,先不論還原矩陣的值,我們必須要有一個$16\times4$的矩陣。

以反卷積其實在做的事情只是想辦法還原shape,而這個還原矩陣的值有很多種方式,這篇文章中的DeConvnet由於不牽涉到訓練過程,採用的方式就是簡單的原始卷積矩陣的轉置$C^{T}$

其實關於逆矩陣或是反矩陣,英文的DeConv或是transpose convolution…blabla,不只被用在是CNN視覺化,還有很多應用。這邊要認真研究有有很多坑可以去講,在我花了兩天看了一堆資料後,下面是我認為的幾個重要概念:

  1. transpose convolution並不能從feature map還原原始的input data,他只是還原出原始的input shape。(就這點來說其實逆矩陣,或是DeConv是個不太適切的講法,因為他並沒有還原原始的input,這個名詞會讓人誤會。)
  2. 這個矩陣的參數不一定一定要是原本Conv matrix的轉置,是可以被學出來的
  3. 就pytorch的實作上,的weight似乎是隨機初始化的,詳見一文搞懂反卷积,转置卷积
  4. tensorflow的實作上則是真的有使用到了卷積的轉置,詳見Deep Learning: Transpose Convolution 到底是?

Training Details

跟AlexNet差不多,不過原本sprase connection(也就是使用到兩張GPU的部分)被替換掉了,ZFNet重頭到尾只用了一張GPU,節能愛地球,讚。

其他更改的地方像是第一層使用了更小的stride(4->2)和kernel size(11->7)。

細節就在仔細去看paper吧,接下來要來看本文重點了。

Convnet Visualization

Feature Visualization

從validation set隨機取了一些feature maps,然後針對9個最大的點(activations)來看這些點映射到input space下的結果,也就是input image哪些區塊激活了這些點。

圖片中左半邊是DeConv的視覺化,右半邊的是該點(activation)對應圖片的感受野區塊(receptive field)

  • 也就是從該點往回推,當推回input layer時被影響到的範圍
  • 比方說input layer -> (3x3 Conv) -> output layer,那在output layer的一個點實際上對應到了input layer的3x3區塊

從這張圖中我們觀察到:

  • show 9個activation的原因是,透過多張圖來觀察,可以發現Conv具備空間不變性: 即使圖片有差異,但學到的特徵都很類似
  • 前幾層學到的特徵都在一些顏色或邊角特徵、越後面則會學到較複雜的紋理、局部、整體特徵

Feature Evolution during Training

這個實驗室show了不同層在訓練過程中的可視化圖,可以發現越淺層學習到特徵所需的時間越短,層數越深,則需要越多次迭代才能學到好的特徵。

Feature Invariance


這個實驗是在說對於CNN垂直翻轉、縮放比較具有不變性,但對於旋轉則比較不具有不變性(除非圖片本身有對稱性,例如娛樂中心那張)。

  • a2-c2是第一層的feature space距離,a3-c3是第七層的距離,可以看到在越深層的地方翻轉和縮放的影響相對旋轉較小。

Architecture Selection

從Feature Visualization實驗中觀察到:

  • 第一層主要都是學習高頻和低頻的訊息,比較少中頻的訊息
  • 第二層有些混疊效應(aliasing artifacts),由於第一層中使用到了較大的stride

因此對AlexNet的設置做了一些修改,修改的部分上面提過了。

Occlusion Sensitivity

觀察遮蔽圖片某個部分的話,對於模型分類的影響。從圖中可以看到,模型確實是定位到了場景中的物體,如果該物體被遮蔽的話那分類的準確度就會大大降低。

Correspondence Analysis

Deep models differ from many existing recognition approaches in that there is no explicit mechanism for establishing correspondence between specific object parts in different images (e.g. faces have a particular spatial configuration of the eyes and nose). However, an intriguing possibility is that deep models might be implicitly computing them.

深度學習沒辦法像傳統的辨識技術那樣顯式地建立特地物件之間的關係(例如臉部中眼睛和鼻子之間的關係),但是一個有趣的可能是模型可能隱式地學習到了這些關係。為了驗證,他們選擇了5張圖片,然後遮蔽相同的部分來做觀察。下面內容引用至Deep Visualization:可视化并理解CNN

觀察方式是: 首先计算图片遮蔽前后特征,两个特征向量做差,通过sign来确定符号;然后通过海明距离来计算5张照片两两之间的一致性,然后求和。

由实验结果可以得出,layer5的特征一致性中,眼和鼻子的数值较低,说明眼和鼻子比其他部分,有更强的相关性,这也说明深度网络能够隐式地建立对应关系。但是在layer7中眼,鼻子和随机的数值较为相似,可能是因为高层尝试去区分狗的种类。

Experiments

值得一提的是,CNN學到的特徵SVM也一樣可以用,越深層學習到的特徵分類效果越好。

其他跳過。

Discussion

跳過

結論

其實說白了ZFNet只是AlexNet對於架構做了一些微調。

不過這篇論文的貢獻在於提出了一個CNN可視化的方法,透過反卷積,DeConvnet,Transpose Convolution隨便什麼名字啦,使得我們可以去觀察模型不同層對應到input時哪些是比較重要的部分,這對於後續的解釋性AI(Explainable AI, XAI)有非常重要的影響。

然後那個反卷積跟ReLU那邊我真的是搞了很久,明明才11頁的paper我居然搞了好幾天才搞完(ヾノ・ω・`)

對了,對於實作有興趣的人,無意中挖到了這個pytorch實作的網站,歡迎去看看可能會對ZFNet更加了解: ZFNet/DeconvNet: Summary and Implementation

References


>