4.10 風格代價函數-深度學習第四課《卷積神經網絡》-Stanford吳恩達教授

風格代價函數 (Style Cost Function)

在上節視頻中,我們學習瞭如何爲神經風格遷移定義內容代價函數,這節課我們來了解風格代價函數。那麼圖片的風格到底是什麼意思呢?

在這裏插入圖片描述

這麼說吧,比如你有這樣一張圖片,你可能已經對這個計算很熟悉了,它能算出這裏是否含有不同隱藏層。現在你選擇了某一層 l l (編號1),比如這一層去爲圖片的風格定義一個深度測量,現在我們要做的就是將圖片的風格定義爲 l l 層中各個通道之間**項的相關係數。

在這裏插入圖片描述

我來詳細解釋一下,現在你將 l l 層的**項取出,這是個 n H n W n c n_H*n_W*n_c 的**項,它是一個三維的數據塊。現在問題來了,如何知道這些不同通道之間**項的相關係數呢?

爲了解釋這些聽起來很含糊不清的詞語,現在注意這個**塊,我把它的不同通道渲染成不同的顏色。在這個例子中,假如我們有5個通道爲了方便講解,我將它們染成了五種顏色。一般情況下,我們在神經網絡中會有許多通道,但這裏只用5個通道,會更方便我們理解。

在這裏插入圖片描述

爲了能捕捉圖片的風格,你需要進行下面這些操作,首先,先看前兩個通道,前兩個通道(編號1、2)分別是圖中的紅色和黃色部分,那我們該如何計算這兩個通道間**項的相關係數呢?

在這裏插入圖片描述

舉個例子,在視頻的左下角在第一個通道中含有某個**項,第二個通道也含有某個**項,於是它們組成了一對數字(編號1所示)。然後我們再看看這個**項塊中其他位置的**項,它們也分別組成了很多對數字(編號2,3所示),分別來自第一個通道,也就是紅色通道和第二個通道,也就是黃色通道。現在我們得到了很多個數字對,當我們取得這兩個 n H n W n_H*n_W 的通道中所有的數字對後,現在該如何計算它們的相關係數呢?它是如何決定圖片風格的呢?

在這裏插入圖片描述

我們來看一個例子,這是之前視頻中的一個可視化例子,它來自一篇論文,作者是Matthew ZeileRob Fergus 我之前有提到過。我們知道,這個紅色的通道(編號1)對應的是這個神經元,它能找出圖片中的特定位置是否含有這些垂直的紋理(編號3),而第二個通道也就是黃色的通道(編號2),對應這個神經元(編號4),它可以粗略地找出橙色的區域。什麼時候兩個通道擁有高度相關性呢?如果它們有高度相關性,那麼這幅圖片中出現垂直紋理的地方(編號2),那麼這塊地方(編號4)很大概率是橙色的。如果說它們是不相關的,又是什麼意思呢?顯然,這意味着圖片中有垂直紋理的地方很大概率不是橙色的。而相關係數描述的就是當圖片某處出現這種垂直紋理時,該處又同時是橙色的可能性。

相關係數這個概念爲你提供了一種去測量這些不同的特徵的方法,比如這些垂直紋理,這些橙色或是其他的特徵去測量它們在圖片中的各個位置同時出現或不同時出現的頻率。

如果我們在通道之間使用相關係數來描述通道的風格,你能做的就是測量你的生成圖像中第一個通道(編號1)是否與第二個通道(編號2)相關,通過測量,你能得知在生成的圖像中垂直紋理和橙色同時出現或者不同時出現的頻率,這樣你將能夠測量生成的圖像的風格與輸入的風格圖像的相似程度。

在這裏插入圖片描述

現在我們來證實這種說法,對於這兩個圖像,也就是風格圖像與生成圖像,你需要計算一個風格矩陣,說得更具體一點就是用 l l 層來測量風格。

在這裏插入圖片描述

我們設 a i , j , k [ l ] a^{[l]}_{i,j,k} ,設它爲隱藏層 l l ( i , j , k ) (i,j,k) 位置的**項, i j k i,j,k 分別代表該位置的高度、寬度以及對應的通道數。現在你要做的就是去計算一個關於 l l 層和風格圖像的矩陣,即 G [ l ] S G^{[l]S} l l 表示層數, S S 表示風格圖像),這( G [ l ] S G^{[l]S} )是一個 n c n c n_c*n_c 的矩陣,同樣地,我們也對生成的圖像進行這個操作。

但是現在我們先來定義風格圖像,設這個關於 l l 層和風格圖像的, G G 是一個矩陣,這個矩陣的高度和寬度都是 l l 層的通道數。在這個矩陣中 k k k k' 元素被用來描述通道 k k k k' 通道之間的相關係數。具體地:

G k k [ l ] ( S ) = i = 1 n H [ l ] j = 1 n W [ l ] a i , j , k [ l ] ( S ) a i , j , k [ l ] ( S ) G^{[l](S)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](S)}_{i,j,k}a^{[l](S)}_{i,j,k'}

用符號 i j i,j 表示下界,對 i j k i,j,k 位置的**項 a i , j , k [ l ] a^{[l]}_{i,j,k} ,乘以同樣位置的**項,也就是 i j k i,j,k' 位置的**項,即 a i , j , k [ l ] a^{[l]}_{i,j,k'} ,將它們兩個相乘。然後 i i j j 分別加到 l l 層的高度和寬度,即 n H [ l ] n_H^{[l]} n W [ l ] n_W^{[l]} ,將這些不同位置的**項都加起來。 ( i , j , k ) (i,j,k) ( i , j , k ) (i,j,k') x x 座標和 y y 座標分別對應高度和寬度,將 k k 通道和 k k' 通道上這些位置的**項都進行相乘。我一直以來用的這個公式,嚴格來說,它是一種非標準的互相關函數,因爲我們沒有減去平均數,而是將它們直接相乘。

在這裏插入圖片描述

這就是輸入的風格圖像所構成的風格矩陣,然後,我們再對生成圖像做同樣的操作。

G k k [ l ] ( G ) = i = 1 n H [ l ] j = 1 n W [ l ] a i , j , k [ l ] ( G ) a i , j , k [ l ] ( G ) G^{[l](G)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](G)}_{i,j,k}a^{[l](G)}_{i,j,k'}

a i , j , k [ l ] ( S ) a^{[l](S)}_{i,j,k} a i , j , k [ l ] ( G ) a^{[l](G)}_{i,j,k} 中的上標 ( S ) (S) ( G ) (G) 分別表示在風格圖像 S S 中的**項和在生成圖像 G G 的**項。我們之所以用大寫字母 G G 來代表這些風格矩陣,是因爲在線性代數中這種矩陣有時也叫Gram矩陣,但在這裏我只把它們叫做風格矩陣。

所以你要做的就是計算出這張圖像的風格矩陣,以便能夠測量出剛纔所說的這些相關係數。更正規地來表示,我們用 a i , j , k [ l ] a^{[l]}_{i,j,k} 來記錄相應位置的**項,也就是 l l 層中的 i , j , k i,j,k 位置,所以 i i 代表高度, j j 代表寬度, k k 代表着 l l 中的不同通道。之前說過,我們有5個通道,所以 k k 就代表這五個不同的通道。

對於這個風格矩陣,你要做的就是計算這個矩陣也就是 G [ l ] G^{[l]} 矩陣,它是個 n c n c n_c*n_c 的矩陣,也就是一個方陣。記住,因爲這裏有 n c n_c 個通道,所以矩陣的大小是 n c n c n_c*n_c 。以便計算每一對**項的相關係數,所以 G k k [ l ] G^{[l]}_{kk'} 可以用來測量 k k 通道與 k k' 通道中的**項之間的相關係數, k k k k' 會在1到 n c n_c 之間取值, n c n_c 就是 l l 層中通道的總數量。

在這裏插入圖片描述

當在計算 G [ l ] G^{[l]} 時,我寫下的這個符號(下標 k k kk' )只代表一種元素,所以我要在右下角標明是 k k kk' 元素,和之前一樣, i , j i,j 從一開始往上加,對應 ( i , j , k ) (i,j,k) 位置的**項與對應 ( i , j , k ) (i,j,k') 位置的**項相乘。記住,這個 i i j j 是**塊中對應位置的座標,也就是該**項所在的高和寬,所以 i i 會從1加到 n H [ l ] n_H^{[l]} j j 會從1加到 n W [ l ] n_W^{[l]} k k k k' 則表示對應的通道,所以 k k k k' 值的範圍是從1開始到這個神經網絡中該層的通道數量 n C [ l ] n_C^{[l]} 。這個式子就是把圖中各個高度和寬度的**項都遍歷一遍,並將 k k k k' 通道中對應位置的**項都進行相乘,這就是 G k k [ l ] G^{[l]}_{kk'} 的定義。通過對 k k k k' 通道中所有的數值進行計算就得到了 G G 矩陣,也就是風格矩陣。

G k k [ l ] = i = 1 n H [ l ] j = 1 n W [ l ] a i , j , k [ l ] a i , j , k [ l ] G^{[l]}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l]}_{i,j,k}a^{[l]}_{i,j,k'}

要注意,如果兩個通道中的**項數值都很大,那麼 G k k [ l ] G^{[l]}_{kk'} 也會變得很大,對應地,如果他們不相關那麼 G k k [ l ] G^{[l]}_{kk'} 就會很小。嚴格來講,我一直使用這個公式來表達直覺想法,但它其實是一種非標準的互協方差,因爲我們並沒有減去均值而只是把這些元素直接相乘,這就是計算圖像風格的方法。

在這裏插入圖片描述

G k k [ l ] ( S ) = i = 1 n H [ l ] j = 1 n W [ l ] a i , j , k [ l ] ( S ) a i , j , k [ l ] ( S ) G^{[l](S)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](S)}_{i,j,k}a^{[l](S)}_{i,j,k'}

你要同時對風格圖像 S S 和生成圖像 G G 都進行這個運算,爲了區分它們,我們在它的右上角加一個 ( S ) (S) ,表明它是風格圖像 S S ,這些都是風格圖像 S S 中的**項,之後你需要對生成圖像也做相同的運算。

G k k [ l ] ( G ) = i = 1 n H [ l ] j = 1 n W [ l ] a i , j , k [ l ] ( G ) a i , j , k [ l ] ( G ) G^{[l](G)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](G)}_{i,j,k}a^{[l](G)}_{i,j,k'}

和之前一樣,再把公式都寫一遍,把這些都加起來,爲了區分它是生成圖像,在這裏放一個 ( G ) (G)

在這裏插入圖片描述

現在,我們有2個矩陣,分別從風格圖像 S S 和生成圖像 G G

在這裏插入圖片描述

再提醒一下,我們一直使用大寫字母 G G 來表示矩陣,是因爲在線性代數中,這種矩陣被稱爲Gram矩陣,但在本視頻中我把它叫做風格矩陣,我們取了Gram矩陣的首字母 G G 來表示這些風格矩陣。

在這裏插入圖片描述

最後,如果我們將 S S G G 代入到風格代價函數中去計算,這將得到這兩個矩陣之間的誤差,因爲它們是矩陣,所以在這裏加一個 F F Frobenius範數,編號1所示),這實際上是計算兩個矩陣對應元素相減的平方的和,我們把這個式子展開,從 k k k k' 開始作它們的差,把對應的式子寫下來,然後把得到的結果都加起來,作者在這裏使用了一個歸一化常數,也就是 1 2 n H [ l ] n W [ l ] n c [ l ] \frac{1}{2n_H^{[l]}n_W^{[l]}n_c^{[l]}} ,再在外面加一個平方,但是一般情況下你不用寫這麼多,一般我們只要將它乘以一個超參數 β \beta 就行。

在這裏插入圖片描述

最後,這是對層定義的風格代價函數,和之前你見到的一樣,這是兩個矩陣間一個基本的Frobenius範數,也就是 S S 圖像和 G G 圖像之間的範數再乘上一個歸一化常數,不過這不是很重要。實際上,如果你對各層都使用風格代價函數,會讓結果變得更好。如果要對各層都使用風格代價函數,你可以這麼定義代價函數,把各個層的結果(各層的風格代價函數)都加起來,這樣就能定義它們全體了。我們還需要對每個層定義權重,也就是一些額外的超參數,我們用 λ [ l ] \lambda^{[l]} 來表示,這樣將使你能夠在神經網絡中使用不同的層,包括之前的一些可以測量類似邊緣這樣的低級特徵的層,以及之後的一些能測量高級特徵的層,使得我們的神經網絡在計算風格時能夠同時考慮到這些低級和高級特徵的相關係數。這樣,在基礎的訓練中你在定義超參數時,可以儘可能的得到更合理的選擇。

爲了把這些東西封裝起來,你現在可以定義一個全體代價函數:

J ( G ) = α J c o n t e n t ( C , G ) + β J s t y l e ( S , G ) J(G)=\alpha J_{content}(C,G)+\beta J_{style}(S,G)

之後用梯度下降法,或者更復雜的優化算法來找到一個合適的圖像 G G ,並計算 J ( G ) J(G) 的最小值,這樣的話,你將能夠得到非常好看的結果,你將能夠得到非常漂亮的結果。

這節神經風格遷移的內容就講到這裏,希望你能愉快地在本週的基礎訓練中進行實踐。在本週結束之前,還有最後一節內容想告訴你們,就是如何對1D和3D的數據進行卷積,之前我們處理的都是2D圖片,我們下節視頻再見。

課程板書

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述