天天看點

雜談CNN:如何通過優化求解輸入圖像

很多機器學習方法可以歸結為優化問題,對于一個參數模型,比如神經網絡,用 y=f(x;θ) 來表示的話,訓練模型其實就是下面的參數優化問題:

雜談CNN:如何通過優化求解輸入圖像

其中 l 是loss function,比如神經網絡中分類常用的 cross-entropy。

特征(representation)。把原始圖像看做一個次元是像素×通道的向量,經過各種複雜的cnn結構,其實隻不過成了另一個向量。這個向量所在的空間也許有更好的線性可分性,也許是相似樣本的“距離”更近,原始的資料經過變換到了這裡之後,就是特征。

那麼有個問題來了,如何可視化一個cnn結構學到的特征呢?答案有很多,其中一種就是本文的主題:不再通過優化求解網絡的參數,而是求解輸入圖像。

優化網絡的輸入,是相對于“正統”的機器學習優化參數而言的。當一個cnn訓練完全後,我們可以固定好參數,把輸入作為可訓練的量,根據目的給定一個新的目标函數。

把這種方法最早用在深度學習裡大概是bengio組在2009年的一個tech report:《visualizing higher-layer features of a deep network》。文章裡提出了下面的優化問題

雜談CNN:如何通過優化求解輸入圖像
雜談CNN:如何通過優化求解輸入圖像

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

雜談CNN:如何通過優化求解輸入圖像
雜談CNN:如何通過優化求解輸入圖像
雜談CNN:如何通過優化求解輸入圖像

注意到這個可視化結果還考慮到了感受野,也就是實際優化的目标是響應圖中心的點,是以越高層的可視化圖像越大。

直接把某一類别的分數作為優化值可以得到關于該類别更直覺的可視化結果,比如下圖是這個工具包對幾個類别的可視化:

雜談CNN:如何通過優化求解輸入圖像

每個類别學到的視覺上的特征一目了然。另外注意到這種方法因為是基于優化,是以每次優化的結果會有不同。

借助這種可視化,我們能夠分析出網絡是不是真的學習到了我們希望其所學的特征,比如google的research blog中提到過啞鈴的例子:

雜談CNN:如何通過優化求解輸入圖像

可視化的類别是啞鈴,可是結果裡包含了一些我們不希望出現的元素:胳膊。這是因為用于訓練的啞鈴圖檔中,大都有握着啞鈴的胳膊。

可視化網絡的方法有很多,以簡單粗暴為最大特點的大概隻是activation maximization。

對抗樣本也是機器學習中的一種常用概念,通常指人為制造的,讓一個機器學習模型發生錯誤的樣本。anh nguyen的論文《deep neural networks are easily fooled: high confidence predictions for unrecognizable images》中有個比較形象的示意:

雜談CNN:如何通過優化求解輸入圖像

要了解這個圖,還要提一句機器學習的一個基本問題:學習資料的分布。具體到方法就是從訓練資料中進行學習,如果學習成功,則可以泛化到所有資料,包含沒見過的測試資料。回到這個圖,資料的分布就是最上邊那三坨。一種造對抗樣本的方法就是從一個類别的樣本出發,做一些小修改,讓模型将修改後的樣本判斷為另一個類别,而實際上(或是人的,顯然的判斷)該樣本仍為原來類别,這就是圖中從藍色原點到白色小方塊的方法。

當然更容易的方法是利用分類邊界的不可确定性。比如上圖中除了最上面部分的空間可以認為是資料存在機率極低的區域,從實際應用的角度甚至可以認為是我們完全不關心的區域。因為算法學習的樣本隻有實心的小圓點,是以遠離小圓點的部分,分類邊界是難以控制的。在這裡面很容易輕松取到算法高機率認為是一個類别的樣本,而實際上卻難以辨認的對抗性樣本。

是以大體來說,對抗性樣本的存在是因為資料次元通常過高,即使考慮所在的子區域,往往還是過高,對整個(資料分布的)空間的搜尋是不可行的。在訓練樣本沒有覆寫的區域,無論該區域是否屬于資料分布所在的區域,無論模型的capacity夠不夠,都有出現對抗性樣本的可能。盡管深度學習中一直主張distributed representation已大幅優于局部泛化,次元的詛咒仍是一個無法擺脫的難題。

具體到cnn,下邊這個例子可能不少人見過:

雜談CNN:如何通過優化求解輸入圖像

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

雜談CNN:如何通過優化求解輸入圖像
雜談CNN:如何通過優化求解輸入圖像

其中n是要求的噪音,α 是相應的系數,l是x+n屬于某個類别的loss,c是某個錯誤類别的标簽。這大概是基于深度學習的計算機視覺中第一個讨論造對抗樣本的方法,見于christian szegedy的論文《intriguing properties of neural networks》。同樣是在這篇論文中,christian描述了一個比較令人擔憂的發現:就是這種樣本居然可以泛化,同一個對抗樣本,對于不同的cnn結構,在不同資料子集下訓練的模型,是可以達到一定程度的“通用”性的。也就是說對于一些涉及到安全的應用,攻擊者即使不知道部署的模型是什麼,通過某種手段猜測資料的分布,也是可以得到有效的攻擊樣本的。

對于cnn,有個很基礎的認識:低層的部分學習紋理等簡單資訊,高層部分學習語義資訊。在《intriguing properties of neural networks》中的另一個發現是,cnn中表示高層學習到的語義資訊的,并不是某一個神經元,而是高層神經元構成的空間。這個看上去有些顯然的結論的一種佐證方式又是對輸入圖像進行優化:

雜談CNN:如何通過優化求解輸入圖像

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

雜談CNN:如何通過優化求解輸入圖像

黑線以上是最大化某個神經元響應的樣本,共性挺明顯,黑線以下是最大化某層特征空間中某個方向響應的樣本,共性也挺明顯。

很多人小時候都有這樣的經曆:擡頭看天空的雲彩,或是觀察地面的紋路,甚至是凝視廁所裡髒兮兮的牆面,這時候看到的卻是各種機器人大戰,武打畫面,或是卡通片中的人物和故事。

deep dream和這很像,輸入任何一幅圖像,都會得到在不同層的響應,前面已經提到過,低層的響應是紋理和細節的相應,高層的響應是語義資訊的響應。是以deep dream的思想是:

對于某個高層的得到的語義資訊響應,加強這些資訊。這相當于讓網絡自己決定從輸入圖像中“看到”了什麼,并把“看到”的東西加強,是以又是一個優化問題。

要優化的目标,就是最大化輸入圖像在某個高層已有的響應,優化的初始值就是輸入圖像,當然還有一些其他項,比如不同的包含不同尺度,或是抑制梯度及高頻成分的限制,這些是否加上視情況而定。這并不是一個典型的優化問題,反而更像是一個單純的梯度下降問題,是以梯度下降通常也不會進行到底,而是進行若幹步直到輸入圖像中出現一個“夢境”。下面是tensorflow的官方tutorial裡,inception模型在一幅圖檔上生成的夢境:

雜談CNN:如何通過優化求解輸入圖像
雜談CNN:如何通過優化求解輸入圖像

基于inception的deepdream有個特點,就是夢境裡的狗很多,就像上面這幅圖一樣。

在電影《inception》裡,夢境是可以操控的,deepdream也可以,按照可視化中的思路,把優化目标換成某一層響應圖中的某個channel,這就是一個傳統的優化問題了:

雜談CNN:如何通過優化求解輸入圖像

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

雜談CNN:如何通過優化求解輸入圖像

其實那些隐藏在白雲裡和牆上的圖案,長大後也是能看到的,隻不過大多數人不看了。

2016年,如果要評選一款和神經網絡相關的最火爆的app,一定非prisma莫屬。其背後的算法,也是對輸入圖像的優化。關于神經網絡的藝術風格學習,首先要追溯到更早的一篇利用優化輸入方法的論文《understanding deep image representations by inverting them》,裡面讨論的問題之一是通過優化算法和神經網絡中的特征重建一幅圖像:

雜談CNN:如何通過優化求解輸入圖像

其中Φ0是某幅圖像在網絡中的特征,這個特征可以是部分層的響應,或者全部的響應。如果Φ0取低層的特征,那麼細節的還原度就會很好,如果Φ0是高層的特征,則畫面中的紋理和細節會丢失很多資訊。比如下面的圖像:

雜談CNN:如何通過優化求解輸入圖像

用vgg16模型執行一遍前向計算,然後分别取relu1~relu5的特征作為 Φ0,重建的結果如下:

雜談CNN:如何通過優化求解輸入圖像

在基于神經網絡的圖像風格藝術化中,通常的輸入是一幅原始圖像,經過處理具有了其他畫面,比如一幅油畫的藝術風格。是以是原始圖像的内容+其他圖像的風格,那麼上面讨論的部分就是内容的重建,是以接下來要讨論的是風格的重建。

圖像風格其實是個很難定義的東西,不過在神經網絡中,談到風格,一般指的是紋理。紋理的特點是什麼呢?又是一個很難定義的東西……不過紋理有個特點是和所在位置無關,基于這個特點,隻要是和位置無關的統計資訊,都可以試着來表示紋理的特征,gram矩陣,就是在cnn中表示這種特征辦法的一種:

雜談CNN:如何通過優化求解輸入圖像

其中 gl 代表第 l 層響應圖對應的gram矩陣,fil 代表該層第 i 個卷積核對應的響應圖。通常一個響應圖是二維的,這裡把響應圖展開為一個一維向量,其中 fikl 代表該層第i個響應圖的第k個元素。是以gram矩陣的每一個元素就是求了個内積,把兩個響應圖之間,和位置無關的一種相關性給求了出來。

接下來的套路就和上一小節一樣了,把每層gram矩陣作為特征,讓重建圖像的gram矩陣盡量接近原圖的gram矩陣,也是個優化問題:

雜談CNN:如何通過優化求解輸入圖像

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

雜談CNN:如何通過優化求解輸入圖像

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

雜談CNN:如何通過優化求解輸入圖像

總之,重建内容和風格的方法都已有,接下來就很自然了,把某個較高層的特征作為内容重建的目标,同時把每層響應的gram矩陣以某個比例求和作為風格的重建目标,對輸入圖像進行優化:

雜談CNN:如何通過優化求解輸入圖像

這就是論文《a neural algorithm of artistic style》中的方法,也是prisma背後的算法。

====================================分割線================================

本文作者:ai研習社

繼續閱讀