深度度量學習中的損失函數

導讀:度量學習 ( metric learning ) 研究如何在一個特定的任務上學習一個距離函數,使得該距離函數能夠幫助基於近鄰的算法 ( kNN、k-means 等 ) 取得較好的性能。深度度量學習 ( deep metric learning ) 是度量學習的一種方法,它的目標是學習一個從原始特徵到低維稠密的向量空間 ( 稱之爲嵌入空間,embedding space ) 的映射,使得同類對象在嵌入空間上使用常用的距離函數 ( 歐氏距離、cosine 距離等 ) 計算的距離比較近,而不同類的對象之間的距離則比較遠。深度度量學習在計算機視覺領域取得了非常多的成功的應用,比如人臉識別、人臉驗證、圖像檢索、簽名驗證、行人重識別等。

損失函數在深度度量學習中起到了非常重要的作用。很多深度度量學習的損失函數構建在樣本對 ( pair ) 或者樣本三元組 ( triplet ) 之上,因而樣本空間的量級 ( O ( N2) 或者 O ( N3) ) 非常大。一般而言,模型在訓練過程中很難窮舉學習所有的樣本對;並且大多數樣本對或者樣本三元組的信息量是很小的,尤其在模型訓練的後期,這些樣本對或者樣本三元組上梯度值幾乎爲0。若不做任何針對性的優化,學習算法的收斂速度會很慢,且易陷入局部最優。

困難樣本挖掘是加快學習算法的收斂速度,並改進學習效果的一種重要手段。它通常和特定的損失函數一起使用,以期望達到最好的效果。困難樣本挖掘可以理解爲在學習過程中給每一個樣本對動態賦予一個權重。在學習不同樣本對時給它們不同的權重,如果某個樣本對包含的信息比較多或比較難學習,那麼它就需要比較大的權重。信息量較少的樣本對則會被賦予較小的權重。若某些樣本對被賦予的權重爲0,則意味着在計算梯度時不考慮這些樣本對,相當於這些樣本對被丟棄了。

不同的損失函數在設計時,對於樣本對的賦權是不同的,或者說與這些損失函數配合使用的困難樣本挖掘方法是不同的。下面列舉一些常用的深度度量學習中使用的損失函數,同時瞭解一下它們是如何來給做困難樣本挖掘的。

損失函數 ( Loss functions )

1. Contrastive loss

Contrastive loss 的輸入是兩個樣本組成的樣本對,label 爲該樣本對是否屬於同類。

其中,fi 是函數 f(xi) 的簡寫,表示輸入 xi 映射之後的 embedding 向量;1{·} 是指示函數,在輸入爲 true 時返回1,否則返回0;m 是預先設定的超參數,表示不同類樣本之間的距離應超過該 margin 值。

Contrastive loss

最原始的 contrastive loss 只考慮了輸入樣本對本身的相似性。

2. Triplet loss

Triplet loss 的輸入由一個三元組組成,每個三元組包含一個 query、一個與 query 屬於同一類的正樣本、一個與 query 屬於不同類的負樣本。

Triplet loss 要求 query 到負樣本的距離與 query 到正樣本的距離之差要大於 m。

Contrastive Loss 和 Triplet Loss 都很常用,一般來說,Triplet Loss 的效果比 Contrastive Loss 的效果要好,因爲他考慮了正負樣本與錨點的距離關係。然而,這兩種 Loss 函數如果單獨使用則會遭遇收斂速度慢的問題。在學習過程的後期,大多數樣本都能滿足損失函數的約束條件,這些樣本對應進一步學習的貢獻很小。因此,這兩種損失函數都需要配合 hard sample mining 的學習策略一起使用,例如 FaceNet 提出的 simi-hard negative sample mining 方法。

Triplet loss

3. N-pair-ms loss

Triplet Loss 在學習參數的更新過程中,只比較了一個負樣本,而忽略了其他類的負樣本。因而,只能促進 query 的 embedding 向量與選中的一個負樣本保持較大的距離,但卻不能保證與其他未被選擇的負樣本也保持較大的距離。

N-pair-ms loss 對 Triplet Loss 的上述問題進行了改進,不同於 Triplet Loss 使用單個的正負樣本,N-pair-ms loss 損失函數利用了數據之間的結構信息來學習到更有區別性的表示,其在每次參數更新的過程中同時考慮了 query 樣本與其他多個不同類的負樣本之間的關係,促使 query 與其他所有類之間都保持距離,這樣能夠加快模型的收斂速度。N-pair-ms loss 的每個訓練樣本由 N+1 元組組成,即:

其中,x+ 是相對於 x 而言的正樣本,${x_i}^{N-1}_{i=1}$ 是負樣本。N+1 元組一般不會提前構建好,而是在訓練的過程中,從同一個 mini batch 中構建出來。

其中,f(·;θ) 是由深度神經網絡定義的 embedding kernel。

4. Lifted Struct loss

Lifted Struct loss 基於訓練集 ( mini batch ) 中所有的正負樣本對來計算 loss,其定義如下:

其中, ${\hat P}$ 是正樣本對 ( pair 的左變量和右邊量來自同一個類 ) 的集合;{\hat N} 是負樣本對的集合; Di,j 是樣本對 { i , j } 的距離。

仔細分析該 loss function,發現對於每一個正樣本對 { i , j } ,模型分別挖掘其左變量 i 和右變量 j 對應的最困難的負樣本,獨立地找到距離左變量最近的負樣本,假設爲 k ;同時找到距離右邊量最近的負樣本,假設爲 l。接着通過比較 Di,k 和 Dj,l,找出其中較小的距離對應的負樣本,假設爲 n。最後,計算三元組 { i,j,n } 確定的 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 函數在實際中容易導致網絡陷入較差的局部最優,因此可以改寫爲一個光滑的上界函數來避免詞問題。

Lifted Struct loss

5. Proxy NCA loss

這個方法提出的目的是去解決採樣的問題。假設 W 代表着訓練集中的一小部分數據,在採樣時通過選擇與 W 中距離最近的一個樣本 u 作爲代理 ( proxy ),即:

基於選擇的 proxy,NCA 損失爲:

6. Ranked list loss

上述的損失函數都存在如下的兩點侷限性:

  1. 這些損失函數雖然都提出了加入更多的負樣本來獲得結構化的信息,但是使用的負樣本僅僅是一小部分;
  2. 另外這些損失函數沒有考慮類內的數據分佈,都追求將同一個class壓縮到一個點上。

Ranked List Loss 對這兩個問題提出了改進。

假設 $X={(x_i,y_i)}^{N}_{i=1}$ 表示訓練集,其中每一組元素 ( xi , yi ) 表示成對的樣本與其標籤,總共包括 C 個類別,即:

${x^c_i}^{N_c}_{i=1}$ 表示屬於類別 c 的所有樣本,Nc 表示相應類別的樣本數量。

我們的目標是學習到一個函數 f 使得正樣本對之間的相似度高於負樣本之間的相似度。爲了將正負樣本區分開,Ranked List Loss 希望負樣本之間的距離大於某個閾值 α ,並且正樣本之間的距離小於 α - m ,即正負樣本之間至少有 m 的間隔。基於此,提出了 pairwise margin loss:

其中,當 yi=yj 時,yij=1,否則 yij=0;dij 表示 f(xi) , f(xj) 之間的歐式距離,[·]+ 是 hinge 函數。

對樣本進行合適採樣可以加快模型的收斂速率和提高模型性能。Ranked List Loss 使用的採樣策略很簡單,就是損失函數不爲0的樣本,具體來說,對於正樣本,損失函數不爲0意味着它們與 anchor 之間的距離大於 α - m,類似的,對於負樣本,損失函數不爲0意味着它們與 anchor 之間的距離小於 α,相當於使得同一類別位於一個半徑爲 α - m 大小的超球體內。

給定一個 anchor xic 基於相似度對其他樣本進行排序,在這個排序結果中,有 Nc - 1 個正樣本,用 $P_{c,i}={x^c_j|j\neq i}$ 表示。同樣地,有 $\sum_{k\neq c}N_k$ 個負樣本,用 $N_{c,i}={x^k_j|k\neq c}$ 表示。於每個 anchor xic , 我們希望使得它與正樣本集 Pc,i 的距離越近越好,並且與負樣本集 Nc,i 之間存在着 m 的間隔,同時,我們還希望使得 anchor 與負樣本的距離大於邊界 α 。在執行困難樣本挖掘後,得到困難的正樣本集合爲:

困難的負樣本集合爲:

因此,對於正樣本我們使用的損失函數爲:

對於負樣本集,考慮到它的樣本數量比較大,對每個負樣本使用加權的方式:

其中,$L_N(x^c_i;f)=\sum_{x^k_j\in N^{c,j}}\frac{w{ij}}{\sum_{x^k_j\in P^{c,j}}w{ij}}L_m(x^c_i,x^k_j;f)$,T 是超參數。

最終,整個損失爲:

通常情況下,設置 λ = 1。

上述幾種 loss 函數的對比如下圖所示:

其中,藍色圓形表示 anchor ( query ) 樣本,不同的形狀表示來自不同類的樣本。

7. Multi-Similarity loss

前面說過,困難樣本挖掘可以理解爲在學習過程中給每一個樣本對動態賦予一個權重。給樣本賦權的核心在於判斷樣本的局部分佈,即它們之間的相似性,局部樣本之間的分佈和相互關係並不僅僅取決於當前兩個樣本之間的距離或相似性,還取決於當前樣本對與其周圍樣本對之間的關係。

因此,對於每一個樣本對,我們不僅需要考慮樣本對本身的自相似性,同時還要考慮它與其它樣本對的相對相似性。其中相對相似性又可以分爲正相對相似性 ( 正樣本 )、負相對相似性 ( 負樣本 ) 兩種相似性。

  1. 自相似性:根據樣本對自身計算出的相似性,這是一種最常用也是最重要的相似性。例如,當一個負樣本對的餘弦相似性較大時,意味着很難把該樣本對所對應的兩種類別區分開來,這樣的樣本對對模型來說是困難的,也是有信息量的,對於模型學習更有區分度的特徵很有幫助。另一方面,自相似性很難完整地描述 embedding 空間的樣本分佈情況。
  2. 正相對相似性:不僅考慮當前樣本對自身的相似性,還考慮局部鄰域內正樣本對之間的相對關係。
  3. 負相對相似性:不僅考慮當前樣本對自身的相似性,還考慮局部鄰域內負樣本對之間的相對關係。

各種損失函數都在給樣本加權以確定「拉或推」的力度,那麼使用什麼樣的函數來加權就非常重要了,在學習不同樣本對時給它們不同的權重,如果某個樣本包含的信息比較多或比較難學習,那麼它就需要比較大的權重。不同的損失函數在設計時,對於樣本對的賦權是不同的,往往會涉及到上述三種相似性的其中一種或多種的計算。以一個負樣本對爲例,上文提到的幾個 loss 函數涉及到的相似性計算類型如下表所示。

Multi-Similarity Loss ( MS loss ) 綜合考慮了三種相似性,它們能概括目前大多數基於樣本對的損失函數。MS Loss 通過採樣和加權兩次迭代,實現更加高效的樣本訓練。它通過定義自相似性和相對相似性,在訓練過程中更加全面地考慮了局部樣本分佈,從而能更高效精確的對重要樣本對進行採用和加權。

對於一個給定的負樣本對 $<x_i,x_j>\in N_i$,MS loss 給它賦予的權重爲:

類似地,對於一個給定的負樣本對 $<x_i,x_j>\in P_i$,MS loss 給它賦予的權重爲:

最終,MS loss 的定義爲:

LMS 相對於 Sij 求得的梯度剛好爲上述樣本權重。

ms loss

MS Loss 在大部分圖像檢索基準數據庫上都有很好的性能,且相比最新的方法也有較大的優勢。

作者介紹

楊旭東

阿里 | 算法工程師

本文來自 DataFun 社區

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247494208&idx=1&sn=50a940f4ce6093cd6c75f84e6c8efd59&chksm=fbd7582ccca0d13a270878d4aeeda8de15cc4be694b86185a95a74fee4aa9ae90efe87fe1bad&scene=27#wechat_redirect

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