學習瞭解online hard example mining線上難例挖掘
對於每一個網路,相當於一個桶,總有樣本效果比較好,有的樣本比較差,多用效果差的樣本進行訓練,那提高了整個網路的短板,總體的效果也會有提升。
一、
難例挖掘是指,針對模型訓練過程中導致損失值很大的一些樣本(使模型很大概率分類錯誤的樣本),重新訓練它們。
維護一個錯誤分類樣本池, 把每個batch訓練資料中的出錯率很大的樣本放入該樣本池中,當積累到一個batch以後,將這些樣本放回網路重新訓練。
二、
有2種難例挖掘技術,一種是用於優化SVM的。通過一個working-set,訓練一個收斂於該working-set的SVM,然後使用該SVM,將一些easy的sample剔除(這些sample通常是遠離SVM分類邊界的),增加hard example到working-set中(這些hard-example是超出模型邊界的錯誤分類樣本)。注意,working-set只是整個訓練集的一個子集。
另一種是用於優化non-SVM的。如被應用於淺層神經網路,boosted decision tree等,這種方法首先開始訓練模型,訓練的資料集開始是由所有的positive example和隨機的negative samples組成的,訓練出來一個模型後,將該模型應用於一個更大的資料集,將model檢測錯誤的樣本(false positives)新增到訓練集中再繼續訓練。不斷迭代訓練。但是論文中提到這個過程通常只迭代一次,且沒有收斂的跡象。
總結:
CNN目標檢測類的文章中,hard negative mining一般是,有正負樣本,然後分類器分出來一些分錯的負樣本(容易將負樣本看成正樣本的那些樣本),即假陽性(false positive),也就是說在對負樣本分類時候,loss比較大(label與prediction相差較大)的那些樣本,這些就是hard negative/困難樣本。
hard negative mining就是多找一些hard negative加入負樣本集
如何判斷困難負樣本呢?先用初始樣本集(即第一幀隨機選擇的正負樣本)去訓練網路,再用訓練好的網路去預測負樣本集中剩餘的負樣本,選擇其中得分最高,即最容易被判斷為正樣本的負樣本為困難樣本,加入負樣本集中,重新訓練網路,迴圈往復。
已有的方法大多是基於loss來確定是否是hard的,參考https://blog.csdn.net/u013608402/article/details/51275486文中的方法是,用兩個網路,一個只用來前向傳播,另一個則根據選擇的ROI進行反向傳播。
類似的實現在https://blog.csdn.net/jiyangsb/article/details/77802941這篇文章中有implementation details也是一樣的。
同時解決正負樣本不平衡以及區分簡單與複雜樣本的問題的focal loss參考https://blog.csdn.net/LeeWanzhi/article/details/80069592
虛擬碼參考:https://blog.csdn.net/lanchunhui/article/details/71194703
下一步進一步搞清楚focal loss和這個線上難例挖掘的聯絡和差別,然後開始實現。