使用一個特別設計的損失來處理類別不均衡的數據集
- 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—