吳恩達 DeepLearning.ai 課程提煉筆記(4-4)卷積神經網路 --- 人臉識別和神經風格遷移

Ng卷積神經網路部分,完結撒花!以下為在Coursera上吳恩達老師的 deeplearning.ai 課程項目中,第四部分《卷積神經網路》第四周課程「特殊應用:人臉識別和神經風格遷移」關鍵點的筆記。本次筆記幾乎涵蓋了所有視頻課程的內容。在閱讀以下筆記的同時,強烈建議學習吳恩達老師的視頻課程,視頻請至 Coursera 或者 網易雲課堂。


Part 1:人臉識別

1. 人臉驗證和人臉識別

人臉驗證(Verification):

  • Input:圖片、名字/ID;
  • Output:輸入的圖片是否是對應的人;
  • 1 to 1 問題。

人臉識別(Recognition):

  • 擁有一個具有K個人的資料庫;
  • 輸入一副人臉圖片;
  • 如果圖片是任意這K個人中的一位,則輸出對應人的ID。

人臉識別問題對於人臉驗證問題來說,具有更高的難度。如對於一個驗證系統來說,如果我們擁有 99% 的精確度,那麼這個驗證系統已經具有了很高的精度;但是假設在另外一個識別系統中,如果我們把這個驗證系統應用在具有K個人的識別系統中,那麼系統犯錯誤的機會就變成了K倍。所以如果我們想在識別系統中得到更高的精度,那麼就需要得到一個具有更高精度的驗證系統。

2. one shot learning

對於大多數的人臉識別系統都存在的一個問題就是one shot learning。

什麼是 one shot learning:

對於一個人臉識別系統,我們需要僅僅通過先前的一張人臉的圖片或者說一個人臉的樣例,就能夠實現該人的識別,那麼這樣的問題就是 one shot 問題。對於存在於資料庫中的人臉圖片,系統能夠識別到對應的人;而不在資料庫中的人臉圖片,則系統給出無法通過識別的結果。

對於one shot learning 問題,因為只有單個樣本,是不足以訓練一個穩健的卷積神經網路來進行不同人的識別過程。而且,在有新的樣本成員加入的時候,往往還需要對網路進行重新訓練。所以我們不能以傳統的方法來實現識別系統。

Similarity 函數:

為了能夠讓人臉識別系統實現一次學習,需要讓神經網路學習 Similarity 函數:

  • d(img1, img2):兩幅圖片之間的差異度
  • 輸入:兩幅圖片
  • 輸出:兩者之間的差異度
  • 如果 d(img1, img2) leqslant tau ,則輸出「same」;

如果 d(img1, img2) > tau ,則輸出「different」.

對於人臉識別系統,通過將輸入的人臉圖片與資料庫中所擁有的圖片成對輸入Similarity函數,兩兩對比,則可解決one shot problem。如果有新的人加入團隊,則只需將其圖片添加至資料庫即可。

3. Siamese 網路

利用Siamese 網路來實現 Similarity 函數。

構建網路:

對於一個卷積神經網路結構,我們去掉最後的softmax層,將圖片樣本1輸入網路,最後由網路輸出一個N維的向量(圖中實例以128表示),這N維向量則代表輸入圖片樣本1的編碼。將不同人的圖片樣本輸入相同參數的網路結構,得到各自相應的圖片編碼。

Similarity 函數實現:

將Similarity 函數表示成兩幅圖片編碼之差的範數:

d(x1, x2) = ||f(x1)-f(x2)||_{2}^{2}

那麼也就是說:

  • 我們的神經網路的參數定義了圖片的編碼;
  • 學習網路的參數,使我們得到好的Similarity 函數:

t- 如果 x_{1},x_{2} 是同一個人的圖片,那麼得到的 ||f(x1)-f(x2)||^{2} 很小;

t- 如果 x_{1},x_{2} 不是同一個人的圖片,那麼得到的 ||f(x1)-f(x2)||^{2} 很大。

4. Triplet 損失

如何通過學習神經網路的參數,得到優質的人臉圖片的編碼?方法之一就是定義 Triplet 損失函數,並在其之上運用梯度下降。

學習目標:

為了使用Triplet 損失函數,我們需要比較成對的圖像(三元組術語):

  • Anchor (A): 目標圖片;
  • Positive(P):與Anchor 屬於同一個人的圖片;
  • Negative(N):與Anchor不屬於同一個人的圖片。

對於Anchor 和 Positive,我們希望二者編碼的差異小一些;對於Anchor 和Negative,我們希望他們編碼的差異大一些。所以我們的目標以編碼差的範數來表示為:

d(A,P)=||f(A) - f(P)||^{2} leqslant ||f(A) - f(N)||^{2} = d(A,N)

也就是:

||f(A) - f(P)||^{2} - ||f(A) - f(N)||^{2} leqslant 0

上面的公式存在一個問題就是,當 f(A)=f(P)=f(N)=0 時,也就是神經網路學習到的函數總是輸出0時,或者 f(A)=f(P)=f(N) 時,也滿足上面的公式,但卻不是我們想要的目標結果。所以為了防止出現這種情況,我們對上式進行修改,使得兩者差要小於一個較小的負數:

||f(A) - f(P)||^{2} - ||f(A) - f(N)||^{2} leqslant - alpha

一般將 alpha 寫成 +alpha ,稱為「margin」,即:

||f(A) - f(P)||^{2} - ||f(A) - f(N)||^{2} + alpha leqslant 0

不同 margin 值的設置對模型學習具有不同的效果,margin 的作用就是拉大了 Anchor與Positive 圖片對 和 Anchor與Negative 圖片對之間的差距。

Triplet 損失函數:

Triplet 損失函數的定義基於三張圖片:Anchor、Positive、Negative。

L(A,P,N) = max (||f(A) - f(P)||^{2} - ||f(A) - f(N)||^{2} + alpha,  0)

整個網路的代價函數:

J = sumlimits_{i=1}^{m}L(A^{(i)},P^{(i)},N^{(i)})

假設我們有一個10000張片的訓練集,裡面是1000個不同的人的照片樣本。我們需要做的就是從這10000張訓練集中抽取圖片生成(A,P,N)的三元組,來訓練我們的學習演算法,並在Triplet 損失函數上進行梯度下降。

注意:為了訓練我們的網路,我們必須擁有Anchor和Positive對,所以這裡我們必須有每個人的多張照片,而不能僅僅是一張照片,否則無法訓練網路。

三元組(A,P,N)的選擇:

在訓練的過程中,如果我們隨機地選擇圖片構成三元組(A,P,N),那麼對於下面的條件是很容易滿足的:

d(A,P) + alpha leqslant d(A,N)

所以,為了更好地訓練網路,我們需要選擇那些訓練有「難度」的三元組,也就是選擇的三元組滿足:

d(A,P) approx d(A,N)

  • 演算法將會努力使得 d(A,N) 變大,或者使得 d(A,N) + alpha 變小,從而使兩者之間至少有一個 alpha 的間隔;
  • 增加學習演算法的計算效率,避免那些太簡單的三元組。

最終通過訓練,我們學習到的參數,會使得對於同一個人的圖片,編碼的距離很小;對不同人的圖片,編碼的距離就很大。

對於大型的人臉識別系統,常常具有上百萬甚至上億的訓練數據集,我們並我容易得到。所以對於該領域,我們常常是下載別人在網上上傳的預訓練模型,而不是從頭開始。

5. 臉部驗證和二分類

除了利用 Triplet 損失函數來學習人臉識別卷積網路參數的方法外,還有其他的方式。我們可以將人臉識別問題利用Siamese網路當成一個二分類問題,同樣可以實現參數的學習。

Siamese 二分類改進:

對兩張圖片應用Siamese 網路,計算得到兩張圖片的N維編碼,然後將兩個編碼輸入到一個logistic regression 單元中,然後進行預測。如果是相同的人,那麼輸出是1;如果是不同的人,輸出是0。那麼這裡我們就將人臉識別的問題,轉化為一個二分類問題。

對於最後的sigmoid函數,我們可以進行如下計算:

hat y = sigma(sumlimits_{k=1}^{N} w_{i}|f(x^{(i)})_{k} - f(x^{(j)})_{k} | + b)

其中, f(x^{(i)}) 代表圖片 x^{(i)} 的編碼,下標 k 代表選擇N維編碼向量中的第 k 個元素。

我們以兩個圖片編碼向量對應元素之間的差值作為特徵輸入到logistic regression 的單元中,增加參數 w_{i}b ,通過訓練得到合適的參數權重和偏置,進而判斷兩張圖片是否為同一個人。

同時輸入邏輯回歸單元的特徵可以進行更改,如還可以是:

dfrac{(f(x^{(i)})_{k} - f(x^{(j)})_{k})^{2}}{f(x^{(i)})_{k} + f(x^{(j)})_{k}}

上式也被稱為 chi 方公式,有時也稱為 chi 方相似度。

在實際的人臉驗證系統中,我們可以對資料庫的人臉圖片進行預計算,存儲卷積網路得到的編碼。當有圖片進行識別時,運用卷積網路計算新圖片的編碼,與預計算保存好的編碼輸入到邏輯回歸單元中進行預測。這樣可以提高我們系統預測的效率,節省計算時間。

總結:

利用Siamese 網路,我們可以將人臉驗證當作一個監督學習,創建成對的訓練集和是否同一個人的輸出標籤。

我們利用不同的圖片對,使用反向傳播的演算法對Siamese網路進行訓練,進而得到人臉驗證系統。


Part 2:神經風格遷移

6. 深度網路學習內容可視化

如何可視化:

假設我們訓練了一個卷積神經網路如下所示:

我們希望看到不同層的隱藏單元的計算結果。依次對各個層進行如下操作:

  • 在當前層挑選一個隱藏單元;
  • 遍歷訓練集,找到最大化地激活了該運算單元的圖片或者圖片塊;
  • 對該層的其他運算單元執行操作。

對於在第一層的隱藏單元中,其只能看到卷積網路的小部分內容,也就是最後我們找到的那些最大化激活第一層隱層單元的是一些小的圖片塊。我們可以理解為第一層的神經單元通常會尋找一些簡單的特徵,如邊緣或者顏色陰影等。

各層網路可視化:

對於卷積網路的各層單元,隨著網路深度的增加,隱藏層計算單元隨著層數的增加,從簡單的事物逐漸到更加複雜的事物。

7. 神經風格遷移代價函數

代價函數:

為了實現神經風格遷移,我們需要為生成的圖片定義一個代價函數。

對於神經風格遷移,我們的目標是由內容圖片C和風格圖片S,生成最終的風格遷移圖片G:

所以為了實現神經風格遷移,我們需要定義關於G的代價函數J,以用來評判生成圖片的好壞:

J(G) = alpha J_{content}(C, G) + beta J_{style}(S,G)

其中

  • J_{content}(C, G) 代表生成圖片G的內容和內容圖片C的內容的相似度;
  •  J_{style}(S,G) 代表生成圖片G的內容和風格圖片S的內容的相似度;
  • alpha、beta 兩個超參數用來表示以上兩者之間的權重。

執行過程:

  • 隨機初始化生成圖片G,如大小為 100times100times3
  • 使用梯度下降演算法最小化上面定義的代價函數 J(G), G:= G - dfrac{partial}{partial G}J(G)

對於上圖的內容圖片C和風格圖片S,通過梯度下降演算法一次次的徐訓練,我們可以由初始的雜訊圖片得到最終的風格遷移圖片G。

8. 內容代價函數(Content cost)

  • 假設我們使用隱藏層 l 來計算內容代價。(如果選擇的$l$ 太小,那麼代價函數就會使得我們的生成圖片G在像素上非常接近內容圖片;然而用很深的網路,那麼生成圖片G中就會產生與內容圖片中所擁有的物體。所以對於 l 一般選在網路的中間層,既不深也不淺);
  • 使用一個預訓練的卷積網路。(如,VGG或其他);
  • a^{[l](C)}a^{[l](G)} 分別代表內容圖片C和生成圖片G的 l 層的激活值;
  • 如果 a^{[l](C)}a^{[l](G)} 相似,那麼兩張圖片就有相似的內容;

定義內容代價函數如下:

J_{content}(C, G) = dfrac{1}{2}||a^{[l](C)} - a^{[l](G)} ||^{2}

在對代價函數運行梯度下降演算法時,會激勵這裡的內容代價函數,努力使得生成圖片G隱含層l 的激活值和內容圖片C隱含層l 的激活值相似。

9. 風格代價函數(Style cost)

「Style」的含義:

對於一個卷積網路中,我們選擇網路的中間層 l , 定義「Style」表示  l 層的各個通道激活項之間的相關性。

相關性大小的度量:

上面是我們選出的 l 層的激活項,對於不同的通道值,代表不同的神經元所學習到的特徵,這裡假如紅色的通道可以找到圖片中含有垂直紋理特徵的區域,黃色通道可以找出橙色的區域。

而相關性大小的含義就是,如假設中,圖片出現垂直紋理特徵的區域顯示橙色可能的大小。

我們將相關係數應用到風格圖片S和生成圖片G的對應通道上,就可以度量風格圖片和生成圖片的相似度。

Style 矩陣:

  • a^{[l]}_{i,j,k} 表示在(i,j,k)位置的激活值,其中i、j、k分別代表激活值的高、寬、通道;
  • G^{[l]} 是一個 n_{c}^{l}times n_{c}^{l} 大小的矩陣:

G^{[l](S)}_{kk} = sumlimits_{i=1}^{n_{h}^{[l]}}sumlimits_{j=1}^{n_{w}^{[l]}}a^{[l](S)}_{i,j,k}a^{[l](S)}_{i,j,k}

G^{[l](G)}_{kk} = sumlimits_{i=1}^{n_{h}^{[l]}}sumlimits_{j=1}^{n_{w}^{[l]}}a^{[l](G)}_{i,j,k}a^{[l](G)}_{i,j,k}

上面的矩陣在線性代數中又稱為Gram 矩陣,這裡稱為風格矩陣。

代價函數:

J^{[l]}_{style}(S, G) = dfrac{1}{2n^{[l]}_{h}n^{[l]}_{w}n^{[l]}_{c}}||G^{[l](S)} - G^{[l](G)} ||^{2}_{F} = dfrac{1}{2n^{[l]}_{h}n^{[l]}_{w}n^{[l]}_{c}}sum_{k}sum_{k}(G^{[l](S)}_{kk} - G^{[l](G)}_{kk})^{2}

內容代價函數和風格代價函數前面的歸一化可以加也可以不加,因為總體的代價函數前面有權重係數。

如果對各層都使用風格代價函數,那麼會讓結果變得更好:

J_{style}(S,G) = sum_{l}lambda^{[l]}J_{style}^{[l]}(S,G)

10. 1D to 3D 卷積

在我們上面學過的卷積中,多數是對圖形應用2D的卷積運算。同時,我們所應用的卷積運算還可以推廣到1D和3D的情況。

2D和1D卷積:

  • 2D卷積: 14times14times3* 5times5times3 ——>10times10times n_{c} ;
  • 1D卷積: 14times1* 5times1 ——>10times n_{c}

3D卷積:

  • 3D卷積: 14times14times14times1 * 5times5times5times1——>10times10times10times n_{c}
  • 3D數據:如醫療CT掃描中的即可產生身體的3D模型;電影切片也屬於3D數據。

本文將同時更新在我的CSDN博客

吳恩達Coursera深度學習課程 DeepLearning.ai 提煉筆記(4-4)-- 特殊應用:人臉識別和神經風格遷移

歡迎關注,一起學習一起進步喲。^_^


推薦閱讀:

【論文簡評】人臉關鍵點檢測
人臉識別的美麗神話
40行代碼的人臉識別實踐
人臉活體檢測技術簡介
人臉解鎖的前世今生

TAG:人工智能 | 深度学习DeepLearning | 人脸识别 |