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

article/2025/10/28 13:16:37

 什么是损失函数?

         1、什么是损失呢?

在机器学习模型中,对于每一个样本的预测值与真实值的差称为损失。

        2、什么是损失函数呢?

显而易见,是一个用来计算损失的函数。它是一个非负实值函数,通常使用L(Y, f(x))来表示。

        3、那损失函数有什么用呢?

度量一个模型进行每一次预测的好坏(即预测值与真实值的差距程度)。差距程度越小,则损失越小,该学习模型越好。

        4、损失函数如何使用呢?

损失函数主要是用在模型的训练阶段。在每一个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值与真实值的差异值,即损失值。得到损失值后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值靠拢,从而达到学习的目的。在训练完该模型后,此时模型通过反向传播后,已经使得每个参数都为最优。所以使用该模型进行预测得到的结果一定是接近真实结果的。

有哪些损失函数?

        1、分类任务损失

                0-1 loss、熵与交叉熵loss、softmax loss及其变种、KL散度、Hinge loss、Exponential loss、Logistic loss、Focal Loss等待。

        2、回归任务损失

                L1 loss、L2 loss、perceptual loss、生成对抗网络损失、GAN的基本损失、-log D trick、Wasserstein GAN、LS-GAN、Loss-sensitive-GAN等等。

Focal Loss损失函数介绍

        Focal Loss的引入主要是为了解决one-stage目标检测中正负样本数量极不平衡问题

        那么什么是正负样本不平衡(Class Imbalance)呢?

在一张图像中能够匹配到目标的候选框(正样本)个数一般只有十几个或几十个,而没有匹配到的候选框(负样本)则有10000~100000个。这么多的负样本不仅对训练网络起不到什么作用,反而会淹没掉少量但有助于训练的样本。

        上面说了是为了解决一阶段目标检测模型,那为什么二阶段不用解决呢?

因为在二阶段中分了两步,第一步时同样也会生成许多的负样本以及很少的正样本,但到第二步时,它会在第一步的基础上选取特定数量的正负样本去检测,所以正负样本并不会特别不平衡

        为了解决该问题,许多网络也进行过许多处理方法,比如:hard negative mining(难例挖掘),即并不会使用所有的负样本去训练网络,而是去选取损失比较大的来训练。

                         

         上表是一张采用hard negative mining和Focal Loss方法的比较,和显然使用Focal Loss的效果非常好

Focal Loss理论知识

        Focal loss是基于二分类交叉熵CE的。它是一个动态缩放的交叉熵损失,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,从而将重心快速聚焦在那些难区分的样本有可能是正样本,也有可能是负样本,但都是对训练网络有帮助的样本)。

        接下来我将从以下顺序详细说明:Cross Entropy Loss (CE->  Balanced Cross Entropy (BCE) -> Focal Loss (FL)

        1、Cross Entropy Loss:基于二分类的交叉熵损失,它的形式如下:

 上式中,y的取值为1和-1,分别代表前景和背景。p的取值范围为0~1,是模型预测属于前景的概率。接下来定义一个关于P的函数:

        

结合上式,可得到简化公式:

     

注意:公式中的log函数就是ln函数:

                                                    

                      

         2、Balanced Cross Entropy常见的解决类不平衡方法。引入了一个权重因子α ∈ [ 0 , 1 ] ,当为正样本时,权重因子就是α,当为负样本时,权重因子为1-α。所以,损失函数也可以改写为:

                                

        这里给出一张图:

                                                    

         可以看出当权重因子为0.75时,效果最好。

        3、Focal Loss虽然BCE解决了正负样本不平衡问题,但并没有区分简单还是难分样本。当易区分负样本超级多时,整个训练过程将会围绕着易区分负样本进行,进而淹没正样本,造成大损失。所以这里引入了一个调制因子 ,用来聚焦难分样本,公式如下:

                                                            

       γ为一个参数,范围在 [0,5], 当 γ为0时,就变为了最开始的CE损失函数。

        可以减低易分样本的损失贡献,从而增加难分样本的损失比例,解释如下当Pt趋向于1,即说明该样本是易区分样本,此时调制因子是趋向于0,说明对损失的贡献较小,即减低了易区分样本的损失比例。当pt很小,也就是假如某个样本被分到正样本,但是该样本为前景的概率特别小,即被错分到正样本了,此时 调制因子是趋向于1,对loss也没有太大的影响。

        对于 γ的不同取值,得到的loss效果如图所示

可以看出,当pt越大,即易区分的样本分配的非常好,其所对于的loss就越小。

        通过以上针对正负样本以及难易样本平衡,可以得到应该最终的Focal loss形式

                                      

 即通过αt​ 可以抑制正负样本的数量失衡,通过 γ 可以控制简单/难区分样本数量失衡。

Focal Loss理论知识总结:

        ①调制因子是用来减低易分样本的损失贡献 ,无论是前景类还是背景类,pt越大,就说明该样本越容易被区分,调制因子也就越小。

        ②αt用于调节正负样本损失之间的比例,前景类别使用 αt 时,对应的背景类别使用 1 − αt 。

        ③γ 和 αt 都有相应的取值范围,他们的取值相互间也是有影响的,在实际使用过程中应组合使用。


http://chatgpt.dhexx.cn/article/o3caHSa7.shtml

相关文章

损失函数loss大总结

分类任务loss: 二分类交叉熵损失sigmoid_cross_entropy: TensorFlow 接口: tf.losses.sigmoid_cross_entropy(multi_class_labels,logits,weights1.0,label_smoothing0,scopeNone,loss_collectiontf.GraphKeys.LOSSES,reductionReduction.SUM_BY_NONZER…

深度学习基础(三)loss函数

loss函数,即损失函数,是决定网络学习质量的关键。若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果。若有错误,敬请指正,Thank you! 目录 一、loss函数定义 二、常见的loss算法种类 1.M…

loss函数 激活函数

一、LOSS函数 loss函数指机器学习模型中用于最小化的目标函数,其一般意义是指判别错误的程度,因为我们要提高准确率,也就是降低错误率,所以可以归结为一个最小化损失函数的问题。 具体的,我们假设有一个十分类问题&a…

Loss损失函数

损失函数是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数,用于衡量预测值与实际值的偏离程度。在机器学习中,损失函数是代价函数的一部分,而代价函数是目标函数的一种类型。 在《神经网络中常…

深度学习之——损失函数(loss)

深度学习中的所有学习算法都必须有一个 最小化或最大化一个函数,称之为损失函数(loss function),或“目标函数”、“代价函数”。损失函数是衡量模型的效果评估。比如:求解一个函数最小点最常用的方法是梯度下降法&…

1_一些文献中的英文解释和用法整理

目录 1、Theorem、Proposition、Lemma和Corollary等的解释与区别 2、论文里的 Preliminaries 究竟是什么意思? (1)Preliminaries是什么? (2)Preliminaries应该写什么内容? (3)…

区分定理(Theorem)、引理(Lemma)、推论(Corollary)等概念

ZZ: http://blog.sina.com.cn/s/blog_a0e53bf70101jwv1.html Theorem:就是定理,比較重要的,簡寫是 Thm。 Lemma:小小的定理,通常是為了證明後面的定理,如果證明的篇幅很長時,可能會把證明拆成幾…

CodeForces - 1364D Ehabs Last Corollary(dfs树找最小环)

题目链接:点击查看 题目大意:给出一个由 n 个结点和 m 条边构成的无向图,再给出一个 k ,需要在图中完成下面任意一种操作: 找到一个大小恰好为 的独立集找到一个大小不超过 k 的环 题目分析: 题目已经…

Codeforces Round 649 (Rated for Div. 2)D. Ehab s Last Corollary详细题解(图论+简单环)

树 边 : 树边: 树边:深度优先森林中的边。如果结点v是因对(u,v)的探索而首先被发现,则(u,v)是一条树边。 后 向 边 : 后向边: 后向边:后向边(u,v)是将结点u连接到其在深度优先树中一个祖先节点v的边. (本文我就称之为反向边了,问题不大) 前…

#649 (Div. 2)D. Ehab‘s Last Corollary

题目描述 Given a connected undirected graph with n vertices and an integer k, you have to either: either find an independent set that has exactly ⌈k2⌉ vertices. or find a simple cycle of length at most k. An independent set is a set of vertices such that…

Ehabs Last Corollary

Given a connected undirected graph with n n n vertices and an integer k k k, you have to either: either find an independent set that has exactly ⌈ k 2 ⌉ ⌈\frac{k}{2}⌉ ⌈2k​⌉ vertices.or find a simple cycle of length at most k k k. An independen…

Latent Variables的理解

加入我们有X,Y两个随机变量,他们的概率分布如下。要直接用一个函数还表示这个分布是比较困难的。 但我们发现这个分布可以分成三个聚类。如果我们给每个聚类编号为。 那么就是简单的高斯函数了。 这里z就是 加入latent variable的意义在于&#xff0c…

Variable(变量)

深度学习入门之PyTorch 作者 廖星宇

对条件变量(condition variable)的讨论

作者:王东 1.1 什么是条件变量和条件等待? 简单的说: 条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个条件为真,而将自己挂起&…

C++ condition_variable用法

概述 condition_variable类似于信号量机制,实现了线程的等待和唤醒。 函数接口: wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码 notify_all() : 唤醒所有阻塞等待的线程 no…

variable命令两种不同的使用方式“v_“和““的区别

大家好,我是小马老师。 本文介绍variable命令两种不同的使用方式:“v_“和”&"。 在lammps模拟中,variable命令用的相对比较多,可以根据需要定义不同的变量。 在使用自定义变量或者调用自定义变量的时候,lamm…

条件变量(Condition Variable)详解

条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子,应用程序A中包含两个线程t1和t2。t1需要在bool变量test_cond为true时才能继续执行,而test_cond的值是由t2来改变的,这种情况下&#x…

Java Variable 变量

目录 变量1. 变量的作用域a. 类级变量b. 成员变量c. 局部变量 2. 基本数据类型a. 按内存占用级数b. 自动类型转换i. 十进制转二进制 c. 强制类型转换i. (XXX)ii. parseXXX() 3. 引用数据类型 变量 同时被 final 和 static 修饰的变量是常量。 1. 变量的作用域 变量的作用域分…

About Variables

Assessing Variable Types “It all began with a variable”, the storyteller began. Just kidding, no one starts their stories that way, even though variables are where all data stories begin. Variables define datasets. They are the characteristics or attr…

pytorch的Variable和Parameters的联系和区别

文章目录 前言一、Variable二、Parameter总结 前言 首先看一下官方文档: 一、Variable torch.autograd.Variable Variable是对Tensor的封装,操作与tensor基本一致,不同的是,每一个Variable被构建的时候,都包含三个…