Focal Loss
摘要
Focal Loss目標是解決樣本類別不平衡以及樣本分類難度不平衡等問題,如目標檢測中大量簡單的background,很少量較難的foreground樣本。Focal Loss通過修改交叉熵函數,通過增加類別權重\(\alpha\) 和 樣本難度權重調因子(modulating factor)\((1-p_t)^\gamma\),來減緩上述問題,提升模型精確。
一、技術背景
我們知道object detection的算法主要可以分為兩大類:two-stage detector和one-stage detector。前者是指類似Faster RCNN,RFCN這樣需要region proposal的檢測算法,這類算法可以達到很高的准確率,但是速度較慢。雖然可以通過減少proposal的數量或降低輸入圖像的分辨率等方式達到提速,但是速度並沒有質的提升。后者是指類似YOLO,SSD這樣不需要region proposal,直接回歸的檢測算法,這類算法速度很快,但是准確率不如前者。作者提出focal loss的出發點也是希望one-stage detector可以達到two-stage detector的准確率,同時不影響原有的速度。
二、擬解決問題
作者認為one-stage detector的准確率不如two-stage detector的原因是:樣本不均衡問題,其中包括兩個方面:
-
- 解決樣本的類別不平衡問題
-
- 解決簡單/困難樣本不平衡問題
When summed over a lager number of easy examples, these small loss values can overwhelm the rare class.
大量loss小的簡單樣本相加,可以淹沒稀有類.
如在object detection領域,一張圖像可能生成成千上萬的candidate locations,但是其中只有很少一部分是包含object的(1:1000)。這就帶來了類別不均衡。那么類別不均衡會帶來什么后果呢?引用原文講的兩個后果:(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal; (2) en masse, the easy negatives can overwhelm training and lead to degenerate models.
負樣本數量太大,占總的loss的大部分,而且多是容易分類的,因此使得模型的優化方向並不是我們所希望的那樣。
三、解決方案
為了解決(1)解決樣本的類別不平衡問題和(2)解決簡單/困難樣本不平衡問題,作者提出一種新的損失函數:focal loss。這個損失函數是在標准交叉熵損失基礎上改進得到:
該focal loss函數曲線為:
其中,\(-log(p_t)\) 為初始交叉熵損失函數,\(\alpha\) 為類別間(0-1二分類)的權重參數,\((1-p_t)^\gamma\) 為簡單/困難樣本調節因子(modulating factor),而\(\gamma\) 則聚焦參數(focusing parameter)。
1、形成過程:
(1)初始二分類的交叉熵(Cross Emtropy, CE)函數:
在上面的\(y\in \{\pm1\}\) 為指定的ground-truth類別,\(p \in [0, 1]\) 是模型對帶有 \(y=1\) 標簽類別的概率估計。為了方便,我們將\(p_t\)定義為:
和重寫的\(CE(p, y)\):
(2)平衡交叉熵(Balanced Cross Entropy):
一個普遍解決類別不平衡的方法是增加權重參數\(\alpha \in [0 ,1]\),當$ y=1 \(類的權重為\)\alpha$ ,\(y=-1\) 類的權重為\(1-\alpha\) 。在實驗中,\(\alpha\) 被設成逆類別頻率(inverse class frequence),\(\alpha_t\)定義與\(p_t\)一樣:
因此,\(\alpha-balanced\) 的CE損失函數為:
(3)聚焦損失(Focal Loss):
盡管\(\alpha\)能平衡positive/negative的重要性,但是無法區分簡單easy/困難hard樣本。為此,對於簡單的樣本增加一個小的權重(down-weighted),讓損失函數聚焦在困難樣本的訓練。
因此,在交叉熵損失函數增加調節因子\((1-p_t)^\gamma\) ,和可調節聚參數\(\gamma \geq 0\)。,所以損失函數變成:
當\(p_t\rightarrow0\)時,同時調節因子也 \((1-p_t)^\gamma\rightarrow0\) ,因此簡單樣本的權重越小。直觀地講,調節因子減少了簡單示例的loss貢獻,並擴展了樣本接收低loss的范圍。 例如,在γ= 2的情況下,與CE相比,分類為pt = 0.9的示例的損失將降低100倍,而對於pt≈0.968的示例,其損失將降低1000倍。 這反過來增加了糾正錯誤分類示例的重要性(對於pt≤0.5和γ= 2,其損失最多縮小4倍)。
(4)最終的損失函數Focal Loss形式:
根據論文作者實驗,\(\alpha=0.25\) 和 \(\gamma=2\) 效果最好
實現代碼:
def focal_loss(y_true, y_pred):
alpha, gamma = 0.25, 2
y_pred = K.clip(y_pred, 1e-8, 1 - 1e-8)
return - alpha * y_true * K.log(y_pred) * (1 - y_pred)**gamma\
- (1 - alpha) * (1 - y_true) * K.log(1 - y_pred) * y_pred**gamma
四、Reference
- https://blog.csdn.net/u014380165/article/details/77019084
- Lin T Y, Goyal P, Girshick R, et al. Focal loss for dense object detection[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2980-2988.