Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习中常见的损失函数(摘自我的书)

深度学习中常见的损失函数(摘自我的书)

作者头像
黄鸿波
修改于 2020-04-28 08:40:19
修改于 2020-04-28 08:40:19
1.8K00
代码可运行
举报
文章被收录于专栏:AI的那些事儿AI的那些事儿
运行总次数:0
代码可运行

深度学习分类任务中,我们经常会使用到损失函数,今天我们就来总结一下深度学习中常见的损失函数。

0-1损失函数

在分类问题中,可以使用函数的正负号来进行模式判断,函数值本身大小并不重要,该函数衡量的是预测值与真实值的符号是否相同,具体形式如下所示:

其等价于下述函数:

由于0-1损失函数只取决于正负号,是一个非凸的函数,在求解过程中,存在很多的不足,通常在实际应用中使用其替代函数。

对数(Log)损失函数

Log损失函数是0-1损失函数的一种替代函数,其形式如下:

运用Log损失函数的典型分类器是logistic(逻辑)回归算法。为什么逻辑回归不用平方损失呢?原因在于平方损失函数是线性回归在假设样本是高斯分布的条件下推导得到的(为什么假设高斯分布?其实就是依据中心极限定理)。而逻辑回归的推导中,它假设样本服从于伯努利分布(0-1分布),然后求得满足该分布的似然函数,接着求取对数等(Log损失函数中采用log就是因为求解过中使用了似然函数,为了求解方便而添加log,因为添加log并不改变其单调性)。但逻辑回归并没有极大化似然函数,而是转变为最小化负的似然函数,因此有了上式。

已知逻辑函数(sigmoid函数)为:

可以得到逻辑回归的Log损失函数:

则全体样本的经验风险函数为:

该式就是sigmoid函数的交叉熵,这也是上文说的在分类问题上,交叉熵的实质是对数似然函数。在深度学习中更普遍的做法是将softmax作为最后一层,此时常用的仍是对数似然损失函数,如下所示:

该式其实是式(1)的推广,正如softmax是sigmoid的多类别推广一样,在TensorFlow里面根据最后分类函数softmax和sigmoid就分为softmax交叉熵以及sigmoid的交叉熵,并对这两个功能进行统一封装。

先看tf.nn.sigmoid_cross_entropy_with_logits(logits,targets)函数,它的实现和之前的交叉熵算法定义是一样的,也是TensorFlow最早实现的交叉熵算法。这个函数的输入是logits和targets,logits就是神经网络模型中的W*X矩阵,注意不需要经过sigmoid,因为在函数中会对其进行sigmoid激活,而targets的shape和logtis相同,就是正确的label值。其计算过程大致如下:

tf.nn.softmax_cross_entropy_with_logits(logits,targets)同样是将softmax和交叉熵计算放到一起了,但是需要注意的是,每个样本只能属于一个类别,即要求分类结果是互斥的,因此该函数只适合单目标的二分类或多分类问题。补充一点,对于多分类问题,例如我们分为5类,并且将其人工编码为0,1,2,3,4,因为输出值是5维的特征,因此需要人工做onehot enconding,即分别编码为00001,00010,00100,01000,10000,才能作为该函数的输入。理论上不做onehot encoding也可以,做成和为1的概率分布也可以,但需要保证和为1,否则TensorFlow会检查这些参数,提醒用户更改。

TensorFlow还提供了一个softmax_cross_entropy_with_logits的易用版本,tf.nn.sparse_softmax_cross_entropy_with_logits(),除了输入参数不同,作用和算法实现都是一样的。softmax_cross_entropy_with_logits的输入必须是类似onehot encoding的多维特征,但像CIFAR-10、ImageNet和大部分分类场景都只有一个分类目标,label值都是从0编码的整数,每次转成onehot encoding比较麻烦,TensorFlow为了简化用户操作,在该函数内部高效实现类似onehot encoding,第一个输入函数和前面一样,shape是[batch_size,num_classes],第二个参数以前必须也是[batch_size,num_classes]否则无法做交叉熵,而这里将其改为[batch_size],但值必须是从0开始编码的int32或int64,而且值的范围是[0,num_class)。如果我们从1开始编码或者步长大于1,则会导致某些label值超过范围,代码会直接报错退出。其实如果用户已经做了onehot encoding,那就可以不使用该函数。

还有一个函数tf.nn.weighted_cross_entropy_with_logits(),是sigmoid_cross_entropy_with_logits的拓展版,输入和实现两者类似,与后者相比,多支持一个pos_weight参数,目的是可以增加或减小正样本在算交叉熵时的loss.其计算原理如下:

还有一个计算交叉熵的函数,sequence_loss_by_example (logits,targets,weights),用于计算所有examples(假设一句话有n个单词,一个单词及单词所对应的label就是一个example,所有examples就是一句话中所有单词)的加权交叉熵损失,logits的shape为[batch_size,num_decoder_symbols],返回值是一个1D float类型的tensor,尺寸为batch_size,其中每一个元素代表当前输入序列example的交叉熵。另外,还有一个与之类似的函数sequence_loss,它对sequence_loss_by_example函数的返回结果进行了一个tf.reduce_sum运算。

值得一提的是,当最后分类函数是sigmoid和softmax时,不采用平方损失函数除上文中提到的样本假设分布不同外,还有一个原因是如果采用平方损失函数,则模型权重更新非常慢,假设采用平方损失函数如下式所示:

采用梯度下降算法调整参数的话,则有

而如果采用交叉熵或者说对数损失函数,则参数更新梯度变为:

为什么一开始我们说log损失函数也是0-1损失函数的一种替代函数,因为log损失函数其实也等价于如下形式:

Hinge损失函数

Hinge损失函数也是0-1函数的替代函数,具体形式如下:

指数损失

具体形式如下:

这也是0-1函数的一种替代函数,主要用于AdaBoost算法。

感知机损失

这也是0-1函数的一种替代函数,具体形式如下:

运用感知机损失的典型分类器是感知机算法,感知机算法只需对每个样本判断其是否分类正确,只记录分类错误的样本,类似hinge损失,不同之处在于,hinge损失对判定边界附近的点的惩罚力度较高,而感知损失只要样本的类别判定正确即可,而不需要其离判别边界的距离,这样的变化使得其比hinge损失简单,但是泛化能力没有hinge损失强。

这几种损失函数形式如下,可以看出,除了0-1函数,其他函数都可认为是0-1函数的替代函数,目的在于使函数更平滑,提高计算性,如图所示。

平方(均方)损失函数

具体形式为:

平方损失函数较多应用于回归任务,它假设样本和噪声都是服从高斯分布的,是连续的。它有几个特点:计算简单方便;欧式距离是一种很好的相似度度量标准;在不同的表示域变换后特征性质不变。因此平方损失函数也是一种应用较多的形式。

在TensorFlow中计算平方损失,一般采用tf.pow(x,y),其返回值是x^y。举例来说:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss = tf.reduce_mean(tf.pow(y-y_, 2))

绝对值损失函数

具体形式为:

绝对值损失函数与平方损失函数类似,不同之处在于平方损失函数更平滑,计算更简便,因此实际应用中更多地使用平方损失函数。

以上主要讲了损失函数的常见形式,在神经网络中应用较多的是对数损失函数(交叉熵)和平方损失函数。可以看出,损失函数的选择与模型是密切相关的,如果是square loss,就是最小二乘了,如果是hinge loss,就是SVM了;如果是exp-loss,那就是boosting了;如果是log loss,那就是logistic regression了,等等。不同的loss函数,具有不同的拟合特性,就需要具体问题具体分析。

自定义损失函数

Tensorflow不仅支持经典的损失函数,还可以优化任意的自定义损失函数。自定义的损失函数原则上满足上文中讲的两个条件即可。TensorFlow提供了很多计算函数,基本可以满足自定义损失函数可能会用到的计算操作。举例来说,预测商品销量时,假设商品成本为1元,销售价为10,如果预测少一个,意味着少挣9元,但预测多一个,意味只损失1元,希望利润最大化,因此损失函数不能采用均方误差,需要自定义损失函数,定义如下:

在TensorFlow中可以这样定义:其中tf.greater()用于比较输入两个张量每个元素的大小,并返回比较结果。Tf.select()会根据第一个输入是否为true,来选择第二个参数,还是第三个参数,类似三目运算符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss=tf.reduce_sum(tf.select(tf.greater(v1,v2),a*(v1-v2),b*(v2-v1)))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI的那些事儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【损失函数】常见的损失函数(loss function)总结
损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。
zenRRan
2020/05/26
3.1K0
【深度学习】一文读懂机器学习常用损失函数(Loss Function)
  损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下式子:
10JQKA
2018/07/25
45.3K0
【深度学习】一文读懂机器学习常用损失函数(Loss Function)
深度学习基础知识(三)--交叉熵损失函数
在监督学习进行训练的过程中,我们学习的目的是得到输入到输出的映射关系,在给定 后,预测出 ,期望 尽可能的接近 ,也就是 和 的差距尽可能小。而损失函数就是衡量 和 之间差距的指标,通过损失函数指明模型优化的方向。
languageX
2022/06/01
2.3K0
TensorFlow四种Cross Entropy算法的实现和应用
作者:陈迪豪,就职于小米,负责企业深度学习平台搭建,参与过HBase、Docker、OpenStack等开源项目,目前专注于TensorFlow和Kubernetes社区。 原文:TensorFlow四种Cross Entropy算法实现和应用,作者授权CSDN转载。 欢迎技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net 交叉熵介绍 交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小,常见的Loss函数就是均方
用户1737318
2018/06/06
2.6K0
02 The TensorFlow Way(2)
MachineLP
2018/01/09
8600
02 The TensorFlow Way(2)
学点基本功:机器学习常用损失函数小结
。而损失函数(Loss Function)则是这个过程中关键的一个组成部分,用来衡量模型的输出
AI科技大本营
2019/10/10
1.5K0
学点基本功:机器学习常用损失函数小结
Tensorflow - Cross Entropy Loss
根据应用场景中,分类目标的独立性与互斥性, 可以选择 sigmoid 或者 softmax 来实现.
AIHGF
2018/05/17
2.5K0
TensorFlow交叉熵函数(cross_entropy)·理解
内容参考: Tensorflow四种交叉熵函数计算公式:tf.nn.cross_entropy TensorFlow四种Cross Entropy算法实现和应用
狼啸风云
2020/08/28
3.7K0
TensorFlow交叉熵函数(cross_entropy)·理解
深度学习基础知识(四)--损失函数小结
均方差损失也称为L2 loss,常用于回归任务。模型输出与真实值误差服从高斯分布的假设下,最小化均方差损失函数与极大似然估计本质一致。所以L1 loss一般用于满足假设场景的任务,比如回归任务。而分类任务不满足此假设,所以如上文一般用交叉熵损失。
languageX
2022/06/01
3K0
损失函数综述
作者 | AI小昕 编辑 | 磐石 出品 | 磐创AI技术团队 【磐创AI导读】:本文主要介绍了几种常见的损失函数。欢迎大家点击上方蓝字关注我们的公众号:磐创AI。点击公众号下方文章精选系列文章了解更多。 损失函数(loss function)又叫做代价函数(cost function),是用来评估模型的预测值与真实值不一致的程度,也是神经网络中优化的目标函数,神经网络训练或者优化的过程就是最小化损失函数的过程,损失函数越小,说明模型的预测值就越接近真是值,模型的健壮性也就越好。 常见的损失函数有以下几种
磐创AI
2018/07/03
1.1K0
入门 | 机器学习中常用的损失函数你知多少?
机器通过损失函数进行学习。这是一种评估特定算法对给定数据建模程度的方法。如果预测值与实际结果偏离较远,损失函数会得到一个非常大的值。在一些优化函数的辅助下,损失函数逐渐学会减少预测值的误差。本文将介绍几种损失函数及其在机器学习和深度学习领域的应用。
机器之心
2018/09/20
5010
入门 | 机器学习中常用的损失函数你知多少?
深度学习中常用的损失函数loss有哪些?
这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。
小草AI
2019/07/08
23.8K1
深度学习中常用的损失函数loss有哪些?
深度学习中的损失函数总结以及Center Loss函数笔记
目标函数,损失函数,代价函数 损失函数度量的是预测值与真实值之间的差异.损失函数通常写做L(y_,y).y_代表了预测值,y代表了真实值. 目标函数可以看做是优化目标,优化模型的最后目标就是使得这个目标函数最大或者最小. 代价函数类似于目标函数. 区别:目标函数(代价函数)可以包含一些约束条件如正则化项. 一般不做严格区分.下面所言损失函数均不包含正则项. 常见的损失函数 以keras文档列出的几个为例 keras-loss 1、mse(mean_squared_error):均方误差损失. K.mean(
企鹅号小编
2018/01/31
2.2K1
深度学习中的损失函数总结以及Center Loss函数笔记
深度学习基础知识(六)--- 损失函数
总的说来,它是把目标值(Yi)与估计值(f(xi))的绝对差值的总和(S)最小化:
TeeyoHuang
2020/02/18
3.9K0
深度学习基础知识(六)--- 损失函数
Pytorch 的损失函数Loss function使用详解
损失函数,又叫目标函数,是编译一个神经网络模型必须的两个要素之一。另一个必不可少的要素是优化器。
狼啸风云
2020/04/22
15.4K0
Pytorch 的损失函数Loss function使用详解
【综述专栏】损失函数理解汇总,结合PyTorch和TensorFlow2
在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。
马上科普尚尚
2020/11/11
1.9K0
【综述专栏】损失函数理解汇总,结合PyTorch和TensorFlow2
[高大上的DL] Deep Learning中常用loss function损失函数的小结
在前面我们分享的如何来训练CNN中,提到了BP算法,还记得BP算法是怎么更新参数w,b的吗?当我们给网络一个输入,乘以w的初值,然后经过激活函数得到一个输出。然后根据输出值和label相减,得到一个差。然后根据差值做反向传播。这个差我们一般就叫做损失,而损失函数呢,就是损失的函数。Loss function = F(损失),也就是F。下面我们说一下还有一个比较相似的概念,cost function。注意这里讲的cost function不是经济学中的成本函数。 首先要说明的一点是,在机器学习和深度学习中,损
用户1622570
2018/04/11
10.8K0
[高大上的DL] Deep Learning中常用loss function损失函数的小结
深度学习500问——Chapter02:机器学习基础(2)
1. 为了得到训练逻辑回归模型的参数,需要一个代码函数,通过训练代价函数来得到参数。
JOYCE_Leo16
2024/03/19
2860
深度学习500问——Chapter02:机器学习基础(2)
[机器学习基础一] 深度学习损失函数小结
2020这个充满变化的不平凡的一年过去了,孕育着希望和机遇的2021即将到来,在此祝愿所有朋友幸福美满,蒸蒸日上,心想事成,欢喜如意,新年快乐!
朴素人工智能
2021/01/12
5400
[机器学习基础一] 深度学习损失函数小结
keras中的损失函数
损失函数是模型优化的目标,所以又叫目标函数、优化评分函数,在keras中,模型编译的参数loss指定了损失函数的类别,有两种指定方法:
用户3578099
2020/03/31
2.4K0
推荐阅读
相关推荐
【损失函数】常见的损失函数(loss function)总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验