0
雷鋒網(wǎng)按:本文作者達聞西,原載于作者知乎專欄,雷鋒網(wǎng)經(jīng)授權發(fā)布。
很多機器學習方法可以歸結為優(yōu)化問題,對于一個參數(shù)模型,比如神經(jīng)網(wǎng)絡,用 y=f(x;θ) 來表示的話,訓練模型其實就是下面的參數(shù)優(yōu)化問題:

其中 L 是loss function,比如神經(jīng)網(wǎng)絡中分類常用的 cross-entropy。
特征(Representation)。把原始圖像看做一個維度是像素×通道的向量,經(jīng)過各種復雜的CNN結構,其實只不過成了另一個向量。這個向量所在的空間也許有更好的線性可分性,也許是相似樣本的“距離”更近,原始的數(shù)據(jù)經(jīng)過變換到了這里之后,就是特征。
那么有個問題來了,如何可視化一個CNN結構學到的特征呢?答案有很多,其中一種就是本文的主題:不再通過優(yōu)化求解網(wǎng)絡的參數(shù),而是求解輸入圖像。
優(yōu)化網(wǎng)絡的輸入,是相對于“正統(tǒng)”的機器學習優(yōu)化參數(shù)而言的。當一個CNN訓練完全后,我們可以固定好參數(shù),把輸入作為可訓練的量,根據(jù)目的給定一個新的目標函數(shù)。
把這種方法最早用在深度學習里大概是Bengio組在2009年的一個Tech report:《Visualizing Higher-Layer Features of a Deep Network》。文章里提出了下面的優(yōu)化問題


其中 hij 代表第j層中的第i個神經(jīng)元的響應。很直觀的,這是要尋找什么樣的圖像可以最大程度地激活這個神經(jīng)元,這種方法就叫做 activation maximization。利用這種辦法,原文中得到了類似下面的可視化,從左至右依次是一個DBN中從低到高的三層:

也許很多人一提起特征可視化首先想到的是可視化特征圖或是直接把卷積核畫出來,就像 Caffe 的 Tutorial(Image Classification and Filter Visualization,地址:http://t.cn/RqAEsPq)中一樣。這樣的可視化其實是很不直觀的,尤其是卷積核的可視化,第一層之后的卷積核到底學到了什么內(nèi)容只能靠腦補?;谶@個思路,Cornell的Jason Yosinski把公式改了改

其實就是Regularization項R(x)放到了目標函數(shù)里。然后他把這種可視化作為功能之一,基于Caffe制作了一個年久失修的用于CNN可視化的工具包:yosinski/deep-visualization-toolbox(地址:http://t.cn/R2rXWi3)。用在AlexNet上的效果是下面樣子:

注意到這個可視化結果還考慮到了感受野,也就是實際優(yōu)化的目標是響應圖中心的點,所以越高層的可視化圖像越大。
直接把某一類別的分數(shù)作為優(yōu)化值可以得到關于該類別更直觀的可視化結果,比如下圖是這個工具包對幾個類別的可視化:

每個類別學到的視覺上的特征一目了然。另外注意到這種方法因為是基于優(yōu)化,所以每次優(yōu)化的結果會有不同。
借助這種可視化,我們能夠分析出網(wǎng)絡是不是真的學習到了我們希望其所學的特征,比如Google的Research Blog中提到過啞鈴的例子:

可視化的類別是啞鈴,可是結果里包含了一些我們不希望出現(xiàn)的元素:胳膊。這是因為用于訓練的啞鈴圖片中,大都有握著啞鈴的胳膊。
可視化網(wǎng)絡的方法有很多,以簡單粗暴為最大特點的大概只是activation maximization。
對抗樣本也是機器學習中的一種常用概念,通常指人為制造的,讓一個機器學習模型發(fā)生錯誤的樣本。Anh Nguyen的論文《Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images》中有個比較形象的示意:

要理解這個圖,還要提一句機器學習的一個基本問題:學習數(shù)據(jù)的分布。具體到方法就是從訓練數(shù)據(jù)中進行學習,如果學習成功,則可以泛化到所有數(shù)據(jù),包含沒見過的測試數(shù)據(jù)?;氐竭@個圖,數(shù)據(jù)的分布就是最上邊那三坨。一種造對抗樣本的方法就是從一個類別的樣本出發(fā),做一些小修改,讓模型將修改后的樣本判斷為另一個類別,而實際上(或是人的,顯然的判斷)該樣本仍為原來類別,這就是圖中從藍色原點到白色小方塊的方法。
當然更容易的方法是利用分類邊界的不可確定性。比如上圖中除了最上面部分的空間可以認為是數(shù)據(jù)存在概率極低的區(qū)域,從實際應用的角度甚至可以認為是我們完全不關心的區(qū)域。因為算法學習的樣本只有實心的小圓點,所以遠離小圓點的部分,分類邊界是難以控制的。在這里面很容易輕松取到算法高概率認為是一個類別的樣本,而實際上卻難以辨認的對抗性樣本。
所以大體來說,對抗性樣本的存在是因為數(shù)據(jù)維度通常過高,即使考慮所在的子區(qū)域,往往還是過高,對整個(數(shù)據(jù)分布的)空間的搜索是不可行的。在訓練樣本沒有覆蓋的區(qū)域,無論該區(qū)域是否屬于數(shù)據(jù)分布所在的區(qū)域,無論模型的capacity夠不夠,都有出現(xiàn)對抗性樣本的可能。盡管深度學習中一直主張distributed representation已大幅優(yōu)于局部泛化,維度的詛咒仍是一個無法擺脫的難題。
具體到CNN,下邊這個例子可能不少人見過:

熊貓的圖片上加上一個人眼難以察覺的噪音,對于人眼而言看上去還是熊貓,可是對于一個CNN而言,右邊的圖片以99%高概率被判斷為了長臂猿。上句話其實已經(jīng)很清楚地指出了得到右邊圖片的方法,還是一個優(yōu)化輸入圖像的問題:加上一個盡量小的噪音,并通過優(yōu)化這個噪音,讓優(yōu)化后的圖像具有另一個類別的高概率:


其中n是要求的噪音,α 是相應的系數(shù),L是x+n屬于某個類別的loss,c是某個錯誤類別的標簽。這大概是基于深度學習的計算機視覺中第一個討論造對抗樣本的方法,見于Christian Szegedy的論文《Intriguing properties of neural networks》。同樣是在這篇論文中,Christian描述了一個比較令人擔憂的發(fā)現(xiàn):就是這種樣本居然可以泛化,同一個對抗樣本,對于不同的CNN結構,在不同數(shù)據(jù)子集下訓練的模型,是可以達到一定程度的“通用”性的。也就是說對于一些涉及到安全的應用,攻擊者即使不知道部署的模型是什么,通過某種手段猜測數(shù)據(jù)的分布,也是可以得到有效的攻擊樣本的。
對于CNN,有個很基礎的認識:低層的部分學習紋理等簡單信息,高層部分學習語義信息。在《Intriguing properties of neural networks》中的另一個發(fā)現(xiàn)是,CNN中表示高層學習到的語義信息的,并不是某一個神經(jīng)元,而是高層神經(jīng)元構成的空間。這個看上去有些顯然的結論的一種佐證方式又是對輸入圖像進行優(yōu)化:

其中 Φ(x) 是神經(jīng)元激活值對應的向量,v是一個隨機向量。另外這和前邊的優(yōu)化有些許不同,x的取值范圍限定在已有的圖片集里。其實就是在某個高層響應的空間里,沿著某個方向挑選了一些該方向上值最大的圖片。最后的結論是,無論是沿著某個隨機方向找到的圖片,還是以某一個神經(jīng)元響應最大找到的圖片,都能看出一些語義上的共性,比如下圖:

黑線以上是最大化某個神經(jīng)元響應的樣本,共性挺明顯,黑線以下是最大化某層特征空間中某個方向響應的樣本,共性也挺明顯。
很多人小時候都有這樣的經(jīng)歷:抬頭看天空的云彩,或是觀察地面的紋路,甚至是凝視廁所里臟兮兮的墻面,這時候看到的卻是各種機器人大戰(zhàn),武打畫面,或是動畫片中的人物和故事。
Deep Dream和這很像,輸入任何一幅圖像,都會得到在不同層的響應,前面已經(jīng)提到過,低層的響應是紋理和細節(jié)的相應,高層的響應是語義信息的響應。所以Deep Dream的思想是:
對于某個高層的得到的語義信息響應,加強這些信息。這相當于讓網(wǎng)絡自己決定從輸入圖像中“看到”了什么,并把“看到”的東西加強,所以又是一個優(yōu)化問題。
要優(yōu)化的目標,就是最大化輸入圖像在某個高層已有的響應,優(yōu)化的初始值就是輸入圖像,當然還有一些其他項,比如不同的包含不同尺度,或是抑制梯度及高頻成分的約束,這些是否加上視情況而定。這并不是一個典型的優(yōu)化問題,反而更像是一個單純的梯度下降問題,所以梯度下降通常也不會進行到底,而是進行若干步直到輸入圖像中出現(xiàn)一個“夢境”。下面是TensorFlow的官方tutorial里,Inception模型在一幅圖片上生成的夢境:


基于Inception的DeepDream有個特點,就是夢境里的狗很多,就像上面這幅圖一樣。
在電影《Inception》里,夢境是可以操控的,DeepDream也可以,按照可視化中的思路,把優(yōu)化目標換成某一層響應圖中的某個channel,這就是一個傳統(tǒng)的優(yōu)化問題了:

和第一部分中的差別在于初始化的是一幅圖像,并且優(yōu)化不會進行到底。比如一個對花朵一樣圖案敏感的channel,對應的夢境里畫面中就會開滿了花:

其實那些隱藏在白云里和墻上的圖案,長大后也是能看到的,只不過大多數(shù)人不看了。
2016年,如果要評選一款和神經(jīng)網(wǎng)絡相關的最火爆的APP,一定非Prisma莫屬。其背后的算法,也是對輸入圖像的優(yōu)化。關于神經(jīng)網(wǎng)絡的藝術風格學習,首先要追溯到更早的一篇利用優(yōu)化輸入方法的論文《Understanding Deep Image Representations by Inverting Them》,里面討論的問題之一是通過優(yōu)化算法和神經(jīng)網(wǎng)絡中的特征重建一幅圖像:

其中Φ0是某幅圖像在網(wǎng)絡中的特征,這個特征可以是部分層的響應,或者全部的響應。如果Φ0取低層的特征,那么細節(jié)的還原度就會很好,如果Φ0是高層的特征,則畫面中的紋理和細節(jié)會丟失很多信息。比如下面的圖像:

用Vgg16模型執(zhí)行一遍前向計算,然后分別取relu1~relu5的特征作為 Φ0,重建的結果如下:

在基于神經(jīng)網(wǎng)絡的圖像風格藝術化中,通常的輸入是一幅原始圖像,經(jīng)過處理具有了其他畫面,比如一幅油畫的藝術風格。所以是原始圖像的內(nèi)容+其他圖像的風格,那么上面討論的部分就是內(nèi)容的重建,所以接下來要討論的是風格的重建。
圖像風格其實是個很難定義的東西,不過在神經(jīng)網(wǎng)絡中,談到風格,一般指的是紋理。紋理的特點是什么呢?又是一個很難定義的東西……不過紋理有個特點是和所在位置無關,基于這個特點,只要是和位置無關的統(tǒng)計信息,都可以試著來表示紋理的特征,Gram矩陣,就是在CNN中表示這種特征辦法的一種:

其中 Gl 代表第 l 層響應圖對應的Gram矩陣,F(xiàn)il 代表該層第 i 個卷積核對應的響應圖。通常一個響應圖是二維的,這里把響應圖展開為一個一維向量,其中 Fikl 代表該層第i個響應圖的第k個元素。所以Gram矩陣的每一個元素就是求了個內(nèi)積,把兩個響應圖之間,和位置無關的一種相關性給求了出來。
接下來的套路就和上一小節(jié)一樣了,把每層Gram矩陣作為特征,讓重建圖像的Gram矩陣盡量接近原圖的Gram矩陣,也是個優(yōu)化問題:

其中El是每一層的loss,wl是該層loss的權重。El的形式是考慮到每層響應圖大小后的Gram矩陣差異:

同樣是用Vgg16,用不同層的特征,對梵高的星空進行風格重建,結果如下:

至于Gram矩陣為什么能作為重建風格的依據(jù),論文《Demystifying Neural Style Transfer》(感謝 @Lyken 在評論中的分享)中給出了一個思路,是一個不錯的參考。比起原文中相關性的解釋,這篇論文更進一步把Gram矩陣轉化成了squared Maximum Mean Discrepancy,這直接把圖像和CNN中響應的分布聯(lián)系了起來,并且可以通過替換計算MMD的方式嘗試其他風格重建的目標計算方式。
總之,重建內(nèi)容和風格的方法都已有,接下來就很自然了,把某個較高層的特征作為內(nèi)容重建的目標,同時把每層響應的Gram矩陣以某個比例求和作為風格的重建目標,對輸入圖像進行優(yōu)化:

這就是論文《A Neural Algorithm of Artistic Style》中的方法,也是Prisma背后的算法。
雷鋒網(wǎng)相關閱讀:
卷積神經(jīng)網(wǎng)絡不能處理“圖”結構數(shù)據(jù)?這篇文章告訴你答案
手把手教你用 TensorFlow 實現(xiàn)卷積神經(jīng)網(wǎng)絡(附代碼)
雷峰網(wǎng)版權文章,未經(jīng)授權禁止轉載。詳情見轉載須知。