炼数成金 门户 商业智能 机器学习 查看内容

Focal Loss--从直觉到实现

2020-2-10 09:40| 发布者: 炼数成金_小数| 查看: 33239| 评论: 0|原作者: 知乎-虎哥|来自: 知乎

摘要: 做机器学习分类问题,难免遇到Biased-Data-Problem, 例如CV的目标检测问题: 绝大多数检测框里都是 backgroud,NLP的异常文本检测: 绝大多数文本都是 normal。对此,以下套路可以缓解:升/降采样, 或者调整样本权重, ...
问题
机器学习分类问题,难免遇到Biased-Data-Problem, 例如
CV的目标检测问题: 绝大多数检测框里都是 backgroud
NLP的异常文本检测: 绝大多数文本都是 normal

对此,以下套路可以缓解:
升/降采样, 或者调整样本权重
换个更鲁棒的loss函数 ,或者加正则
集成模型: Bagging, RandomForest ...
利于外部先验知识: 预训练+微调
多任务联合学习

... (以上概念纯属我瞎白虎,既不完备也不互斥)

今天要聊的就是一种针对该问题精心设计的loss函数——Focal Loss

现状
先来回顾一下常用的 BinaryCrossEntropyLoss 公式如下


不难看出,CE是个“笨学生”。

考前复习的时候,他不会划重点,对所有知识点 “一视同仁”。
如果教科书上有100道例题,包括: 90道加减乘除 + 10道 三角函数。CE同学就会吭哧吭哧的“平均用力”反复练习这100道例题,结果可想而知——他会精通那90道个位数加减乘除题目,然后其他题目基本靠蒙。那10道他不会的题,往往还是分值高的压轴题。

嗯,大概就是这么个症状。

解决办法
机智如你,想必已经有办法了 —— 给他指个方向,别再“平均用力”就好了

方法一、分科复习
每个【科目】的难度是不同的;你要花 30%的精力在四则运算,70%的精力在三角函数。--- 老师告诉CE同学 第一个技巧

对应到公式中,就是针对每个类别赋予不同的权重,即下述

这是个简单粗暴有效的办法。

方法二、刷题战术
每道【题目】的难度是不同的;你要根据以往刷类似题时候的正确率来合理分配精力。
--- 老师告诉CE同学 第二个技巧


代码(Keras实现)
from keras import backend as K

def focal_loss(alpha=0.75, gamma=2.0):
    """ 参考 https://blog.csdn.net/u011583927/article/details/90716942 """
    def focal_loss_fixed(y_true, y_pred):
        # y_true 是个一阶向量, 下式按照加号分为左右两部分
        # 注意到 y_true的取值只能是 0或者1 (假设二分类问题),可以视为“掩码”
        # 加号左边的 y_true*alpha 表示将 y_true中等于1的槽位置为标量 alpha
        # 加号右边的 (ones-y_true)*(1-alpha) 则是将等于0的槽位置为 1-alpha
        ones = K.ones_like(y_true)
        alpha_t = y_true*alpha + (ones-y_true)*(1-alpha)

        # 类似上面,y_true仍然视为 0/1 掩码
        # 第1部分 `y_true*y_pred` 表示 将 y_true中为1的槽位置为 y_pred对应槽位的值
        # 第2部分 `(ones-y_true)*(ones-y_pred)` 表示 将 y_true中为0的槽位置为 (1-y_pred)对应槽位的值
        # 第3部分 K.epsilon() 避免后面 log(0) 溢出
        p_t = y_true*y_pred + (ones-y_true)*(ones-y_pred) + K.epsilon()

        # 就是公式的字面意思
        focal_loss = -alpha_t * K.pow((ones-p_t),gamma) * K.log(p_t)
    return focal_loss_fixed

model = ...
model.compile(..., loss=focal_loss(gamma=3, alpha=0.5))

参考文献
https://arxiv.org/pdf/1708.02002.pdf
https://towardsdatascience.com/demystifying-focal-loss-i-a-more-focused-version-of-cross-entropy-loss-f49e4b044213
https://zhuanlan.zhihu.com/p/49981234
https://blog.csdn.net/MrR1ght/article/details/93649259

声明:文章收集于网络,版权归原作者所有,为传播信息而发,如有侵权,请联系小编删除,谢谢!

欢迎加入本站公开兴趣群
商业智能与数据分析群
兴趣范围包括:各种让数据产生价值的办法,实际应用案例分享与讨论,分析工具,ETL工具,数据仓库,数据挖掘工具,报表系统等全方位知识
QQ群:81035754

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2020-4-4 03:20 , Processed in 0.141102 second(s), 25 queries .