Siamese網絡,Triplet Loss以及Circle Loss的解釋的

2021-02-19 AI公園

介紹

我讀到一篇關於一個新的損失函數的論文,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,模型既會將正樣本輸入拉向錨,也會將負樣本輸入推離錨。

Circle Loss

在理解了Triplet Loss之後,我們終於可以開始關注本文中介紹的Circle Loss了Circle Loss: A Unified Perspective of Pair Similarity Optimization。

本文認為,以往的相關工作的優化方式不靈活。我們可以看看下面的例子,兩對正樣本和負樣本之間有相同的margin,但是其中一對離錨更近另一對離點更遠。在 Triplet Loss 中,它會把這兩對看成是一樣的,它會通過把正樣本拉得更近把負樣本推得更遠來優化這兩對樣本。

Triplet Loss

Sp為類內相似度評分,Sn為類間相似度評分。值得注意的是,相似度得分與距離成反比。

然而,這並不是最優的。當正樣本已經很接近「錨」時,我們就會把注意力更多地放在把負樣本推開上,當正樣本和負樣本都離我們很遠時,我們就會把注意力更多地放在把正樣本拉向「錨」。這就是Circle Loss所做的。

Circle Loss

Circle 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標籤進行學習。

相關焦點

  • 【乾貨】Lossless Triplet Loss: 一種高效的Siamese網絡損失函數
    儘管Google的FaceNet利用Triplet Loss效果顯著,但作者認為,原來網絡中triplet_loss函數存在一定的瑕疵:「每當你的損失小於0時,損失函數就不能提供任何信息」。為解決這種問題,作者構建一個能夠捕捉到小於0的損失——Lossless Triplet Loss。在文中充分分析了不同傳統Triplet Loss及其變體的不足,然後通過實驗初步證明了提出的損失函數的有效性。
  • 【強基固本】深度學習從入門到放飛自我:完全解析triplet loss
    之前實驗室有個做無監督特徵學習的小任務,因為沒有類別的監督信息,因此也可以用triplet loss來設計約束,以期得到discriminative embedding。triplet loss原理是比較簡單的,關鍵在於搞懂各種採樣triplets的策略。
  • 【損失函數合集】Yann Lecun的Contrastive Loss 和 Google的Triplet Loss
    況且人臉識別需要考慮到樣本的類別以及數量都是非常多的,這無疑使得直接用特徵向量來對比更加困難。,這種損失函數可以有效的處理這種網絡中的成對數據的關係。關於FaceNet更多的訓練細節我們就不再介紹了,這一節的目的是介紹Triplet Loss,之後在人臉識別專欄再單獨寫一篇介紹FaceNet訓練測試以及網絡參數細節的。
  • FAT:一種快速的Triplet Loss近似方法,學習更魯棒的特徵表示,並進行有噪聲標籤的提純
    本文的貢獻:提出了FAT loss,提升了標準的triplet loss的效率。首次證明了處理了標註噪聲可以進一步提升ReID的性能。通過分配soft label可以學到更魯棒的特徵。2.方法2.1 Fast Approximated Triplet (FAT) LossFAT loss的推導如下:
  • 直播 | Circle Loss:從對相似性優化的統一視角進行深度特徵學習
    例如,用於分類學習的 softmax cross entropy loss 及其變種 AM-Softmax(CosFace)、ArcFace 等,用於樣本對距離優化的 contrastive loss 和 triplet loss 等。
  • 度量學習中的pair-based loss
    Triplet Loss最先被用於人臉識別中,如下圖,輸入一個triplet對(三張圖像),使用同一個網絡對這個三張圖像進行特徵提取,得到三個embedding向量,三個向量輸入到Triplet Loss中得到loss,然後根據loss值使用反向傳播算法對模型進行更新。
  • CVPR 2020 Oral|曠視研究院提出Circle Loss,統一優化視角
    使用類標籤時,一般需要用分類損失函數(比如 softmax + cross entropy)優化樣本和權重向量之間的相似度;使用樣本對標籤時,通常用度量損失函數(比如 triplet 損失)來優化樣本之間的相似度。這兩種學習方法之間並無本質區別,其目標都是最大化類內相似度(s_p)和最小化類間相似度(s_n)。
  • 【深度度量學習系列】​Triplet-loss原理與應用
    Ranking loss被用在很多不同的領域,它有非常廣泛應用,但缺乏命名標準化,導致了這個損失函數擁有很多其他別名,比如對比損失Contrastive loss,邊緣損失Margin loss,鉸鏈損失hinge loss和我們常見的三元組損失Triplet loss等。
  • 孿生網絡入門(上) Siamese Net及其損失函數
    就是一般情況下,模型運行一次,給出一個loss,但是在siamese net中,模型要運行兩次才能得到一個loss。我個人感覺,一般的任務像是衡量一種絕對的距離,樣本到標籤的一個距離;但是孿生網絡衡量的是樣本到樣本之間的一個距離。2.1 孿生網絡的用途Siamese net衡量的是兩個輸入的關係,也就是兩個樣本相似還是不相似。
  • 深度學習中的損失函數總結以及Center Loss函數筆記
    y_true = K.clip(y_true, K.epsilon(), 1)y_pred = K.clip(y_pred, K.epsilon(), 1)K.sum(y_true * K.log(y_true / y_pred), axis=-1)一種解釋:KL散度是用來 度量使用基於Q的編碼來編碼來自P的樣本平均所需的額外的位元數。
  • Siamese network 孿生神經網絡--一個簡單神奇的結構
    左右兩個神經網絡的權重一模一樣?答:是的,在代碼實現的時候,甚至可以是同一個網絡,不用實現另外一個,因為權值都一樣。對於siamese network,兩邊可以是lstm或者cnn,都可以。大家可能還有疑問:如果左右兩邊不共享權值,而是兩個不同的神經網絡,叫什麼呢?答:pseudo-siamese network,偽孿生神經網絡,如下圖所示。
  • 算法工程師分析Center Loss在人臉識別中的應用
    通過添加center loss使得簡單的softmax就能夠訓練出擁有內聚性的特徵。該特點在人臉識別上尤為重要,從而使得在很少的數據情況下訓練出來的模型也能有不俗的性能。本文嘗試用一種比較容易理解的方式來解釋這篇文章。我覺得在開始正式介紹center loss之前,我有必要講一個故事。請大家回答我,做人臉研究,最期待的事情是什麼?
  • Focal Loss--從直覺到實現
    越大的樣本,我們越要打壓它對loss的貢獻。FL是這麼定義的:0或者1 (假設二分類問題),可以視為「掩碼」 # 加號左邊的 y_true*alpha 表示將 y_true中等於1的槽位置為標量 alpha # 加號右邊的 (ones-y_true)*(1-alpha) 則是將等於0的槽位置為 1-alpha ones = K.ones_like(y_true) alpha_t = y_true*alpha
  • 《csgo》跳loss指丟包怎麼辦 新指令降低loss介紹
    導 讀 csgo新指令降低loss,csgo跳loss指丟包怎麼辦呢?有沒有什麼新的指令呢?
  • 英語美文欣賞:Hair Loss Remedies
    However not all hair loss remedies are equal, and before you decide that it's time to tackle your hair loss problem, you might like to think a little more about whether you need to seek out a hairloss
  • 深度實戰各種loss(上)
    = loss_mean(input, target)bce_sum = loss_sum(input, target)bce_none = loss_none(input, target)Long but expected Float提示label的梯度應設為False, 即requires_grad=False:TypeError: new() received an invalid combination of arguments - got (list, requires_grad=bool), but expected one of: didn't
  • Softmax-based Loss Functions
    近年來,在人臉識別等領域對softmax loss進行了改進,使得既能夠充分利用softmax loss收斂快等良好性質,又能夠訓練獲得一個具有優良泛化性能的度量空間。這些改進方法大概能夠被劃分為歸一化(normalization)和增加margin.歸一化優化softmax loss需要增大
  • 清晰易懂的Focal Loss原理解釋
    總述Focal loss主要是為了解決one-stage目標檢測中正負樣本比例嚴重失衡的問題。該損失函數降低了大量簡單負樣本在訓練中所佔的權重,也可理解為一種困難樣本挖掘。 2.是經過激活函數的輸出,所以在0-1之間。
  • 您知道loss是什麼意思嗎?
    說到loss這個單詞,您想到什麼意思了?今天,我們就一起看一下loss的用法。首先,我們看一下loss做名詞的用法。1、單詞loss做名詞可以翻譯成喪失、損失、丟失,通常用單數形式。When she died I was filled with a sense of loss .她去世後我心裡充滿了失落感。2、單詞loss做名詞可以翻譯成虧損、虧蝕。
  • 超詳細的語義分割中的Loss大盤點
    前言前兩天介紹了一下Contrastive Loss、Triplet Loss以及Center Loss。今天正好是周六,時間充分一點,我就來大概盤點一下語義分割的常見Loss,希望能為大家訓練語義分割網絡的時候提供一些關於Loss方面的知識。