有模型就要定义损失函数(又叫目标函数),没有损失函数,模型就失去了优化的方向。大家往往接触的损失函数比较少,比如回归就是MSE,MAE,分类就是log loss,交叉熵。在各个模型中,目标函数往往都是不一样的,如下所示:

  • 朴素贝叶斯: 最大化后验概率
  • 遗传编程: 最大化适应度函数
  • 强化学习: 最大化总回报/价值函数
  • CART决策树分类: 最大化信息增益/最小化子节点不纯度
  • CART,决策树回归,线性回归,自适应线性神经元…: 最小化均方误差成本(或损失)函数
  • 分类模型: 最大化对数似然或最小化交叉熵损失(或代价)函数
  • 支持向量机: 最小化hinge损失

Loss Function

损失函数是一种评估“你的算法/模型对你的数据集预估情况的好坏”的方法。如果你的预测是完全错误的,你的损失函数将输出一个更高的数字。如果预估的很好,它将输出一个较低的数字。当调整算法以尝试改进模型时,损失函数将能反应模型是否在改进。“损失”有助于我们了解预测值与实际值之间的差异。损失函数可以总结为3大类,回归,二分类和多分类。

常用损失函数:

Mean Error (ME)

Mean Squared Error (MSE)

Mean Absolute Error (MAE)

Root Mean Squared Error (RMSE)

Categorical Cross Entropy Cost Function(在只有一个结果是正确的分类问题中使用分类交叉熵)

Binary Cross Entropy Cost Function.

Hinge Loss(hinge损失不仅会惩罚错误的预测,也会惩罚那些正确预测但是置信度低的样本)

Multi-class Cross Entropy Loss

这里我们要区分Multi-class和Multi-label,如下图:

对于Multi-Label我们不能使用softmax,因为softmax总是只强制一个类变为1,其他类变为0。因此,我们可以简单地在所有输出节点值上用sigmoid,预测每个类的概率。

Divergence LOSS (KL-Divergence)

KL散度是一个分布与另一个分布的概率差异的度量,KL散度在功能上类似于多类交叉熵,KL散度不能用于距离函数,因为它不是对称的。

Huber loss

a为比较小的值,此函数是二次函数;对于a为大值时,此函数是线性函数。变量a通常是指残差,即观测值和预测值之间的差值。与平方误差损失相比,Huber损失对数据中的异常值不那么敏感。使函数二次化的小误差值是多少取决于“超参数”, (delta),它可以调整。

有的时候,我们的任务并不是回归或分类,而是排序,下面介绍rank loss。

Rank Loss

排名损失用于不同的领域,任务和神经网络设置,如Siamese NetsTriplet Nets。这就是为什么他们会有名称,如Contrastive Loss, Margin Loss, Hinge Loss or Triplet Loss

与其他损失函数(如交叉熵损失或均方误差损失)不同,损失函数的目标是学习直接预测给定输入的一个标签、一个值或一组或多个值,rank loss的目标是预测输入之间的相对距离。这个任务通常被称为度量学习。

rank loss在训练数据方面非常灵活:我们只需要得到数据点之间的相似性得分就可以使用它们。分数可以是二元的(相似/不同)。例如,假设一个人脸验证数据集,我们知道哪些人脸图像属于同一个人(相似),哪些不属于(不同)。利用rank loss,我们可以训练CNN来推断两张人脸图像是否属于同一个人。

为了使用rank loss,我们首先从两个(或三个)输入数据点中提取特征,并得到每个特征点的嵌入表示。然后,我们定义一个度量函数来度量这些表示之间的相似性,例如欧几里德距离。最后,我们训练特征提取器在输入相似的情况下为两个输入产生相似的表示,或者在两个输入不同的情况下为两个输入产生距离表示。

Pairwise Ranking Loss

我们从上式可以看到,当两个人的描述的是一个人时,他们嵌入表示距离大小就是loss,当描述不是一个人时,嵌入表示距离大于margin才不会产生loss。我们也可以把公式改写为:

Triplet Ranking Loss

通过使用三组训练数据样本(而不是成对样本),这种设置优于前者(同时优化类内距离和类间距),目标就是使得锚点与负样本距离显著大于(由margin决定)与正样本的距离,loss定义如下。

我们来分析一下这种损失的三种情况:

Easy Triplets: 相对于嵌入空间中的正样本,负样本已经足够远离锚定样本。损失是0并且网络参数不会更新。

Hard Triplets: 负样本比正样本更接近锚点,损失是正的。

Semi-Hard Triplets:负样本比正样本离锚的距离远,但距离不大于margin,所以损失仍然是正的。

负样本选择:

在triplets loss训练过程中,负样本选择和三元祖样本挖掘是非常重要的。选择的策略对训练的效率和最终效果有很大的影响。一个很重要的点是,训练三元祖应避免easy triplets,因为他们所造产生的loss是0,不能用于优化模型。

样本挖掘的第一种策略离线进行三元组挖掘,这意味着三元组是在训练开始时定义的,或者是在每个epoch前。后来又提出了online triplet loss(在线三元组挖掘),即在训练过程中为每一个epoch定义三元组,从而提高了训练效率和性能。

需要注意的是,选择负样本的最佳方法是高度依赖于任务的。

Circle loss

在理解了triplet loss之后,我们终于可以开始研究circle loss:A Unified Perspective of Pair Similarity Optimization。Circle Loss 获得了更灵活的优化途径及更明确的收敛目标,从而提高所学特征的鉴别能力。它使用同一个公式,在两种基本学习范式,三项特征学习任务(人脸识别,行人再识别,细粒度图像检索),十个数据集上取得了极具竞争力的表现。

更多干货,请关注公众号:炼丹笔记

一文弄懂各种loss function

一文弄懂各种loss function相关推荐

  1. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  2. 一文弄懂 Diffusion Model

    什么是 Diffusion Model 一.前向 Diffusion 过程 Diffusion Model 首先定义了一个前向扩散过程,总共包含T个时间步,如下图所示: 最左边的蓝色圆圈 x0 表示真 ...

  3. 一文弄懂神经网络中的反向传播法

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  4. 一文弄懂神经网络中的反向传播法——BackPropagation【转】

    本文转载自:https://www.cnblogs.com/charlotte77/p/5629865.html 一文弄懂神经网络中的反向传播法--BackPropagation 最近在看深度学习的东 ...

  5. 一文弄懂String的所有小秘密

    文章目录 简介 String是不可变的 传值还是传引用 substring() 导致的内存泄露 总结 一文弄懂String的所有小秘密 简介 String是java中非常常用的一个对象类型.可以说ja ...

  6. 一文弄懂EnumMap和EnumSet

    文章目录 简介 EnumMap 什么时候使用EnumMap EnumSet 总结 一文弄懂EnumMap和EnumSet 简介 一般来说我们会选择使用HashMap来存储key-value格式的数据, ...

  7. CAD2010 为了保护_一文弄懂,锂电池的充电电路,以及它的保护电路方案设计

    原标题:一文弄懂,锂电池的充电电路,以及它的保护电路方案设计 锂电池特性 首先,芯片哥问一句简单的问题,为什么很多电池都是锂电池? 锂电池,工程师对它都不会感到陌生.在电子产品项目开发的过程中,尤其是 ...

  8. deque stack java_一文弄懂java中的Queue家族

    简介 java中Collection集合有三大家族List,Set和Queue.当然Map也算是一种集合类,但Map并不继承Collection接口. List,Set在我们的工作中会经常使用,通常用 ...

  9. 一文弄懂Flink网络流控及反压

    一文弄懂Flink网络流控及反压 1. 为什么需要网络流控? 2. 网络流控的实现:静态限速 3. 网络流控的实现:动态反馈/自动反压 3.1 案例一:Storm 反压实现 3.2 案例二:Spark ...

最新文章

  1. mysql求每个订单的平均价_MySQL – 选择所有客户和每个客户的总订单和总价值
  2. oracle密码加密工具下载,oracle加密工具wrap
  3. linux查看端口号是否被占用
  4. js 解除网页右键菜单被禁用
  5. Keil | 解决Keil与VScode配合使用时,代码与注释位置不一样的问题。
  6. VGG和GoogLeNet inception
  7. python中执行shell脚本之subprocess模块_如何使用Python中的subprocess模块检查shell脚本的状态?...
  8. 第十章:XAML标记扩展(三)
  9. Java中简单Http请求
  10. 对称密码 -- 工作模式总结 GCM CCM OCB
  11. 三阶行列式简便算法_三阶行列式计算方法
  12. 什么是混合APP开发
  13. 百度指数批量查询器,百度指数
  14. ITIL工具系列之Tivoli
  15. 2020年Android GMS 认证 boot logo 最新要求
  16. 计算机连共享盘被禁止用户,共享文件夹无法访问、设置文件夹访问权限、共享文件夹拒绝访问的解决方法...
  17. 什么是会员标签?会员标签有什么作用呢?
  18. 计算机基本概念反思,计算机基础教学反思
  19. php 触控精灵,背景控制,精灵图 3-12
  20. 全国程序员高考卷,开始答题!

热门文章

  1. HDU 1114(没有变形的完全背包)
  2. 10大主流压力测试工具推荐(转载)
  3. 关于C/C++的trigraphs和Digraphs
  4. 第二十二章 李逵为什么不可爱
  5. oracle 触发器 和 常用内置程序包
  6. csh for循环_shell中的for循环用法详解_linux shell
  7. circRNA研究相关数据库,riboCIRC使用指南
  8. keil3 安装教程
  9. C语言 | 基于MPU605(六轴传感器)的I2C实现LCD1602显示(代码类)
  10. C语言 | 结构体详解(C结构体)