我讀到一篇關於一個新的損失函數的論文,Circle Loss,我很難理解它。我想尋找一個更簡單的解釋,但是沒有結果☹️,這是一篇比較近的論文,2020年6月。因此,我決定寫這篇文章,為了給其他人提供一個更簡單的解釋,並記錄我的學習。
必備知識為了理解Circle Loss,神經網絡,CNN, Siamese網絡,和Triplet Loss的知識是非常有用的。我將在這篇文章中簡要地解釋Siamese網絡和Triplet Loss。
Siamese 網絡在實現分類解決方案時,你可能面臨的一個常見問題是缺少其中一個類的訓練數據。例如,假設你想為只有5名員工的公司創建一個人臉識別系統。訓練這個網絡需要為每個員工提供大量圖像,而公司通常只為每個員工提供一張圖像。此外,當新員工加入時,你需要再次對模型進行訓練,以便在網絡中添加新類。因此,你需要一種解決方案,能夠通過每個類(person)的單個輸入(image)來區分person。
One-Shot Learning的目的是解決這些問題,每個類只需要一個訓練樣本。Siamese Network是一種可以進行one-shot learning的架構。讓我們看看它的架構是什麼樣的。
Siamese網絡結構Siamese網絡由兩個完全相同的卷積網絡組成,因此Siamese這個名字的意思是同卵雙胞胎。它的想法是,不是給一個單獨的圖像作為輸入然後嘗試預測類別,你將給網絡一對圖像作為輸入,通過ConvNets處理,它會給你特徵圖或者每個圖像的嵌入。然後我們使用一個損失函數來計算這兩個特徵之間的差異,以衡量相似度得分。對比損失是計算兩個嵌入之間的餘弦距離的損失的一個例子。最後,我們使用一個sigmoid函數將相似度評分轉換為0到1之間的值。
相似度評分使你能夠確定兩個圖像是否相似。0表示圖像不同,而1表示圖像相似。這進而解決了前面的問題,因為每個類最初只需要一個圖像作為參考圖像。
Triplet Loss多年之前,谷歌在FaceNet: A Unified Embedding for Face Recognition and Clustering論文中引入了人臉識別的 Triplet Loss 函數。
在 Triplet Loss 中,在訓練期間,不是有兩個輸入,而是有三個輸入,分別是錨,正樣本和負樣本。錨是參考輸入,它可以是任何輸入,正樣本輸入是與錨具有相同類別的輸入,而負樣本輸入必須與錨具有不同的類別。例如,在人臉識別的情況下,輸入的信息可以像下面的圖片一樣,錨和正樣本顯示的是同一個人,負樣本顯示的是不同的人。
兩張正樣人臉(歐巴馬)和一張負樣本人臉(馬克龍)的Triplet loss然後,通過將每幅圖像傳遞給相同的CNN(相同的權值)來計算每幅圖像的嵌入。接下來,我們將把這三個嵌入件傳遞給 Triplet Loss 函數。下面是嵌入的可視化。
最小化triplet loss函數之前(左)和之後(右)Triplet Loss函數背後的想法是,我們推遠或最大化錨和負樣本之間的距離,同時拉近或最小化錨和正樣本嵌入之間的距離。
要做到這一點,我們計算錨和正樣本之間的差別,使用距離函數d,我們表示為d (a, p),理想情況下這應該很低,同時計算錨和負樣本之間的差別,我們表示為d(a, n),理想情況下應該很高。因此,為了得到一個正確的預測,我們總是希望值d(a,p)小於d(a,n)。數學上我們也可以表示為,d(a,p) - d(a,n) < 0。但是,由於我們不希望我們的損失是一個負值,如果它是負數,我們將它設為零。因此,我們可以定義損失函數為max(d(a,p) - d(a,n), 0)。
然而,前面的方程的問題是,事實上,當正樣本或負樣本與錨具有相同的距離時,或者正樣本只是相比負樣本稍微接近錨,損失就會是零,此時就不會進行校正,儘管它仍然應該把正樣本拉的更近,把負樣本推得更遠。為了解決這個問題,我們只需在d(a,p) - d(a,n)上加上一個常數,我們稱這個常數為margin。因此,我們最終可以將triplet loss函數定義為:
Triplet Loss函數根據公式,我們可以將triplets分為三種類型:
Easy triplets:由於d(a,p)+margin<d(a,n),而損失為0的triplets。Hard triplets:Triplets中負樣本比正樣性更接近錨,即d(a,n)<d(a,p)。Semi-hard triplets:Triplets中負樣本與錨的距離並不比正樣本近,但仍有正的損失:d(a,p)<d(a,n)<d(a,p)+margin你可以注意到,當正樣本靠近錨的程度非常接近負樣本時,margin將防止損失為零。理想情況下,你應該使用Hard negatives來訓練這個模型,避免使用easy negatives,因為它會產生0損失。
等等,我們為什麼要用 triplet loss,而不是在以前的Siamese網絡上使用對比損失呢(在那裡你只計算錨和另一個圖像距離/差別)?在對比損失中,你只是更新權重來最小化不同類的相似性或最大化相同類的相似性。另一方面,使用Triplet Loss,模型既會將正樣本輸入拉向錨,也會將負樣本輸入推離錨。
在理解了Triplet Loss之後,我們終於可以開始關注本文中介紹的Circle Loss了Circle Loss: A Unified Perspective of Pair Similarity Optimization。
本文認為,以往的相關工作的優化方式不靈活。我們可以看看下面的例子,兩對正樣本和負樣本之間有相同的margin,但是其中一對離錨更近另一對離點更遠。在 Triplet Loss 中,它會把這兩對看成是一樣的,它會通過把正樣本拉得更近把負樣本推得更遠來優化這兩對樣本。
Triplet LossSp為類內相似度評分,Sn為類間相似度評分。值得注意的是,相似度得分與距離成反比。
然而,這並不是最優的。當正樣本已經很接近「錨」時,我們就會把注意力更多地放在把負樣本推開上,當正樣本和負樣本都離我們很遠時,我們就會把注意力更多地放在把正樣本拉向「錨」。這就是Circle Loss所做的。
Circle LossCircle Loss通過對每個相似度評分、Sn、Sp分別給予不同的懲罰強度,從而使優化更加靈活。因此,我們將(Sn — Sp)推廣到(αn*Sn — αp * Sp),其中,αn和αp是獨立的權重因子,允許Sn和Sp以不同的速度學習。
此外,Circle loss也給出了一個更明確的收斂點。在前面的Triplet Loss中,它認為上面的兩對具有相同的最優性。相反,在Circle Loss中傾向於不是太接近錨(因為這意味著平均負樣本更接近錨點)和不是太遠離錨(因為正樣樣本會離錨太遠)的樣本對。
常用的減小(sn−sp)的優化方式,提出的減小(αnSn — αpSp)的優化方式的比較。在這個例子中,T和T '都有相同的margin,其他損失,如triplet loss,會發現這種任意性。然而, Circle Loss傾向於T和T '創建一個明確的收斂目標。決策邊界也由sp−sn = m變為*(αnsn - αpsp) = m*,從而形成一個圓,命名為Circle Loss。
假設兩對樣本的margin相同,在Circle Loss中更傾向於T。此外,Circle loss引入了pair-wise標籤和class-level標籤的統一學習視角。給出了一個統一的公式,只要稍加修改就可退化為triplet loss或分類損失。
統一的損失的公式然後,給定一個類級別的標籤,它會退化為分類損失。
給一個類級別的標籤,退化為分類損失然後,給一個pair-wise的標籤,會退化為Triplet loss。
給一個pair-wise的標籤,退化為Triplet loss最後,提出的Circle Loss如下:
Circle Loss方程其中
注意,我們有5個超參數,Op, On, γ,∆p,∆n。但是,我們通過設置Op = 1+m, On =−m,∆p = 1−m,∆n = m來降低超參數,因此我們只需要設置縮放參數γ和margin m。
為了進行評價,我們在class-level標籤學習和pair-wise標籤學習兩種學習方式下進行了circle loss的實驗,效果均表現較好。
對於class-level標籤,在人臉識別和行人重識別任務中評估circle loss。
對於pair-wise標籤,在細粒度圖像檢索任務上評估circle loss。
我們可以看到,在其他的最先進的方法中,circle loss在這兩個任務中都表現得很好。
簡而言之, Circle loss通過對每個相似度評分使用不同的懲罰強度,給出了一個更靈活的優化,從而使它們能夠以不同的幅度學習,創建一個更明確的收斂點。此外,它使用了一個統一的公式,使用class level標籤和pair-wise標籤進行學習。