神经网络中的损失函数(下)——分类任务

这篇具有很好参考价值的文章主要介绍了神经网络中的损失函数(下)——分类任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上文主要介绍了回归任务中常用的几个损失函数,本文则主要介绍分类任务中的损失函数。

分类任务中的损失函数

为了与回归任务的损失函数形式相统一,此处仅考虑某一条数据的损失函数。

在分类任务中,假设一共有 n n n个类别。该数据的真实值 Y Y Y一般用独热编码(只有某一位为1,其余都是0的向量)表示, Y = ( 0 , 0 , ⋯   , 0 , 1 , 0 , ⋯   , 0 ) Y=(0,0,\cdots,0,1,0,\cdots,0) Y=(0,0,,0,1,0,,0),其中只有第 k k k维为1,其它维都是0,表示该数据的真实类别为第 k k k类。该数据的预测值用 Y ^ \widehat{Y} Y 表示, Y ^ = ( y ^ 1 , y ^ 2 , ⋯   , y ^ n ) \widehat{Y}=(\widehat{y}_{1},\widehat{y}_{2},\cdots,\widehat{y}_{n}) Y =(y 1,y 2,,y n),其中 y ^ i \widehat{y}_{i} y i表示预测该数据属于第 i i i类的概率。由于是概率,所以 ∀ i ∈ Z , 1 ≤ i ≤ n \forall i \in \mathbb{Z},1\leq i \leq n iZ,1in,下式成立:
{ 0 ≤ y ^ i ≤ 1 ∑ i = 1 n y ^ i = 1 \begin{cases} 0\leq\widehat{y}_{i}\leq1\\ \sum_{i=1}^n\widehat{y}_{i}=1\\ \end{cases} {0y i1i=1ny i=1

本质上,分类任务任务中的损失函数也是量化两个向量 Y Y Y Y ^ \widehat{Y} Y 之间的差距。那么是否可以套用回归任务中的损失函数呢?我们套用MAE的公式看看。

M A E ( Y , Y ^ ) = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ ≤ 1 n ∑ i = 1 n 1 = 1 MAE(Y,\widehat{Y})=\frac{1}{n}\sum_{i=1}^n |y_i-\widehat{y}_i|\leq\frac{1}{n}\sum_{i=1}^n{1}=1 MAE(Y,Y )=n1i=1nyiy in1i=1n1=1

会发现MAE的值始终落在 [ 0 , 1 ] [0,1] [0,1]中。我们希望损失函数展现出更大的弹性,当预测概率与真实结果概率差异越大时,给与更大的损失惩罚。所以我们要重新推导一套针对概率分布的损失函数。

交叉熵

交叉熵,英文为cross entropy。公式为
L o s s ( Y , Y ^ ) = − ∑ i = 1 n y i l o g y ^ i = − l o g y ^ k Loss(Y,\widehat{Y})=-\sum_{i=1}^n y_i log\widehat{y}_i=-log\widehat{y}_k Loss(Y,Y )=i=1nyilogy i=logy k

该公式可以从两个角度来理解,分别是最大似然的角度和信息论的角度。

最大似然

假设一个箱子里有 n n n种类型的球,我们不能打开箱子,只能通过有放回地取出其中的球(简称采样),现在我们要根据采样结果估计这些球在箱子中的比例。假设我们估计的第 i i i种类型的球的比例为 y ^ i \widehat{y}_i y i

假设我们现在抽球,第一次抽到了1类球,第二次抽到了2类球,第三次又抽到了1类球。那么这个事件在我们的估计中发生的概率为 y ^ 1 2 y ^ 2 \widehat{y}_1^2 \widehat{y}_2 y 12y 2。一般地,假设我们用 y i y_i yi表示第 i i i类球抽到的次数,那么事件 Y = ( y 1 , y 2 , ⋯   , y n ) Y=(y_1,y_2,\cdots,y_n) Y=(y1,y2,,yn)在我们的估计中发生的概率为 ∑ i = 1 n y ^ i y i \sum_{i=1}^n \widehat{y}_i^{y_i} i=1ny iyi。(这里假定已知抽出球的顺序,若不知道顺序,则需要乘以一些组合数,由于组合数为常数,可以忽略。)

最大似然的思想假定已经发生的事情就是概率最大的事情。按照该思想,就是要使得 ∑ i = 1 n y ^ i y i \sum_{i=1}^n \widehat{y}_i^{y_i} i=1ny iyi最大化。为了方便计算,这里不妨对该式取对数(底数无所谓,取底数为2或者e都可以),即为 ∑ i = 1 n y i l o g 2 y ^ i \sum_{i=1}^n y_i log_2 \widehat{y}_i i=1nyilog2y i。那么使得该式最大的 Y ^ = ( y ^ 1 , y ^ 2 , ⋯   , y ^ n ) \widehat{Y}=(\widehat{y}_{1},\widehat{y}_{2},\cdots,\widehat{y}_{n}) Y =(y 1,y 2,,y n)就是我们根据采样求出的最有可能的每类球的比例。

损失函数要求最小化,而不是最大化,故需要在 ∑ i = 1 n y i l o g 2 y ^ i \sum_{i=1}^n y_i log_2 \widehat{y}_i i=1nyilog2y i前加个负号,变成 − ∑ i = 1 n y i l o g 2 y ^ i -\sum_{i=1}^n y_i log_2 \widehat{y}_i i=1nyilog2y i,且取负号之后该式刚好非负,这就是大名鼎鼎的交叉熵。在分类任务中,我们已经知道 Y Y Y,相当于已经有了采样结果,那么需要通过最小化损失函数,使得 Y ^ \widehat{Y} Y 更加逼近真实情况。如果已知该实例的分类结果属于第 k k k类,那么上面的损失函数还可以化简,变成 − l o g 2 y ^ k -log_2\widehat{y}_k log2y k

可能有人会问,既然我们已经知道该实例属于第 k k k类,那为什么不直接求出 y ^ k = 1 \widehat{y}_k=1 y k=1,其余都为0。为什么要通过损失函数绕这么大一个圈子来求。这是因为我们的损失函数是用在神经网络中的, y ^ i \widehat{y}_i y i是通过一系列复杂的表达式求出来的,我们在使 y ^ k \widehat{y}_k y k靠近1的过程中,其实是在训练神经网络中的一些参数,使神经网络在遇到其它不知道真实分类结果的时候也能给出正确分类。而且由于噪声的存在,我们不能只顾这一个实例,如果把这个例子训练得很好,可能在别的例子中也不一定能达到很好的效果,所以要通过一个损失函数来量化我们的训练结果与真实结果之间的差距,这样才能顾全大局,训练出使得全局最优的参数。

因为可以从最大似然的角度推出该公式,所以交叉熵损失函数又可以称为负对数似然(NLL)损失函数。

信息论

信息论是研究信息的产生、传输、存储、处理和度量的数学理论,是信息论之父香农提出的一套理论。这里简单介绍一些基本概念,然后推出我们的交叉熵损失函数。

信息量

若一个事件A发生的概率为 p p p,则A的信息量的定义为 l o g 2 1 p = − l o g 2 p log_2\frac{1}{p}=-log_2p log2p1=log2p。该函数在 p ∈ [ 0 , 1 ] p\in[0,1] p[0,1]时单调递减且恒为非负。这个定义比较符合直觉,一个发生概率越小的事件发生了所带来的信息量肯定是更多的。一个发生概率很大的事件发生了,大家也不会感到奇怪,因为信息量比较小。

信息熵

信息熵是一个信息带来的不确定性,也可以理解为一个信息的信息量。对于一个信息来说,可能会传达 n n n种事件。而一个信息的信息量,其实就是各种可能发生的事件的信息量的数学期望。公式为

− ∑ i = 1 n p i l o g 2 p i -\sum_{i=1}^np_ilog_2p_i i=1npilog2pi

最短平均编码长度

信息论中,信息熵也代表着对信息编码所需要的最短平均编码长度,而这种编码方式是根据信息的概率分布编码的。在这种编码方式下,一个事件的编码长度与其信息量相等。一个事件发生概率越高,其信息量越小,编码长度也越短,只有这样才能降低平均编码长度。

为了方便理解,举个具体的例子。一个选择题有四个选项ABCD,假设我们想要传输它的答案(只能用0和1传输),则需要一套编码方式。假设我们用(00,01,10,11)表示(A,B,C,D),则这套编码方式的平均编码长度就是2。假设这道题选ABCD的概率均为 1 4 \frac{1}{4} 41,那么这道题选ABCD的信息量均为2,该选择题的信息熵也为2。但是,如果这道题选ABCD的概率分别为 ( 1 4 , 1 8 , 1 2 , 1 8 ) (\frac{1}{4},\frac{1}{8},\frac{1}{2},\frac{1}{8}) (41,81,21,81),此时该选择题的信息量为1.75,那么其实存在一种更好的编码方式——用(10,110,0,111)来表示(A,B,C,D)。(此处的编码刚好为哈夫曼编码。)此时每个选项的编码长度刚好与其信息量相等,平均编码长度也达到了最小值1.75,恰好等于该选择题的信息熵。

要使得信息的编码长度最短,其精髓在于赋予概率较大的事件以较短的编码长度,赋予概率较小的事件以较大的编码长度。而研究表明,编码长度等于信息量时,会使得信息的平均编码长度最短。(虽然在实际应用中,编码长度须为整数,但是在理论研究中,编码长度不一定要是整数。)

交叉熵

根据事件的发生概率(信息量)来编码,会使得平均编码长度最短,那如果不按照这种方式编码呢?假设我们有一个概率分布 ( q 1 , q 2 , ⋯   , q n ) (q_1,q_2,\cdots,q_n) (q1,q2,,qn),用 ( − l o g 2 q 1 , − l o g 2 q 2 , ⋯   , − l o g 2 q n ) (-log_2q_1,-log_2q2,\cdots,-log_2q_n) (log2q1,log2q2,,log2qn)作为每一个事件的编码长度,那么平均编码长度为 − ∑ i = 1 n p i l o g 2 q i -\sum_{i=1}^np_ilog_2q_i i=1npilog2qi。该式即为交叉熵。交叉熵代表了用非真实分布来编码某个信息所需要的平均编码长度。而当 q i = p i ( 1 ≤ i ≤ n ) q_i=p_i(1\leq i\leq n) qi=pi(1in)时,交叉熵取到最小值,此时的值即为该信息的信息熵,也即最短平均编码长度。

回到我们的损失函数上面来。交叉熵看起来说的是编码长度,但其实也可以衡量两个概率分布之间的相似性。平均编码长度越短,就代表两个概率分布越接近。需要注意的是,交叉熵并不是一个对称的度量,交换 p i p_i pi q i q_i qi的位置不会得到相同的结果。我们取 p i p_i pi为真实的分布, q i q_i qi为预测的分布。在神经网络中, p i p_i pi对应的就是 y i y_i yi,是我们的真实标签,而 q i q_i qi对应的则是 y ^ i \widehat{y}_i y i,是预测的结果。所以我们的交叉熵损失函数即为 − ∑ i = 1 n y i l o g 2 y ^ i -\sum_{i=1}^n y_i log_2\widehat{y}_i i=1nyilog2y i

KL散度

KL散度(Kullback-Leibler散度),又称为相对熵,公式为 ∑ i = 1 n y i l o g 2 y i y ^ i = − l o g y ^ k \sum_{i=1}^ny_ilog_2\frac{y_i}{\widehat{y}_i}=-log\widehat{y}_k i=1nyilog2y iyi=logy k

在真实标签确定的情况下,KL散度和交叉熵损失函数其实是一样的。

在信息论中,KL散度表示基于不同概率分布所需的额外编码长度。

假设有两个分布 P ( x ) P(x) P(x) Q ( x ) Q(x) Q(x),根据信息论的知识,P的最小编码长度为 − ∑ P ( x ) l o g 2 P ( x ) -\sum P(x)log_2P(x) P(x)log2P(x),基于概率分布Q来编码P的编码长度为 − ∑ P ( x ) l o g 2 Q ( x ) -\sum P(x)log_2Q(x) P(x)log2Q(x)(此处即为交叉熵),那么基于Q的编码来编码来自P的样本平均额外增加的长度为 − ∑ P ( x ) l o g 2 Q ( x ) + ∑ P ( x ) l o g 2 P ( x ) = ∑ P ( x ) l o g 2 P ( x ) Q ( x ) -\sum P(x)log_2Q(x)+\sum P(x)log_2P(x)=\sum P(x)log_2\frac{P(x)}{Q(x)} P(x)log2Q(x)+P(x)log2P(x)=P(x)log2Q(x)P(x),这个值即为KL散度。由于KL散度=交叉熵-信息熵,所以KL散度又被称为相对熵。当 P ( x ) P(x) P(x)为常数分布时,信息熵为0,所以KL散度此时等于交叉熵。

KL散度可以衡量两个概率分布之间的接近程度。KL散度越小,表示两个概率分布越接近。KL散度是一个非对称度量,为了解决非对称的问题,又提出了JS散度。

余弦相似度损失函数

余弦相似度损失函数(Cosine Similarity Loss)的公式为 1 − y ^ k ∣ Y ^ ∣ 1-\frac{\widehat{y}_k}{|\widehat{Y}|} 1Y y k

我们来推导一下这个公式。

根据向量的点积公式 Y ⋅ Y ^ = ∣ Y ∣ ∣ Y ^ ∣ c o s θ Y\cdot\widehat{Y}=|Y||\widehat{Y}|cos\theta YY =Y∣∣Y cosθ,有

c o s θ = Y ⋅ Y ^ ∣ Y ∣ ∣ Y ^ ∣ cos\theta=\frac{Y\cdot\widehat{Y}}{|Y||\widehat{Y}|} cosθ=Y∣∣Y YY

由于 Y Y Y只有第 k k k维为1,其余都为0,并且 ∣ Y ∣ = 1 |Y|=1 Y=1,于是有

c o s θ = Y ⋅ Y ^ ∣ Y ^ ∣ = y ^ k ∣ Y ^ ∣ cos\theta=\frac{Y\cdot\widehat{Y}}{|\widehat{Y}|}=\frac{\widehat{y}_k}{|\widehat{Y}|} cosθ=Y YY =Y y k

θ \theta θ表示 Y Y Y Y ^ \widehat{Y} Y 之间的角度,角度越小表示这两个向量越接近。为了使角度为0时,损失函数也为0,所以我们用 1 − c o s θ 1-cos\theta 1cosθ作为损失函数。

总结

在实际应用中,交叉熵是使用最为广泛的损失函数。本文从最大似然和信息论两个角度推导出了交叉熵损失函数。同时又介绍了KL散度和余弦相似度损失函数。文章来源地址https://www.toymoban.com/news/detail-796607.html

到了这里,关于神经网络中的损失函数(下)——分类任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络基础-神经网络补充概念-14-逻辑回归中损失函数的解释

    逻辑回归损失函数是用来衡量逻辑回归模型预测与实际观测之间差异的函数。它的目标是找到一组模型参数,使得预测结果尽可能接近实际观测。 在逻辑回归中,常用的损失函数是对数似然损失(Log-Likelihood Loss),也称为交叉熵损失(Cross-Entropy Loss)。它在分类问题中非常

    2024年02月12日
    浏览(46)
  • 前馈神经网络多分类任务

    pytorch深度学习的套路都差不多,多看多想多写多测试,自然就会了。主要的技术还是在于背后的数学思想和数学逻辑。 废话不多说,上代码自己看。

    2024年02月12日
    浏览(45)
  • yolov5目标检测神经网络——损失函数计算原理

    前面已经写了4篇关于yolov5的文章,链接如下: 1、基于libtorch的yolov5目标检测网络实现——COCO数据集json标签文件解析 2、基于libtorch的yolov5目标检测网络实现(2)——网络结构实现 3、基于libtorch的yolov5目标检测网络实现(3)——Kmeans聚类获取anchor框尺寸 4、C++实现Kmeans聚类算法获

    2024年02月02日
    浏览(43)
  • pytorch-神经网络-手写数字分类任务

    Mnist分类任务: 网络基本构建与训练方法,常用函数解析 torch.nn.functional模块 nn.Module模块 读取Mnist数据集 会自动进行下载 注意数据需转换成tensor才能参与后续建模训练 torch.nn.functional 很多层和函数在这里都会见到 torch.nn.functional中有很多功能,后续会常用的。那什么时候使

    2024年02月09日
    浏览(36)
  • 循环神经网络RNN用于分类任务

    RNN是一类 拥有隐藏状态,允许以前的输出可用于当前输入 的神经网络,  输入一个序列,对于序列中的每个元素与前一个元素的隐藏状态一起作为RNN的输入,通过计算当前的输出和隐藏状态。当前的影藏状态作为下一个单元的输入...   上图中的红色方块代表输入,蓝色方块

    2024年02月09日
    浏览(38)
  • Pytorch:搭建卷积神经网络完成MNIST分类任务:

    2023.7.18 MNIST百科: MNIST数据集简介与使用_bwqiang的博客-CSDN博客 数据集官网:MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges 数据集将按以图片和文件夹名为标签的形式保存:  代码:下载mnist数据集并转还为图片  训练代码: 测试代码: 分类正确率不错:

    2024年02月17日
    浏览(43)
  • 基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

    在皮肤病计算机辅助诊断中,皮肤病变的分割和分类是两项至关重要且相互关联的任务。联合执行这两个任务可以利用它们之间的相关性来获得性能提升,但这仍然是一个具有挑战性的主题。本文提出了一种端到端多任务学习卷积神经网络(MTL-CNN)用于关节皮肤病变的分割和分

    2024年02月14日
    浏览(43)
  • 卷积神经网络CNN原理+代码(pytorch实现MNIST集手写数字分类任务)

    前言 若将图像数据输入全连接层,可能会导致丧失一些位置信息 卷积神经网络将图像按照原有的空间结构保存,不会丧失位置信息。 卷积运算: 1.以单通道为例: 将将input中选中的部分与kernel进行数乘 : 以上图为例对应元素相乘结果为211,并将结果填入output矩阵的左上角

    2024年02月04日
    浏览(59)
  • 使用PyG(PyTorch Geometric)实现基于图卷积神经网络(GCN)的节点分类任务

    PyG(PyTorch Geometric)是一个基于PyTorch的库,可以轻松编写和训练图神经网络(GNN),用于与结构化数据相关的广泛应用。 它包括从各种已发表的论文中对图和其他不规则结构进行深度学习的各种方法,也称为几何深度学习。此外,它还包括易于使用的迷你批处理加载程序,用

    2023年04月20日
    浏览(44)
  • 一种基于注意机制的快速、鲁棒的混合气体识别和浓度检测算法,配备了具有双损失函数的递归神经网络

    提出一个由注意力机制组成的电子鼻系统。首先采用端到端的编码器译码器,提供处理可变长度输入的灵活性。然后提供一种新的门控循环单元网络,方便从时间动态中提取特征,在此基础上注意力机制动态分配气体特征的权重向量。最后采用双损失函数,利用同一网络实现

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包