Triplet Loss
在人臉識別中,Triplet loss被用來進行人臉嵌入的訓練。如果你對triplet loss很陌生,可以看一下吳恩達關於這一塊的課程。Triplet loss實現起來並不容易,特別是想要將它加到tensorflow的計算圖中。
通過本文,你講學到如何定義triplet loss,和進行triplets采樣的幾種策略。然后我將解釋如何在TensorFlow中使用在線triplets挖掘來實現Triplet loss。
Triplet loss和triplets挖掘
為什么不用softmax
谷歌的論文FaceNet: A Unified Embedding for Face Recognition and Clustering最早將triplet loss應用到人臉識別中。他們提出了一種實現人臉嵌入和在線triplet挖掘的方法,這部分內容我們將在后面章節介紹。
在監督學習中,我們通常都有一個有限大小的樣本類別集合,因此可以使用softmax和交叉熵來訓練網絡。但是,有些情況下,我們的樣本類別集合很大,比如在人臉識別中,標簽集很大,而我們的任務僅僅是判斷兩個未見過的人臉是否來自同一個人。
Triplet loss就是專為上述任務設計的。它可以幫我們學習一種人臉嵌入,使得同一個人的人臉在嵌入空間中盡量接近,不同人的人臉在嵌入空間中盡量遠離。
定義損失
Triplet loss的目標:
- 使具有相同標簽的樣本在嵌入空間中盡量接近
- 使具有不同標簽的樣本在嵌入空間中盡量遠離
值得注意的一點是,如果只遵循以上兩點,最后嵌入空間中相同類別的樣本可能collapse到一個很小的圈子里,即同一類別的樣本簇中樣本間的距離很小,不同類別的樣本簇之間也會偏小。因此,我們加入間隔(margin)的概念——跟SVM中的間隔意思差不多。只要不同類別樣本簇簡單距離大於這個間隔就闊以了。
Triplet可以理解為一個三元組,它由三部分組成:
- anchor在這里我們翻譯為原點
- positive同類樣本點(與原點同類)
- negative異類樣本點
我們要求,在嵌入空間dd中,三元組(a,p,n)(a,p,n)滿足一下關系:
L=max(d(a,p)−d(a,n)+margin,0)L=max(d(a,p)−d(a,n)+margin,0)
最小化該LL,則d(a,p)→0, d(a,n)>margind(a,p)→0, d(a,n)>margin。
Triplets挖掘
基於前文定義的Triplet loss,可以將三元組分為一下三個類別:
- easy triplets:可以使loss = 0的三元組,即容易分辨的三元組
- hard triplets:d(a,n)<d(a,p)d(a,n)<d(a,p)的三元組,即一定會誤識別的三元組
- semi-hard triplets:d(a,p)<d(a,n)<d(a,p)+margind(a,p)<d(a,n)<d(a,p)+margin的三元組,即處在模糊區域(關鍵區域)的三元組
圖中,a為原點位置,p為同類樣本例子,不同顏色表示的區域表示異類樣本分布於三元組類別的關系
顯然,中間的Semi-hard negatives樣本對我們網絡模型的訓練至關重要。
離線和在線triplets挖掘
在網絡訓練中,應盡可能使用Semi-hard negatives樣本,這一節將介紹如何選擇這些樣本。
離線
可以在每輪迭代之前離線的生成Triplet。也就是先對所有的訓練集計算嵌入表達,然后只選擇semi-hard triplets並以此為輸入訓練一次網絡。具體而言:
- 生成一系列Triplet(i, j, k)
- 假設batchsize = B, 也就是會產生3B個嵌入表達
- 計算這B個Triplet的損失並反向傳遞
離線挖掘方式幾乎與傳統的深度學習一樣,操作簡單,但是效率較低(畢竟每次迭代之前都遍歷了整個訓練集來找到semi-hard樣本)。