神经网络损失函数汇总

article/2025/10/11 17:45:40

目录

一、基础知识

二、分类

(1)二分类交叉熵损失函数(binary_crossentropy)

(2)categorical_crossentropy损失函数

(3)sparse_categorical_crossentropy

(4)平衡交叉熵函数(balanced cross entropy)

(5)focal loss 

三、回归

(1)均方误差(MSE-Mean Square Error,L2 loss)

(2)平均绝对误差(MAEMean Absolute Error,L1 loss)

(3)SmoothL1 Loss(Huber损失函数)

(4)L1、L2、smooth L1总结-工业应用中如何选择合适的损失函数


一、基础知识

在理解各种损失函数的选择原理之前,先回顾一下损失函数、模型训练、训练方法的相关基本概念

损失函数(Loss Function):用来估量模型的预测值 f(x) 真实值 y 的偏离程度,以下是选择损失函数的基本要求与高级要求:

  • 基本要求:用来衡量模型输出分布和样本标签分布之间的接近程度,
  • 高级要求:在样本分布不均匀地情况下,精确地描述模型输出分布和样本标签之间的接近程度

模型训练(Training):训练的过程实质是优化(最小化)损失函数,让 f(x) 与 y 尽量接近。实际上是模型参数拟合的过程(比如使用最小二乘法、梯度下降法求解回归模型中的参数),也可以理解为模型求解的过程(比如使用最大期望法求解概率模型中的参数)。和其他数学建模中的求解参数过程本质上没太大区别。

常用训练方法:梯度下降算法寻找函数最小值

一般的损失函数的都是直接计算 batch 的数据,因此返回的 loss 结果都是维度为 batch_size的向量, 值得注意的是, pytorch中很多的损失函数都有 size_average 和 reduce 两个布尔类型的参数,具体内容为:

  • 如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss;
  • 如果 reduce = True,那么 loss 返回的是标量
    • 如果 size_average = True,返回 loss.mean();
    • 如果 size_average = True,返回 loss.sum();

为了更好地理解损失函数的定义以下代码部分将这两个参数均设置为False

一般来说,工程实践中常用的损失函数大致可以分成两大应用情况:回归(Regression)和分类(Classification)

二、分类

(1)二分类交叉熵损失函数(binary_crossentropy

inary_crossentropy损失函数的公式如下(一般搭配sigmoid激活函数使用):

binary_crossentropy


根据公式我们可以发现,i∈[1,output_size] 中每个i是相互独立的,互不干扰,因此它一般用于多标签分类(yolov3的分类损失函数就是用这个),比如说我们有标签 ‘人’,‘男人’, ‘女人’ ,如果使用categorical_crossentropy,由于它的数学公式含义,标签只能是其中一个,而binary_crossentropy各个i是相互独立的,意味着是有可能出现一下这种情况:(举例)
‘人’ 标签的概率是0.9, ‘男人’ 标签概率是0.6,‘女人’ 标签概率是0.3。
那么我们有足够的说服力断定他是 ‘人’,并且很可能是 ‘男人’。


(2)categorical_crossentropy损失函数

在这里插入图片描述

 根据公式我们可以发现,因为yi,要么是0,要么是1。而当yi等于0时,结果就是0,当且仅当yi等于1时,才会有结果。也就是说categorical_crossentropy只专注与一个结果,因而它一般配合softmax做单标签分类。

如果是分类编码(one-hot编码),则使用categorical_crossentropy。one-hot编码就是在标签向量化的时候,每个标签都是一个N维的向量(N由自己确定),其中这个向量只有一个值为1,其余的都为0。也就是将整数索引i转换为长度为N的二进制向量,这个向量只有第i个元素是1,其余的都是0.

(3)sparse_categorical_crossentropy

在开发文档中有例程

import tensorflow as tf
import numpy as np
y_true = tf.constant([1, 2])
y_pred = tf.constant([[0.05, 0.95, 0], [0.1, 0.8, 0.1]])
loss = tf.reduce_mean(tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred))
scce = tf.keras.losses.SparseCategoricalCrossentropy()print(loss.numpy())
print(scce(y_true, y_pred).numpy())

其中有两个基准值1,2说明一共有两类且分别为第一类,第二类,又有两个预测数组[0.05, 0.95, 0], [0.1, 0.8, 0.1]。表明在预测第一个的时候,属于第一类的概率为0.05,属于第二类的概率为0.95,既不属于第一类也不属于第二类的概率为0。同理,在预测第二个的时候,属于第一类的概率为0.1,属于第二类的概率为0.8,既不属于第一类也不属于第二类的概率为0.1。
所以在使用这个函数时,需要如下组织y_true和y_pred:
假如分类时存在三类:其中y_true为:

[1, 2,1,3]

因为sparse_categorical_crossentropy接受的是离散值,且y_true出现了1,2,3 所以共三类,共四个需要预测。y_pred的组织应该如下:

[0.05, 0.95, 0,0],
[0.1, 0.8, 0.1,0],
[0.1, 0.8, 0.1,0],
[0.1, 0.8, 0.1,0]

意思为,对于第1个预测:属于第一类,第二类,第三类的概率分别为0.05,0.95,0;不属于任何一类的概率为0。
对于第2,3,4个的预测依次类推。
其中这样的组织方式,适用于分类任务,也适用于语义分割任务。因为语义分割任务就是像素点所属类别的预测。
再比如:

y_true = tf.constant([1, 2, 3, 4])
y_pred = tf.constant([[0.05, 0.95, 0, 0, 0],[0.1, 0.8, 0.1, 0, 0],[0.1, 0.8, 0.1, 0, 0],[0.1, 0.8, 0.1, 0, 0]})

注意,假如y_true:[1, 2, 4, 4],还是看做三类:
y_pred:

[0.05, 0.95, 0,0],
[0.1, 0.8, 0.1,0],
[0.1, 0.8, 0.1,0],
[0.1, 0.8, 0.1,0]

categorical_crossentropy与sparse_categorical_crossentropy的区别:

sparse_categorical_crossentropy跟categorical_crossentropy的区别是其标签不是one-hot,而是integer。比如在categorical_crossentropy是[1,0,0],在sparse_categorical_crossentropy中是3.

(4)平衡交叉熵函数(balanced cross entropy)

交叉熵损失函数:

 样本不均衡问题:

其中m为正样本个数,n为负样本个数,N为样本总数,m+n=N。当样本分布失衡时,在损失函数L的分布也会发生倾斜,如m<<n时,负样本就会在损失函数占据主导地位。由于损失函数的倾斜,模型训练过程中会倾向于样本多的类别,造成模型对少样本类别的性能较差。

(5)focal loss 

focal loss是最初由何恺明提出的,最初用于图像领域解决数据不平衡造成的模型性能问题。本文试图从交叉熵损失函数出发,分析数据不平衡问题,focal loss与交叉熵损失函数的对比,给出focal loss有效性的解释。

 

focal loss VS balanced cross entropy

focal loss相比balanced cross entropy而言,二者都是试图解决样本不平衡带来的模型训练问题,后者从样本分布角度对损失函数添加权重因子,前者从样本分类难易程度出发,使loss聚焦于难分样本。

focal loss 为什么有效

focal loss从样本难易分类角度出发,解决样本非平衡带来的模型训练问题。

相信很多人会在这里有一个疑问,样本难易分类角度怎么能够解决样本非平衡的问题,直觉上来讲样本非平衡造成的问题就是样本数少的类别分类难度较高。因此从样本难易分类角度出发,使得loss聚焦于难分样本,解决了样本少的类别分类准确率不高的问题,当然难分样本不限于样本少的类别,也就是focal loss不仅仅解决了样本非平衡的问题,同样有助于模型的整体性能提高。

要想使模型训练过程中聚焦难分类样本,仅仅使得Loss倾向于难分类样本还不够,因为训练过程中模型参数更新取决于Loss的梯度。

 思考:

三、回归

(1)均方误差(MSE-Mean Square Error,L2 loss

均方误差(MSE)是回归损失函数中最常用的误差,它是预测值与目标值之间差值的平方和,其公式如下所示:

以 y-f(x) 为横坐标,MSE 为纵坐标,绘制其损失函数的图形:

MSE 曲线的特点是光滑连续、可导,便于使用梯度下降算法。平方误差有个特性,就是当 yi 与 f(xi) 的差值大于 1 时,会增大其误差;当 yi 与 f(xi) 的差值小于 1 时,会减小其误差。这是由平方的特性决定的。也就是说, MSE 会对误差较大(>1)的情况给予更大的惩罚,对误差较小(<1)的情况给予更小的惩罚。比如说真实值为1,预测10次,有一次预测值为1000,其余次的预测值为1左右,显然loss值主要由1000决定。

优点:收敛速度快-MSE 随着误差的减小,梯度也在减小,这有利于函数的收敛,即使固定学习率,函数也能较快收敛到最小值。

缺点:离群点影响大从Training的角度来看,模型会更加偏向于惩罚较大的点,赋予其更大的权重,忽略掉较小的点的作用,无法避免离群点可能导致的梯度爆炸问题。如果样本中存在离群点,MSE 会给离群点赋予更高的权重,但是却是以牺牲其他正常数据点的预测效果为代价,因此会导致降低模型的整体性能

(2)平均绝对误差(MAEMean Absolute Error,L1 loss

平均绝对误差(MAE)是另一种常用的回归损失函数,它是目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,范围是0到∞,其公式如下所示:

 以 y-f(x) 为横坐标,MAE 为纵坐标,绘制其损失函数的图形:

MAE 的曲线呈 V 字型,连续但在 y-f(x)=0 处不可导,计算机求导比较难。且 MAE 大部分情况下梯度相等,这意味着即使对于小的损失值,其梯度也是大的,不利于函数的收敛和模型的学习

优点:由于MAE 计算的是绝对误差,无论是 y-f(x)>1 还是 y-f(x)<1,没有平方项的作用,惩罚力度相同,因此MAE 相比 MSE 对离群点不过分敏感,拟合直线能够较好地表征正常数据的分布情况,其鲁棒性更好

缺点:MAE训练中梯度始终很大,且在0点连续但不可导,这意味着即使对于小的损失值,其梯度也是大的。这不利于函数的收敛和模型的学习,模型学习速度慢,同时也会导致使用梯度下降训练模型时,在结束时可能会遗漏全局最小值。

代码实现由torch.nn.L1Loss的参数reduction决定,当参数reduction

  • 选择 ‘mean’ 或’none’时,即为MAE,
  • 选择’sum’时即为L1 loss;

(3)SmoothL1 Loss(Huber损失函数)

顾名思义,smooth L1说的是光滑之后的L1,前面说过了L1损失的缺点就是有折点,不光滑,导致不稳定,那如何让其变得光滑呢?

Huber函数是对MAE和MSE二者的综合,其在函数值为0时,它也是可微分的。,其包含了一个超参数δ,δ 值决定了 Huber侧重于 MSE 还是 MAE 的优秀形式表现

  • 当δ~ 0时,Huber损失会趋向于MSE;
  • 当δ~ ∞(很大的数字),Huber损失会趋向于MAE

分别取 δ = 0.1、δ = 10,绘制相应的 Huber Loss损失函数的图形:

    当 |y−f(x)| > δ 时,梯度一直近似为 δ,能够保证模型以一个较快的速度更新参数当 |y−f(x)| ≤ δ 时,梯度逐渐减小,也能够保证模型更精确地得到全局最优值

该函数实际上就是一个分段函数,在[-1,1]光滑,这样解决了MAE的不光滑问题,在[-∞,1)(1,+∞])区间解决了MSE可能导致的离群点梯度爆炸的问题,即:

Huber 函数它围绕的最小值会减小梯度,且相比MSE,它对异常值更具鲁棒性, Huber 函数同时具备了 MSE 和 MAE 的优点,既弱化了离群点的过度敏感问题,又实现了处处可导的功能

优点:同时具备了 MSE 和 MAE 的优点,既弱化了离群点的过度敏感问题,又实现了处处可导的功能,收敛速度也快于MAE

  • 相比于MAE损失函数,可以收敛得更快;
  • 相比于MSE损失函数,对离群点、异常值不敏感,梯度变化相对更小,训练时不容易抛出奇怪的结果

注意点:δ超参数需要在训练中选择,常常使用交叉验证法选取合适超参数δ ,超参数的选取直接影响训练的效果的好坏

(4)L1、L2、smooth L1总结-工业应用中如何选择合适的损失函数

  • 从误差的角度来说:MSE可以用来评价数据变化的程度,MAE则能更好的反应预测值误差的实际情况
  • 从离群点角度选择: 如果离群点仅仅只是在数据提取的过程中的损坏或者清洗中的错误采样,则无须给予过多关注,那么我们应该选择 MAE, 但如果离群点是实际的数据或者重要的数据需要被检测到的异常值,那我们应该选择 MSE
  • 从收敛速度的角度来说:MSE>Huber>MAE
  • 从求解梯度的复杂度来说:MSE 要优于 MAE,且梯度也是动态变化的,MSE能较快准确达到收敛。
  • 从模型的角度选择:对于大多数CNN网络,我们一般是使用MSE而不是MAE,因为训练CNN网络很看重训练速度,对于边框预测回归问题,通常也可以选择平方损失函数,但平方损失函数缺点是当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。对于目标检测FastR CNN采用稍微缓和一点绝对损失函数(smooth L1损失),它是随着误差线性增长,而不是平方增长。


http://chatgpt.dhexx.cn/article/wod1y4CK.shtml

相关文章

Jmeter 使用正则表达式提取器将返回值全部保存到一个文件中

目标&#xff1a;将响应数据 {"errorCode":0,"message":"success","data":null} 中的message字段的值全部保存到一个文件中。 1.正则表达式提取器 正则表达式&#xff1a;提取内容的正则表达式【()表示提取&#xff0c;对于你要提取的…

Jmeter性能测试报告模板

性能测试报告 一、测试内容 针对当当网——服务器&#xff0c;进行性能测试&#xff0c;主要针对的核心业务是&#xff1a;注册&#xff0c;登录&#xff0c;查看商品信息与提交订单等。 二、测试方法 本次采用Apache的开元测试工具jmeter&#xff0c;采用本地动态拼装请求数据…

Jmeter5.4.1测试批量上传文件(参数化)

0、下载jmeter5.4.1 jmeter5.4.1-Java文档类资源-CSDN下载 注意需要java环境哦 jdk1.8-java_sdk_jre-Java文档类资源-CSDN下载 启动命令&#xff1a; java -jar ApacheJMeter.jar 用这个启动才是中文版本&#xff0c;另外启动后&#xff0c;界面字体太小&#xff0c…

Jmeter接口测试参数化详解

接口测试是目前最主流的自动化测试手段&#xff0c;它组合不同的参数向服务器发送请求&#xff0c;接受和解析响应结果&#xff0c;通过测试数据的交换逻辑来验证服务端程序工作的正确性。我们在测试过程中需要考虑不同的输入组合&#xff0c;来覆盖不同的测试范围&#xff1b;…

Jmeter学习之用户定义变量与用户变量

一、User Defined Variables 1、添加方法&#xff1a;选择“线程组”&#xff0c;右键点击添加&#xff0d;Config Element&#xff0d;User Defined Variables&#xff0c;定义你所需要的参数&#xff0c;如 2、在对应的需要使用参数的位置&#xff0c;使用${host}替代。 …

jmeter请求get接口报错(java.net.URISyntaxException: Illegal character in query at index 153: http://qa....)

log: 问题描述&#xff1a; 接口请求类型&#xff1a;get 请求参数&#xff1a;{"canshu1":"17600000005","canshu2":"test-0004","canshu3":"2021090301"},如下&#xff1a; 请求的时候报错如下&#xff1a; …

jmeter文件上传请求配置:文件,图片,语音、视频上传

图片上传http请求配置&#xff1a; 跟一般的http请求相对&#xff0c;图片上传的配置请求参数多了以下3个部分 1.点击图中【高级】&#xff0c;将客户端实现方式改为java 2.点击【参数】&#xff0c;按照基本请求参数配置即可 3.点击【文件上传】&#xff0c;配置图片路径&am…

JMeter外观配置与汉化

1、JMeter外观配置 推荐使用系统默认的外观&#xff0c;原因&#xff1a;不会出现窗口拉伸、变形等问题。 路径&#xff1a;选项->外观->System 2、JMeter汉化 方法1&#xff1a;修改JMeter设置&#xff08;一次性的&#xff0c;下次打开JMeter还会恢复默认配置&#x…

16、Jmeter如何创建桌面快捷带图方式(亲测有效)

First step** 1、先找到jmeter文件安装的bin目录—>jmeter.bat文件&#xff0c;创建桌面快捷方式。 ** 2、右键&#xff0c;点击“发送到”---->桌面快捷方式”。然后再选中桌面快捷方式&#xff0c;右键&#xff0c;点击“属性”&#xff0c;修改“属性”里的路径为&am…

11、jmeter读取CSV文件之元件数据文件设置基础页面了解(1)

使用场景以及好处&#xff1a; 读取用例的方法通常有两种&#xff0c;1、通过建立多个请求信息实现接口的入参参数化&#xff0c;2、通过读取csv文件&#xff0c;加载测试用例。第一种方法会导致脚本过于冗余&#xff0c;不便于维护&#xff0c;因此多数情况我们会使用读取csv文…

JMeter的基本使用

目录 一、下载JMeter 二、设置语言为简体中文 三、JMeter外观设置 三、添加线程组 四、添加HTTP请求 五、添加信息头管理器 ​六、创建察看结果树 七、运行查看结果 一、下载JMeter 下载地址&#xff1a;Apache JMeter - Apache JMeter™ 下载zip文件解压后运行bin目录…

使用Jmeter进行性能测试的基本操作方法

Jmeter是一款轻量型的优秀测试软件产品&#xff0c;在很多场合如个人测试&#xff0c;企业测试中都有广泛应用。相比体积巨大的我们在某些场合可能更倾向于对Jmeter的使用&#xff0c;那么我们要如何利用该软件进行性能测试呢&#xff1f; 我们需要下载安装这款全免费的测试软件…

JMeter下载安装及入门教程

1 JMeter介绍 JMeter使用了不同技术和协议&#xff0c;是一款可以进行配置和执行负载测试、性能测试和压力测试的工具。负载测试、性能测试和压力测试概念&#xff1a; 负载测试: 这类测试使系统或者应用程序在预先设计好的极端场景下测试运行。这类测试用来评估系统或者程序…

Jmeter模拟selenium操作浏览器

前言 selenium是一个web自动化测试的开源框架&#xff0c;它支持多语言&#xff1a;python/java/c#… selenium支持多语言&#xff0c;是因为selenium与浏览器驱动之间是通过http协议进行通信的。只关心通信的数据是否能够正确解读 &#xff0c;并不关心这个数据是从哪个客户…

jmeter 安装与配置

目录 一、jmeter 安装配置与启动 1、安装 2、配置 3、启动 &#xff08;若要求在 Linux 下启动&#xff0c;则用bin --> jmeter.sh 打开&#xff09; 二、jmeter 插件安装 一、jmeter 安装配置与启动 &#xff08;需要Java环境&#xff09; 1、安装 安装与JDK版本对…

JMeter执行顺序与作用域

两个线程组之间是不可以直接传入参数的 执行顺序 一般情况下JMeter按照如下顺序执行∶ 0.配置元件 1.定时器 2.前置处理器 3.取样器 4. 后置处理器 5.断言 6&#xff0e;监听器 一个简单的例子∶ -Test Plan -Thread Group -HTTP Requesto 4  …

Jmeter测试全流程学习教程

Jmeter测试全流程学习教程,本文从jmeter的下载安装到具体的测试流程做了详细的介绍,并在文章中介绍了一些长见问题及处理方法。适合刚刚接触jmeter测试的新手小白参考,若有错误之处,欢迎指正,大神勿喷。 1. 安装与配置 1.1. 下载 官网地址:https://jmeter.apache.org/…

jmeter测试服务器性能测试报告,Jmeter的性能测试

需要分析的系统信息 需要分析的业务信息 性能需求评估 确定性能测试点: 关键业务: 确定被测项目是否属于关键业务,有哪些主要的业务逻辑点,特别是跟交易相关的功能点。例如转账,扣款等接口。如果项目(或功能点)不属于关键业务(或关键业务点) 日请求量: 确定被测项目各功能…

Jemeter 设置中文

1、在jmeter路径下找到文件&#xff0c;bin–>jmeter.bat开启编辑模式 2、找到set JMETER_LANGUAGE-Duser.language“en” -Duser.region"EN"部分&#xff1b; 3、在该部分前后分别添加goto remove_language_reset_bug_4.0和:remove_language_reset_bug_4.0&#…

怎么将fiddler中的接口数据导入jemer直接使用

1、将附件JmeterExproter.dll和JmeterExporter.pdb替换至ImportExport 2、将CustomRules.js替换至Script里 3、进入fiddler&#xff0c;选择任意接口&#xff0c;点击file-export sessions-selected sessions–选择Jmeter 4、导入为.jmx的文件 5、在jmeter中打开即可…