人臉識別(Face recognization)
人臉識別和人臉驗證(Face verification)在本課中的區(qū)別是人臉識別是對應一個輸入與多個可能的目標值的對應,例如輸入一張圖片,與數(shù)據(jù)庫中的圖片進行對比,從而輸出與數(shù)據(jù)庫中相匹配的照片的姓名;而人臉驗證則是一個輸入與一個輸出之間的對應,例如輸入一張圖片和姓名,輸出照片是否和姓名對應的判斷結果。由于對于準確率要求更高,因此識別問題比驗證問題更加困難。
One-shot 學習
人臉識別問題中一個重要的挑戰(zhàn)是需要系統(tǒng)根據(jù)存儲在數(shù)據(jù)庫中的一張照片來判斷新的輸入是否與已有數(shù)據(jù)匹配。由于不能把同一個人的多張不同角度的照片作為輸入信息來進行對比,因此系統(tǒng)需要學習一個函數(shù)關系來使得其能在少量數(shù)據(jù)的情況下表現(xiàn)出色。在這里可以定義一個“相似度”函數(shù) d(img1, img2) 用以衡量兩張照片的差異程度,當 d(img1, img2) ≤ τ 時可以認為兩張圖片上的人的身份相符,反之亦然,這里 τ 是一個超參數(shù)。
Siamese 網(wǎng)絡
Siamese 的實現(xiàn)原理是通過訓練使得網(wǎng)絡可以將輸入照片編碼輸出為一個向量,再將兩張不同的照片輸入由同一套參數(shù)構建的網(wǎng)絡后將輸出向量進行對比。例如對于兩張輸入照片 x(1)、x(2),對應的網(wǎng)絡輸出是 f(x(1))、f(x(2)),則 d(x(1), x(2)) 可以定義為 ||f(x(1)) - f(x(2)) ||22,用這個量的大小來衡量兩張照片是否是同一個人。
Triplet 損失函數(shù)
為了可以通過相似度 d 的大小來進行人臉識別,網(wǎng)絡的損失函數(shù)定義方法之一是采用 Triplet 損失函數(shù):假設對于同一個基準輸入,在這里稱為 Anchor,將與之匹配的輸入定義為 Positive,而對于與之不匹配的輸入則定義為 Negative,由于對于一組照片來說總是同時考慮三個輸入,所以稱作 Triplet。
由于在網(wǎng)絡訓練過程中我們希望 ||f(A) - f(p)||22 - ||f(A) - f(N)||22 ≤ 0,即基準和匹配照片的差異值應該小于基準和不匹配照片的差異值,但如果網(wǎng)絡通過訓練將上式各項均設為 0 ,則結果也滿足要求。因此可以定義一個超參數(shù) α,稱為誤差限(margin),使得 ||f(A) - f(p)||22 + α - ||f(A) - f(N)||22 ≤ 0,即希望基準和匹配照片的差異值與基準和不匹配照片的差異值應至少為 α。
一個 Triplet 輸入的損失函數(shù)可以定義為:
L(A, P, N) = max(||f(A) - f(p)||22 - ||f(A) - f(N)||22 + α, 0)
訓練集的成本函數(shù)為:
J = ∑ L(A(i), P(i), N(i)),其中 i = 1, 2, 3,...,m
在實際訓練中,訓練數(shù)據(jù)集中的 (A,P,N) 對一般有多個,例如提供 10,000 張包含 1000 個個體的照片,而如果隨機選擇這些配對則有可能誤差限 α 非常容易滿足,因此需要在訓練中選擇比較難的配對方式。
二分法人臉識別
人臉識別實現(xiàn)中還可以通過一個 siamese 網(wǎng)絡來將兩張不同的照片輸入編碼成為向量后轉換成二分問題,即相同取 1,不同取 0,此時的輸出會變成:
? = σ( ∑wi |f(x(i)k - f(x(j)k| + b), 其中 k 為特征向量的第 k 個元素,i, j 為兩個不同的輸入
上式中的相應元素之差的絕對值部分還可以變成 (f(x(i)k - f(x(j)k)2 / (f(x(i)k + f(x(j)k)
風格遷移
近幾年比較流行的一個有趣的應用是使用神經(jīng)網(wǎng)絡來進行圖畫作品的風格遷移,而想要深刻理解和實施風格遷移就需要了解卷積神經(jīng)網(wǎng)絡每一個隱含層所學習到的內(nèi)容。直觀的理解就是神經(jīng)網(wǎng)絡隨著層次的深入,其所能識別的模式愈加復雜,在初期只能識別簡單的線條,而到了后期則可以逐漸識別一個完整的圖片。
在實施風格遷移時,其成本函數(shù)的定義過程為:
將需要做遷移的圖片用 C, Content 來表示,而風格的來源則用 S, Style 表示,最終生成的圖片用 G,Generated 來表示
風格遷移的成本函數(shù)定義為 J(G) = α * Jcontent(C, G) + β * Jstyle(S, G),其中前半部分衡量兩張圖片內(nèi)容的相似度,后半部分衡量兩張圖片風格的相似度,α, β 為各自的權重
考慮到神經(jīng)網(wǎng)絡各層對于圖片內(nèi)容的識別程度,因此一般選擇中間某層計算風格遷移的內(nèi)容成本部分,越往前則對內(nèi)容相似度要求越高。假設取在 l 層,如果內(nèi)容圖片和最終生成圖片的激活函數(shù)為 a[ l ](C)、a[ l ](G),則可以令 Jcontent(C, G) = ||a[ l ](C) - a[ l ](G)||22 通過比較兩個激活向量每一個元素的差異的平方和來判斷兩者內(nèi)容的相似度
圖片之間的風格比較則可以定義為不同通道間激活項的相關系數(shù),也即不同通道之間特征的相關性:令 ai,j,k[ l ] 指代在 l 層高度為 i, 寬度為 j,通道為 k 位置的激活項,則可以構造兩個 nC x nC 的風格矩陣 Gkk'[ l ](S) = ∑∑ai,j,k[ l ](S) ai,j,k'[ l ](S) 和 Gkk'[ l ](G) = ∑∑ai,j,k[ l ](G) ai,j,k'[ l ](G),其中 i = 1, 2, 3,...,nH,j = 1, 2, 3,...,nW,相應的成本函數(shù)則可以定義為 J[ l ]style(S, G) = ||Gkk'[ l ](S) - Gkk'[ l ](G)||22,在實際應用中為了使得最終的圖片更加美觀還可以進一步取多個層的成本函數(shù)的加和來進行風格比較 Jstyle(S, G) = ∑λ[ l ]J[ l ]style(S, G)