天天看點

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

目錄

  • 參考文獻
  • 人臉損失函數
    • CenterLoss (2016)
    • 餘弦距離 cosine loss
    • CosineMarginLoss(Large-Margin-Cosine-Loss)(2018 CosFace)
    • ArcFace
    • Circle Loss(2020)
    • MV-Softmax loss(2020)
    • CurricularFace(2020)
    • 人臉損失函數github源碼詳解
      • ArcFace(InsightFace)pytorch代碼實作(對官方代碼有詳細注解)
      • Angular Penalty Softmax Losses Pytorch
        • 損失函數的定義
        • 模型的定義
        • 訓練
      • Face_Pytorch
        • Arcface的loss函數實作
        • 訓練
        • 測試
    • 人臉損失函數用于普通分類
      • [Arcface loss實作MNIST資料集(pytorch)](https://blog.csdn.net/weixin_45191152/article/details/98327257?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare)
      • 分類器ArcFace、ArcLoss在MNIST資料集上的實作和效果
      • pytorch-center-loss(mnist資料集)
          • models.py的定義
          • main.py
  • 度量學習損失函數
  • 一些用于回歸問題的損失函數

參考文獻

https://blog.csdn.net/zhangxb35/article/details/72464152

人臉識别中Softmax-based Loss的演化史(技術改進主要又能被歸為兩大類别,做歸一化以及加 margin)

人臉識别最新進展——幾篇相關論文總結

人臉識别損失函數(Center-Loss、A-Softmax、AM-Softmax、ArcFace)

人臉識别損失函數綜述(附開源實作)

人臉識别:損失函數總結

人臉識别損失函數(Center-Loss、A-Softmax、AM-Softmax、ArcFace)(對幾個loss的優缺點進行了點評)

有大牛在cifar10和 cifar100上測試過 centerloss ,發現效果并不是很好,準确率明顯低于單獨的 softmax loss ;在mnist 上測試加上centerloss 的 softmax 好于單獨的 softmax loss ;是以了解之是以centerloss是針對人臉識别的loss 是有原因的,因為人臉的中心性更強一些,即一個人的所有臉取平均值之後的人臉我們還是可以辨識是不是這個人,是以centerloss才能發揮作用。

人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace

一言以蔽之ArcFace、SphereFace、CosFace三個損失函數相對于前輩們而言,改進的一個核心思路就是:

隻有平常(train)更刻苦的訓練,才有可能在比賽中(test)中得到更好的結果。

它們都對卷積神經網絡提出了更高的目标,在訓練階段更為艱難,也是以讓其成為了一個更好的分類器。

人臉損失函數

CenterLoss (2016)

CenterLoss | 減小類間距離

損失函數改進之Center Loss

github代碼講述了怎樣實作centerloss,以及怎樣使用和更新centerloss,以及特征可視化

  • centerloss的主要思路為:讓每一類特征盡可能的在輸出特征空間内聚集在一起。更直白的描述就是每一類的特征在特征空間中盡可能的聚集在某一個中心點附近。
  • 中心點是如何維護的?

    接下來就詳細講一下這個動态過程,首先提出一個問題:中心點明明是不确定的,那如何讓特征去聚集在這個不确定的特征中心點呢?

    ----- 随機初始化各類的中心點,然後動态更新。

    pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

用知乎上比較概括性的話來講就是:

center loss的原理主要是在softmax loss的基礎上,通過對訓練集的每個類别在特征空間分别維護一個類中心,在訓練過程,增加樣本經過網絡映射後在特征空間與類中心的距離限制,進而兼顧了類内聚合與類間分離。

最終通過将centerloss和softmaxloss進行權重求和,實作整體的分類任務的學習。

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

注意:因為center loss要維護一個動态變化的center,是以它本身是具有可學習參數的。是以要為center loss搭配一個優化器。代碼參考:https://github.com/KaiyangZhou/pytorch-center-loss

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

在github的pytorch源碼中,centerLoss類有一個初始化參數feat_dim

def init(self, num_classes=10, feat_dim=2, use_gpu=True)

其中,feat_dim指的是輸入loss函數進行損失計算的特征向量的次元,一般是将最後全連接配接層的輸出送入centerLoss,是以一般feat_dim和num_classes相等

餘弦距離 cosine loss

注意:餘弦距離是比較兩個向量的相似度,要與“Large Margin Cosine Loss”差別開來(後者是将交叉熵變換到極坐标空間,然後強行加入一個決策邊界)。

深度學習分類、識别等任務常用的餘弦距離和對應的PyTorch代碼

分類結果是可以通過判斷兩個樣本在輸出空間對應的向量之間的夾角來得知是否是同一類樣本。這個夾角就是所謂的餘弦距離,夾角越小,兩個樣本越相似。
pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數
from torch.nn import functional as F
def calculate_cos_distance(a,b):
    a = F.normalize(a, dim=-1)
    b = F.normalize(b, dim=-1)
    cose = torch.mm(a,b)
    return 1 - cose
           

CosineMarginLoss(Large-Margin-Cosine-Loss)(2018 CosFace)

pytorch源碼

TensorFlow源碼

CosineMarginLoss做了兩件事:

1、轉換了學習空間,由最開始的優化内積變成了現在的優化角度,但是學習到的feature仍然隻是separable,還沒到達我們的目标:discriminative features。

  • 轉換過程如下:

    (1)原始的交叉熵損失:

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

上式中,p(i)是指ground truth的标簽,q(i)是指預測機率。

分類神經網絡中,很多情況下(因為one-hot編碼中label隻有一項為1,其它都為0)就等效為下式(哭:下式中pi指的是預測機率):

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

pi 被正确分類的後驗機率,C是類别總數, fi是最後的全連接配接層(偏置為0)的輸出。

上式中,因為采用的是softmax,是以有log(pi)的等式:

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

(2)令Wj是分類全連接配接層參數,x是全連接配接層前的特征,那麼就有:

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

這個公式表明向量的範數和角度都會影響後驗機率。作者是根據NormFace這篇文章的思想,将||Wj||||x||規範化為一個尺度s。是以,後驗機率僅僅依賴于夾角的餘弦值。

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

到目前為止,模型隻是轉換了學習空間而已,由最開始的優化内積變成了現在的優化角度,但是學習到的feature仍然隻是separable,還沒到達我們的目标:discriminative features。(然而這個損失函數僅僅将不同類的特征分離,增強了分類的正确性,學習到的特征判别性還不夠強。是以有必要為分類界面引入餘弦Margin)

2、引入一個cosine margin來進行度量的限制,讓目前樣本所屬的類别在減去一個m之後仍然屬于這個類别

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

是以進一步改進後的損失函數通過額外添加的Margin促使學習的特征更具有判别性。最後定義Large Margin Cosine Loss(LMCL):

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

ArcFace

ArcFace算法筆記

Circle Loss(2020)

CVPR 2020 Oral | 曠視研究院提出Circle Loss,統一優化視角

MV-Softmax loss(2020)

2020- Mis-classifified Vector Guided Softmax Loss for Face Recognition

我們提出了一種新的MV-Softmax loss算法,它明确指出了難例樣本,并着重于它們來指導鑒别特征學習。

CurricularFace(2020)

人臉識别中常用損失函數主要包括兩類,基于間隔和難樣本挖掘,這兩種方法損失函數的訓練政策都存在缺陷。

基于間隔的方法是對所有樣本都采用一個固定的間隔值,沒有充分利用每個樣本自身的難易資訊,這可能導緻在使用大邊際時出現收斂問題;

基于難樣本挖掘的方法則在整個網絡訓練周期都強調難樣本,可能出現網絡無法收斂問題。

為了解決上述問題,優圖實驗室引入了Curriculum Learning的概念來優化損失函數。

人臉損失函數github源碼詳解

ArcFace(InsightFace)pytorch代碼實作(對官方代碼有詳細注解)

Angular Penalty Softmax Losses Pytorch

Angular Penalty Softmax Losses Pytorch(實作啦ArcFace、SphereFace、CosFace、Additive Margin等loss,但是這份源碼僅有訓練部分,沒有測試部分的代碼)

損失函數的定義

檔案:loss_functions.py

三種損失函數進行了統一的定義

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

損失函數中引入了一個Linear層,也就引入了參數。這些參數在訓練過程中是需要更新的。其中,Linear層的輸入是骨幹網的輸出矢量(如resnet最後的Linear層輸出的一維向量,也就是類别數(在畫可視化圖時,可以将resnet的最後輸出改為2,便于畫二維可視化圖,見center loss的原文))

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數
pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

模型的定義

檔案:model.py

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

訓練

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

Face_Pytorch

Face_Pytorch( including arcface, cosface and sphereface and so on. 有訓練代碼、測試代碼,注意訓練和測試采用的網絡結構不一樣,後者隻使用了骨幹網,沒有采用Loss函數中的Linear層。)

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數
pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

Arcface的loss函數實作

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

訓練

存在于train.py

  • 訓練前的準備
pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數
  • 每一次iter
    pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

測試

  • 疑問?— 為啥測試時僅用骨幹網的輸出矢量,但這個矢量的次元卻不等于類别數?
  • xys猜測:因為人臉識别跟普通的分類問題不同,并沒有确定的類别數量。(普通的分類問題時,骨幹網的輸出矢量的次元應該就要等于類别數量)
pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數
pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

人臉損失函數用于普通分類

Arcface loss實作MNIST資料集(pytorch)

分類器ArcFace、ArcLoss在MNIST資料集上的實作和效果

pytorch-center-loss(mnist資料集)

models.py的定義

模型采用Lenet,為了适應centerloss的需要,在模型的最後做了微調。

原始的Lenet就是在卷積層後加入一個全連接配接層作為logits輸出,但該模型中把該全連接配接層作為了一個特征向量(特征向量的次元=2是為了可視化,也可是其它次元)

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

該模型在輸出時有兩個值,一個是特征向量x,x在訓練時後接centerloss計算子產品,x在推理時不使用;另一個是分類輸出y,y在訓練時後接交叉熵損失,y在推理時用作分類

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數
main.py

訓練開始之前定義兩個優化器。

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

main.py中進行了模型的訓練

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

main.py模型測試:

pytorch loss function (人臉損失函數/ 度量損失函數/回歸問題的損失函數)總結參考文獻人臉損失函數度量學習損失函數一些用于回歸問題的損失函數

度量學習損失函數

  • 常用度量學習損失函數(介紹了對比損失、三元組損失(Triplet loss)、四元組損失(Quadruplet loss)、難樣本采樣三元組損失(Triplet loss with batch hard mining, TriHard loss)、邊界挖掘損失(Margin sample mining loss, MSML))
  • Margin Sample Mining Loss(MSML是同時兼顧相對距離和絕對距離并引入了難樣本采樣思想的度量學習方法)

MSML損失的核心思想是:對于每一個訓練batch,随機挑選 P 個ID的行人,每個行人随機挑選 K 張不同的圖檔,即一個batch含有 P×K 張圖檔,然後計算一個NxN的距離矩陣。之後對于一個batch,我們隻挑選一個最難的正樣本對和一個最難的負樣本對。

這種采樣方法并不會浪費訓練資料,因為兩個樣本對的選擇,是由整個批次中所有的資料決定的,随着訓練次數增加,損失的下降,不僅僅兩個選擇的樣本對,大部分的正負樣本對之間的距離都會變大。

TriHard損失是針對batch中的每一張圖檔都挑選了一個三元組,而MSML損失隻挑選出最難的一個正樣本對和最難的一個負樣本對計算損失。是以MSML是比TriHard更難的一種難樣本采樣

深度度量學習中的損失函數(Contrastive loss、Triplet loss、N-pair-ms loss、Lifted Struct loss、Proxy NCA loss、Ranked list loss、Multi-Similarity loss)

  • Sampling Methods of Metric Learning

一些用于回歸問題的損失函數

最牛損失函數解讀: A General and Adaptive Robust Loss Function

對于一個特定的問題,我們可能需要測試各種損失。在訓練一個網絡的同時,快速測試各種損失函數不是很神奇嗎?本文的主要思想是引入一個廣義的損失函數,其中損失函數的魯棒性可以改變,并可以在訓練網絡的同時訓練這個超參數,以提高性能。這比通過執行網格搜尋交叉驗證來尋找最佳損失所花費的時間要少得多。

繼續閱讀