機器/深度學習: 損失函數(loss function)- Huber Loss和 Focal loss

Tommy Huang
7 min readSep 28, 2018

本篇介紹兩種分類用的損失函數: Huber Loss和 Focal loss

Huber Loss

Huber loss是為了改善均方誤差損失函數(Squared loss function)對outlier的穩健性(robustness)而提出的(均方誤差損失函數對outlier較敏感,原因可以看之前文章「機器/深度學習: 基礎介紹-損失函數(loss function)」)。

Huber loss定義如下:

δ是Huber loss的參數。
第一眼看Huber loss都會覺得很複雜,但其實它就是squared loss和 absolute loss的合成。

我下面放一張squared loss、 absolute loss和Huber loss在不同參數下(δ=1, 3, 5, 10)的residual和loss變化。

δ越大越接近squared loss(因為是平方值,所以loss值遠大於其他),δ越小越接近absolute loss(基本上δ=1的Huber loss跟absolute loss重疊在一起)。

之前在「機器/深度學習: 基礎介紹-損失函數(loss function)」舉的例子,我在這邊繼續用,左表是殘差差異不大(介於-10~10),右表是我把第5筆資料殘差改成100(離群值outlier)。

由上表可以發現Huber loss得到的loss值是可以調整的(利用不同的參數(δ)),參數值(δ=1)越小Huber loss對outlier越穩健,當然由Huber loss在不同參數下的那張圖下也可以看到這個現象。

其實概念就是Huber loss是由square loss 和 absolute loss合成,從公式上看|y-ŷ|≦δ則用square loss,其他情況則用absolute loss,所以Huber loss就是發揮了機器學習大部分算法的精神,「把別人的東西變成我的special case那我就變強了」。

Focal loss

Focal loss是出自2017年 Tsung-Yi Lin等人提出的一個loss函數,這篇論文順便提出一個叫 RetinaNet的物件偵測神經網路,但作者有提到這篇主要貢獻還是在focal loss,RetinaNet只是用來驗證的一個網路。

節錄摘要:「 To evaluate the effectiveness of our loss, we design and train a simple dense detector we call RetinaNet.」

Note: 這篇第一作者Tsung-Yi Lin是台灣人,另一個作者Kaiming He就是Faster R-CNN、Mask R-CNNDeep Residual Learning的作者,何博士太秋了一堆大作。Tsung-Yi Lin和Kaiming He合作的 Feature Pyramid Networks for Object Detection也是一篇大作。

Focal loss不同於Huber loss
Huber loss是藉由針對outlier (hard example)進行down-weighting,因此對outlier,loss function還有穩健性。
但focal loss是希望針對inliers(easy example)進行down-weighting,因為 focal loss希望的是在訓練過程中能盡量去訓練hard example,忽略那些easy example。
原因在於focal loss是提出來在物件偵測用,但往往一張圖片找出的候選物件或是Anchor有絕大部分的比例是背景(background)而不是前景(foreground,也就是物件),所以在計算loss會有極大的不平衡(extreme imbalance)的問題,在這篇「Focal Loss for Dense Object Detection」文章提到在training過程中前景和背景比例可能達到1:1000。

回顧一下針對二元分類問題(y∈{±1})的Cross-entropy (CE)

p: 就是屬於y=1類模型估計的機率。把cross-entropy在簡化寫成:

從論文中給的Figure1可以發現,cross-entropy在easy example (pt>0.5),也給了loss很大的值,隨然hard example (pt<0.1)值很大,但因為Total loss是看所有候選物件的loss值相加,這時候1000筆easy examples的loss相加絕對會大於1個hard example的loss,這時候模型在學習就幾乎都在學習背景的東西。

一個解決最簡單的方法(作者提的),直接在cross-entropy加上一個weight,名稱為α-balanced cross-entropy:

但加了α還是沒有辦法解決1000筆easy examples的loss相加會大於1個hard example的loss的問題(因為α只是等比例放大縮小)。

所以focal loss加入了modulating factor:

r: focusing參數,必須≧0。

Focal loss定義如下:

作者提到說α-balanced加到focal loss可以提高一點點正確率,所以最終版的focal loss會以下公式為主:

在把模型的loss function改成這樣,搭配RetinaNet(one stage object detection)就可以達到比two stage方法好的mAP,且計算量速度都比two stage來的快,這個方法雖然很簡單,但有誰想到了。
不免俗再提一下,機器學習大部分算法的精神,「把別人的東西變成我的special case那我就變強了」,focal loss也是把cross entropy變成我的special case,當α=1且r=0,focal loss=cross entropy,所以figure 1沒有額外畫一條cross-entropy的線,因為cross-entropy的線等於淺藍色(r=0)的線。

--

--

Tommy Huang

怕老了忘記這些吃飯的知識,開始寫文章記錄機器/深度學習相關內容。Medium現在有打賞功能(每篇文章最後面都有連結),如果覺得寫的文章不錯,也可以Donate給個Tipping吧。黃志勝 Chih-Sheng Huang (Tommy), mail: chih.sheng.huang821@gmail.com