使用一個特別設計的損失來處理類別不均衡的數據集

  • 2019 年 10 月 7 日
  • 筆記

導讀

本文是Google對CVPR ' 19上發表的一篇文章的綜述,文章的標題是Class-Balanced Loss Based on Effective Number of Samples。它為最常用的損耗(softmax-cross-entropy、focal loss等)提出了一個針對每個類別的重新加權方案,能夠快速提高精度,特別是在處理高度類不平衡的數據時。

本文是Google對CVPR ' 19上發表的一篇文章的綜述,文章的標題是Class-Balanced Loss Based on Effective Number of Samples。

它為最常用的損耗(softmax-cross-entropy、focal loss等)提出了一個針對每個類別的重新加權方案,能夠快速提高精度,特別是在處理高度類不平衡的數據時

論文的PyTorch實現源碼:https://github.com/vandit15/Class-balanced-loss-pytorch

樣本的有效數量

在處理長尾數據集(其中大部分樣本屬於很少的類,而許多其他類的樣本非常少)的時候,如何對不同類的損失進行加權可能比較棘手。通常,權重設置為類樣本的倒數或類樣本的平方根的倒數。

傳統的權重調整與這裡提出的權重調整

然而,正如上面的圖所示,這一過度是因為隨著樣本數量的增加,新數據點的帶來的好處會減少。新添加的樣本極有可能是現有樣本的近似副本,特別是在訓練神經網路時使用大量數據增強(如重新縮放、隨機裁剪、翻轉等)的時候,很多都是這樣的樣本。用有效樣本數重新加權可以得到較好的結果。

有效樣本數可以想像為n個樣本所覆蓋的實際體積,其中總體積N由總樣本表示。

有效樣本數量

我們寫成:

有效樣本數量

我們還可以寫成下面這樣:

每個樣本的貢獻

這意味著第j個樣本對有效樣本數的貢獻為βj-1。

上式的另一個含義是,如果β=0,則En=1。同樣,當β→1的時候En→n。後者可以很容易地用洛必達法則證明。這意味著當N很大時,有效樣本數與樣本數N相同。在這種情況下,唯一原型數N很大,每個樣本都是唯一的。然而,如果N=1,這意味著所有數據都可以用一個原型表示。

類別均衡損失

如果沒有額外的資訊,我們不能為每個類設置單獨的Beta值,因此,使用整個數據的時候,我們將把它設置為一個特定的值(通常設置為0.9、0.99、0.999、0.9999中的一個)。

因此,類別均衡損失可表示為:

這裡, L(p,y) 可以是任意的損失。

類別均衡Focal Loss

原始版本的focal loss有一個α平衡變數。這裡,我們將使用每個類的有效樣本數對其重新加權。

類似地,這樣一個重新加權的項也可以應用於其他著名的損失(sigmod -cross-entropy, softmax-cross-entropy等)。

實現

在開始實現之前,需要注意的一點是,在使用基於sigmoid的損失進行訓練時,使用b=-log(C-1)初始化最後一層的偏差,其中C是類的數量,而不是0。這是因為設置b=0會在訓練開始時造成巨大的損失,因為每個類的輸出概率接近0.5。因此,我們可以假設先驗類是1/C,並相應地設置b的值。

每個類的權值的計算

計算歸一化的權值

上面的程式碼行是獲取權重並將其標準化的簡單實現。

得到標籤的onehot張量

在這裡,我們得到權重的獨熱值,這樣它們就可以分別與每個類的損失值相乘。

實驗

類平衡提供了顯著的收益,特別是當數據集高度不平衡時(不平衡= 200,100)。

結論

利用有效樣本數的概念,可以解決數據重疊問題。由於我們沒有對數據集本身做任何假設,因此重新加權通常適用於多個數據集和多個損失函數。因此,可以使用更合適的結構來處理類不平衡問題,這一點很重要,因為大多數實際數據集都存在大量的數據不平衡。

—END—