专栏首页机器学习与python集中营深度学习中常用的损失函数loss有哪些?

深度学习中常用的损失函数loss有哪些?

转自:有三AI

这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

今天来说说深度学习中常见的损失函数(loss),覆盖分类,回归任务以及生成对抗网络,有了目标才能去优化一个模型。

作者&编辑 | 言有三

1 什么是损失函数

在机器学习中,损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,损失函数越小,一般就代表模型的鲁棒性越好,正是损失函数指导了模型的学习。

机器学习的任务本质上是两大类,分类问题与回归问题,再加上综合了判别模型和生成模型后在各类图像任务中大展拳脚的生成对抗网络,这一次我们就重点讲述这些内容。

2 分类任务损失

2.1、0-1 loss

0-1 loss是最原始的loss,它直接比较输出值与输入值是否相等,对于样本i,它的loss等于:

当标签与预测类别相等时,loss为0,否则为1。可以看出,0-1 loss无法对x进行求导,这在依赖于反向传播的深度学习任务中,无法被使用,0-1 loss更多的是启发新的loss的产生。

2.2、熵与交叉熵loss

在物理学有一个概念,就是熵,它表示一个热力学系统的无序程度。为了解决对信息的量化度量问题,香农在1948年提出了“信息熵”的概念,它使用对数函数表示对不确定性的测量。熵越高,表示能传输的信息越多,熵越少,表示传输的信息越少,我们可以直接将熵理解为信息量

按照香农的理论,熵背后的原理是任何信息都存在冗余,并且冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。概率大,出现机会多,则不确定性小,这个关系就用对数函数来表征。

为什么选择对数函数而不是其他函数呢?首先,不确定性必须是概率P的单调递降函数,假设一个系统中各个离散事件互不相关,要求其总的不确定性等于各自不确定性之和,对数函数是满足这个要求的。将不确定性f定义为log(1/p)=-log(p),其中p是概率。

对于单个的信息源,信源的平均不确定性就是单个符号不确定性-logpi的统计平均值,信息熵的定义如下。

假设有两个概率分布p(x)和q(x),其中p是已知的分布,q是未知的分布,则其交叉熵函数是两个分布的互信息,可以反应其相关程度。

从这里,就引出了分类任务中最常用的loss,即log loss,又名交叉熵loss,后面我们统一称为交叉熵:

n对应于样本数量,m是类别数量,yij 表示第i个样本属于分类j的标签,它是0或者1。对于单分类任务,只有一个分类的标签非零。f(xij) 表示的是样本i预测为j分类的概率。loss的大小完全取决于分类为正确标签那一类的概率,当所有的样本都分类正确时,loss=0,否则大于0。

2.3、softmax loss及其变种

假如log loss中的f(xij)的表现形式是softmax概率的形式,那么交叉熵loss就是我们熟知的softmax with cross-entropy loss,简称softmax loss,所以说softmax loss只是交叉熵的一个特例。

softmax loss被广泛用于分类分割等任务,而且发展出了很多的变种,有针对不平衡样本问题的weighted softmax loss, focal loss,针对蒸馏学习的soft softmax loss,促进类内更加紧凑的L-softmax Loss等一系列改进,公众号早在一年前就撰写过综述如下:

【技术综述】一文道尽softmax loss及其变种

2.4、KL散度

Kullback和Leibler定义了KL散度用于估计两个分布的相似性,定义如下;

Dkl是非负的,只有当p与q处处相等时,才会等于0。上面的式子也等价于

其中l(p,p)是分布p的熵,而l(p,q)就是p和q的交叉熵。假如p是一个已知的分布,则熵是一个常数,此时dkl(p|q)与l(p,q)也就是交叉熵只有一个常数的差异,两者是等价的。

同时值得注意的是,KL散度并不是一个对称的loss,即dkl(p|q) != dkl(q|p),KL散度常被用于生成式模型。

2.5、Hinge loss

Hinge loss主要用于支持向量机中,它的称呼来源于损失的形状,定义如下:

如果分类正确,loss=0,如果错误则为1-f(x),所以它是一个分段不光滑的曲线。Hinge loss被用来解SVM问题中的间距最大化问题。

2.6、Exponential loss与Logistic loss

Exponential loss是一个指数形式的loss,它的特点就是梯度比较大,主要用于Adaboost集成学习算法中,定义如下:

logistic loss取了Exponential loss的对数形式,它的定义如下:

logistic loss 梯度相对变化更加平缓。

此外还有sigmoid cross_entropy_loss,可以被用于多标签分类任务或者不需要创建类间竞争机制的分类任务,在Mask RCNN中就被用了。

以上就涵盖了大部分常用的分类任务损失,多半都是对数的形式,这是由信息熵的定义,参数似然估计的本质决定的。

3 回归任务损失

在回归任务中,回归的结果是一些整数或者实数,并没有先验的概率密度分布,常使用的loss是L1 loss和L2 loss。

3.1、L1 loss

Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离:

由于L1 loss具有稀疏性,为了惩罚较大的值,因此常常将其作为正则项添加到其他loss中作为约束。L1 loss的最大问题是梯度在零点不平滑,导致会跳过极小值。

3.2、L2 loss

Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss,或欧氏距离,它以误差的平方和作为距离:

L2 loss也常常作为正则项。当预测值与目标值相差很大时, 梯度容易爆炸,因为梯度里包含了x−t。

3.3、L1 loss与L2 loss的改进

原始的L1 loss和L2 loss都有缺陷,比如L1 loss的最大问题是梯度不平滑,而L2 loss的最大问题是容易梯度爆炸,所以研究者们对其提出了很多的改进。

在faster rcnn框架中,使用了smooth L1 loss来综合L1与L2 loss的优点,定义如下:

在x比较小时,上式等价于L2 loss,保持平滑。在x比较大时,上式等价于L1 loss,可以限制数值的大小。

为了增强L2 loss对噪声(离群点)的鲁棒性,研究者提出了Huber loss,定义如下:

Huber对于离群点非常的有效,它同时结合了L1与L2的优点,不过多出来了一个delta参数需要进行训练。

除此之外还有Log-Cosh Loss等损失,大家可以自己了解,也欢迎补充。

从上面可以看出,L1/L2各有优劣,设计一个通用的框架同时满足L1/L2损失的优点是研究重点,我见过的最夸张的是这样的。

3.4、perceptual loss

对于图像风格化,图像超分辨率重建等任务来说,早期都使用了图像像素空间的L2 loss,但是L2 loss与人眼感知的图像质量并不匹配,恢复出来的图像往往细节表现不好。

现在的研究中,L2 loss逐步被人眼感知loss所取代。人眼感知loss也被称为perceptual loss(感知损失),它与MSE采用图像像素进行求差的不同之处在于所计算的空间不再是图像空间。

研究者们常使用VGG等网络的特征,令φ来表示损失网络,Cj表示网络的第j层,CjHjWj表示第j层的特征图的大小,感知损失的定义如下:

可以看出,它有与L2 loss同样的形式,只是计算的空间被转换到了特征空间。

4 生成对抗网络损失

生成对抗网络即Generative Adversarial Networks,简称GAN,它是2014年以后兴起的无监督学习网络,现在有非常多的解读了,我们一年前也解读过,欢迎移步,适合初学者。

【技术综述】有三说GANs(上)

原始的用于生成图片的GAN的损失函数包括了生成式模型和判别式模型两部分,如今GAN被用于各类任务,其他的各种损失也加入了进来,不过我们这里还是专门针对GAN的基本损失进行讲述。

4.1、GAN的基本损失

GAN是在生成模型和判别模型的相互博弈中进行迭代优化,它的优化目标如下:

从中可以看出,包括两个部分,Ex∼pdata(x)[logD(x)]和Ez∼pz(z)[log(1−D(G(z)))]要求最大化判别模型对真实样本的概率估计,最小化判别模型对生成的样本的概率估计,生成器则要求最大化D(G(z)),即最大化判别模型对生成样本的误判,这个loss是对数log的形式。

原始的GAN的损失使用了JS散度,两个分布之间越接近,它们的JS散度越小,但实际上这并不适合衡量生成数据分布和真实数据分布的距离,相关的分析已经非常的多了,本文如果展开就太长了,因此直接给解决方案。

4.2、-log D trick

Ian Goodfellow提出了-log D trick,即把生成器loss改成如下,使得生成器的损失不依赖于生成器G

这个等价最小化目标存在两个严重的问题。第一是它同时要最小化生成分布与真实分布的KL散度,却又要最大化两者的JS散度,这是矛盾的会导致梯度不稳定。第二,因为KL散度不是对称的,导致此时loss不对称,对于正确样本误分和错误样本误分的惩罚是不一样的。第一种错误对应的是“生成器没能生成真实的样本”,即多样性差,惩罚微小;第二种错误对应的是“生成器生成了不真实的样本”,即准确性低,惩罚巨大。这样造成生成器生成多样性很差的样本,出现了常说的模式崩塌(collapse mode)问题。

4.3、Wasserstein GAN(简称wgan)等改进方案

wgan采用了Earth-Mover距离(EM距离)作为loss,它是在最优路径规划下的最小消耗,计算的是在联合分布γ下,样本对距离的期望值:

与原始的GAN的loss形式相比,其实wgan就是生成器和判别器的loss不取log。wessertein距离相比KL散度和JS散度的优势在于,即使两个分布的支撑集没有重叠或者重叠非常少,仍然能反映两个分布的远近。而JS散度在此情况下是常量,KL散度可能无意义。

wgan有一些问题,wgan-gp改进了wgan连续性限制的条件,后面还有一些研究,大家可以自行跟进,我们后面也会讲述。

4.4、LS-GAN

LS-GAN即Least Squares Generative Adversarial Networks。它的原理部分可以一句话概括,即使用了最小二乘损失函数代替了GAN的损失函数,相当于最小化P和Q之间的Pearson卡方散度(divergence),这属于f-divergence的一种,有效地缓解了GAN训练不稳定和生成图像质量差多样性不足的问题。作者认为使用JS散度并不能拉近真实分布和生成分布之间的距离,使用最小二乘可以将图像的分布尽可能的接近决策边界,其损失函数定义如下:

以交叉熵作为损失,它的特点是会使得生成器不会再优化那些被判别器识别为真实图片的生成图片,即使这些生成图片距离判别器的决策边界仍然很远,也就是距真实数据比较远,这意味着生成器的生成图片质量并不高。而要想最小二乘损失比较小,则在混淆判别器的前提下还得让生成器把距离决策边界比较远的生成图片拉向决策边界,这就是LS-GAN的优势。

4.5、Loss-sensitive-GAN

在原始的GAN的损失函数后添加了一个约束项来直接限定GAN的建模能力,它的损失函数如下:

优化将通过最小化这个目标来得到一个“损失函数" (下文称之为L函数)。L函数在真实样本上越小越好,在生成的样本上越大越好。它是以真实样本x和生成样本的一个度量为各自L函数的目标间隔,把x和生成样本分开。好处是如果生成的样本和真实样本已经很接近,就不必要求他们的L函数有个固定间隔,因为生成的样本已经很好。这样就可以集中力量提高那些距离真实样本还很远,真实度不那么高的样本,能更合理地使用LS-GAN的建模能力,被称为“按需分配”。

关于GAN的损失优化,这是一个不小的研究领域,下面是一个简单的汇总。

如果你对GAN还有更多兴趣,那就看这个参考网址吧,https://hollobit.github.io/All-About-the-GAN/,不多不多,也就几千篇文章,我大概看了1000篇的摘要,等闲下来再跟大家搞GAN,是Generative Adversarial Networks噢。

本文分享自微信公众号 - 机器学习与python集中营(yasuozet01)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Pytorch填坑记】PyTorch 踩过的 12 坑

    1. nn.Module.cuda() 和 Tensor.cuda() 的作用效果差异

    小草AI
  • 深入剖析Mean Shift聚类算法原理

    Mean Shift在计算机视觉领域的应用非常广,如图像分割,聚类和视频跟踪,小编曾经用Mean Shift实现目标跟踪,效果还不错。本文详细的总结了Mean ...

    小草AI
  • python面试题精讲——monkey patch(猴子补丁)

    本次依然是选自python面试题系列,将一个比较偏的概念,可能很多人没怎么听说过——猴子补丁,其实所讲的内容很简单,它得益于python灵活的语法、一切皆对象的...

    小草AI
  • 【AI初识境】深度学习中常用的损失函数有哪些?

    这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

    用户1508658
  • 二分类语义分割损失函数

    1 - softmax 交叉熵损失函数(softmax loss,softmax with cross entroy loss)

    AIHGF
  • pytorch进行CIFAR-10分类(4)训练

    经过前面的数据加载和网络定义后,就可以开始训练了,这里会看到前面遇到的一些东西究竟在后面会有什么用,所以这一步希望各位也能仔细研究一下

    TeeyoHuang
  • GAN对抗网络入门教程

    译:A Beginner's Guide to Generative Adversarial Networks (GANs) https://skymind.a...

    致Great
  • 论文阅读|How Does Batch Normalizetion Help Optimization

    Batch Normalization在2015年被谷歌提出,因为能够加速训练及减少学习率的敏感度而被广泛使用。

    AI部落联盟
  • 论文阅读|How Does Batch Normalizetion Help Optimization

    Batch Normalization在2015年被谷歌提出,因为能够加速训练及减少学习率的敏感度而被广泛使用。

    zenRRan
  • 一个值得深思的问题?为什么验证集的loss会小于训练集的loss

    在本教程中,您将学习在训练自己的自定义深度神经网络时,验证损失可能低于训练损失的三个主要原因。

    AI算法与图像处理

扫码关注云+社区

领取腾讯云代金券