一、正負樣本不均衡問題
Class Imbalance(正負樣本不平衡) 帶來的問題就是:樣本中會存在大量的easy examples,且都是負樣本(屬於背景的樣本)。這樣,easy negative examples會對loss起主要貢獻作用,會主導梯度的更新方向,網絡學不到有用的信息,無法對object進行準確分類。
還有一個問題,爲什麼two stage不會有這樣的問題呢或者爲什麼two stage沒有one stage這麼嚴重呢?
因爲,對於two stage來說,首先利用RPN產生region proposal,這一步就已經刪去了很多easy examples。我們對這些region proposal進行篩選,可以人爲控制正負樣本的比例爲1:3。 此外,對於負樣本的選取,可以通過在線難例挖掘,選取有利於網絡更新的難分樣本,讓網絡學習到有用的信息,進行參數的更新。
因此,one stage在檢測mAP上不如two stage。
二、解決方案:Focal Loss
如下是未變化前的交叉熵(cross entropy) loss,以二分類爲例:
通過實驗發現,即使是easy examples(Pt >> 0.5),它的loss也很高,所以當這種樣本的數量較多的時候,累計起來就會比較大了,甚至會超過那些概率較小的樣本(hard example),導致對於那些hard example的學習效果不佳,這也就是爲什麼正負樣本不均衡會導致學習效果不佳,太多的簡單樣本,累加起來,會產生較大的影響,量變產生質變。如下圖藍線:
可見普通的交叉熵對於正樣本而言,輸出概率越大損失越小。對於負樣本而言,輸出概率越小則損失越小。此時的損失函數在大量簡單樣本的迭代過程中比較緩慢且可能無法優化至最優。
因此,對於大量的easy negative examples,這些loss會主導梯度下降的方向,淹沒少量的正樣本的影響。所以,我們要解決:1> 正負樣本不平衡;2>easy和hard examples不平衡問題 。
1、正負樣本不均衡問題
爲交叉熵加一個權重alpha,用來平衡正負樣本本身的比例不均,其中權重因子的大小一般爲相反類的比重。即負樣本越多,給它的權重越小。這樣就可以降低負樣本的影響。文中alpha取0.25,即正樣本要比負樣本佔比小,這是因爲負例易分。
也可以這麼理解:加一個小於1的超參數,相當於把算是Loss曲線整體往下拉一些,是的當概率較大的時候影響減小。
2、easy和hard examples不平衡問題
針對easy和hard樣本,在原有的基礎上加了一個因子,其中gamma>0使得減少易分類樣本的損失。使得更關注於困難的、錯分的樣本。我們定義損失函數如下:
其中,gamma range from 0 to 5. 例如gamma爲2,對於正類樣本而言,預測結果爲0.95肯定是簡單樣本,所以(1-0.95)的gamma次方就會很小,這時損失函數值就變得更小。而預測概率爲0.3的樣本其損失相對很大。對於負類樣本而言同樣,預測0.1的結果應當遠比預測0.7的樣本損失值要小得多。對於預測概率爲0.5時,損失只減少了0.25倍,所以更加關注於這種難以區分的樣本。這樣減少了簡單樣本的影響,大量預測概率很小的樣本疊加起來後的效應纔可能比較有效。
舉例:取γ=2,假如分類的概率是p=0.9,則原來的loss=-log(0.9) =0.046,現在-(1-0.9)^2 * log(0.9) = 0.00046,縮小了約100倍,加入分類概率是p=0.968,那麼就會縮小約1000倍,如果概率小於0.5,如:p=0.4 , -log(0.4) == 0.39, -(1-0.4)^2 * log(0.4) = 0.14,只是減少了不到3倍。
這樣做的好處就是:
- 如果一個樣本分類錯誤了,概率很小(pt很小),這樣相乘的係數(1-pt)就接近於1,對樣本原本的分類影響不大;
- γ 起到了平滑的作用,作者的實驗中,其等於2的效果最好。
正樣本:概率越小,表示hard example,損失越大; 負樣本:概率越大,表示hard example,損失越大。
這樣,(正樣本)當對於簡單樣本,Pt會比較大,所以權重自然減小了。針對hard example,Pt比較小,則權重比較大,讓網絡傾向於利用這樣的樣本來進行參數的更新(可參考上圖思考)。 且這個權重是動態變化的,如果複雜的樣本逐漸變得好分,則它的影響也會逐漸的下降。
gamma調節簡單樣本權重降低的速率,當gamma爲0時即爲交叉熵損失函數,當gamma增加時,調整因子的影響也在增加。實驗發現gamma爲2是最優。
3、Focal Loss的生成
最終,我們把這兩種單獨的改進進行合併,最終Focal Loss的形式爲:
既做到了解決正負樣本不平衡,也做到了解決easy與hard樣本不平衡的問題。
這裏的兩個參數α和γ協調來控制,論文采用α=0.25,γ=2效果最好。
三、Caffe實現
修改prototxt:
layer {
name: "mbox_loss"
type: "MultiBoxFocalLoss" #change the type
bottom: "mbox_loc"
bottom: "mbox_conf"
bottom: "mbox_priorbox"
bottom: "label"
top: "mbox_loss"
include {
phase: TRAIN
}
propagate_down: true
propagate_down: true
propagate_down: false
propagate_down: false
loss_param {
normalization: VALID
}
focal_loss_param { #set the alpha and gamma, default is alpha=0.25, gamma=2.0
alpha: 0.25
gamma: 2.0
}
multibox_loss_param {
loc_loss_type: SMOOTH_L1
conf_loss_type: SOFTMAX
loc_weight: 1.0
num_classes: 2
share_location: true
match_type: PER_PREDICTION
overlap_threshold: 0.5
use_prior_for_matching: true
background_label_id: 0
use_difficult_gt: true
neg_pos_ratio: 3.0
neg_overlap: 0.5
code_type: CENTER_SIZE
ignore_cross_boundary_bbox: false
mining_type: NONE #do not use OHEM(online hard example miniing)
}
}
參考鏈接:https://blog.csdn.net/LeeWanzhi/article/details/80069592
caffe相關配置:https://blog.csdn.net/wfei101/article/details/79477542
Focal Loss的Caffe源碼:https://download.csdn.net/download/duan19920101/12150017