Focal Loss 損失函數簡述

Focal Loss

摘要

Focal Loss目標是解決樣本類別不平衡以及樣本分類難度不平衡等問題,如目標檢測中大量簡單的background,不多量較難的foreground樣本。Focal Loss經過修改交叉熵函數,經過增長類別權重\(\alpha\) 和 樣本難度權重調因子(modulating factor)\((1-p_t)^\gamma\),來減緩上述問題,提高模型精確。python

1、技術背景

咱們知道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的準確率,同時不影響原有的速度。算法

2、擬解決問題

做者認爲one-stage detector的準確率不如two-stage detector的緣由是:樣本不均衡問題,其中包括兩個方面:函數

    1. 解決樣本的類別不平衡問題
    1. 解決簡單/困難樣本不平衡問題

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的大部分,並且可能是容易分類的,所以使得模型的優化方向並非咱們所但願的那樣。spa

3、解決方案

爲了解決(1)解決樣本的類別不平衡問題和(2)解決簡單/困難樣本不平衡問題,做者提出一種新的損失函數:focal loss。這個損失函數是在標準交叉熵損失基礎上改進獲得:.net

該focal loss函數曲線爲:
code

其中,\(-log(p_t)\) 爲初始交叉熵損失函數,\(\alpha\)類別間(0-1二分類)的權重參數\((1-p_t)^\gamma\)簡單/困難樣本調節因子(modulating factor),而\(\gamma\)聚焦參數(focusing parameter)blog

一、造成過程:

(1)初始二分類的交叉熵(Cross Emtropy, CE)函數:


在上面的\(y\in \{\pm1\}\) 爲指定的ground-truth類別,\(p \in [0, 1]\) 是模型對帶有 \(y=1\) 標籤類別的機率估計。爲了方便,咱們將\(p_t\)定義爲:
ip

和重寫的\(CE(p, y)\)
ci

(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

4、Reference

  1. https://blog.csdn.net/u014380165/article/details/77019084
  2. 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.
相關文章
相關標籤/搜索