關於triplet loss的理解

一:前言

Triplet Network最常用於人臉識別的領域,利用Triplet loss來學習人臉的特徵向量表示。在看本文章之前,建議先觀看Andrew Ng在Coursera上的deep learning specialization的相關課程。b站鏈接點這裏

1、介紹

triplet network的網絡結構如他的名字,輸入是一個三元組<a,p,n>

a(anchor): 正樣本

p(positive ):與a是同一類別的樣本,可以理解爲也是正樣本

n(negative):與a不是同一類別的樣本,負樣本

如上圖所示,triplet network的輸入是一個三元組,實際上是三個輸入共享一個同網絡的參數,分別輸出三個圖片的特徵,然後進行d(a,p)以及d(a,n)的對比。d(a,p)爲anchor與positive example的距離,此距離爲類內距離,越小越好;d(a,n)爲negative example 與anchor距離,此距離爲類間距離,越大越好。

2、我們對這個模型的預期是什麼?

模型本身作爲一個encoding function,我們需要更新參數直到模型達到以下條件:

1.代表同一個人臉的兩張圖encoding出來的vector距離比較小,而代表不同人臉的兩張圖encoding出來的vector比較大。用公式表示爲  :

                                                     

但是,爲了避免模型將f(img)學習成f(img)=0 來滿足條件,我們引入了一個margin,將上述公式改成:

                                             

設定margin爲一個常量,可以迫使模型努力學習出來能讓兩張不同圖片的distance值更大,或者將兩張相同的圖片的distance更小。這裏用吳恩達老師舉的例子解釋一下:

 

若我們不加margin參數,當計算出來的d(a,p)=0.5時,這時候d(a,n)=0.51也能滿足條件,此時,網絡對正負樣本的區分能力不大。當我們添加了一個margin值爲0.2時,計算出來d(a,p)=0.5的時候,這時候d(a,n)必須大於0.7才能滿足條件,此時正負樣本得到更好的區分。

3.如何將上述內容轉化成損失函數?

作者將損失函數定義爲:

                                                                       L=max(d(a,p)−d(a,n)+margin,0)

公式解析:d(a,p)−d(a,n)+margin這部分實際上就是這一條公式

d(a,p)−d(a,n)+margin<=0時,這時候我們的數據比較容易訓練,一下子就能區分出來,此時損失值直接設置成0,不用繼續訓練,這時候的反向傳播會肯定當前的parameters的值。

當d(a,p)−d(a,n)+margin>=0時,整個L保持爲當前的值,這時候損失值>0,說明當前還不是最優的參數,需要繼續優化,反向傳播會否定和懲罰去更新當前的parameters。

這麼一來,模型就能朝着我們希望的方向演變。

4.Triplet mining,如何選擇訓練數據?

將triplet(三元組)分爲三類,

easy triplets(簡單三元組): triplet對應的損失爲0的三元組,形式化定義爲:d(a,n)>d(a,p)+margin

hard triplets(困難三元組): negative example 與anchor距離小於anchor與positive example的距離,d(a,n)<d(a,p)

semi-hard triplets(一般三元組): negative example 與anchor距離大於anchor與positive example的距離,但還不至於使得loss爲0,d(a,p)<d(a,n)<d(a,p)+margin

我們一般在訓練的時候選擇困難三元組或者一般三元組而不是隨機選擇的,即使保證A,P指向同一個人也不行。爲什麼呢?因爲隨機選擇的圖片能讓d(a,n)的距離很容易就很大,大於d(a,p),這樣模型基本不需要怎麼學習就能達到這個條件。那麼當遇到P,N很相似的圖片時候,我們的模型就失去識別的能力,這就是我們爲什麼不能隨機選擇圖片的原因。

那麼我們應該如何去選擇圖片呢,選擇的標準是什麼?

標準:d(a,p)儘可能接近d(a,n)的值,也就是困難三元組或者一般三元組。這樣一來數據不易滿足損失函數,損失值不那麼低,模型必須認真訓練自己的參數,從而努力讓d(a,n)的值儘可能變大,d(a,p)的值儘可能變小。

 

以上就是最近學習的triplet的一些理解,希望對你有幫助,如有錯誤,懇請指出一起交流~

 

相關論文:

《FaceNet A unified embedding for face recognition and clustering》

《DeepFace closing the gab to human level performance》

 

 

 

 

 

 

 

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