【论文理解】focal loss交叉熵

一、为什么改进交叉熵?

Single stage detector不好的原因完全在于:

  1. 极度不平衡的正负样本比例: anchor近似于sliding window的方式会使正负样本接近1000:1,而且绝大部分负样本都是easy example,
  2. 这就导致下面一个问题:gradient被easy example dominant的问题:往往这些easy example虽然loss很低,但由于数量众多,对于loss依旧有很大贡献,从而导致收敛到不够好的一个结果。

作者认为one-stage和two-stage的表现差异主要原因是大量前景背景类别不平衡导致

  • 双阶段算法中,在候选框阶段,通过得分和nms筛选过滤掉了大量的负样本,然后在分类回归阶段又固定了正负样本比例,或者通过OHEM在线困难挖掘使得前景和背景相对平衡。
  • one-stage阶段需要产生约100k的候选位置,虽然有类似的采样,但是训练仍然被大量负样本所主导

所以作者改进了交叉熵,解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘

二、以往的交叉熵损失函数

Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:
L = − y l o g y ^ − ( 1 − y ) l o g ( 1 − y ^ ) = { − l o g ( y ^ ) y=1 − l o g ( 1 − y ^ ) y=0 L = -y log \hat{y}-(1-y)log(1-\hat{y})=\begin{cases} -log( \hat{y})& \text{y=1}\\ -log(1-\hat{y})& \text{y=0} \end{cases} L=ylogy^(1y)log(1y^)={log(y^)log(1y^)y=1y=0
其中 y ∈ 0 , 1 y∈{0,1} y0,1 是真实标签, y ^ \hat{y} y^是预测值。
可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。

三、Focal loss的改进

L = { − α ( 1 − y ^ ) γ l o g ( y ^ ) y=1 − ( 1 − α ) y ^ γ l o g ( 1 − y ^ ) y=0 L =\begin{cases} -\alpha (1-\hat{y})^{\gamma}log( \hat{y})& \text{y=1}\\ -(1-\alpha){\hat{y}}^{\gamma}log(1-\hat{y})& \text{y=0} \end{cases} L={α(1y^)γlog(y^)(1α)y^γlog(1y^)y=1y=0
α = 0.25 \alpha = 0.25 α=0.25
γ = 2 \gamma = 2 γ=2
首先在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。

  • 例如gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很,这时损失函数值就变得更
  • 对于正类样本而言,预测结果为0.1肯定是困难样本,所以(1-0.1)的gamma次方就会很,这时损失函数值就变得更
  • 对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。
  • 所以更加关注于这种难以区分的样本。这样减少了简单样本的影响。

加入平衡因子alpha
注意在他的任务中,正样本是属于少数样本,也就是说,本来正样本难以“匹敌”负样本,但经过加入gamma的“操控”后,也许形势还逆转了,还要对正样本降权

这是因为加入了gamma因子,使得正样本的损失变大了很多,负样本虽然很多个,但是损失还是相对减少了,所以需要加入平衡因子alpha=0.25,来调节一下正负样本损失。

参考:

为什么使用交叉熵的理解
正负样本比例失衡以及难易区分样本的理解
交叉熵中gamma的理解
交叉熵中alpha的理解

### 关于 Focal Loss论文及其相关内容 Focal Loss 是一种专为解决一阶段目标检测器中的类别不平衡问题而设计的损失函数[^1]。其核心思想在于重新调整标准交叉熵损失,以降低那些容易被分类的样本(即简单示例)对总损失的影响,从而使模型能够更加专注于难以分类的样本(困难示例)。这一方法显著提高了密集对象检测器的效果。 #### RetinaNet: 使用 Focal Loss 的经典案例 在《Focal Loss for Dense Object Detection》这篇论文中,作者提出了 RetinaNet 架构并引入了 Focal Loss 来应对前景与背景之间的极端类别不平衡问题[^4]。具体而言,当面对诸如 1:1000 这样的严重比例失衡时,传统的交叉熵损失会倾向于忽略少数类别的正样本,因为大量负样本主导了整个优化过程。通过应用 Focal Loss,可以有效缓解此类问题,并提升检测精度。 以下是该算法的一些关键技术要点: - **动态加权机制**: 对于每一个预测框, focal loss 动态地赋予不同难度级别的样例不同的权重值. - **γ参数控制聚焦程度**: γ是一个超参量用来调节难易区分度之间差异的重要性. 较高的gamma意味着更加强调困难例子. ```python def focal_loss(prediction_tensor, target_tensor, alpha=0.25, gamma=2): r""" Compute the focal loss between `logits` and the golden `target` values Args: prediction_tensor: The predicted outputs (before sigmoid). target_tensor: The ground truth labels {0 or 1}. alpha: A balancing factor to handle class imbalance problem. gamma: Modulating factor that focuses on hard negatives. Returns: Weighted cross entropy loss with modulation term added. """ zeros = tf.zeros_like(target_tensor) pos_p_sub = tf.where(tf.equal(target_tensor , 1), prediction_tensor - zeros, zeros) neg_p_sub = tf.where(tf.less(target_tensor, 1), zeros - prediction_tensor, zeros ) per_entry_cross_ent = -(alpha * ((pos_p_sub)**gamma) * tf.log(tf.clip_by_value(pos_p_sub,1e-8,1.)) + (1-alpha)*((neg_p_sub)**gamma ) *tf.log(1.-prediction_tensor)) return tf.reduce_sum(per_entry_cross_ent) ``` 此代码片段展示了如何实现基于 TensorFlow 的焦损计算逻辑。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值