focal loss详解

article/2025/10/28 10:45:59

文章目录

focal loss的整体理解

focal loss 是一种处理样本分类不均衡的损失函数,它侧重的点是根据样本分辨的难易程度给样本对应的损失添加权重,即给容易区分的样本添加较小的权重 α 1 \alpha_1 α1,给难分辨的样本添加较大的权重 α 2 \alpha_2 α2.那么,损失函数的表达式可以写为:
L s u m = α 1 × L 易 区 分 + α 2 × L 难 区 分 L_{sum}=\alpha_1\times L_{易区分}+\alpha_2\times L_{难区分} Lsum=α1×L+α2×L
因为 α 1 \alpha_1 α1小而 α 2 \alpha_2 α2大,那么上述的损失函数中 L 难 区 分 L_{难区分} L主导损失函数,也就是将损失函数的重点集中于难分辨的样本上,对应损失函数的名称:focal loss。
表达式为 F L ( p t ) = − ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t)=-(1-p_t)^\gamma \log(p_t) FL(pt)=(1pt)γlog(pt).含义后文会讲。

易分辨样本、难分辨样本的含义

在本损失函数中数次出现难分辨和易分辨的词语,那么何为易分辨、何为难分辨?
其实这个区别隐藏在分类置信度上!
通常将分类置信度接近1或接近0的样本称为易分辨样本,其余的称之为难分辨样本。换句话说,也就是我们有把握确认属性的样本称为易分辨样本,没有把握确认属性的样本称之为难分辨样本。
比如在一张图片中,我们获得是人的置信度为0.9,那么我们很有把握它是人,所以此时认定该样本为易分辨样本。同样,获得是人的置信度为0.6,那么我们没有把握它是人,所以称该样本为难分辨样本。

focal loss的出现过程

  1. 首先,在分类损失中最经典的损失函数为标准交叉熵,以二分类为例可以写为:
    C E ( p , y ) = { − log ⁡ ( p ) i f y = 1 − log ⁡ ( 1 − p ) o t h e r w i s e CE(p,y)= \begin{cases} -\log(p)&if\space y=1\\ -\log(1-p)&otherwise \end{cases} CE(p,y)={log(p)log(1p)if y=1otherwise
    其中 y = 1 或 − 1 y=1或-1 y=11. p ϵ [ 0 , 1 ] p\epsilon[0,1] pϵ[0,1]是判断是正样本( y = 1 y=1 y=1)的概率。为了统一 p 、 1 − p p、1-p p1p,我们设置 p t p_t pt函数:
    p t = { p i f y = 1 1 − p o t h e r w i s e p_t=\begin{cases}p&if\space y=1\\1-p&otherwise\end{cases} pt={p1pif y=1otherwise
    于是可以得到 C E ( p , y ) = C E ( p t ) = − log ⁡ ( p t ) CE(p,y)=CE(p_t)=-\log(p_t) CE(p,y)=CE(pt)=log(pt)
    但是这种损失函数在处理类不均衡问题时非常糟糕,会因为某类的冗余,而主导损失函数,使模型失去效果。
  2. 为了解决类不平衡问题,常见的做法是添加权重因子,即平衡交叉熵。在 α ϵ [ 0 , 1 ] \alpha\epsilon[0,1] αϵ[0,1]的前提下,对class 1添加 α \alpha α,对class -1添加 1 − α 1-\alpha 1α。为了形式上的方便,我们采用 α t \alpha_t αt,从而可以得到
    C E ( p t ) = − α t log ⁡ ( p t ) CE(p_t)=-\alpha_t\log(p_t) CE(pt)=αtlog(pt)
    但是,当我们处理大量负样本、少量正样本的情况时( e g eg eg 50000:20),即使我们把负样本的权重设置的很低,但是因为负样本的数量太多,积少成多,负样本的损失函数也会主导损失函数。
  3. 后来作者做实验,得到下面的数据:
    在这里插入图片描述
    可以从图中发现,那些即使置信度很高的样本在标准交叉熵里也会存在损失。而且在实际中,置信度很高的负样本往往占总样本的绝大部分,如果将这部分损失去除或者减弱,那么损失函数的效率会更高。
    于是,作者想到减少置信度很高的样本损失在总损失中的比重,即在标准交叉熵前添加了权重因子 ( 1 − P t ) γ (1-P_t)^\gamma (1Pt)γ,形成focal loss:
    F L ( p t ) = − ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t)=-(1-p_t)^\gamma \log(p_t) FL(pt)=(1pt)γlog(pt)

focal loss 举例说明

γ = 0 \gamma=0 γ=0时,focal loss等于标准交叉熵函数。
γ > 0 \gamma>0 γ>0时,因为 ( 1 − p t ) > = 0 (1-p_t)>=0 (1pt)>=0,所以focal loss的损失应该是小于等于标准交叉熵损失。所以,我们分析的重点应该放在难、易分辨样本损失在总损失中所占的比例。
假设有两个 y = 1 y=1 y=1的样本,它们的分类置信度分别为0.9和0.6,取 γ = 2 \gamma=2 γ=2。按照公式计算可得它们的损失分别为: − ( 0.1 ) 2 log ⁡ ( 0.9 ) -(0.1)^2\log(0.9) (0.1)2log(0.9) − ( 0.4 ) 2 log ⁡ ( 0.6 ) -(0.4)^2\log(0.6) (0.4)2log(0.6).
将它们的权重相除: 0.16 0.01 = 16 \frac{0.16}{0.01}=16 0.010.16=16,可得到分类置信度为0.6的样本损失大大增强,分类置信度为0.9的样本损失大大抑制,从而使得损失函数专注于这些难分辨的样本上,这也是函数的中心思想。

focal loss的 α \alpha α变体

之前我们提到了解决类不均衡的平衡交叉熵,那么将平衡交叉熵和focla loss两者混合就可以得到focal loss的 α \alpha α变体,如下:
F L ( p t ) = − α t ( 1 − p t ) γ log ⁡ ( p t ) FL(p_t)=-\alpha_t(1-p_t)^\gamma\log(p_t) FL(pt)=αt(1pt)γlog(pt)

这个损失函数不光考虑了“容易分辨”,还考虑了“正负样本”的问题。在处理类不均衡问题上,可以发挥出巨大的作用。


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

相关文章

深度学习——损失函数(Regression Loss、Classification Loss)

简介 Loss function 损失函数 用于定义单个训练样本与真实值之间的误差 Cost function 代价函数 用于定义单个批次/整个训练集样本与真实值之间的误差 Objective function 目标函数 泛指任意可以被优化的函数 损失函数用于衡量模型所做出的预测离真实值(GT)之间的偏离程度。 …

深度学习中常见的损失函数(L1Loss、L2loss)

损失函数定义 损失函数:衡量模型输出与真实标签的差异。 L1_loss 平均绝对误差(L1 Loss):平均绝对误差(Mean Absolute Error,MAE)是指模型预测值f(x)和真实值y之间距离的平均值,公式如下: 优…

损失函数(loss function)

文章目录 1、什么是损失函数2、为什么要使用损失函数3、损失函数分类1、分类一2、分类二3、分类三3.1基于距离度量的损失函数3.1.1 均方误差损失函数(MSE)3.1.2 L2损失函数3.1.3 L1损失函数3.1.4 Smooth L1损失函数3.1.5 huber损失函数 3.2 基于概率分布…

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

什么是损失函数? 1、什么是损失呢? 在机器学习模型中,对于每一个样本的预测值与真实值的差称为损失。 2、什么是损失函数呢? 显而易见,是一个用来计算损失的函数。它是一个非负实值函数,通常使用L(Y, f(x))来表示。 3、…

损失函数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…