从最优化角度分析Focal loss



  • 关于softmax可以从概率角度思考为概率分布的相似的的比较,但是这位大神【从最优化的角度看待Softmax损失函数】 https://zhuanlan.zhihu.com/p/45014864 从最优化理论重新分析了softmax函数,也非常棒。

    于是我尝试用这个理论分析了Focal loss,结果和focalloss的提出是一致的。

    focal loss的提出背景

    让我们首先了解类别不平衡数据集的一般的处理方法,然后再学习 focal loss 的解决方式。

    在多分类问题中,类别平衡的数据集的目标标签是均匀分布的。若某类目标的样本相比其他类在数量上占据极大优势,则可以将该数据集视为不平衡的数据集。这种不平衡将导致两个问题:

    1. 训练效率低下,因为大多数样本都是简单的目标,这些样本在训练中提供给模型不太有用的信息;
    2. 简单的样本数量上的极大优势会搞垮训练,使模型性能退化。一种常见的解决方案是执行某种形式的困难样本挖掘,实现方式就是在训练时选取困难样本 或 使用更复杂的采样,以及重新对样本加权等方案。

    对具体图像分类问题,对数据增强技术方案变更,以便为样本不足的类创建增强的数据。

    Focal loss旨在通过降低简单样本的权重来解决类别不平衡问题,这样即使简单样本的数量很大,但它们对总损失的贡献却很小。也就是说,该函数侧重于用困难样本稀疏的数据集来训练。

    Focal loss介绍

    Focal loss是在交叉熵损失函数基础上进行的修改 :
    0_1587024519146_cccd4b36-0249-4da8-9680-554236e47e50-image.png
    首先在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。

    此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:文中alpha取0.25,即正样本要比负样本占比小,这是因为负例易分。
    0_1587024545326_b0f99146-7a50-4f2d-bbb6-379e4b473c37-image.png
    alpha的引入只用来解决类别平衡问题,gamma的引入用于解决困难样本问题。

    从优化角度分析

    首先,分析几个常见函数的smooth版本

    1. max函数

      max函数的一种近似是LogSumExp函数
      LSE(X;γ)=1γlogiexp(γxi)max(X)LSE(X;\gamma) = \frac{1}{\gamma}\log \sum_i \exp(\gamma x_i) \approx \max(X)
      γ\gamma越大,效果越好

    2. min函数

      即LSE的负数版本
      NLSE(X;γ)=1γlogiexp(γxi)min(X)NLSE(X;\gamma) = -\frac{1}{\gamma}\log \sum_i \exp(-\gamma x_i) \approx \min(X)

    3. relu函数
      Softplus(x)=log(1+ex)max(x,0)=[x]+Softplus(x) = \log(1+e^x)\approx\max(x,0)=[x]_+

    将focal loss转化为多分类形式
    0_1587024751068_60dadf56-88da-4d43-8866-956b222106f2-image.png
    到目前为止的的推理是在基于对softmax的理解的基础上,继续推导的结果。接下来只对左边的focal loss独有的部分推导。
    0_1587024778559_7e57c2e3-2280-4320-b115-3a92ece1a3cf-image.png

    即focal loss可以写为:
    Lfleγ[ztmax(zi,it)]+[max(zi,iy)zy+m]+\mathrm{L_{fl}}\approx e^{-\gamma [z_t-\max(z_i,i\ne t)]+}[\max(z_i,i\ne y)-z_y+m]_+

    gamma为0时与交叉熵一致,当gamma大于1时,相当于在loss前乘以了一个系数。这个系数的值可以小于1也可以约等于1,表示对loss的惩罚增加还是减少。

    ztmax(zi,it)0 z_t-\max(z_i,i\ne t) \ge 0 时,表明正确类的得分已经比其他类的最大得分大了,eγ[ztmax(zi,it)]+e^{-\gamma [z_t-\max(z_i,i\ne t)]_+}的值小于1,可以减少后面交叉熵损失函数的值。

    ztmax(zi,it)0z_t-\max(z_i,i\ne t)\le0时,由于使用了relu([x]+)relu([x]+)函数,所以eγ[ztmax(zi,it)]+e^{-\gamma [z_t-\max(z_i,i\ne t)]_+}的值约等于1,之后交叉熵的损失函数不变。

    这与focalloss的函数图像也是吻合的:
    0_1587025366814_1055519-20180818170840882-453549240.png

    focalloss的平衡问题

    由于cross entropy回传loss时,正负类得到的梯度绝对值都是1,所以我们认为cross entropy是平衡的损失函数。

    对于focalloss求导:
    0_1587025402003_4364a6bf-1f8c-451d-a7ac-be3a919c8c96-image.png
    这里带入值求解 a = [0.3,0.7],则y'=[0.40131234, 0.59868766],y=[1,0],取gamma=2

    0_1587025429469_10608750-ae81-47aa-9ae2-7e4ffaba640f-image.png
    求对z0的梯度:
    0_1587025495405_cac8616f-f85c-4177-8012-4def019b16e1-image.png
    求对z1的梯度:
    0_1587025509702_2d0b1c26-10ec-4f35-a107-37dfc0d47b28-image.png
    这是由于softmax函数的梯度本身是均衡的:
    0_1587025549718_d23c5fbd-d2e7-4d86-a949-f1fbb8e8a36f-image.png
    aj(1aj)ijaiaj=aj(1ai)=0a_j(1-a_j)-\sum_{i\ne j} a_ia_j = a_j(1-\sum a_i) = 0

    梯度的和为0,保证了只要是以softmax为预测层的loss都是均衡的。


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待