這篇cvpr2019的論文主要提出了一個損失函數Class-Balanced Loss用來處理數據長尾問題
長尾問題是由於分類問題中數據集每類的數據量不同,導致分類准確度下降。舉個極端點的例子有助於理解:A、B二分類問題,數據集中,A、B數據量比例為999:1,為了減少損失值,網絡很自然的將所有圖片都分到A類,這樣准確率為99.9%,但是明顯這個網絡不能用。
為了解決長尾問題,前人也提出了不少辦法,比如將B圖片數據增強,縮放、旋轉、平移、裁剪,使得B類別中有999張圖片,這樣數據就均衡了;或者給A的損失值之前加一個權重系數(1/999)。理想很豐滿,現實很骨感。這樣做提升效果有限。
為什么呢?打個比方:假設AB兩個類別分別是一個圓形,數據集中的數據就是圓形中的點。如果訓練時你能把圓中每個點都取到了,測試時網絡的准確率一定是100%,畢竟所有點都記錄在案了。然而實際上不可能取到圓中每一個點,同樣也不能取到類中的每一個數據。我們可以退而求其次,如果能從圓中均勻的取足夠多的點,也能反應出這個圓(類別)的特性。然而用上面提到的兩種方法做數據增強,相當於在已有點周圍取點,很明顯這些點不能反映圓(類別)的特性。
那什么樣的點能夠反映圓的特性呢?換言之,哪些點是有效的,哪些點是無效的呢?
這篇論文一開始就提出一個概念:Effective Number(有效數據,用E來表示),如果知道了每個類別中的有效數據數量,問題似乎就好辦多了:CB = 1/E * L 。其中CB是本文提出的Class-Balanced Loss,L是普通損失函數,可以任意更換。
現在要做的就是求有效數據E。先給結論:
,其中
,N為有效樣本的上限,該類別的采樣數(數據集中該類別的圖片數量),可以用歸納法證明
當n=1時,E1=1
當n>1時,,因為
所以,
所以最終,
是Class-Balanced Loss
是普通損失函數,可以任意更換。
由於現實中,N無法得到,因此無法計算,因為N幾近無窮,因此β取一個接近1的數,作者代碼里給的是0.9999。
這樣,這個問題就完美解決。
作者在論文里還嘗試了該算法與一些傳統算法結合,效果也不錯: