超级详细的解读 Focal Loss损失函数

什么是损失函数?1、什么是损失呢?
在机器学习模型中,对于每一个样本的预测值与真实值的差称为损失 。
2、什么是损失函数呢?
显而易见,是一个用来计算损失的函数 。它是一个非负实值函数,通常使用L(Y, f(x))来表示 。
3、那损失函数有什么用呢?
度量一个模型进行每一次预测的好坏(即预测值与真实值的差距程度) 。差距程度越小,则损失越小,该学习模型越好 。
4、损失函数如何使用呢?
损失函数主要是用在模型的训练阶段 。在每一个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值与真实值的差异值,即损失值 。得到损失值后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值靠拢,从而达到学习的目的 。在训练完该模型后,此时模型通过反向传播后,已经使得每个参数都为最优 。所以使用该模型进行预测得到的结果一定是接近真实结果的 。
有哪些损失函数?1、分类任务损失:
0-1 loss、熵与交叉熵loss、 loss及其变种、KL散度、Hinge loss、 loss、 loss、Focal Loss等待 。
2、回归任务损失:
L1 loss、L2 loss、 loss、生成对抗网络损失、GAN的基本损失、-log D trick、 GAN、LS-GAN、Loss--GAN等等 。
Focal Loss损失函数介绍
Focal Loss的引入主要是为了解决one-stage目标检测中正负样本数量极不平衡问题 。
那么什么是正负样本不平衡(Class )呢?
在一张图像中能够匹配到目标的候选框(正样本)个数一般只有十几个或几十个,而没有匹配到的候选框(负样本)则有10000~个 。这么多的负样本不仅对训练网络起不到什么作用,反而会淹没掉少量但有助于训练的样本 。
上面说了是为了解决一阶段目标检测模型,那为什么二阶段不用解决呢?
因为在二阶段中分了两步,第一步时同样也会生成许多的负样本以及很少的正样本,但到第二步时,它会在第一步的基础上选取特定数量的正负样本去检测,所以正负样本并不会特别不平衡
为了解决该问题,许多网络也进行过许多处理方法,比如:hard(难例挖掘),即并不会使用所有的负样本去训练网络,而是去选取损失比较大的来训练 。

超级详细的解读  Focal Loss损失函数

文章插图
上表是一张采用hard和Focal Loss方法的比较,和显然使用Focal Loss的效果非常好 。
Focal Loss理论知识
Focal loss是基于二分类交叉熵CE的 。它是一个动态缩放的交叉熵损失,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将重心快速聚焦在那些难区分的样本(有可能是正样本,也有可能是负样本,但都是对训练网络有帮助的样本) 。
接下来我将从以下顺序详细说明:CrossLoss (CE)-> Cross(BCE) ->Focal Loss (FL) 。
1、CrossLoss:基于二分类的交叉熵损失,它的形式如下:
上式中,y的取值为1和-1,分别代表前景和背景 。p的取值范围为0~1,是模型预测属于前景的概率 。接下来定义一个关于P的函数:
结合上式,可得到简化公式:
注意:公式中的log函数就是ln函数:
2、 Cross :常见的解决类不平衡方法 。引入了一个权重因子α ∈ [ 0 , 1 ] ,当为正样本时,权重因子就是α,当为负样本时,权重因子为1-α 。所以,损失函数也可以改写为:
这里给出一张图:
可以看出当权重因子为0.75时,效果最好 。
3、Focal Loss:虽然BCE解决了正负样本不平衡问题,但并没有区分简单还是难分样本 。当易区分负样本超级多时,整个训练过程将会围绕着易区分负样本进行,进而淹没正样本,造成大损失 。所以这里引入了一个调制因子,用来聚焦难分样本,公式如下: