深度度量學習初步整理
知乎:triplet loss 在深度學習中主要應用在什么地方?有什么明顯的優勢?
Triplet loss通常是在個體級別的細粒度識別上使用,傳統的分類是花鳥狗的大類別的識別,但是有
些需求是要精確到個體級別,比如精確到哪個人的人臉識別,所以triplet loss的最主要應用也就是
face identification, person re-identification, vehicle re -identification的各種identification識
別問題上
-
當然你可以把每個人當做一個類別來進行分類訓練,但是往往最后會造成softmax的維數遠大於
feature的維數,想想resnet50 global ap出來- -個2048的feature對應到一 -個幾萬,幾十萬的分
類softmax就可怕。 -
另外一個結論就是triplet loss通常能比classification得到更好的feature,我個人測試triplet loss
至少比classification高10個點。 -
還有一個優點就是triplet loss可以卡閾值, triplet losi訓練的時候要設置- 個margin, 這個
margin可以控制正負樣本的距離,當feature 進行normalization之后,可以更加方便的卡個閾
值來判斷是不是同一個ID
當然triplet loss也有缺點,就是收斂慢,而且比classification更容 易overfitting (此條待考究,並且即使過擬合了也比classification性能要好),此外需 要對輸入的數據按照label進行特別的排列,非常重要的一點是沒有triplet loss的API,新手小白可能連十行代碼都不到的triplet loss都寫不出 來,所以deep learning不只是調庫調參而已現在triplet loss已經有很多改進版本了,可以搜索improved triplet loss,in defense of triplet loss,beyond triplet loss
等論文
知乎:Triplet Loss
Triplet Loss
三元組(Triplet)計算而來的損失(Loss)
由Anchor(A),Negative(N),Positive§組成,基點為A,正匹配為P,負匹配為N。
Triplet Loss的學習目標可以形象的表示如下圖:
網絡沒經過學習之前,A和P的歐式距離可能很大,A和N的歐式距離可能很小,如上圖左邊,在網絡的學習過程中,A和P的歐式距離會逐漸減小,而A和N的距離會逐漸拉大。
網絡會直接學習特征間的可分性:同一類的特征之間的距離要盡可能的小,而不同類之間的特征距離要盡可能的大。
通過學習,使得類間的距離要大於類內的距離。
損失函數為:
其中,左邊的二范數表示類內距離,右邊的二范數表示類間距離,α是一個常量。優化過程就是使用梯度下降法使得損失函數不斷下降,即類內距離不斷下降,類間距離不斷提升。
以及hard negative
來作為我們的三元組
Hard Triplets應該是滿足類內距離最大化並且類間距離最小化的三元組。
深度度量學習中的損失函數
度量學習(metric learning)研究如何在一個特定的任務上學習一個距離函數,使得該距離函數能夠幫助基於近鄰的算法(kNN、k-means等)取得較好的性能。深度度量學習(deep metric learning)是度量學習的一種方法,它的目標是學習一個從原始特征到低維稠密的向量空間(稱之為嵌入空間,embedding space)的映射,使得同類對象在嵌入空間上使用常用的距離函數(歐氏距離、cosine距離等)計算的距離比較近,而不同類的對象之間的距離則比較遠。深度度量學習在計算機視覺領域取得了非常多的成功的應用,比如人臉識別、人臉驗證、圖像檢索、簽名驗證、行人重識別等。
損失函數在深度度量學習中起到了非常重要的作用。很多深度度量學習的損失函數構建在樣本對(pair)或者樣本三元組(triplet)之上,因而樣本空間的量級( 或者 )非常大。一般而言,模型在訓練過程中很難窮舉學習所有的樣本對;並且大多數樣本對或者樣本三元組的信息量是很小的,尤其在模型訓練的后期,這些樣本對或者樣本三元組上梯度值幾乎為0。若不做任何針對性的優化,學習算法的收斂速度會很慢,且易陷入局部最優。
困難樣本挖掘是加快學習算法的收斂速度,並改進學習效果的一種重要手段。它通常和特定的損失函數一起使用,以期望達到最好的效果。困難樣本挖掘可以理解為在學習過程中給每一個樣本對動態賦予一個權重。在學習不同樣本對時給它們不同的權重,如果某個樣本對包含的信息比較多或比較難學習,那么它就需要比較大的權重。信息量較少的樣本對則會被賦予較小的權重。若某些樣本對被賦予的權重為0,則意味着在計算梯度時不考慮這些樣本對,相當於這些樣本對被丟棄了。
不同的損失函數在設計時,對於樣本對的賦權是不同的,或者說與這些損失函數配合使用的困難樣本挖掘方法是不同的。下面列舉一些常用的深度度量學習中使用的損失函數,同時了解一下它們是如何來給做困難樣本挖掘的。
損失函數(Loss functions)
1. Contrastive loss
Contrastive loss的輸入是兩個樣本組成的樣本對,label為該樣本對是否屬於同一類。
其中,
是函數
的簡寫,表示輸入
映射之后的embedding向量;
是指示函數,在輸入為true時返回1,否則返回0;
是預先設定的超參數,表示不同類樣本之間的距離應超過該margin值。
最原始的contrastive loss只考慮了輸入樣本對本身的相似性。
2. Triplet loss
Triplet loss的輸入由一個三元組組成,每個三元組包含一個query、一個與query屬於同一類的正樣本、一個與query屬於不同類的負樣本。
Triplet loss要求query到負樣本的距離與query到正樣本的距離之差要大於
。
Contrastive loss和triplet loss都很常用,一般來說,Triplet-Loss的效果比Contrastive Loss的效果要好,因為他考慮了正負樣本與錨點的距離關系。然而,這兩種loss函數如果單獨使用則會遭遇收斂速度慢的問題。在學習過程的后期,大多數樣本都能滿足損失函數的約束條件,這些樣本對應進一步學習的貢獻很小。因此,這兩種損失函數都需要配合hard sample mining的學習策略一起使用,例如FaceNet提出的simi-hard negative sample mining方法。
Contrastive loss能夠讓正樣本對盡可能的近,負樣本對盡可能的遠,這樣可以增大類間差異,減小類內差異。但是其需要指定一個固定的margin,即公式中的 ,因為 是固定的,所以這里就隱含了一個很強的假設,即每個類目的樣本分布都是相同的,不過一般情況下這個強假設未必成立。
例如,有一個數據集有三種動物,分別是狗、狼 、貓,直觀上狗和狼比較像,狗和貓的差異比較大,所以狗狼之間的margin應該小於狗貓之間的margin,但是Contrastive loss使用的是固定的margin,如果margin設定的比較大,模型可能無法很好的區分狗和狼,而margin設定的比較小的話,可能又無法很好的區分狗和貓。
6. Ranked list loss
上述的損失函數都存在如下的兩點局限性:
- 這些損失函數雖然都提出了加入更多的負樣本來獲得結構化的信息,但是使用的負樣本僅僅是一小部分;
- 另外這些損失函數沒有考慮類內的數據分布,都追求將同一個class壓縮到一個點上。
假設
表示訓練集, 其中每一組元素
表示成對的樣 本與其標簽, 總共包括
個類別, 即
表示屬於 類別
的所有樣本,
表示相應類別的樣本數量。
我們的目標是學習到一個函數
使得正樣本對之間的相似度高於負樣本之間的 相似度。為了將正負樣本區分開,Ranked List Loss希望負樣本之間的距離大 於某個間值
並目正樣本之間的距離小於
,即正負樣本之間至少有
的間隔。基於此, 提出了pairwise margin loss:
其中,當
時,
,否則
;
表示
之間的歐式距離, 是hinge函數。
對樣本進行合適采樣可以加快模型的收斂速率和提高模型性能。Ranked List Loss使用的采樣策略很簡單,就是損失函數不為0的樣本,具體來說,對於正樣本,損失函數不為0意味着它們與anchor之間的距離大於 , 類似的,對於負樣本,損失函數不為0意味着它們與anchor之間的距離小於 ,相當於使得同一類別位於一個半徑為 大小的超球體內。

給定一個anchor
基於相似度對其他樣本進行排序, 在這個排序結果中, 有
個正樣本, 用
表示。 同樣地, 有
個負樣 本, 用
表示。於每個anchor
我們希望使得它與正樣本集
的距離越近越好, 並且與負樣本集
之間存在着
的間隔, 同時,我們還希望使得anchor與負樣本的距離大於邊界
。在執行困難樣本挖掘后,得到困難的正樣本集合為
困難的負
樣本集合為
因此, 對於正樣本我們使用的損失函數為:
對於負樣本集,考慮到它的樣本數量比較大,對每個負樣本使用加權的方式:
其中,
是超參數
最終, 整個損失為:
通常情況下,設置 。
上述幾種loss函數的對比如下圖所示:
其中,藍色圓形表示anchor(query)樣本,不同的形狀表示來自不同類的樣本。
7. Multi-Similarity loss
前面說過,困難樣本挖掘可以理解為在學習過程中給每一個樣本對動態賦予一個權重。給樣本賦權的核心在於判斷樣本的局部分布,即它們之間的相似性,局部樣本之間的分布和相互關系並不僅僅取決於當前兩個樣本之間的距離或相似性,還取決於當前樣本對與其周圍樣本對之間的關系。
因此,對於每一個樣本對,我們不僅需要考慮樣本對本身的自相似性,同時還要考慮它與其它樣本對的相對相似性。其中相對相似性又可以分為正相對相似性 (正樣本)、負相對相似性(負樣本)兩種相似性。
-
自相似性:根據樣本對自身計算出的相似性,這是一種最常用也是最重要的相似性。例如,當一個負樣本對的余弦相似性較大時,意味着很難把該樣本對所對應的兩種類別區分開來,這樣的樣本對對模型來說是困難的,也是有信息量的,對於模型學習更有區分度的特征很有幫助。另一方面,自相似性很難完整地描述embedding空間的樣本分布情況。
-
正相對相似性:不僅考慮當前樣本對自身的相似性,還考慮局部鄰域內
正樣本對之間
的相對關系。 -
負相對相似性:不僅考慮當前樣本對自身的相似性,還考慮局部鄰域內
負樣本對之間
的相對關系。
各種損失函數都在給樣本加權以確定「拉或推」的力度,那么使用什么樣的函數來加權就非常重要了,在學習不同樣本對時給它們不同的權重,如果某個樣本包含的信息比較多或比較難學習,那么它就需要比較大的權重。不同的損失函數在設計時,對於樣本對的賦權是不同的,往往會涉及到上述三種相似性的其中一種或多種的計算。以一個負樣本對為例,上文提到的幾個loss函數涉及到的相似性計算類型如下表所示。
Multi-Similarity Loss(MS loss) 綜合考慮了三種相似性,它們能概括目前大多數基於樣本對的損失函數。MS Loss 通過采樣和加權兩次迭代,實現更加高效的樣本訓練。它通過定義自相似性和相對相似性,在訓練過程中更加全面地考慮了局部樣本分布,從而能更高效精確的對重要樣本對進行采用和加權。
對於一個給定的負樣本對
MS loss給它賦予的權重為 :
類似地, 對於一個給定的負樣本對
MS loss給它賦予的權重 為:
最終,MS loss的定義為:
相對於
求得的梯度剛好為上述樣本權重。
MS Loss 在大部分圖像檢索基准數據庫上都有很好的性能,且相比最新的方法也有較大的優勢。
知乎:度量學習中的pair-based loss
1. Triplet center loss
Triplet Loss是讓正樣本對之間的距離小於負樣本對之間的距離,並且存在一定的margin。因此triplet樣本的選取至關重要,如果選取的triplet對沒啥難度,很容就能進行區分,那大部分的時間生成的loss都為0,模型不更新,而如果使用hard mining的方法對難例進行挖掘,又會導致模型對噪聲極為敏感。為了對Triplet loss的缺點進行改進,Triplet center loss就被提出來了。
Triplet Center loss[3]的思想非常簡單,原來的Triplet是計算anchor到正負樣本之間的距離,現在Triplet Center是計算anchor到正負樣本所在類別的中心的距離。類別中心就是該類別所有樣本embedding向量的中心。
Triplet Center Loss形式如下:
其中
表示的是anchor樣本到正樣本類別中心的距離,
表示的是anchor樣本到負樣本類別中心的距離。
是hinge 函數:
。
2. N-pair loss
triplet loss同時拉近一對正樣本和一對負樣本,這就導致在選取樣本對的時候,當前樣本對只能夠關注一對負樣本對,而缺失了對其他類別樣本的區分能力。
為了改善這種情況,N-pair loss[4]就選取了多個負樣本對,即一對正樣本對,選取其他所有不同類別的樣本作為負樣本與其組合得到負樣本對。
如果數據集中有 個類別,則每個正樣本對 都對應了 個負樣本對。
N-pair loss的形式如下:
其中
代表樣本 和 之間的距離 。
3. Quadruplet loss
Quadruplet loss[5] 由兩部分組成:
一部分就是正常的triplet loss,這部分loss能夠讓模型區分出正樣本對和負樣本對之間的相對距離。
另一部分是正樣本對和其他任意負樣本對之前的相對距離。這一部分約束可以理解成最小的類間距離都要大於類內距離,不管這些樣本對是否有同樣的anchor。即不僅要要求
,還需要
Quadruplet loss的形式如下:
3. Lifted Structure Loss
Lifted Structure loss[6]的思想是對於一對正樣本對而言,不去區分這個樣本對中誰是anchor,誰是positive,而是讓這個正樣本對中的每個樣本與其他所有負樣本的距離都大於給定的閾值。此方法能夠充分的利用mini-batch中的所有樣本,挖掘出所有的樣本對。
另一種定義:
Lifted Struct loss基於訓練集(mini batch)中所有的正負樣本對來計算loss,其定義如下:
其中,
是正樣本對(pair的左變量和右邊量來自同一個類)的集合;
是負樣本對的集合;
是樣本對
的距離。
仔細分析該loss function,發現對於每一個正樣本對 ,模型分別挖掘其左變量 和右邊量 對應的最困難的負樣本,獨立地找到距離左變量最近的負樣本,假設為 ;同時找到距離右邊量最近的負樣本,假設為 。接着通過比較 和 ,找出其中較小的距離對應的負樣本,假設為 。最后,計算三元組 確定的triplet loss函數。如下圖所示:
Hard negative edge is mined with respect to each left and right example per each positive pairs. In this illustration with 6 examples in the batch, both x3 and x4 independently compares against all other negative edges and mines the hardest negative edge.
Lifted Struct loss與triplet loss的不同之處就在於,triplet loss的樣本三元組是提前確定好的,而Lifted Struct loss是為每一個正樣本對動態構建最困難的三元組,在構建的過程中考慮了(mini batch中)所有的負樣本。
由於上述定義的Lifted Struct loss函數是不光滑的函數,嵌套的max函數在實際中容易導致網絡陷入較差的局部最優,因此可以改寫為一個光滑的上界函數來避免此問題。
5. Proxy NCA loss
這個方法提出的目的是去解決采樣的問題。假設W代表着訓練集中的一小部分數據,在采樣時通過選擇與W中距離最近的一個樣本u作為代理(proxy), 即:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ p(u)=argmin_{w…
基於選擇的proxy, NCA損失為:
總結
度量學習中還有很多其他類型的pair-based loss,通過上文可以發現,這些不同的loss基本上都是在Contrastive loss和Triplet loss的基礎上改進而來。這些改進思想很值得我們借鑒,尤其是通過觀察分析已經存在的loss的缺陷,從而提出針對性的改進,構造一個適合自己應用場景的loss。