轉載:https://zhuanlan.zhihu.com/p/72516633 這里僅當學習使用;
度量學習
度量學習(Metric Learning)是一種空間映射的方法,其能夠學習到一種特征(Embedding)空間,在此空間中,所有的數據都被轉換成一個特征向量,並且相似樣本的特征向量之間距離小,不相似樣本的特征向量之間距離大,從而對數據進行區分。度量學習應用在很多領域中,比如圖像檢索,人臉識別,目標跟蹤等等。
在深度學習中,很多度量學習的方法都是使用成對成對的樣本進行loss計算的,這類方法被稱為 pair-based deep metric learning。例如,在訓練模型的過程,我們隨意的選取兩個樣本,使用模型提取特征,並計算他們特征之間的距離。 如果這兩個樣本屬於同一個類別,那我們希望他們之間的距離應該盡量的小,甚至為0;如果這兩個樣本屬於不同的類別,那我們希望他們之間的距離應該盡量的大,甚至是無窮大。正是根據這一原則,衍生出了許多不同類型的pair-based loss,使用這些loss對樣本對之間的距離進行計算,並根據生成的loss使用各種優化方法對模型進行更新。本文將介紹一些常見的pair-based metric learning loss。
Contrastive los
Contrastive loss[1]是最簡單最直觀的一種pair-based deep metric learning loss,其思想就是:
1) 選取一對樣本對,如果其是正樣本對,則其產生的loss就應該等於其特征之間的距離(例如L2 loss);因為我們的期望是他們之間的距離為0,所以凡是大於零的loss都需要被保留。
2) 如果是負樣本對,他們之間的距離應該盡可能的大,至於應該大到多少則由我們人為的設定,假設設定的閾值為 ,如果距離大於
,則說明模型已經不錯了,不需要對模型進行更新了,如果小於
,則認為模型還不夠好,需要繼續訓練。
根據這一思想, 可以得到如下形式的Contrastive Loss:
上式中 代表樣本
和
之間的距離 ,
代表這兩個樣本屬於同一個類別,是一對正樣本對;
代表這兩個樣本屬於不同類別,是一對負樣本對。
是hinge 函數:
。
如上式,如果是正樣本對,其產生的loss就等於兩個樣本之間的距離,這里的距離函數一般取L2距離。如果是負樣本對,當兩個樣本之間的距離大 時,其loss為0,在模型更新的時候,loss為0,意味着不對模型進行更新。
Contrastive loss能夠讓正樣本對盡可能的近,負樣本對盡可能的遠,這樣可以增大類間差異,減小類內差異。但是其需要指定一個固定的margin,即公式中的 ,因為
是固定的,所以這里就隱含了一個很強的假設,即每個類目的樣本分布都是相同的,不過一般情況下這個強假設未必成立。
例如,有一個數據集有三種動物,分別是狗、狼 、貓,直觀上狗和狼比較像,狗和貓的差異比較大,所以狗狼之間的margin應該小於狗貓之間的margin,但是Contrastive loss使用的是固定的margin,如果margin設定的比較大,模型可能無法很好的區分狗和狼,而margin設定的比較小的話,可能又無法很好的區分狗和貓。
Triplet loss
Constrastive Loss的思想是讓正樣本對之間的距離盡可能的小,負樣本對之間的距離盡可能的大。從而達到增大類間差異,減小類內差。在訓練的過程中選取的要么是正樣本對,要么是負樣本對。
Triplet Loss[2]的思想是讓負樣本對之間的距離大於正樣本對之間的距離,在訓練過的過程中同時選取一對正樣本對和負樣本對,且正負樣本對中有一個樣本是相同的。仍舊以前面的狗、狼、貓數據為例,首先隨機選取一個樣本,此樣本稱之為anchor 樣本,假設此樣本類別為狗,然后選取一個與anchor樣本同類別的樣本(另一個狗狗),稱之為positive,並讓其與anchor樣本組成一個正樣本對(anchor-positive);再選取一個與anchor不同類別的樣本(貓),稱之為negative,讓其與anchor樣本組成一個負樣本對(anchor-negative)。這樣一共選取了三個樣本,即triplet。
其loss形式如下:
通過上述公式可以看出,當負樣本對之間的距離比正樣本對之間的距離大m的時候,loss為0 ,認為當前模型已經學的不錯了,所以不對模型進行更新。
Triplet Loss最先被用於人臉識別中,如下圖,輸入一個triplet對(三張圖像),使用同一個網絡對這個三張圖像進行特征提取,得到三個embedding向量,三個向量輸入到Triplet Loss中得到loss,然后根據loss值使用反向傳播算法對模型進行更新。
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樣本到負樣本類別中心的距離。
N-pair loss
triplet loss同時拉近一對正樣本和一對負樣本,這就導致在選取樣本對的時候,當前樣本對只能夠關注一對負樣本對,而缺失了對其他類別樣本的區分能力。
為了改善這種情況,N-pair loss[4]就選取了多個負樣本對,即一對正樣本對,選取其他所有不同類別的樣本作為負樣本與其組合得到負樣本對。如果數據集中有 個類別,則每個正樣本對
都對應了
個負樣本對。
N-pair loss的形式如下:
其中
Quadruplet loss
Quadruplet loss[5] 由兩部分組成:
一部分就是正常的triplet loss,這部分loss能夠讓模型區分出正樣本對和負樣本對之間的相對距離。
另一部分是正樣本對和其他任意負樣本對之前的相對距離。這一部分約束可以理解成最小的類間距離都要大於類內距離,不管這些樣本對是否有同樣的anchor。即不僅要要求 ,還需要
Quadruplet loss的形式如下:
Lifted Structure Loss
Lifted Structure loss[6]的思想是對於一對正樣本對而言,不去區分這個樣本對中誰是anchor,誰是positive,而是讓這個正樣本對中的每個樣本與其他所有負樣本的距離都大於給定的閾值。此方法能夠充分的利用mini-batch中的所有樣本,挖掘出所有的樣本對。
總結
度量學習中還有很多其他類型的pair-based loss,通過上文可以發現,這些不同的loss基本上都是在Contrastive loss和Triplet loss的基礎上改進而來。這些改進思想很值得我們借鑒,尤其是通過觀察分析已經存在的loss的缺陷,從而提出針對性的改進,構造一個適合自己應用場景的loss。
參考
- ^Dimensionality Reduction by Learning an Invariant Mapping http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf
- ^FaceNet: A Unified Embedding for Face Recognition and Clustering https://arxiv.org/abs/1503.03832
- ^Triplet-Center Loss for Multi-View 3D Object Retrieval https://arxiv.org/abs/1803.06189
- ^Improved Deep Metric Learning with Multi-class N-pair Loss Objective http://www.nec-labs.com/uploads/images/Department-Images/MediaAnalytics/papers/nips16_npairmetriclearning.pdf
- ^Beyond triplet loss: a deep quadruplet network for person re-identification https://arxiv.org/abs/1704.01719
- ^Deep Metric Learning via Lifted Structured Feature Embedding https://arxiv.org/abs/1511.06452