本課介紹了近年來人們對理解卷積網絡這個“黑盒子”所做的一些可視化工作,以及deepdream和風格遷移。
1 卷積網絡可視化
1.1 可視化第一層的濾波器
我們把卷積網絡的第一層濾波器權重進行可視化(權重值縮放到0~255之間)可以發現:
第一層的濾波器可以看做模版匹配,那么它尋找的模式就是一些邊和線。也就是說,當濾波器滑動到邊和線的時候,會有較大的激活值。這跟人腦的功能幾乎是一致的。
然而,我們只能可視化第一層濾波器得到如此有意義的結論,可視化后面的濾波器,我們將無法看到什么有用的東西。
1.2 研究最后一層
這里的最后一層指的是在輸入到最后的得分之前的那一層。
最近鄰
左圖是我們在像素空間上求最近鄰的結果,右圖是我們在最后一層產生的特征向量空間上求最近鄰的結果。可以看到右邊的有些結果,雖然在像素上大有不同,但是卻有相同的語義含義。說明卷積網絡處理后的特征向量確實包含着語義信息。
t-SNE降維后可視化
還有一種方法是對最后一層產生的特征向量做t-SNE降維(一種非線性降維方法),降到兩維。然后在二維坐標系中將這些圖片的位置標識出來。具體結果可以看這里:
http://cs.stanford.edu/people/karpathy/cnnembed/
1.3 可視化激活層
有一些研究可視化了中間的激活層(featureMap):
大部分的激活好像都不能看到什么東西,有一個激活很明顯的與人臉對應。
1.4 產生最大激活值的圖片碎片
我們從每層當中選擇一個深度切片,然后在CNN上前向傳播大量的圖片,觀察這些深度切片上的神經元的激活值。對每一張圖片來說,選取深度切面上激活值最大的那個神經元,並截取這個神經元所能看到的圖片區域。然后按照激活值的大小對這些圖片區域進行排序。
上圖中,每一行表示每一個深度切面的排序結果,可以看到一個深度切面確實是在尋找一種相同的模式。並且,高層所尋找的是一種更大的圖片結構,這是因為高層的神經元具有更大的感受野。
1.5 “排除”實驗
有一項研究通過遮擋圖像的某一部分,將這部分替換為平均像素值,然后查看對輸出分數的影響,繪制熱力圖。
可以看到船的主體部分,大象的身體,卡丁車以及賽道都對其具體的分類有較大影響。
1.6 Saliency Maps
我們可以查看輸出分數關於輸入像素的梯度(也就是哪些像素的改變對於輸出分數影響最大)。將梯度取絕對值並縮放到0~255之間,進行可視化:
這也被稱為Saliency Maps。 Saliency Maps可以用來做無監督的語義分割(注意,這里事實上還是有監督的,因為產生Saliency Maps的肯定是一個訓練好的CNN,只不過我們不需要那些對每個像素都打好標簽的圖片)。這方面內容可以看看這篇文章:Rother et al, “Grabcut: Interactive foreground extraction using iterated graph cuts”, ACM TOG 2004
1.7 guided backprop
與 Saliency Maps類似,只不過我們這里是看某個特定神經元的激活值關於圖片像素的梯度。對梯度可視化的結果如下:
上圖我們看到的是(4)中的神經元關於對應的輸入圖片的梯度。顯然,每一個神經元的激活都對圖像的一種特定模式特別敏感,印證了我們在(4)中的結論。
1.8 Gradient Ascent
Saliency Maps 和guided backprop都是前向傳播一張特定的圖片,然后看輸出分數或中間激活值關於輸入像素的梯度。
Gradient Ascent則是要找到使得某個激活值最大的輸入是長什么樣子,即生成一張圖片。我們使用的方法是輸入一張空白圖片,前向傳播得到激活值(或得分值),然后反向傳播計算激活(得分)關於輸入的梯度,然后輸入使用梯度下降更新,不斷迭代,直到生成一張滿意的圖片。
這里我們添加了正則項,是為了使得生成的圖片更自然。
這里是一些生成的結果:
另外還有一些方法能夠使得生成的圖片更漂亮,具體可以看CS231n課件。
我們可以用Gradient Ascent 的方法來生成對抗樣本,步驟為:
生成的對抗樣本在人眼上看不出什么差別,但在神經網絡看來卻會將其錯誤分類。這確實有點顛覆我們的認知。
更多對抗樣本的知識見Ian Goodfellow的講座。
2 DeepDream
deepdream其實就是利用Gradient Ascent來最大化某一層激活的范數,相當於放大這一層學到的特征。具體步驟為:
最后會生成一些很crazy的圖片,這里不貼圖了。可以看看deepdream的官方博客:
http://googleresearch.blogspot.ch/2015/06/inceptionism-going-deeper-into-neural.html
3 風格遷移
在介紹風格遷移之前,先介紹特征反演和紋理生成。
3.1 特征反演 Feature Inversion
特征反演是為了查看不同層的特征向量能保留多少原始的圖片信息。
任選一張圖片,前向傳播到已經訓練好的CNN。然后選取CNN當中某一層產生的特征向量,記住這個向量。現在,我們要生成一張圖片,盡量讓它在該層產生一樣的特征向量。這個任務仍然是用Gradient Ascent來做,目標函數定義為最小化生成圖片的特征向量與給定特征向量的L2距離,並且加一些正則化項保證生成圖片的平滑:
用這種方法,我們可以看到不同層的特征向量所包含的信息完整度:
可以看到,在relu2_2層,可以根據特征向量幾乎無損地恢復出原圖片。但是隨着層的深入,神經網絡記住的只是圖片的線條結構,顏色這些低階信息開始丟失。
3.2 紋理生成 Texture Synthesis
本節主要介紹目前效果最好的基於深度學習的神經紋理生成方法。注意在這之前有一些傳統的方法(最近鄰法),這些方法在簡單紋理上表現效果可以,但無法處理更復雜的紋理生成。
格萊姆矩陣 Gram Matrix
將一張圖片傳入一個已經訓練好的CNN,選定其中一層激活,其大小是C*H*W,可以看做是H x W 個C維向量。從這個激活圖中任意選取兩個C維向量,做矩陣乘法可以得到一個矩陣。然后對激活圖中任意兩個C維向量的組合,都可以求出這樣一個矩陣。把這些矩陣求和並平均,就是Gram Matrix。
Gram Matrix其實是feature之間的偏心協方差矩陣(即沒有減去均值的協方差矩陣)。其計算了每個通道特征之間的相關性,考察哪些特征是此消彼長的,哪些特征是同時出現的。我們認為Gram Matrix度量了圖片中的紋理特性,並且不包含圖像的結構信息。事實上,使用協方差矩陣代替Gram Matrix也能取得很好的效果,但是Gram Matrix有更高效的計算方法:將激活圖張量C*H*W展開成C*HW的形式,然后將其乘以其轉置,即得到gram矩陣。
神經紋理生成
當我們有了Gram矩陣這一度量圖像紋理特性的神器后,就可以使用類似於Gradient Ascent的算法來產生特定紋理的圖像。算法流程為:
該算法旨在生成與目標圖像具有相同gram矩陣的圖像。這里計算的損失是生成圖像與目標圖像各層gram矩陣的加權L2距離。
效果
這張圖表示,如果以更高層gram矩陣的L2距離作為損失函數,那么生成圖像就會更完全地重建圖像的空間結構。這是由於更高層的神經元具有更大的感受野導致的。
3.3 風格遷移
如果我們結合特征反演和紋理生成,就可以實現所謂的風格遷移。我們需要兩張圖像,一張圖像稱為Content image,生成圖像需要重建它的空間結構;另一張圖像稱為Style image,生成圖像需要重建它的紋理結構。使用下面的框架完成這個任務:
在這個框架中,我們同時優化特征反演和紋理生成的損失函數(與gram矩陣的距離以及與激活圖的距離的加權和),使得生成圖既具有Content image的空間結構,又具有Style image的紋理結構。
這里有一些超參數,使得我們可以控制生成的圖像:
此外,我們可以使用不同風格的gram矩陣的加權和,來生成多風格圖:
Fast Style Transfer
上面的風格遷移框架,每生成一張新的圖像都需要迭代數次。因此有研究提出了下面的Fast style Transfer的框架:
同樣使用特征反演和紋理生成的聯合損失函數,更新前饋網絡中的參數值。這樣,訓練好一個前饋網絡后,每次生成一個新圖像只需要進行一次前向傳播即可。