深度學習筆記(44) Triplet 損失

深度學習筆記(44) Triplet 損失


1. 三元組損失函數

已經瞭解了Siamese網絡架構,並且知道想要網絡輸出什麼,即什麼是好的編碼
但是如何定義實際的目標函數
能夠讓神經網絡學習並做到 深度學習筆記(43) Siamese網絡 討論的內容呢?

要想通過學習神經網絡的參數來得到優質的人臉圖片編碼
方法之一就是:定義三元組損失函數然後應用梯度下降

在這裏插入圖片描述
爲了應用三元組損失函數,需要比較成對的圖像
比如這個圖片,爲了學習網絡的參數,需要同時看幾幅圖片
比如這對圖片(編號1和編號2),想要它們的編碼相似,因爲這是同一個人
然而假如是這對圖片(編號3和編號4),會想要它們的編碼差異大一些,因爲這是不同的人

用三元組損失的術語來說,要做的通常是看一個 Anchor 圖片
想讓 Anchor圖片 和 Positive圖片(Positive意味着是同一個人)的距離很接近
當 Anchor圖片 與 Negative圖片(Negative意味着是非同一個人)對比時
會想讓他們的距離離得更遠一點

在這裏插入圖片描述
它代表你通常會同時看三張圖片,需要看 Anchor圖片、Postive圖片,還有Negative圖片
要把 Anchor圖片、Positive圖片和Negative圖片簡寫成 APN


2. 損失函數公式

把這些寫成公式的話,想要的是網絡的參數或者編碼能夠滿足以下特性:
想要 ||f( A )-f( P )||2,希望這個數值很小
準確地說,想讓它小於等 f( A ) 和 f( N ) 之間的距離
或者說是它們的範數的平方,即:||f( A ) - f( P )||2 ≤ ||f( A ) - f( N )||2
||f( A ) - f( P )||2 ,這就是 d(A,P)d(A,P)
||f( A ) - f( N )||2 ,這就是 d(A,N)d(A,N)
可以把 dd 看作是距離(distance)函數,這也是爲什麼把它命名爲 dd
在這裏插入圖片描述
現在如果把方程右邊項移到左邊,最終就得到:
||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 ≤ 0

現在要對這個表達式做一些小的改變
有一種情況滿足這個表達式,但是沒有用處,就是把所有的東西都學成0
如果 f 總是輸出0,即0 - 0 ≤ 0,這就是0減去0還等於0
如果所有圖像的 f 都是一個零向量,那麼總能滿足這個方程

所以爲了確保網絡對於所有的編碼不會總是輸出0
也爲了確保它不會把所有的編碼都設成互相相等的
另一種方法能讓網絡得到這種沒用的輸出
就是如果每個圖片的編碼和其他圖片一樣
這種情況,還是得到0 - 0
在這裏插入圖片描述
爲了阻止網絡出現這種情況,需要修改這個目標
也就是這個不能是剛好小於等於0,應該是比0還要小
所以這個應該小於一個 -a 值(即 ||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 ≤ -a)
這裏的 a 是另一個超參數,這個就可以阻止網絡輸出無用的結果
按照慣例,習慣寫 +a(即 ||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 + a ≤ 0)
而不是把 -a 寫在後面,它也叫做 間隔(margin)
這個術語你會很熟悉,如果看過關於支持向量機 (SVM) 的文獻
可以把上面這個方程(||f( A ) - f( P )||2 - ||f( A ) - f( N )||2)也修改一下,加上這個間隔參數

舉個例子,假如間隔設置成0.2
如果在這個例子中,如果 Anchor和 Negative圖片的d(A,P)d(A,P) = 0.5,
d(A,N)d(A,N)只大一點,比如說0.51,條件就不能滿足
雖然0.51也是大於0.5的,但還是不夠好

想要 d(A,N)d(A,N)d(A,P)d(A,P) 大很多,會想讓 d(A,N)d(A,N) 至少是0.7或者更高
或者爲了使這個間隔,或者間距至少達到0.2,可以把這項調大或者這個調小
這樣這個間隔a,超參數a 至少是0.2
d(A,P)d(A,P)d(A,N)d(A,N) 之間至少相差0.2,這就是間隔參數a的作用
它拉大了Anchor和Positive 圖片對和Anchor與Negative 圖片對之間的差距

取下面的這個方框圈起來的方程式,更公式化表示,然後定義三元組損失函數
在這裏插入圖片描述
其中positive圖片和anchor圖片是同一個人,但是negative圖片和anchor不是同一個人

接下來定義損失函數,這個例子的損失函數,它的定義基於三元圖片組

在這裏插入圖片描述
所以爲了定義這個損失函數
L(A,P,N)L(A,P,N) =maxmax(||f( A ) - f( P )||2 - ||f( A ) - f( N )||2+a,0)

這個max函數的作用就是,只要這個||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 + a ≤ 0
那麼損失函數就是0
只要能使畫綠色下劃線部分小於等於0,只要能達到這個目標
那麼這個例子的損失就是0

另一方面如果這個||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 + a ≤ 0
然後取它們的最大值,最終會得到綠色下劃線部分,即||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 + a是最大值
這樣會得到一個正的損失值
通過最小化這個損失函數達到的效果:使這部分 ||f( A ) - f( P )||2 - ||f( A ) - f( N )||2 + a 小於或者等於0
只要這個損失函數小於等於0,網絡不會關心它負值有多大

整個網絡的代價函數應該是 訓練集中這些單個三元組損失的總和
假如有一個10000個圖片的訓練集,裏面是1000個不同的人的照片(每個人十張圖片)
要做的就是取這10000個圖片,然後生成這樣的三元組,然後訓練學習算法
對這種代價函數用梯度下降,這個代價函數就是定義在數據集裏的這樣的三元組圖片上

注意,爲了定義三元組的數據集需要成對的A和P
即同一個人的成對的圖片,爲了訓練系統確實需要一個數據集,裏面有同一個人的多個照片
這樣在1000個不同的人的10000張照片中,也許是這1000個人平均每個人10張照片
如果只有每個人一張照片,那麼根本沒法訓練這個系統

當然,訓練完這個系統之後,可以應用到一次學習問題上
對於人臉識別系統,可能只有想要識別的某個人的一張照片
但對於訓練集,需要確保有同一個人的多個圖片,至少是訓練集裏的一部分人
這樣就有成對的Anchor和Positive圖片了


3. 訓練集

現在來看,如何選擇這些三元組來形成訓練集
一個問題是如果從訓練集中,隨機地選擇A、P和N
遵守A和P是同一個人,而A和N是不同的人這一原則

有個問題就是,如果隨機的選擇它們,那麼這個約束條件(d(A,P)d(A,P) + a ≤ d(A,N)d(A,N))很容易達到
因爲隨機選擇的圖片,A和N比A和P差別很大的概率很大
如果A和N是隨機選擇的不同的人,有很大的可能性 ||f( A ) - f( N )||2會比左邊這項 ||f( A ) - f( P )||2
而且差距遠大於a,這樣網絡並不能從中學到什麼

在這裏插入圖片描述
所以爲了構建一個數據集,要做的就是儘可能選擇難訓練的三元組A、P和N

具體而言,想要所有的三元組都滿足這個條件(d(A,P)d(A,P) + a ≤ d(A,N)d(A,N)
難訓練的三元組就是,A、P和N的選擇使得d(A,P)d(A,P)很接近d(A,N)d(A,N),即 d(A,P)d(A,N)d(A,P)≈d(A,N)
這樣學習算法會竭盡全力使右邊這個式子變大(d(A,N)d(A,N)),或者使左邊這個式子(d(A,P)d(A,P))變小
這樣左右兩邊至少有一個a的間隔
並且選擇這樣的三元組還可以增加學習算法的計算效率

如果隨機的選擇這些三元組,其中有太多會很簡單,梯度算法不會有什麼效果
因爲網絡總是很輕鬆就能得到正確的結果
只有選擇難的三元組梯度下降法才能發揮作用,使得這兩邊離得儘可能遠

如果對此感興趣的話,這篇論文中有更多細節
作者是Florian Schroff, Dmitry Kalenichenko, James Philbin
他們建立了這個叫做 FaceNet 的系統,博客的許多觀點都是來自於他們的工作
FaceNet: A Unified Embedding for Face Recognition and Clustering

總結一下,訓練這個三元組損失需要取訓練集,然後把它做成很多三元組,這就是一個三元組(編號1)

在這裏插入圖片描述
有一個Anchor圖片和Positive圖片,這兩個圖片是同一個人,還有一張另一個人的Negative圖片
這是另一組(編號2),其中Anchor和Positive圖片是同一個人,但這兩個圖片不是同一個人,等等

在這裏插入圖片描述
定義了這些包括A、P和N圖片的數據集之後
還需要做的就是用梯度下降最小化之前定義的代價函數 JJ
這樣做的效果就是反向傳播到網絡中的所有參數來學習到一種編碼,使得如果兩個圖片是同一個人
那麼它們的 dd 就會很小,如果兩個圖片不是同一個人,它們的 dd 就會很大

這就是三元組損失,並且如何用它來訓練網絡輸出一個好的編碼用於人臉識別
現在的人臉識別系統,尤其是大規模的商業人臉識別系統都是在很大的數據集上訓練
超過百萬圖片的數據集並不罕見,一些公司用千萬級的圖片,還有一些用上億的圖片來訓練這些系統
這些是很大的數據集,即使按照現在的標準,這些數據集並不容易獲得

幸運的是,一些公司已經訓練了這些大型的網絡並且上傳了模型參數
所以相比於從頭訓練這些網絡,在這一領域,由於這些數據集太大
這一領域的一個實用操作就是下載別人的預訓練模型,而不是一切都要從頭開始
但是即使下載了別人的預訓練模型,瞭解怎麼訓練這些算法也是有用的
以防針對一些應用需要從頭實現這些想法


參考:

《神經網絡和深度學習》視頻課程


相關推薦:

深度學習筆記(43) Siamese網絡
深度學習筆記(42) 人臉識別
深度學習筆記(41) 候選區域
深度學習筆記(40) YOLO
深度學習筆記(39) Anchor Boxes


謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章