损失函数(Loss)

article/2025/10/28 10:32:13

如果我们定义了一个机器学习模型,比如一个三层的神经网络,那么就需要使得这个模型能够尽可能拟合所提供的训练数据。但是我们如何评价模型对于数据的拟合是否足够呢?那就需要使用相应的指标来评价它的拟合程度,所使用到的函数就称为损失函数(Loss Function),当损失函数值下降,我们就认为模型在拟合的路上又前进了一步。最终模型对训练数据集拟合的最好的情况是在损失函数值最小的时候,在指定数据集上时,为损失函数的平均值最小的时候。

交叉熵损失函数(Cross Entropy)

在物理学中,“熵”被用来表示热力学系统所呈现的无序程度。香农将这一概念引入信息论领域,提出了“信息熵”概念,通过对数函数来测量信息的不确定性。

交叉熵(cross entropy)是信息论中的重要概念,主要用来度量两个概率分布间的差异。假定 p p p q q q 是数据 x x x 的两个概率分布,通过 q q q 来表示 p p p 的交叉熵可如下计算: H ( p , q ) = − ∑ x p ( x ) log ⁡ q ( x ) ) H(p,q)=-\displaystyle \sum_x p(x)\log q(x)) H(p,q)=xp(x)logq(x))交叉熵刻画了两个概率分布之间的距离,旨在描绘通过概率分布 q q q 来表达概率分布 p p p 的困难程度。根据公式不难理解,交叉熵越小,两个概率分布 p p p q q q 越接近。

这里仍然以三类分类问题为例,假设数据 x x x 属于类别 1。记数据 x x x 的类别分布概率为 y y y,显然 y = ( 1 , 0 , 0 ) y=(1,0,0) y=(1,0,0)代表数据 x x x 的实际类别分布概率。记 y ^ \hat{y} y^ 代表模型预测所得类别分布概率。

那么对于数据 x x x 而言,其实际类别分布概率 y y y 和模型预测类别分布概率 y ^ \hat y y^ 的交叉熵损失函数定义为:
c r o s s e n t r o p y = − y × log ⁡ ( y ^ ) cross\ entropy=-y\times \log \left( \hat{y} \right) cross entropy=y×log(y^)

很显然,一个良好的神经网络要尽量保证对于每一个输入数据,神经网络所预测类别分布概率与实际类别分布概率之间的差距越小越好,即交叉熵越小越好。于是,可将交叉熵作为损失函数来训练神经网络。

在这里插入图片描述
上图给出了一个三个类别分类的例子。由于输入数据 x x x 属于类别 1,因此其实际类别概率分布值为 y = ( y 1 , y 2 , y 3 ) = ( 1 , 0 , 0 ) y=(y_1,y_2,y_3)=(1,0,0) y=(y1,y2,y3)=(1,0,0)。经过神经网络的变换,得到了输入数据 x x x 相对于三个类别的预测中间值 ( z 1 , z 2 , z 3 ) (z_1,z_2,z_3) (z1,z2,z3)。然后,经过 Softmax 函数映射,得到神经网络所预测的输入数据 x x x 的类别分布概率 y ^ = ( y ^ 1 , y ^ 2 , y ^ 3 ) \hat y=(\hat y_1,\hat y_2,\hat y_3) y^=(y^1,y^2,y^3)。根据前面的介绍, y ^ 1 , y ^ 2 , y ^ 3 \hat y_1,\hat y_2,\hat y_3 y^1,y^2,y^3为 (0,1) 范围之间的一个概率值。由于样本 x x x 属于第一个类别,因此希望神经网络所预测得到的 y ^ 1 \hat y_1 y^1取值要远远大于 y ^ 2 \hat y_2 y^2 y ^ 3 \hat y_3 y^3 的取值。为了得到这样的神经网络,在训练中可利用如下交叉熵损失函数来对模型参数进行优化: c r o s s e n t r o p y = − ( y 1 × log ⁡ ( y ^ 1 ) + y 2 × log ⁡ ( y ^ 2 ) + y 3 × log ⁡ ( y ^ 3 ) ) cross\ entropy=-\left( y_1\times \log \left( \hat{y}_1 \right) +y_2\times \log \left( \hat{y}_2 \right) +y_3\times \log \left( \hat{y}_3 \right) \right) cross entropy=(y1×log(y^1)+y2×log(y^2)+y3×log(y^3))在上式中, y 2 y_2 y2 y 3 y_3 y3 均为 0、 y 1 y_1 y1 为 1,因此交叉熵损失函数简化为: − y 1 × log ⁡ ( y ^ 1 ) = − log ⁡ ( y ^ 1 ) -y_1\times \log \left( \hat{y}_1 \right) =-\log \left( \hat{y}_1 \right) y1×log(y^1)=log(y^1)在神经网络训练中,要将输入数据实际的类别概率分布与模型预测的类别概率分布之间的误差(即损失)从输出端向输入端传递,以便来优化模型参数。下面简单介绍根据交叉熵计算得到的误差从 y ^ 1 \hat y_1 y^1 传递给 z 1 z_1 z1 z 2 z_2 z2 z 3 z_3 z3 的推导与 z 2 z_2 z2 相同)的情况。 ∂ y ^ 1 ∂ z 1 = ∂ ( e z 1 ∑ k e z k ) ∂ z 1 = ( e z 1 ) ′ × ∑ k e z k − e z 1 × e z 1 ( ∑ k e z k ) 2 = e z 1 ∑ k e z k − e z 1 ∑ k e z k × e z 1 ∑ k e z k = y ^ 1 ( 1 − y ^ 1 ) \frac{\partial \hat{y}_1}{\partial z_1}=\frac{\partial \left( \frac{e^{z_1}}{\sum_k{e^{z_k}}} \right)}{\partial z_1}=\frac{\left( e^{z_1} \right) ^{'}\times \sum_k{e^{z_k}-e^{z_1}\times e^{z_1}}}{\left( \sum_k{e^{z_k}} \right) ^2}=\frac{e^{z_1}}{\sum_k{e^{z_k}}}-\frac{e^{z_1}}{\sum_k{e^{z_k}}}\times \frac{e^{z_1}}{\sum_k{e^{z_k}}}=\hat{y}_1\left( 1-\hat{y}_1 \right) z1y^1=z1(kezkez1)=(kezk)2(ez1)×kezkez1×ez1=kezkez1kezkez1×kezkez1=y^1(1y^1)由于交叉熵损失函数 − log ⁡ ( y ^ 1 ) -\log \left( \hat{y}_1 \right) log(y^1) y ^ 1 \hat y_1 y^1 求导的结果为 − 1 y ^ 1 -\frac{1}{\hat{y}_1} y^11 y ^ 1 ( 1 − y ^ 1 ) \hat{y}_1\left( 1-\hat{y}_1 \right) y^1(1y^1) − 1 y ^ 1 -\frac{1}{\hat{y}_1} y^11 相乘的结果为 y ^ 1 − 1 \hat{y}_1-1 y^11 这说明一旦得到模型预测输出 y ^ 1 \hat y_1 y^1,将该输出减去1就是交叉损失函数相对于 z 1 z_1 z1 的偏导结果。 ∂ y ^ 1 ∂ z 2 = ∂ ( e z 1 ∑ k e z k ) ∂ z 2 = 0 × ∑ k e z k − e z 1 × e z 2 ( ∑ k e z k ) 2 = − e z 1 ∑ k e z k × e z 2 ∑ k e z k = − y ^ 1 y ^ 2 \frac{\partial \hat{y}_1}{\partial z_2}=\frac{\partial \left( \frac{e^{z_1}}{\sum_k{e^{z_k}}} \right)}{\partial z_2}=\frac{0\times \sum_k{e^{z_k}-e^{z_1}\times e^{z_2}}}{\left( \sum_k{e^{z_k}} \right) ^2}=-\frac{e^{z_1}}{\sum_k{e^{z_k}}}\times \frac{e^{z_2}}{\sum_k{e^{z_k}}}=-\hat{y}_1\hat{y}_2 z2y^1=z2(kezkez1)=(kezk)20×kezkez1×ez2=kezkez1×kezkez2=y^1y^2同理,交叉熵损失函数导数为 − 1 y ^ 1 -\frac{1}{\hat{y}_1} y^11 − y ^ 1 y ^ 2 -\hat{y}_1\hat{y}_2 y^1y^2 − 1 y ^ 1 -\frac{1}{\hat{y}_1} y^11 相乘结果为 y ^ 2 \hat y_2 y^2。这意味对于除第一个输出节点以外的节点进行偏导,在得到模型预测输出后,只要将其保存,就是交叉损失函数相对于其他节点的偏导结果。在 z 1 z_1 z1 z 2 z_2 z2 z 3 z_3 z3得到偏导结果后,再通过链式法则(后续介绍)将损失误差继续往输入端传递即可。

在上面的例子中,假设所预测中间值 ( z 1 , z 2 , z 3 ) (z_1,z_2,z_3) (z1,z2,z3) 经过 Softmax 映射后所得结果为 ( 0.34 , 0.46 , 0.20 ) (0.34,0.46,0.20) (0.34,0.46,0.20)。由于已知输入数据 x x x 属于第一类,显然这个输出不理想而需要对模型参数进行优化。如果选择交叉熵损失函数来优化模型,则 ( z 1 , z 2 , z 3 ) (z_1,z_2,z_3) (z1,z2,z3) 这一层的偏导值为 ( 0.34 − 1 , 0.46 , 0.20 ) = ( − 0.66 , 0.46 , 0.20 ) (0.34−1,0.46,0.20)=(−0.66,0.46,0.20) (0.341,0.46,0.20)=(0.66,0.46,0.20)

可以看出,Softmax 和交叉熵损失函数相互结合,为偏导计算带来了极大便利。偏导计算使得损失误差从输出端向输入端传递,来对模型参数进行优化。在这里,交叉熵与 Softmax 函数结合在一起,因此也叫 Softmax 损失(Softmax with cross-entropy loss)。

均方差损失(Mean Square Error,MSE)

均方误差损失又称为二次损失、L2损失,常用于回归预测任务中。均方误差函数通过计算预测值和实际值之间距离(即误差)的平方来衡量模型优劣。即预测值和真实值越接近,两者的均方差就越小。

假设有 n n n 个训练数据 x i x_i xi,每个训练数据 x i x_i xi 的真实输出为 y i y_i yi,模型对 x i x_i xi 的预测值为 y ^ i \hat y_i y^i。该模型在 n n n 个训练数据下所产生的均方误差损失可定义如下: M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE=\frac{1}{n}\sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2} MSE=n1i=1n(yiy^i)2假设真实目标值为100,预测值在 -10000 到 10000 之间,绘制MSE函数曲线如下图所示。可以看到,当预测值越接近100时,MSE损失值越小。MSE损失的范围为 0 到 ∞ ∞

在这里插入图片描述


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

相关文章

focal loss详解

文章目录 focal loss的整体理解易分辨样本、难分辨样本的含义focal loss的出现过程focal loss 举例说明focal loss的 α \alpha α变体 focal loss的整体理解 focal loss 是一种处理样本分类不均衡的损失函数,它侧重的点是根据样本分辨的难易程度给样本对应的损失添…

深度学习——损失函数(Regression Loss、Classification Loss)

简介 Loss function 损失函数 用于定义单个训练样本与真实值之间的误差 Cost function 代价函数 用于定义单个批次/整个训练集样本与真实值之间的误差 Objective function 目标函数 泛指任意可以被优化的函数 损失函数用于衡量模型所做出的预测离真实值(GT)之间的偏离程度。 …

深度学习中常见的损失函数(L1Loss、L2loss)

损失函数定义 损失函数:衡量模型输出与真实标签的差异。 L1_loss 平均绝对误差(L1 Loss):平均绝对误差(Mean Absolute Error,MAE)是指模型预测值f(x)和真实值y之间距离的平均值,公式如下: 优…

损失函数(loss function)

文章目录 1、什么是损失函数2、为什么要使用损失函数3、损失函数分类1、分类一2、分类二3、分类三3.1基于距离度量的损失函数3.1.1 均方误差损失函数(MSE)3.1.2 L2损失函数3.1.3 L1损失函数3.1.4 Smooth L1损失函数3.1.5 huber损失函数 3.2 基于概率分布…

Focal Loss损失函数(超级详细的解读)

什么是损失函数? 1、什么是损失呢? 在机器学习模型中,对于每一个样本的预测值与真实值的差称为损失。 2、什么是损失函数呢? 显而易见,是一个用来计算损失的函数。它是一个非负实值函数,通常使用L(Y, f(x))来表示。 3、…

损失函数loss大总结

分类任务loss: 二分类交叉熵损失sigmoid_cross_entropy: TensorFlow 接口: tf.losses.sigmoid_cross_entropy(multi_class_labels,logits,weights1.0,label_smoothing0,scopeNone,loss_collectiontf.GraphKeys.LOSSES,reductionReduction.SUM_BY_NONZER…

深度学习基础(三)loss函数

loss函数,即损失函数,是决定网络学习质量的关键。若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果。若有错误,敬请指正,Thank you! 目录 一、loss函数定义 二、常见的loss算法种类 1.M…

loss函数 激活函数

一、LOSS函数 loss函数指机器学习模型中用于最小化的目标函数,其一般意义是指判别错误的程度,因为我们要提高准确率,也就是降低错误率,所以可以归结为一个最小化损失函数的问题。 具体的,我们假设有一个十分类问题&a…

Loss损失函数

损失函数是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数,用于衡量预测值与实际值的偏离程度。在机器学习中,损失函数是代价函数的一部分,而代价函数是目标函数的一种类型。 在《神经网络中常…

深度学习之——损失函数(loss)

深度学习中的所有学习算法都必须有一个 最小化或最大化一个函数,称之为损失函数(loss function),或“目标函数”、“代价函数”。损失函数是衡量模型的效果评估。比如:求解一个函数最小点最常用的方法是梯度下降法&…

1_一些文献中的英文解释和用法整理

目录 1、Theorem、Proposition、Lemma和Corollary等的解释与区别 2、论文里的 Preliminaries 究竟是什么意思? (1)Preliminaries是什么? (2)Preliminaries应该写什么内容? (3)…

区分定理(Theorem)、引理(Lemma)、推论(Corollary)等概念

ZZ: http://blog.sina.com.cn/s/blog_a0e53bf70101jwv1.html Theorem:就是定理,比較重要的,簡寫是 Thm。 Lemma:小小的定理,通常是為了證明後面的定理,如果證明的篇幅很長時,可能會把證明拆成幾…

CodeForces - 1364D Ehabs Last Corollary(dfs树找最小环)

题目链接:点击查看 题目大意:给出一个由 n 个结点和 m 条边构成的无向图,再给出一个 k ,需要在图中完成下面任意一种操作: 找到一个大小恰好为 的独立集找到一个大小不超过 k 的环 题目分析: 题目已经…

Codeforces Round 649 (Rated for Div. 2)D. Ehab s Last Corollary详细题解(图论+简单环)

树 边 : 树边: 树边:深度优先森林中的边。如果结点v是因对(u,v)的探索而首先被发现,则(u,v)是一条树边。 后 向 边 : 后向边: 后向边:后向边(u,v)是将结点u连接到其在深度优先树中一个祖先节点v的边. (本文我就称之为反向边了,问题不大) 前…

#649 (Div. 2)D. Ehab‘s Last Corollary

题目描述 Given a connected undirected graph with n vertices and an integer k, you have to either: either find an independent set that has exactly ⌈k2⌉ vertices. or find a simple cycle of length at most k. An independent set is a set of vertices such that…

Ehabs Last Corollary

Given a connected undirected graph with n n n vertices and an integer k k k, you have to either: either find an independent set that has exactly ⌈ k 2 ⌉ ⌈\frac{k}{2}⌉ ⌈2k​⌉ vertices.or find a simple cycle of length at most k k k. An independen…

Latent Variables的理解

加入我们有X,Y两个随机变量,他们的概率分布如下。要直接用一个函数还表示这个分布是比较困难的。 但我们发现这个分布可以分成三个聚类。如果我们给每个聚类编号为。 那么就是简单的高斯函数了。 这里z就是 加入latent variable的意义在于&#xff0c…

Variable(变量)

深度学习入门之PyTorch 作者 廖星宇

对条件变量(condition variable)的讨论

作者:王东 1.1 什么是条件变量和条件等待? 简单的说: 条件变量(condition variable)是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待某个条件为真,而将自己挂起&…

C++ condition_variable用法

概述 condition_variable类似于信号量机制,实现了线程的等待和唤醒。 函数接口: wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码 notify_all() : 唤醒所有阻塞等待的线程 no…