了解 CNN 關注的區域:CAM 與 Grad-CAM 的介紹分享
前言
相信對神經網路有一定認識的人應該聽過 Grad-CAM 這門技術。透過 Grad-CAM 我們可以了解一個執行圖像分類任務的 CNN 在它自身的網路裡是因為看重照片中的哪一個區域,進而做出該 CNN 模型的分類判斷。
而這樣技術的重要性在於對神經網路的可解釋性做了一定程度的回答,並且也提供了我們一種方式來檢視訓練完成的 CNN 模型是否是根據照片中合理的區域來進行分類判斷,還是說我們訓練出來的模型其實根本只是學歪了。
如下圖,假設我們希望 CNN 模型對於這張照片給出的分類判斷是「貓」。這時會有會有兩種可能的情況:
(1) CNN 確實給這張照片做出「貓」的分類判斷。
(2) CNN 給了這張照片錯誤的分類判斷,即判定不是「貓」。
對於 (1)、(2) 兩種情況,透過 Grad-CAM 都可以幫助我們了解模型的狀況。
對於情況 (1) 而言,CNN 雖然做出了正確的分類判斷,但是透過 Grad-CAM 發現 CNN 關注的區域其實是照片中的左下角與右下角而非照片中的貓本身。這時我們就應當對這個 CNN 的決策做出懷疑,看看在訓練的過程中是否有什麼瑕疵,或是我們的照片資料中是否夾帶了什麼不該出現的資訊,導致了 CNN 出現了偷吃步做弊的情形。
而對於情況 (2) 來說,由於 CNN 做了錯誤的分類判斷,我們可以進一步的透過 Grad-CAM 察看 CNN 關注的區域,這時若發現關注的區域不是貓的本身因此模型做了錯的分類判斷,我們就可以開始思考是不是在訓練方面哪邊的準備工夫還不夠,致使模型還學不會我們的資料。
然而若想要了解 Grad-CAM 的原理,或許先從 Grad-CAM 的前身 CAM 開始講起會是一條比較好的路徑,因此下面將會分別針對 CAM 與 Grad-CAM 做說明介紹。
CAM
CAM (Class Activation Map) 出自於 Learning Deep Features for Discriminative Localization 這篇論文,其做法是在最後的卷積層之後接上 GAP 層(Global Average Pooling Layer) ,取代一般會使用的攤平全連接層 (Flatten Fully Connecting Layer)。
我們知道 CNN 卷積層的作用是進行特徵淬取,而層數愈後面的卷積層所取出的特徵樣式愈複雜,因此一個合理的想法是我們可以透過最後一層卷積輸出的特徵圖來獲得 CNN 進行決策的資訊。每一張特徵圖經過 GAP 的轉換後將特徵圖的訊息壓縮成一個一個的神經元,因此經過 GAP 轉換後的每一個神經元分別對應到了最後一層的某一張特徵圖,而 GAP 層所連接的權重即可視為每一張特徵圖對於模型預測類別的重要性,最後將每一張特徵圖依照其對應的權重進行加權即得到 CAM (Class Activation Map)。
而在文中也給出了明確的數學推導,希望了解詳細過程的話建議可以直接參考論文,這裡我們給出關鍵的式子:
- 將 f_k 視為最後的卷積層經過 activation 後輸出的 feature map,f_k(x,y) 即為 f_k 上 (x,y) 位置的像素值,透過 GAP 後我們可以得到 f_k 所對應的神經元 F_k
這裡要說明一下原則上經過 GAP 還要再除上 f_k 上像素值的個數 (假設我們令它為 Z),但是由於 Z 是常數的關係,在本篇論文上應該是將其省略。
- 將每一個 F_k 與它連結到某一類別 c 神經元的權重 w 做線性組合,即得到一個類別分數 S_c,經過計算我們得到
- 定義 M_c 為類別 c 的 class activation map
- 如此我們就得到
由於 S_c 是模型將輸入照片歸到類別 c 的分數,因此由上方的式子可以知道 M_c (x,y) 值的大小即代表空間位置 (x,y) 對於模型而言將輸入的照片分到類別 c 的影響程度。因此我們若將 M_c 透過 upsampling 輸出即可觀察到模型對於輸入照片進行分類判斷所關注的區域。
Grad-CAM
Grad-CAM 是出自於論文 Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization ,不過在談 Grad-CAM 之前我們先說說 CAM 的限制。從 CAM 的介紹我們知道要能夠實踐 CAM 最後的卷積層輸出一定要接上 GAP Layer ,可是這無疑的限縮了網路架構的設計方式,而且若是要求模型在最後一定要接上 GAP Layer ,這樣往往會讓模型在準確度上做出犧牲。
然而 Grad-CAM 勉除了這樣的限制,對於一般的 CNN 架構透過 Grad-CAM 我們都可以得到 CNN 對於輸入照片的關注圖。
Grad-CAM 的想法可以理解成希望找到如同 CAM 當中連接在 GAP Layer 之後的那些權重 w ,如果我們能找到這樣概念的 w 那麼隨後要做的工作僅僅是將這些 w 與 CNN 最後的卷積層做線性組合 (如同 CAM 的手法一樣),最後將線性組合的結果 upsampling 輸出,即可得到模型對輸入照片的關注圖。
Grad-CAM 的論文中定義了如下形式的 α ,其作用即對應到 CAM 當中的權重 w :
其中 y^c 表示在進入 softmax 前模型將輸入照片判定為類別 c 的分數。
不過我們該如何去理解上面的 α 為何那樣定義?
如果我們將最後的卷積層 A 一直到 y^c 的網路架構視為一非線性函數 f , 如下圖:
為了要得到如同 CAM 當中 GAP Layer 之後到 y^c node 之間的線性連接方式,一個可以想到的做法就是將 f 線性化, 為了方便說明 f 的線性化,我們考慮一個簡化的架構:
所以將 f 線性逼近之後,我們得到近似於 f 的線性架構如下:
再回到 α 的定義,我們應該不難看出 y^c 對於 feature map A^k 上每個 ij 位置的偏微分即為將 f 線性化之後連接到 y^c 上的權重:
而 CAM 的做法是將一整個 feature map A^k 取 GAP 所以這裡對照的做法是將線性化後的這些偏微分權重取平均,即得到對照到 CAM 當中權重 w 的 α :
然後最後將每一個 α 與其對應的 feature map A^k 做線性組合再取 ReLU 即可得到模型的關注圖:
這邊取 ReLU 的用意是希望關注到的區域是對模型分類有正向影響的地方。
在 Grad-CAM 的論文中作者還提到 CAM 其實是 Grad-CAM 的特例,也就是說 Grad-CAM 相較於 CAM 更一般化,作者在這部分給了嚴格的證明,希望了解的讀者可以再去察看 Grad-CAM 的論文。
結語
以上就是對 CAM 與 Grad-CAM 所做的介紹,文中有許多部分是屬於自己的理解,如果有錯誤的話也歡迎指正。若是對 Grad-CAM 的實做有興趣的話,也可以參考 Keras 官方提供的實作範例,或是參考這篇 Medium 的講解都會很有幫助。
References
[1] https://arxiv.org/abs/1512.04150
[2] https://arxiv.org/abs/1610.02391
[3] https://medium.com/%E6%89%8B%E5%AF%AB%E7%AD%86%E8%A8%98/grad-cam-introduction-d0e48eb64adb