题目
试想有一份数据集,有99个负样本,1个正样本。现在我们要学习一个模型,怎么学?
分析
看上去,直接学,模型会拟合大量负样本的特性。根本学不到正样本的。学到的模型,即使将所有样本都预测为负样本,都会取得很高的正确率。 本质上还是样本不平衡问题。
怎么解决呢?
Hard Negtive Mining
传统的做法,如SVM分类时,首先训练一个模型, 利用该模型将预测错误的样本加入,认为这部分样本为Hard Negtive。
预测正确且置信度很高的样本剔除,认为这部分样本为Easy Negtive。
这个过程很好理解, 就像我们上学时的错题本,经常会记入一些自己做错的,或者不会做的题。同时会将一些简单的题,做对的题从作业本上划掉。后面在复习时,就直接跳过了。
方法改进
-
均衡交叉熵 Blanced CE
给不同的类别的样本,在损失上增加不同的权重,以增加对该类别的重视。
-
FocalLoss
Focal Loss是Kaiming 大神团队在他们的论文Focal Loss for Dense Object Detection 提出来的损失函数,利用它改善了图像物体检测的效果。是从损失函数方面进行改进,来改变样本分布平衡状态。Kaiming 大神团队认为上面的Hard Negtive Minging虽然增加了错分类样本的权重,但是容易忽略容易分类的样本。而 Blanced CE是一个超参,还是不够灵活,虽然能够平衡 positive/negative 样本的重要性,但不能区分 easy/had 样本. 因此提出了Focal loss。
Focal Loss是对交叉熵损失函数的一点小改造,经过这种改造后,可以动态的调整权重,具体表现为降低Easy分类样本的权重,增加难分类样本的权重。
交叉熵函数本尊长得下面这样:
简写一下,就是下面这样:
其实上面交叉熵的公式,当y=0的时候,y^ 就是y=0的概率,而1-y^ 也就是y=1的概率。就记着一句话, log里面都是y=1的概率就可以了。所以这样就可以统一成,简化版了,简化版中pt 就是 y=1 的预测概率。
再来看FocalLoss的公式:
再来看看简化版:
跟上面交叉熵及简化版一样,简单理解下。
那么大神这么做能否 化腐朽为神奇,能否成为神来之笔?
r = 0时,是标准的传统交叉熵,为蓝色曲线。
r =其他值时,是蓝色曲线下面的曲线。
可以发现:
1)当一个样本被分错的时候,pt是很小的,那么调制因子(1-Pt)接近1,无论r取多少,该样本贡献的损失基本不变,该怎么办就怎么办;
但是当一个样本分对了, Pt→1,那么(1-Pt)接近0,而且在r次方下,更接近于0了,这样分对的样本对损失贡献为0,可以理解为没啥贡献了。
经过,上面(1-pt)和r的调整后,相当于增大了分错样本的权重, 因为其对损失贡献大,地位重要。 减弱了分对样本的权重,因为他对损失的贡献小,地位很弱了。总之,更加让模型去重视那些易分错样本,即Hard Negtive, 否则承受着更大损失的增长。
2) 参数γ平滑地调节了易分样本调低权值的比例。γ增大能增强调制因子的影响,实验发现γ取2最好。
focal loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失的贡献。
样本改进
见本人之前分享的另一篇文章<采样>