論文:Focal Loss for Dense Object Detection
論文鏈接:https://arxiv.org/abs/1708.02002
一. 提出背景
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的原因是:樣本的類別不均衡導致的。我們知道在object detection領域,一張圖像可能生成成千上萬的candidate locations,但是其中只有很少一部分是包含object的,這就帶來了類別不均衡。那么類別不均衡會帶來什么后果呢?引用原文講的兩個后果:(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的大部分,而且多是容易分類的,因此使得模型的優化方向並不是我們所希望的那樣。其實先前也有一些算法來處理類別不均衡的問題,比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句話概括:In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples。OHEM算法雖然增加了錯分類樣本的權重,但是OHEM算法忽略了容易分類的樣本。
因此針對類別不均衡問題,作者提出一種新的損失函數:focal loss,這個損失函數是在標准交叉熵損失基礎上修改得到的。這個函數可以通過減少易分類樣本的權重,使得模型在訓練時更專注於難分類的樣本。為了證明focal loss的有效性,作者設計了一個dense detector:RetinaNet,並且在訓練時采用focal loss訓練。實驗證明RetinaNet不僅可以達到one-stage detector的速度,也能有two-stage detector的准確率。
二. focal loss
1.Cross Entropy
對於二分類來說:標准的交叉熵損失:
$CrossEntropy= -\frac{1}{n} \sum_{i=1}^{n} [y_i log(p_i) + (1-y_i) log(1 - log(p_i))]$
或
這里$y$是GT=1/0,$p$是預測輸出為1的概率。
我們知道,當$y=1$時:
這時候,$L$與預測輸出的關系如下左圖所示:很顯然:對於正樣本的預測,預測輸出越接近真實樣本標簽$y=1$, 損失函數$L$越小;預測輸出越接近0,$L$越大。
而當$y=0$時:
這時候,$L$與預測輸出的關系如上右圖:同樣,預測輸出越接近真實樣本標簽0($p$值越小),損失函數$L$越小;預測輸出越接近1,$L$越大。函數的變化趨勢也完全符合實際需要的情況。
無論真實樣本標簽 $y$ 是 0 還是 1,$L$ 都表征了預測輸出與 $y$ 的差距。從圖形中我們可以發現:預測輸出與 $y$ 差得越多,$L$ 的值越大,也就是說對當前模型的 “ 懲罰 ” 越大,而且是非線性增大,是一種類似指數增長的級別。這是由 log 函數本身的特性所決定的。這樣的好處是模型會傾向於讓預測輸出更接近真實樣本標簽$ y$。
為了方便,用pt代替p,如下公式2:
接下來介紹一個最基本的對交叉熵的改進,也將作為本文實驗的baseline。
2.Balanced Cross Entropy
什么意思呢?增加了一個系數at,跟pt的定義類似,當label=1的時候,at=a;當label=-1的時候,at=1-a,a的范圍也是0到1。因此可以通過設定a的值(一般而言假如1這個類的樣本數比-1這個類的樣本數多很多,那么a會取0到0.5來增加-1這個類的樣本的權重)來控制正負樣本對總的loss的共享權重。這里當a=0.5時就和標准交叉熵一樣了(系數是個常數)。
顯然前面的公式3雖然可以控制正負樣本的權重,但是沒法控制容易分類和難分類樣本的權重。
3.Focal Loss
這里的$\gamma$ 稱作focusing parameter,$\gamma>=0$。
$(1- p_t)^\gamma$ 稱為調制系數(modulating factor)
這里介紹下focal loss的兩個重要性質:1、當一個樣本被分錯的時候,pt是很小的(請結合公式2,比如當y=1時,p<0.5才是錯分類,此時pt就比較小,反之當y=-1時,p>0.5是錯分了),因此調制系數就趨於1,也就是說相比原來的loss是沒有什么大的改變的。當pt趨於1的時候(此時分類正確而且是易分類樣本),調制系數趨於0,也就是對於總的loss的貢獻很小。2、當 $γ=0$ 的時候,focal loss就是傳統的交叉熵損失,當 $γ$ 增加的時候,調制系數也會增加。
focal loss的兩個性質算是核心,其實就是用一個合適的函數去度量難分類和易分類樣本對總的損失的貢獻。
作者在實驗中采用的是公式5的focal loss(結合了公式3和公式4,這樣既能調整正負樣本的權重,又能控制難易分類樣本的權重):
PS: 實際我在使用中,選擇的是以下方式
FL(p_t) =(1 - p_t) ^ 1.0 * log(p_t) if p_t 來自正樣本 FL(p_t) =(1 - p_t) ^ gamma * log(p_t) if p_t 來自負樣本
即給易分的負樣本更大的懲罰。
三. 實驗
在實驗中a的選擇范圍也很廣,一般而言當γ增加的時候,a需要減小一點(實驗中γ=2,a=0.25的效果最好)
實驗結果:
Table1是關於RetinaNet和Focal Loss的一些實驗結果。(a)是在交叉熵的基礎上加上參數a,a=0.5就表示傳統的交叉熵,可以看出當a=0.75的時候效果最好,AP值提升了0.9。(b)是對比不同的參數γ和a的實驗結果,可以看出隨着γ的增加,AP提升比較明顯。(d)通過和OHEM的對比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。這里OHEM1:3表示在通過OHEM得到的minibatch上強制positive和negative樣本的比例為1:3,通過對比可以看出這種強制的操作並沒有提升AP。(e)加入了運算時間的對比,可以和前面的Figure2結合起來看,速度方面也有優勢!注意這里RetinaNet-101-800的AP是37.8,當把訓練時間擴大1.5倍同時采用scale jitter,AP可以提高到39.1,這就是全文和table2中的最高的39.1AP的由來。
Figure4是對比forground和background樣本在不同γ情況下的累積誤差。縱坐標是歸一化后的損失,橫坐標是總的foreground或background樣本數的百分比。可以看出γ的變化對正(forground)樣本的累積誤差的影響並不大,但是對於負(background)樣本的累積誤差的影響還是很大的(γ=2時,將近99%的background樣本的損失都非常小)。
三. 總結
原文的這段話概括得很好:In this work, we identify class imbalance as the primary obstacle preventing one-stage object detectors from surpassing top-performing, two-stage methods, such as Faster R-CNN variants. To address this, we propose the focal loss which applies a modulating term to the cross entropy loss in order to focus learning on hard examples and down-weight the numerous easy negatives.