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

news/2024/12/23 0:07:02/

神经网络中的损失函数

  • 前言
  • 分类任务中的损失函数
    • 交叉熵
      • 最大似然
      • 信息论
        • 信息量
        • 信息熵
        • 最短平均编码长度
        • 交叉熵
    • KL散度
    • 余弦相似度损失函数
  • 总结

前言

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

分类任务中的损失函数

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

在分类任务中,假设一共有 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散度和余弦相似度损失函数。


http://www.ppmy.cn/news/1326439.html

相关文章

【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案

Qt Creator 下载地址(含历史版本):https://download.qt.io/official_releases/qtcreator/ 症状 Qt Creator 目前最新版为12.0.1,安装后打开.qml文件发现设计工具图标为禁用状态。 原因及解决方案 根据官网材料(Qt C…

主动轮廓——计算机视觉中的图像分割方法

​ 一、说明 简单来说,计算机视觉就是为计算机提供类似人类的视觉。作为人类,我们很容易识别任何物体。我们可以很容易地识别山丘、树木、土地、动物等,但计算机没有眼睛,也没有大脑,因此它很难识别任何图像。计算机只…

配置zabbix平台对数据库以及主从状态的监控

引言:明人不说暗话,今天分享下配置zabbix平台对数据库以及主从状态的监控 准备好zabbix监控平台(zabbix-server端)例10.12.153.235 db1客户端(zabbix-agent)例10.12.153.73 1.安装Zabbix存储库 # rpm -Uv…

windows虚拟主机和linux虚拟主机的区别有哪些?

很多个人站长和中小企业在做网站的时候,会选择虚拟主机。虚拟主机用的操作系统多为Windows系统,很多人一提到操作系统立马联想到Windows系统。其实除了Windows系统外,还有很多的操作系统。其中Linux系统是其中的佼佼者。 1、操作系统 window…

Qt之QByteArray内容判断和填充

判断是否为空 可以使用函数isEmpty()来判断字节数组是否为空,即size是否为0。函数isEmpty()的原型声明如下: bool isEmpty(); 如果字节数组的size为0,则返回true,否则返回false下列代…

Flink实时数仓同步:拉链表实战详解

一、背景 在大数据领域,业务数据通常最初存储在关系型数据库,例如MySQL。然而,为了满足日常分析和报表等需求,大数据平台会采用多种不同的存储方式来容纳这些业务数据。这些存储方式包括离线仓库、实时仓库等,根据不同…

代码随想录算法训练营第四十三天| 1049.最后一块石头的重量 II、494.目标和、474.一和零

代码随想录算法训练营第四十三天| 1049.最后一块石头的重量 II、494.目标和、474.一和零 题目 1049.最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,…

你真的知道如何查看 Elasticsearch 的 Debug 日志吗?!

当我们遇到问题或者需要深入了解 Elasticsearch 的运行机制时,调整日志等级( logging level )到更详细的级别,比如 DEBUG、TRACE ,会是一个有效且必须要掌握的方法。 Elasticsearch 提供了如下的接口来支持动态变更 l…