「技術綜述」「看透」神經網絡

2019-07-12   有三AI

作者 | 言有三

編輯 | 言有三

大家最詬病深度學習的一點就是理論基礎不夠系統,模型就像一個黑盒子,這就更加凸顯了深度學習模型可視化的重要性了。

本文以實戰經驗為主,除去數據的可視化部分,我們說以下幾個主要的方向(1)模型結構的可視化(2)卷積參數的可視化(3)激活區域的可視化(4)訓練過程的可視化。

1 模型結構的可視化

所謂模型結構的可視化,就是為了方便更直觀的看到模型的結構,從而方便進行調試,下面對2個主流的框架進行展示。

1.1 caffe網絡結構可視化

定義一個簡單的3層的模型(模型可以查看我們git,代碼太長此處不展示),我們可以採用幾種方案進行可視化;第一種,利用caffe自帶的可視化方法;第二種,利用開源項目netscope;由於netscope可視化效果更好,因此我們採用netscope進行可視化,工具網址如下:http://ethereon.github.io/netscope/#/editor

可視化後的結果如上圖,可以看到網絡的結構是通過卷積+激活函數的堆疊,同時網絡的數據輸入層和最後的全連接層作為了loss層和acc層的輸入。

當我們想要看每一層的參數時,就可以將滑鼠放上相應的結構塊;

當然,還可以使用caffe自帶的腳本進行可視化,在caffe根目錄下的python目錄下有draw_net.py這個腳本。

draw_net.py執行的時候帶三個參數,第一個參數是網絡模型的prototxt文件,第二個參數是保存的圖片路徑及名字,第三個參數是rankdirx,他有四種選項,分別是LR, RL, TB, BT。用來表示網絡的方向,分別是從左到右,從右到左,從上到小,從下到上。默認為LR。

1.2 tensorflow網絡結構可視化

在tensorflow中要進行可視化,必須使用name scope來確定模塊的作用範圍,添加部分名稱和作用域,否則網絡圖會非常複雜。與上面類似,我們同樣定義一個三層的卷積網絡(代碼還是看git)。

要想利用tensorboard進行可視化,必須在session中通過summary存儲網絡圖,只需要在訓練代碼中添加命令即可,summary = tf.summary.FileWriter("output", sess.graph)

最後利用tensorboard命令來查看訓練結果和可視化結果,網絡的可視化結果如下。

可以看出,網絡的結構可視化和caffe的差不多。除了caffe的網絡結構可視化是輸入模型配置文件,大部分的深度學習框架都使用了python進行開發,模型結構的可視化與tensorflow結果差不多。相比較來說,caffe的模型可視化方法更加簡單直接,獨立於代碼,可以更便捷地看到每一層的參數配置。

2 卷積參數可視化

前面我們可視化了網絡的結構,從而對要訓練的網絡就有了整體的把握。當我們得到了訓練結果之後,一個模型常有百萬千萬級別的參數,我們能否通過可視化的方法,來評判一下這個網絡結構的好壞呢?通常情況下,我們希望網絡結構學習到的權重,模式足夠豐富,這樣才有強大的表征能力。

2.1 淺層卷積參數可視化

網絡的早期卷積學習到的是通用的特徵,由於大部分網絡的輸入都是彩色圖,所以數據層的通道數為3。正好我們平時用的彩色圖的通道就是3維,這時候如果直接將這3組通道轉換為一個彩色圖,我們就可以很直觀的可視化這第一層的卷積參數,對於任意以輸入圖為3通道彩色圖的網絡結構來說,這都是通用的。

下面是alexnet學習到的權重的第一層卷積的可視化。

這其中有一些卷積核為灰度圖,說明三個通道的對應參數相近,學習到的是與顏色無關的特徵。有的為彩色圖,說明3個通道的特徵差異大,學習到的是與顏色有關的特徵。這與上面人眼和感知特性也是相通的,在底層,學習到的是邊緣,形狀,顏色等敏感等信息。

細心的讀者應該可以注意到,上面的參數,具有一定的互補性和對稱性。

2.2 高層卷積參數可視化

到了高層,由於輸入的通道數不再為3,所以無法像第一層那樣,將其投射到圖像空間進行直觀的可視化。

這時候就有了兩種思路。分別是dataset-centric和network-centric方法。他們的區別就是,第一個要可視化核函數,必須要使用真實的輸入數據。第二個,則是通過生成一個隨機圖片,然後進行疊代的方法,來最大化響應層的神經元的激活,這個時候為使得輸入的圖片更加平滑,可以考慮使用GAN等方法。

主要的研究方法包括兩種,反卷積法【2】和梯度計算法【3】。

反卷積方法的核心思想就是利用上採樣從特徵空間逐步恢復到圖像空間。假設我們要可視化第1個feature map的一個unit,即特徵圖的一個像素的activation,則首先從數據集中計算一下多個輸入圖像各自經過前向傳播後在這個unit上產生的activation,取出activation最大的一些圖像,這些圖像作為輸入圖。

然後將輸入圖分別在這個unit上產生的activation進行反向傳播,其他位置置為零。其中與pooling對應的就是uppooling,它通過在max pooling的時候記錄下最大激活位置,在反卷積的時候進行恢復。與卷積對應的操作就是轉置卷積操作,這是被用於圖像分割的方法,也是通常意義上所說的反卷積。

反卷積的結果,就是一個重建的圖。

梯度計算法包括標準的梯度計算法以及它的一些改進版本integrated gradients,guided backprop,基本原理如下,在訓練的過程中固定網絡的參數不變,學習輸入。

反卷積法和梯度計算法可視化出來的結果,可以反映出神經元學習到的類別的輪廓,但是結果不夠精細。GoogleBrain團隊的deep dream【4】研究,對inception網絡進行了逐層的特徵可視化,揭示了每一個網絡層的特性。該項目是通過輸入隨機噪聲和想讓網絡學習的圖像的先驗知識,最後可視化網絡學習到的該類的結果,雖然不是現實存在的圖像,但是卻具有該類別的特性,如同人類夢境中生成的不真實卻又有辨識度的場景一樣。

下面展示了layer 4c層的一個神經元的結果。

3 激活熱圖可視化

可視化了卷積參數,它可以反映出所學習到的網絡的參數本身有什麼樣的特點,它是從神經元的角度解釋了 CNN,而激活熱圖可視化考慮從輸入圖像的角度解釋CNN。它從輸入圖像中找出激活卷積層中特定神經元的選擇性模式,來反應網絡到底學習到了什麼信息。

特徵圖可視化的結果是sensitivity map,也叫saliency maps,以CAM(Class Activation Mapping)【5】方法及其變種為代表。

CAM利用GAP(Global Average Pooling)替換掉了全連接層,將輸出通道調整為輸出類別數,再加權然後通過softmax層得到結果,可視化原理圖如下:

看上圖,最後輸入softmax的特徵圖,等於k個featuremap的加權和,其中w係數包括c維,c等於類別數目。等到了熱力圖之後,直接上採樣到原圖中就能得到激活區域,因為featuremap保留了原圖的空間關係。

4 訓練過程可視化

最後,我們通過tensorflow可視化開源框架來展示在項目中的可視化,由於我們前面已經有許多期文章講述過可視化的各個模塊細節,所以此處就不再做技術細節展示,而只展示結果。

項目是這個:

https://github.com/carpedm20/DCGAN-tensorflow,我們用來生成了一批嘴唇數據。

4.1 loss可視化

loss等標量指標可視化可以反應網絡的學習情況,是必須關注的。

4.2 中間結果可視化

對於圖像生成任務,沒有什麼比查看中間結果更加有說服力的了。

4.3 網絡結構可視化

tensorflow可視化網絡結果雖然比caffe更加複雜,但也更加細緻,關注關注沒有壞處。

另外,還可以查看權重的直方圖分布等等,對於網絡的性能判斷也有輔助作用。

5 總結

正所謂一圖勝千言,可視化起來high啊,這個坑遠遠沒有這麼簡單。

如果你想了解更多,有一篇綜述文章【6】做了分類,不過對於大部分人來說那個分類並不好理解,所以我還是按照本文的組織形式。

參考文章

[1] Erhan D, Bengio Y, Courville A, et al. Visualizing higher-layer features of a deep network[J]. University of Montreal, 2009, 1341(3): 1.

[2] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks[J]. 2013, 8689:818-833.

[3] Simonyan K, Vedaldi A, Zisserman A. Deep inside convolutional networks: Visualising image classification models and saliency maps[J]. arXiv preprint arXiv:1312.6034, 2013.

[4] https://distill.pub/2017/feature-visualization/

[5] Zhou B, Khosla A, Lapedriza A, et al. Learning deep features for discriminative localization[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 2921-2929.

[6] How convolutional neural network see the world - A survey of convolutional neural network visualization methods