1.类别不平衡问题
一份给定的数据集中,可能出现类别不平衡,即某种类型的数量特别少,以我现在做的二分类项目为例, 训练集类别为NG数量为12000, OK1600张,相差较多.
存在的问题:
模型对NG的学习较多,所以对NG的识别能力很强,Ok的识别能力很弱
2.FocalLoss损失函数:
2.1 二分类交叉损失函数:
这里的y表示标签,y' 表示预测此样本为1的概率p,或者说为正例的概率p.
其实对于二分类问题的类型不同,会导致最后使用的激活函数不同,交叉熵的计算方法也不一样.
这里的激活函数的选择导致了两种计算方式:
假设一个二分类问题,神经网络的最后一层输出有两个结果,最后需要再加一层激活函数-- sigmoid函数或者softmax函数:
2.1.1 sigmoid层作为输出的交叉熵:
sigmoid一般用来处理多标签分类问题,比如在多标签二分类问题里,一张图片既可能是A,也可能是B,也可能都是, 怎么判别?sigmoid的每个输出值与某个阈值比较,概率大于那个阈值,就可以判别为那一类.
作为最后一层的输出,两个输出值加起来不等于1,那么这时候的二分类其实指的是对单个类别的二分类,即是是否为A.另一个输出用来判断是否为B,这两个值的处理是相互独立的,不相斥的.
所有这个时候的分类交叉损失熵如何计算呢?其实应该计算每个神经元的二分类交叉损失熵,然后相加.
ti为单个神经元为正例的概率
比如最后一层sigmoid层的输出是[0.7, 0.8], 表示预测是A的概率是0.7, 是B的概率为0.8, label为[1, 0],表示此样本是A且不是B
第一个神经元的交叉熵: -1*log(0.7)
第二个神经元的交叉熵: -(1-0)*log(1-0.8)
总的交叉熵就是-log(0.7)-log(1-0.8)
2.1.2 softmax层作为输出的交叉熵:
softmax一般用来处理单标签分类问题,同样拿二分类问题举例子,如果是单标签分类问题,那么最后一层就应该使用softmax,这时候两个结果是互斥的,输出值加起来为1.
这时候的计算公式是:
同样加入最后一层的输出为[0.35, 0.65], label为[1], 表示预测是A的概率是0.35, 预测是B的概率是0.65, 但实际上是A
交叉熵: -1*log(0.35)
2.2 类别不平衡在二分类交叉损失函数中的问题
二分类交叉损失函数会带来什么问题呢,我们先改写一下形式,y'改写程概率p,以单标签二分类问题为例
其中
所以二分类交叉损失函数最简单的形式就是:
可见普通的交叉熵而言,输出概率pt越大损失越小。符合预测越准,损失越小的原则
什么是简单样本:?什么是困难样本?就是预测值pt较大的的那些样本
两个问题:
1.如果某类型的样本占比较大,数量少的样本产生的loss较少,
2.而且简单样本比较多,就会导致困难样本产生的loss值占比较少,
负样本数量太大,占总的loss函数输入参数的大部分,而且多是容易分类的,因此使得模型的优化方向(即loss函数的梯度下降方向)并不是我们所希望的那样。
2.3 FocalLoss:
由此提出Focal loss函数:
首先在原有的基础上加了一个因子,其中Gamma>0使得减少易分类样本的损失,使得模型更关注于困难的、错分的样本。
例如:Gamma为2时,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍。所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
换个形式看更清晰:
显然,样本越易分,pt越大,则贡献的loss就越小,相对来说,难分样本所占的比重就会变大.
在此基础上,再引入一个平衡因子 Alpha,用来平衡正负样本本身的数量比例不均(即类别不均衡):
我们为交叉熵分配一个权重,其中权重因子的大小一般为相反类的比重。即负样本不是多吗,它越多,我们给它的权重越小。这样就可以降低负样本的影响。
只添加Alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题,因此针对难分样本的Gamma也必不可少。