0
本文作者: AI研習(xí)社 | 2017-06-27 16:00 |
雷鋒網(wǎng)按:本文作者達(dá)聞西,原載于作者知乎專欄,雷鋒網(wǎng)經(jīng)授權(quán)發(fā)布。
很多機(jī)器學(xué)習(xí)方法可以歸結(jié)為優(yōu)化問題,對于一個參數(shù)模型,比如神經(jīng)網(wǎng)絡(luò),用 y=f(x;θ) 來表示的話,訓(xùn)練模型其實(shí)就是下面的參數(shù)優(yōu)化問題:
其中 L 是loss function,比如神經(jīng)網(wǎng)絡(luò)中分類常用的 cross-entropy。
特征(Representation)。把原始圖像看做一個維度是像素×通道的向量,經(jīng)過各種復(fù)雜的CNN結(jié)構(gòu),其實(shí)只不過成了另一個向量。這個向量所在的空間也許有更好的線性可分性,也許是相似樣本的“距離”更近,原始的數(shù)據(jù)經(jīng)過變換到了這里之后,就是特征。
那么有個問題來了,如何可視化一個CNN結(jié)構(gòu)學(xué)到的特征呢?答案有很多,其中一種就是本文的主題:不再通過優(yōu)化求解網(wǎng)絡(luò)的參數(shù),而是求解輸入圖像。
優(yōu)化網(wǎng)絡(luò)的輸入,是相對于“正統(tǒng)”的機(jī)器學(xué)習(xí)優(yōu)化參數(shù)而言的。當(dāng)一個CNN訓(xùn)練完全后,我們可以固定好參數(shù),把輸入作為可訓(xùn)練的量,根據(jù)目的給定一個新的目標(biāo)函數(shù)。
把這種方法最早用在深度學(xué)習(xí)里大概是Bengio組在2009年的一個Tech report:《Visualizing Higher-Layer Features of a Deep Network》。文章里提出了下面的優(yōu)化問題
其中 hij 代表第j層中的第i個神經(jīng)元的響應(yīng)。很直觀的,這是要尋找什么樣的圖像可以最大程度地激活這個神經(jīng)元,這種方法就叫做 activation maximization。利用這種辦法,原文中得到了類似下面的可視化,從左至右依次是一個DBN中從低到高的三層:
也許很多人一提起特征可視化首先想到的是可視化特征圖或是直接把卷積核畫出來,就像 Caffe 的 Tutorial(Image Classification and Filter Visualization,地址:http://t.cn/RqAEsPq)中一樣。這樣的可視化其實(shí)是很不直觀的,尤其是卷積核的可視化,第一層之后的卷積核到底學(xué)到了什么內(nèi)容只能靠腦補(bǔ)?;谶@個思路,Cornell的Jason Yosinski把公式改了改
其實(shí)就是Regularization項(xiàng)R(x)放到了目標(biāo)函數(shù)里。然后他把這種可視化作為功能之一,基于Caffe制作了一個年久失修的用于CNN可視化的工具包:yosinski/deep-visualization-toolbox(地址:http://t.cn/R2rXWi3)。用在AlexNet上的效果是下面樣子:
注意到這個可視化結(jié)果還考慮到了感受野,也就是實(shí)際優(yōu)化的目標(biāo)是響應(yīng)圖中心的點(diǎn),所以越高層的可視化圖像越大。
直接把某一類別的分?jǐn)?shù)作為優(yōu)化值可以得到關(guān)于該類別更直觀的可視化結(jié)果,比如下圖是這個工具包對幾個類別的可視化:
每個類別學(xué)到的視覺上的特征一目了然。另外注意到這種方法因?yàn)槭腔趦?yōu)化,所以每次優(yōu)化的結(jié)果會有不同。
借助這種可視化,我們能夠分析出網(wǎng)絡(luò)是不是真的學(xué)習(xí)到了我們希望其所學(xué)的特征,比如Google的Research Blog中提到過啞鈴的例子:
可視化的類別是啞鈴,可是結(jié)果里包含了一些我們不希望出現(xiàn)的元素:胳膊。這是因?yàn)橛糜谟?xùn)練的啞鈴圖片中,大都有握著啞鈴的胳膊。
可視化網(wǎng)絡(luò)的方法有很多,以簡單粗暴為最大特點(diǎn)的大概只是activation maximization。
對抗樣本也是機(jī)器學(xué)習(xí)中的一種常用概念,通常指人為制造的,讓一個機(jī)器學(xué)習(xí)模型發(fā)生錯誤的樣本。Anh Nguyen的論文《Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images》中有個比較形象的示意:
要理解這個圖,還要提一句機(jī)器學(xué)習(xí)的一個基本問題:學(xué)習(xí)數(shù)據(jù)的分布。具體到方法就是從訓(xùn)練數(shù)據(jù)中進(jìn)行學(xué)習(xí),如果學(xué)習(xí)成功,則可以泛化到所有數(shù)據(jù),包含沒見過的測試數(shù)據(jù)。回到這個圖,數(shù)據(jù)的分布就是最上邊那三坨。一種造對抗樣本的方法就是從一個類別的樣本出發(fā),做一些小修改,讓模型將修改后的樣本判斷為另一個類別,而實(shí)際上(或是人的,顯然的判斷)該樣本仍為原來類別,這就是圖中從藍(lán)色原點(diǎn)到白色小方塊的方法。
當(dāng)然更容易的方法是利用分類邊界的不可確定性。比如上圖中除了最上面部分的空間可以認(rèn)為是數(shù)據(jù)存在概率極低的區(qū)域,從實(shí)際應(yīng)用的角度甚至可以認(rèn)為是我們完全不關(guān)心的區(qū)域。因?yàn)樗惴▽W(xué)習(xí)的樣本只有實(shí)心的小圓點(diǎn),所以遠(yuǎn)離小圓點(diǎn)的部分,分類邊界是難以控制的。在這里面很容易輕松取到算法高概率認(rèn)為是一個類別的樣本,而實(shí)際上卻難以辨認(rèn)的對抗性樣本。
所以大體來說,對抗性樣本的存在是因?yàn)閿?shù)據(jù)維度通常過高,即使考慮所在的子區(qū)域,往往還是過高,對整個(數(shù)據(jù)分布的)空間的搜索是不可行的。在訓(xùn)練樣本沒有覆蓋的區(qū)域,無論該區(qū)域是否屬于數(shù)據(jù)分布所在的區(qū)域,無論模型的capacity夠不夠,都有出現(xiàn)對抗性樣本的可能。盡管深度學(xué)習(xí)中一直主張distributed representation已大幅優(yōu)于局部泛化,維度的詛咒仍是一個無法擺脫的難題。
具體到CNN,下邊這個例子可能不少人見過:
熊貓的圖片上加上一個人眼難以察覺的噪音,對于人眼而言看上去還是熊貓,可是對于一個CNN而言,右邊的圖片以99%高概率被判斷為了長臂猿。上句話其實(shí)已經(jīng)很清楚地指出了得到右邊圖片的方法,還是一個優(yōu)化輸入圖像的問題:加上一個盡量小的噪音,并通過優(yōu)化這個噪音,讓優(yōu)化后的圖像具有另一個類別的高概率:
其中n是要求的噪音,α 是相應(yīng)的系數(shù),L是x+n屬于某個類別的loss,c是某個錯誤類別的標(biāo)簽。這大概是基于深度學(xué)習(xí)的計(jì)算機(jī)視覺中第一個討論造對抗樣本的方法,見于Christian Szegedy的論文《Intriguing properties of neural networks》。同樣是在這篇論文中,Christian描述了一個比較令人擔(dān)憂的發(fā)現(xiàn):就是這種樣本居然可以泛化,同一個對抗樣本,對于不同的CNN結(jié)構(gòu),在不同數(shù)據(jù)子集下訓(xùn)練的模型,是可以達(dá)到一定程度的“通用”性的。也就是說對于一些涉及到安全的應(yīng)用,攻擊者即使不知道部署的模型是什么,通過某種手段猜測數(shù)據(jù)的分布,也是可以得到有效的攻擊樣本的。
對于CNN,有個很基礎(chǔ)的認(rèn)識:低層的部分學(xué)習(xí)紋理等簡單信息,高層部分學(xué)習(xí)語義信息。在《Intriguing properties of neural networks》中的另一個發(fā)現(xiàn)是,CNN中表示高層學(xué)習(xí)到的語義信息的,并不是某一個神經(jīng)元,而是高層神經(jīng)元構(gòu)成的空間。這個看上去有些顯然的結(jié)論的一種佐證方式又是對輸入圖像進(jìn)行優(yōu)化:
其中 Φ(x) 是神經(jīng)元激活值對應(yīng)的向量,v是一個隨機(jī)向量。另外這和前邊的優(yōu)化有些許不同,x的取值范圍限定在已有的圖片集里。其實(shí)就是在某個高層響應(yīng)的空間里,沿著某個方向挑選了一些該方向上值最大的圖片。最后的結(jié)論是,無論是沿著某個隨機(jī)方向找到的圖片,還是以某一個神經(jīng)元響應(yīng)最大找到的圖片,都能看出一些語義上的共性,比如下圖:
黑線以上是最大化某個神經(jīng)元響應(yīng)的樣本,共性挺明顯,黑線以下是最大化某層特征空間中某個方向響應(yīng)的樣本,共性也挺明顯。
很多人小時候都有這樣的經(jīng)歷:抬頭看天空的云彩,或是觀察地面的紋路,甚至是凝視廁所里臟兮兮的墻面,這時候看到的卻是各種機(jī)器人大戰(zhàn),武打畫面,或是動畫片中的人物和故事。
Deep Dream和這很像,輸入任何一幅圖像,都會得到在不同層的響應(yīng),前面已經(jīng)提到過,低層的響應(yīng)是紋理和細(xì)節(jié)的相應(yīng),高層的響應(yīng)是語義信息的響應(yīng)。所以Deep Dream的思想是:
對于某個高層的得到的語義信息響應(yīng),加強(qiáng)這些信息。這相當(dāng)于讓網(wǎng)絡(luò)自己決定從輸入圖像中“看到”了什么,并把“看到”的東西加強(qiáng),所以又是一個優(yōu)化問題。
要優(yōu)化的目標(biāo),就是最大化輸入圖像在某個高層已有的響應(yīng),優(yōu)化的初始值就是輸入圖像,當(dāng)然還有一些其他項(xiàng),比如不同的包含不同尺度,或是抑制梯度及高頻成分的約束,這些是否加上視情況而定。這并不是一個典型的優(yōu)化問題,反而更像是一個單純的梯度下降問題,所以梯度下降通常也不會進(jìn)行到底,而是進(jìn)行若干步直到輸入圖像中出現(xiàn)一個“夢境”。下面是TensorFlow的官方tutorial里,Inception模型在一幅圖片上生成的夢境:
基于Inception的DeepDream有個特點(diǎn),就是夢境里的狗很多,就像上面這幅圖一樣。
在電影《Inception》里,夢境是可以操控的,DeepDream也可以,按照可視化中的思路,把優(yōu)化目標(biāo)換成某一層響應(yīng)圖中的某個channel,這就是一個傳統(tǒng)的優(yōu)化問題了:
和第一部分中的差別在于初始化的是一幅圖像,并且優(yōu)化不會進(jìn)行到底。比如一個對花朵一樣圖案敏感的channel,對應(yīng)的夢境里畫面中就會開滿了花:
其實(shí)那些隱藏在白云里和墻上的圖案,長大后也是能看到的,只不過大多數(shù)人不看了。
2016年,如果要評選一款和神經(jīng)網(wǎng)絡(luò)相關(guān)的最火爆的APP,一定非Prisma莫屬。其背后的算法,也是對輸入圖像的優(yōu)化。關(guān)于神經(jīng)網(wǎng)絡(luò)的藝術(shù)風(fēng)格學(xué)習(xí),首先要追溯到更早的一篇利用優(yōu)化輸入方法的論文《Understanding Deep Image Representations by Inverting Them》,里面討論的問題之一是通過優(yōu)化算法和神經(jīng)網(wǎng)絡(luò)中的特征重建一幅圖像:
其中Φ0是某幅圖像在網(wǎng)絡(luò)中的特征,這個特征可以是部分層的響應(yīng),或者全部的響應(yīng)。如果Φ0取低層的特征,那么細(xì)節(jié)的還原度就會很好,如果Φ0是高層的特征,則畫面中的紋理和細(xì)節(jié)會丟失很多信息。比如下面的圖像:
用Vgg16模型執(zhí)行一遍前向計(jì)算,然后分別取relu1~relu5的特征作為 Φ0,重建的結(jié)果如下:
在基于神經(jīng)網(wǎng)絡(luò)的圖像風(fēng)格藝術(shù)化中,通常的輸入是一幅原始圖像,經(jīng)過處理具有了其他畫面,比如一幅油畫的藝術(shù)風(fēng)格。所以是原始圖像的內(nèi)容+其他圖像的風(fēng)格,那么上面討論的部分就是內(nèi)容的重建,所以接下來要討論的是風(fēng)格的重建。
圖像風(fēng)格其實(shí)是個很難定義的東西,不過在神經(jīng)網(wǎng)絡(luò)中,談到風(fēng)格,一般指的是紋理。紋理的特點(diǎn)是什么呢?又是一個很難定義的東西……不過紋理有個特點(diǎn)是和所在位置無關(guān),基于這個特點(diǎn),只要是和位置無關(guān)的統(tǒng)計(jì)信息,都可以試著來表示紋理的特征,Gram矩陣,就是在CNN中表示這種特征辦法的一種:
其中 Gl 代表第 l 層響應(yīng)圖對應(yīng)的Gram矩陣,F(xiàn)il 代表該層第 i 個卷積核對應(yīng)的響應(yīng)圖。通常一個響應(yīng)圖是二維的,這里把響應(yīng)圖展開為一個一維向量,其中 Fikl 代表該層第i個響應(yīng)圖的第k個元素。所以Gram矩陣的每一個元素就是求了個內(nèi)積,把兩個響應(yīng)圖之間,和位置無關(guān)的一種相關(guān)性給求了出來。
接下來的套路就和上一小節(jié)一樣了,把每層Gram矩陣作為特征,讓重建圖像的Gram矩陣盡量接近原圖的Gram矩陣,也是個優(yōu)化問題:
其中El是每一層的loss,wl是該層loss的權(quán)重。El的形式是考慮到每層響應(yīng)圖大小后的Gram矩陣差異:
同樣是用Vgg16,用不同層的特征,對梵高的星空進(jìn)行風(fēng)格重建,結(jié)果如下:
至于Gram矩陣為什么能作為重建風(fēng)格的依據(jù),論文《Demystifying Neural Style Transfer》(感謝 @Lyken 在評論中的分享)中給出了一個思路,是一個不錯的參考。比起原文中相關(guān)性的解釋,這篇論文更進(jìn)一步把Gram矩陣轉(zhuǎn)化成了squared Maximum Mean Discrepancy,這直接把圖像和CNN中響應(yīng)的分布聯(lián)系了起來,并且可以通過替換計(jì)算MMD的方式嘗試其他風(fēng)格重建的目標(biāo)計(jì)算方式。
總之,重建內(nèi)容和風(fēng)格的方法都已有,接下來就很自然了,把某個較高層的特征作為內(nèi)容重建的目標(biāo),同時把每層響應(yīng)的Gram矩陣以某個比例求和作為風(fēng)格的重建目標(biāo),對輸入圖像進(jìn)行優(yōu)化:
這就是論文《A Neural Algorithm of Artistic Style》中的方法,也是Prisma背后的算法。
雷鋒網(wǎng)相關(guān)閱讀:
卷積神經(jīng)網(wǎng)絡(luò)不能處理“圖”結(jié)構(gòu)數(shù)據(jù)?這篇文章告訴你答案
手把手教你用 TensorFlow 實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(附代碼)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。