(五)比赛中的CV算法(下4)损失函数的改进(1)

——NeoZng[neozng1@hnu.edu.cn]

不小心又咕咕咕了,寒假保证一周两更!

  • FL(focal loss)

    在介绍交叉熵损失的时候我们知道虽然它改善了输出层梯度消失的问题,却无法赋予不同的样本以不同的损失权重。这个问题在one-stage检测器中尤为严重,如前文的基本概念中介绍的那样,目标检测的正负样本严重失衡,存在大量的背景(负类),而有目标存在的正样本区域则是少之又少。two-stage检测器如Faster R-CNN等可以在区域提议阶段之后对正负样本进行筛选使他们的比例保持在1:3左右(经验值),而one-stage由于没有类似RPN的结构因此无法调整正负样本的比例。

    并且,负样本又常为易分样本(背景的提取出来的特征和目标特征通常差异很大),正样本由于数量特别少而无法主导损失和梯度,因此模型会往我们不期望的方向发展。在得到MSE的启发后,自然而然,我们需要为此设计一种损失函数,能够提高正样本和难样本的权重,降低简单样本对损失的贡献从而修正这个问题。

    Focal Loss将损失函数设计成如下的样子:

     

    令:

      得到统一的表达式:

 

在这里,pt描述了预测值和标签的接近程度,pt越大说明分类越容易(准确度越高)。经过(1-pt)^γ的调制,容易分类的样本的损失贡献将会下降很多,而难分类样本的权重同样会降低(但是降低得不如简单样本那样多),最后的效果就是loss将会倾向难分类样本。

论文原文中不同γ取值的Focal Loss对比CE Loss

此处回应 RMSE中的 mark:可是上面我们强调,损失的大小和回传的梯度是无关的,那即使增大了难样本/正样本的损失值,又有什么用?损失函数的梯度和后者无关,这就说明即使LF的值很大梯度的模还是可能很小啊,因此可能会出现loss大然而梯度很小甚至为零的情况,那么权重就不会更新,难样本就无法影响学习的过程。这里就需要仔细分析计算一下了,我们分别算出CE和FL的梯度,得到结果如下:

 

怎么比价两者的大小?光看函数似乎很难得出比较的关系,彷佛又想起了求导比大小的恐惧... 没事我用matlab帮你画好了:

 

可以发现,在pt小于0.3的时候,FL相比CE将有更大的梯度,而在大于0.3的时候,就更小了

一顿分析猛如虎,我们得到使用FL对于难样本确实可以产生比CE更大的回传梯度,那前面说的”对loss有更大的贡献“到底有没有用?这里我们从两个角度入手考虑这个问题:

  1. 特定于Focal Loss的设计,从前面”论文原文中不同γ取值的Focal Loss对比CE Loss“的图上就可以看出,当loss越大的时候,FL的曲线是要比CE更陡峭的,这就说明了FL在pt值小的时候会比CE拥有更大的梯度值,而在pt大的时候前者的变化趋势会比后者更平缓,也就对应了我们刚刚对其梯度的分析。

    这里只放了γ=2时的FL和CE,比前面的图更清楚一些

    这是一种巧合吗?似乎也不是。当pt等于1时,我们必然要求loss=0(预测值和标签完全相同,说明很好的拟合了需要的函数),那么,如果我们要求在pt小的时候拥有较大的梯度,在pt大的时候梯度必然会相对更小。举一个实例更直观地理解:让汽车从静止开始在固定时间内加速到10m/s,起始的加速度越大,你在后程就必须松更多的油门(减小加速度),对应loss就是一开始有很大的梯度(斜率大),而在pt=1的时候loss必须为零,那后程的斜率就会相对减小了。

    从这里的分析我们也会发现,其实log本身就对pt有一定的”focus“效果,CE曲线对应的损失和梯度也是在pt小时更大,pt大时更小,只不过效果没有FL那么明显罢了。

    要从数学上严谨的证明也不是什么难事,若该函数是单调 的,在loss-pt平面上取(0,loss0)和(1,0)两点的连线,若开始时函数的斜率大于此直线的斜率,后面就一定会小于此直线的斜率(凸?凹函数?)。直线对应的就是CE的梯度。

  2. 抛开FL的函数形式分析,难样本的贡献大是否有助于网络对难样本的分类?

    这部分主要是笔者的一些感性的、直觉性的想法,请戳:样本对Loss贡献越大,网络会对它”多多关照“吗?。并没有严谨的数学分析,仅作参考!

 

  • GHM

    上面介绍的Focla loss为难易样本施以不同的权重从而让网络倾向难样本分类的训练,一定程度上解决了样本分布不均衡的问题。而GHM(Gradient Harmonized mechanism)则直接从样本产生的梯度分布入手,从这个角度看待样本数量和难易程度的不均匀问题。

    笔者私以为FL其实颇有一点“瞎打误撞”的感觉,原文虽然在最后分析了CE和FL的梯度对比,但是却是从样本产生的loss引入的。很多博客和教程、视频都认为难样本loss越大则模型权重会往相应的方向更新,但其实这种说法是知其然不知其所以然,从原理上是绝对错误的。对网络的训练过程不甚了解。相信你看完了这一小节,会对loss的设计有更深的理解。

    以分类任务为例,希望难样本能够主导网络权重的更新,而不能让简单样本淹没了不容易分类的样本。我们在focal loss已经分析得到,难样本将拥有更大loss贡献,同时也会有更大的梯度,而后者则是问题的关键:难样本虽然会产生对应方向上更大的梯度,但是巨量的简单样本产生的梯度叠加起来就会导致网络向简单样本倾斜。

    第一幅图中,显示了作者统计的所有样本的梯度范数的,注意纵坐标是对数坐标。梯度范数的就是这个样本在loss function上产生回传梯度的模值。不出所料易分样本(左侧Gradient norm很小的样本)的数量比其他都高出了几个数量级,积少成多,简单样本的总梯度共贡献会超过难样本。并且,经过统计还发现,部分特别难的样本(gradient norm右侧,那些在分类中近乎完全错误的样本),也会产生异常的梯度,作者认为这些样本是outlier(离群点,标记错误或由于噪声产生的异常值),所以同时也要修正这个问题。

    那有什么办法在这种先天不公平的情况下把一碗水端平?只需要选择一个合适的权重,让他们有相同的梯度贡献,那么问题的答案也就呼之欲出了:用该样本的梯度除以拥有相同梯度样本的数量,最终得到的统计曲线就如中间的图像所示。那么,我们只需要将原来的样本分布乘以得到的调制系数,便获得了右侧的调制后的梯度。用GHM对比CE和FL,显然GHM在易分样本上有很好的抑制效果,同时对于异常多的难分样本(outlier)也同样有抑制效果。

    那么应该如何计算样本的密度分布(也就是拥有相同或类似梯度样本的数量,这可以用一个分布函数来表示,但由于现实世界中的采样是离散的,要进行一些处理)?请看论文原文:1811.05181 Gradient Harmonized Single-stage Detector (arxiv.org)。原文中还提出了一种对于bbox回归的梯度均衡化损失函数,并且对梯度密度函数的计算进行了简化和近似,以降低复杂度加快训练速度。

接下来会分别介绍iou family和GFL,然后就进入到激动人心的多尺度特征融合、注意力机制、anchor-free概览部分!

如果觉得笔者写得还不错,点个赞收藏一下吧,专栏将持续更新。

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值