學術界一直困惑的點是"如何讓看似黑盒的CNN模型說話",即對它的分類結果給出解釋。git
這裏的解釋是指,讓模型告訴咱們它是經過圖片的哪些像素作出判斷的,並非深度學習理論層面的解釋。github
CNN模型的可解釋問題,很早就有人在研究了,嚴格來講只是「CNN可視化」。有兩個經典的方法。算法
反捲機(Deconvolution)、上採樣(Unsampling)、上池化(Unpooling)bash
UnPooling的過程,特色是在Maxpooling的時候保留最大值的位置信息,以後在unPooling階段使用該信息擴充FeatureMap,除最大值位置之外,其他補0。
UnSampling階段沒有使用MaxPooling時的位置信息,而是直接將內容複製來擴充Feature Map。
反捲積是卷積的逆過程,又稱做轉置卷積。最大的區別在於反捲積過程是有參數要進行學習的(相似卷積過程),理論是反捲積能夠實現UnPooling和unSampling,只要卷積核的參數設置的合理。網絡
特徵輸入爲i,卷積核尺寸爲k,步長爲s,padding爲p。\(i=6,k=3,p=1,s=2\)的卷積過程以下:
輸出特徵層的尺寸爲\(o=(i+2p-k)/s+1\)app
考慮將\(i=4,k=3,s=1\)卷積獲得\(o=2\)框架
能夠將3x3的卷積核展開爲4x16的矩陣C.ide
CX=Y即是上述卷積過程。可見,卷積層的計算實質能夠轉化爲矩陣的乘法。函數
值得注意的是,在一些深度學習網絡的開源框架中並非經過這種這個轉換方法來計算卷積的,由於這個轉換會存在不少無用的0乘操做,Caffe中具體實現卷積計算的方法可參考:Implementing convolution as a matrix multiplication。這是一個toeplitz 託普利茲矩陣。學習
咱們很容易理解卷積層的前向傳播是和矩陣C線程,那麼反向傳播即是和它的轉置相乘。
反捲積和卷積的關係:卷積層的前向傳播過程就是反捲積層的反向傳播過程,卷積層的反向傳播過程就是反捲積層的前向傳播過程。
在步長s=1的狀況下,反捲積核卷積過程恰好相反。結果會忽略padding的邊(p=2)。
反捲積有時候也被叫作Fractionally Strided Convolution(小數步長的卷積)。對於步長 s>1的卷積,咱們可能會想到其對應的反捲積步長 s′<1。
咱們能夠理解爲:在其輸入特徵單元之間插入 s−1 個0,插入0後把其看出是新的特徵輸入。
在FCN的原文中提到deconvolutional layer中的kernel是能夠被訓練的,也能夠是固定的,即默認的二維bilinear kernel。
之因此說FCN中的反捲積操做不是原則意義上transposed convolution,是由於做者設置其中的學習率lr_mult爲0,沒有讓該層學習。即卷積核是固定不變的。
layer { name: "upscore" type: "Deconvolution" bottom: "score_fr" top: "upscore" param { lr_mult: 0 } convolution_param { num_output: 21 bias_term: false kernel_size: 64 stride: 32 } }
上採樣利用的是conv2d_transpose函數,將輸入特徵插值到一個更大的特徵圖而後進行卷積。
conv2d_transpose(value,filter,output_shape,strides,padding..) Args: value: A 4-D `Tensor` of type `float` and shape `[batch, height, width, in_channels]` for `NHWC` data format or `[batch, in_channels, height, width]` for `NCHW` data format. filter: A 4-D `Tensor` with the same type as `value` and shape `[height, width, output_channels, in_channels]`. `filter`'s `in_channels` dimension must match that of `value`. output_shape: A 1-D `Tensor` representing the output shape of the deconvolution op. strides: A list of ints. The stride of the sliding window for each dimension of the input tensor. padding: A string, either `'VALID'` or `'SAME'`. The padding algorithm.
好了,回到咱們要研究的問題
反向傳播、反捲積、導向反向傳播的區別在於反向傳播過程當中通過ReLU層時對梯度的不一樣處理策略。在論文中有詳細描述。
雖然過程上的區別看起來沒有很是微小,可是在最終的效果上卻有很大差異。
使用普通的反向傳播獲得的圖像噪聲較多,基本看不出模型的學到了什麼東西。使用反捲積能夠大概看清楚貓和狗的輪廓,可是有大量噪聲在物體之外的位置上。導向反向傳播基本上沒有噪聲,特徵很明顯的集中貓和狗的身體部位上。
雖然藉助反捲積和導向反向傳播咱們「看到」了CNN模型神祕的內部,可是卻並不能拿來解釋分類的結果,由於它們對類別並不敏感,直接把全部能提取的特徵都展現出來了。在剛纔的圖片中,模型給出的分類結果是貓,可是經過反捲積和導向反向傳播展現出來的結果卻同時包括了狗的輪廓。換句話說,咱們並不知道模型究竟是經過哪塊區域判斷出當前圖片是一隻貓的。要解決這個問題,咱們必須考慮其餘辦法。
你們在電視上應該都看過熱成像儀生成的圖像
圖像中動物或人由於散發出熱量,因此可以清楚的被看到。接下來要介紹的CAM(Class Activation Mapping)產生的CAM圖與之相似,當咱們須要模型解釋其分類的緣由時,它以熱力圖(Saliency Map,我不知道怎麼翻譯最適合,叫熱力圖比較直觀一點)的形式展現它的決策依據,如同在黑夜中告訴咱們哪有發熱的物體。
對一個深層的卷積神經網絡而言,經過屢次卷積和池化之後,它的最後一層卷積層包含了最豐富的空間和語義信息,再往下就是全鏈接層和softmax層了,其中所包含的信息都是人類難以理解的,很難以可視化的方式展現出來。因此說,要讓卷積神經網絡的對其分類結果給出一個合理解釋,必需要充分利用好最後一個卷積層。
CAM利用GAP(Global Average Pooling)替換掉了全鏈接層。能夠把GAP視爲一個特殊的average pool層,只不過其pool size和整個特徵圖同樣大,其實說白了就是求每張特徵圖全部像素的均值.
GAP的優勢在NIN的論文中說的很明確了:因爲沒有了全鏈接層,輸入就不用固定大小了,所以可支持任意大小的輸入;此外,引入GAP更充分的利用了空間信息,且沒有了全鏈接層的各類參數,魯棒性強,也不容易產生過擬合;
還有很重要的一點是,在最後的 mlpconv層(也就是最後一層卷積層)強制生成了和目標類別數量一致的特徵圖,通過GAP之後再經過softmax層獲得結果,這樣作就給每一個特徵圖賦予了很明確的意義,也就是categories confidence maps。
若是你當時不理解這個categories confidence maps是個什麼東西,結合CAM應該就能很快理解。
咱們重點看下通過GAP以後與輸出層的鏈接關係(暫不考慮softmax層),實質上也是就是個全鏈接層,只不過沒有了偏置項,如圖所示:
對每個類別C,每一個特徵圖k的均值都有一個對應的w,記爲\(w^c_k\)。
CAM的基本結構就是這樣了,下面就是和普通的CNN模型同樣訓練就能夠了。訓練完成後纔是重頭戲:咱們如何獲得一個用於解釋分類結果的熱力圖呢?其實很是簡單,好比說咱們要解釋爲何分類的結果是羊駝,咱們把羊駝這個類別對應的全部\(w^c_k\)取出來,求出它們與本身對應的特徵圖的加權和便可。因爲這個結果的大小和特徵圖是一致的,咱們須要對它進行上採樣,疊加到原圖上去,以下所示。
CAM以熱力圖的形式告訴了咱們,模型是重點經過哪些像素肯定這個圖片是羊駝了。
前面看到CAM的解釋效果已經很不錯了,可是它有一個導致傷,就是它要求修改原模型的結構,致使須要從新訓練該模型,這大大限制了它的使用場景。若是模型已經上線了,或着訓練的成本很是高,咱們幾乎是不可能爲了它從新訓練的。因而乎,Grad-CAM橫空出世,解決了這個問題。
Grad-CAM的基本思路和CAM是一致的,也是經過獲得每對特徵圖對應的權重,最後求一個加權和。
可是它與CAM的主要區別在於求權重\(w^c_k\)的過程。CAM經過替換全鏈接層爲GAP層,從新訓練獲得權重,而Grad-CAM另闢蹊徑,用梯度的全局平均來計算權重。事實上,通過嚴格的數學推導,Grad-CAM與CAM計算出來的權重是等價的。爲了和CAM的權重作區分,定義Grad-CAM中第k個特徵圖對類別c的權重爲\(α^c_k\),可經過下面的公式計算:
\[\alpha_k^c=\frac{1}{Z}\sum\limits_{i}\sum\limits_{j}\frac{\partial y^c}{\partial A_{ij}^k}\]
其中,Z爲特徵圖的像素個數,\(y^c\)是對應類別c的分數(在代碼中通常用logits表示,是輸入softmax層以前的值),\(A^k_{ij}\)表示第k個特徵圖中,(i,j)位置處的像素值。求得類別對全部特徵圖的權重後,求其加權和就能夠獲得熱力圖。
\[L_{Grad-CAM}^c=ReLU(\sum\limits_k\alpha_k^cA^k)\]
總體結構以下圖所示
注意這裏和CAM的另外一個區別是,Grad-CAM對最終的加權和加了一個ReLU,加這麼一層ReLU的緣由在於咱們只關心對類別c有正影響的那些像素點,若是不加ReLU層,最終可能會帶入一些屬於其它類別的像素,從而影響解釋的效果。使用Grad-CAM對分類結果進行解釋的效果以下圖所示:
除了直接生成熱力圖對分類結果進行解釋,Grad-CAM還能夠與其餘經典的模型解釋方法如導向反向傳播相結合,獲得更細緻的解釋。
這樣就很好的解決了反捲積和導向反向傳播對類別不敏感的問題。固然,Grad-CAM的神奇之處還不只僅侷限在對圖片分類的解釋上,任何與圖像相關的深度學習任務,只要用到了CNN,就能夠用Grad-CAM進行解釋,如圖像描述(Image Captioning),視覺問答(Visual Question Answering)等,所須要作的只不過是把yc換爲對應模型中的那個值便可。
限於篇幅,本文就不展開了,更多細節,強烈建議你們去讀讀論文,包括Grad-CAM與CAM權重等價的證實也在論文中。若是你只是想在本身的模型中使用Grad-CAM,能夠參考這個連接,熟悉tensorflow的話實現起來真的很是簡單,一看就明白。
前面共同的侷限性:當模型對咱們來講徹底爲一個黑盒時就無能爲力了。針對這個問題,這裏介紹另外一套辦法,即便咱們對模型一無所知也可以對它的行爲做出解釋。
LIME是KDD 2016上一篇很是漂亮的論文,思路簡潔明瞭,適用性廣,理論上能夠解釋任何分類器給出的結果。其核心思想是:對一個複雜的分類模型(黑盒),在局部擬合出一個簡單的可解釋模型,例如線性模型、決策樹等等。這樣說比較籠統,咱們從論文中的一張示例圖來解釋:
如圖所示,紅色和藍色區域表示一個複雜的分類模型(黑盒),圖中加粗的紅色十字表示須要解釋的樣本,顯然,咱們很難從全局用一個可解釋的模型(例如線性模型)去逼近擬合它。
可是,當咱們把關注點從全局放到局部時,能夠看到在某些局部是能夠用線性模型去擬合的。具體來講,咱們從加粗的紅色十字樣本週圍採樣,所謂採樣就是對原始樣本的特徵作一些擾動,將採樣出的樣本用分類模型分類並獲得結果(紅十字和藍色點),同時根據採樣樣本與加粗紅十字的距離賦予權重(權重以標誌的大小表示)。虛線表示經過這些採樣樣本學到的局部可解釋模型,在這個例子中就是一個簡單的線性分類器。在此基礎上,咱們就能夠依據這個局部的可解釋模型對這個分類結果進行解釋了。
一個看似複雜的模型經過咱們巧妙的轉換,就可以從局部上獲得一個讓人類理解的解釋模型,光這樣說仍是顯得有些空洞,具體來看看LIME在圖像識別上的應用。咱們但願LIME最好能生成和Grad-CAM同樣的熱力圖解釋。可是因爲LIME不介入模型的內部,須要不斷的擾動樣本特徵,這裏所謂的樣本特徵就是指圖片中一個一個的像素了。仔細一想就知道存在一個問題,LIME採樣的特徵空間太大的話,效率會很是低,而一張普通圖片的像素少說也有上萬個。若直接把每一個像素視爲一個特徵,採樣的空間過於龐大,嚴重影響效率;若是少採樣一些,最終效果又會比較差。
因此針對圖像任務使用LIME時還須要一些特別的技巧,也就是考慮圖像的空間相關和連續的特性。不考慮一些極小特例的狀況下,圖片中的物體通常都是由一個或幾個連續的像素塊構成,所謂像素塊是指具備類似紋理、顏色、亮度等特徵的相鄰像素構成的有必定視覺意義的不規則像素塊,咱們稱之爲超像素。相應的,將圖片分割成一個個超像素的算法稱爲超像素分割算法,比較典型的有SLIC超像素分割算法還有quickshit等,這些算法在scikit-image庫中都已經實現好了,quickshit分割後如圖所示:
從特徵的角度考慮,實際上就再也不以單個像素爲特徵,而是以超像素爲特徵,整個圖片的特徵空間就小了不少,採樣的過程也變的簡單了許多。更具體的說,圖像上的採樣過程就是隨機保留一部分超像素,隱藏另外一部分超像素,以下所示:
從圖中能夠很直觀的看出這麼作的意義:找出對分類結果影響最大的幾個超像素,也就是說模型僅經過這幾個像素塊就已經可以自信的作出預測。這裏還涉及到一個特徵選擇的問題,畢竟咱們不可能窮舉特徵空間全部可能的樣本,因此須要在有限個樣本中找出那些關鍵的超像素塊。雖然這部分沒有在論文中過多說起,但在LIME的代碼實現中是一個重要部分,實現了前向搜索(forward selection)、Lasso和嶺迴歸(ridge regression)等特徵選擇方式,默認當特徵數小於等於6時採用前向搜索,其餘狀況採用嶺迴歸。
總體流程如圖:
和Grad-CAM同樣,LIME一樣能夠對其餘可能的分類結果進行解釋。
LIME除了可以對圖像的分類結果進行解釋外,還能夠應用到天然語言處理的相關任務中,如主題分類、詞性標註等。由於LIME自己的出發點就是模型無關的,具備普遍的適用性。
雖然LIME方法雖然有着很強的通用性,效果也挺好,可是在速度上卻遠遠不如Grad-CAM那些方法來的快。固然這也是能夠理解的,畢竟LIME在採樣完成後,每張採樣出來的圖片都要經過原模型預測一次結果。
說來也巧,在寫這篇文章的時候,AAAI 2018的論文放出來了,其中有LIME做者的最新研究成果Anchors,順道去了解了一下。Anchors指的是複雜模型在局部所呈現出來的很強的規則性的規律,注意和LIME的區別,LIME是在局部創建一個可理解的線性可分模型,而Anchors的目的是創建一套更精細的規則系統。不過看過論文之後感受更可能是在和文本相關的任務上有不錯的表現,在圖像相關的任務上並無什麼特別另人耳目一新的東西,只是說明了在Anchor(圖像中指若干個超像素)固定的狀況下,其餘像素不管替換爲何,現有的模型都會罔顧人類常識,自信的作出錯誤判斷。這部份內容因爲前幾年看多了Adversarial Samples,已經見怪不怪了。
實際上在模型可解釋性這塊還有其餘不少相關研究,包括最近的AAAI 2018上也有幾篇這方面的文章,如Beyond Sparsity: Tree Regularization of Deep Models for Interpretability,這都在必定程度上說明,業內仍是重視這個方向的。尤爲在涉及到醫療、自動駕駛等人命關天的應用場合,可解釋性顯得尤其重要。