交叉熵损失函数

虽然之前也面向github跑了很多代码,但是通常仅仅改改输入输出,没有深入了解过。上学期才深入了解了卷积神经网络以及反向传播,前段时间又简单的总结了常见的激活函数。接下来准备总结总结机器学习中常用的损失函数以及优化方法。然后好好看看NumpyDL这个库。不仅仅要理论跟得上,实践也要跟的上啊。好了,废话不多说了。

交叉熵

为了方便理解交叉熵的本质,我将从以此介(chao)绍(xi)信息熵、条件熵、相对熵、交叉熵。

另外,因为该笔记参考了很多教程,我尽可能的已经统一了符号,但是有些地方改的比较麻烦,我就不改了,而且一眼就能看出来什么意思。例如$\sum_{x}p(x)logp(x)$和$-\sum_{j=1}^{n}p(x_j)logp(x_j)$代表同一个意思。

信息熵

熵 (entropy) 这一词最初来源于热力学。1948年,克劳德·爱尔伍德·香农将热力学中的熵引入信息论,所以也被称为香农熵 (Shannon entropy),信息熵 (information entropy)。本文只讨论信息熵。首先,我们先来理解一下信息这个概念。信息是一个很抽象的概念,百度百科将它定义为:指音讯、消息、通讯系统传输和处理的对象,泛指人类社会传播的一切内容。那信息可以被量化么?可以的!香农提出的“信息熵”概念解决了这一问题。

一条信息的信息量大小和它的不确定性有直接的关系。我们需要搞清楚一件非常非常不确定的事,或者是我们一无所知的事,就需要了解大量的信息。相反,如果我们对某件事已经有了较多的了解,就不需要太多的信息就能把它搞清楚。所以,从这个角度,我们可以认为,信息量的度量就等于不确定性的多少。比如,有人说广东下雪了。对于这句话,我们是十分不确定的。因为广东几十年来下雪的次数寥寥无几。为了搞清楚,我们就要去看天气预报,新闻,询问在广东的朋友,而这就需要大量的信息,信息熵很高。再比如,中国男足进军2022年卡塔尔世界杯决赛圈。对于这句话,因为确定性很高,几乎不需要引入信息,信息熵很低。

考虑一个离散的随机变量$X$,由上面两个例子可知,信息的量度应该依赖于概率分布 $p(X)$,因此我们想要寻找一个函数 $I(X)$,它是概率$p(X)$ 的单调函数,表达了信息的内容。怎么寻找呢?如果我们有两个不相关的事件 $X$ 和 $Y$,那么观察两个事件同时发生时获得的信息量应该等于观察到事件各自发生时获得的信息之和,即:$I(X,Y)=I(X)+I(Y)$。因为两个事件是独立不相关的,因此$p(X,Y)=p(X)p(Y)$。

根据这两个关系,很容易看出 $I(X)$一定与 $p(X)$ 的对数有关(因为对数的运算法则是 $log_a(mn)=log_am+log_an$。因此,我们有 $I(X)=-logp(X)$其中负号是用来保证信息量是正数或者零

验证:

其中,$log$ 函数基的选择是任意的(信息论中基常常选择为2,因此信息的单位为比特bits;而机器学习中基常常选择为自然常数,因此单位常常被称为奈特nats)。$I(X)$ 也被称为随机变量$X$ 的自信息 (self-information),描述的是随机变量的某个事件发生所带来的信息量。图像如图:

最后,我们正式引出信息熵。 现在假设一个发送者想传送一个随机变量的值给接收者。那么在这个过程中,他们传输的平均信息量可以通过求$I(X)=-logp(X)$ 关于概率分布 $p(X)$ 的期望得到,即:

其中,$n$表示随机变量一共有$n$个取值的可能,$x_j$表示随机变量取第$j$个值。$H(X)$就被称为随机变量 $X$ 的 熵,它是表示随机变量不确定的度量,是对所有可能发生的事件产生的信息量的期望。从公式可得,随机变量的取值个数越多,状态数也就越多,信息熵就越大,混乱程度就越大。当随机分布为均匀分布时,熵最大 ,且 $0\le H(X)\le logn$。稍后证明。

将一维随机变量分布推广到多维随机变量分布,则其 联合熵 (Joint entropy) 为:

注意点:

  • 熵只依赖于随机变量的分布,与随机变量取值无关,所以也可以将 $X$ 的熵记作$H(p)$。
  • 令$0log0=0$(因为某个取值概率可能为0)。 那么这些定义有着什么样的性质呢?考虑一个随机变量$x$。

这个随机变量有4种可能的状态,每个状态都是等可能的。为了把$x$的值传给接收者,我们需要传输2比特的消息

现在考虑一个具有4种可能的状态 $\left\{a,b,c,d\right\}$ 的随机变量,每个状态各自的概率为 $\left(\displaystyle\frac{1}{2},\frac{1}{4},\frac{1}{8},\frac{1}{8} \right)$

这种情形下的熵为:

我们可以看到, 非均匀分布比均匀分布的熵要小。现在让我们考虑如何把变量状态的类别传递给接收者。与之前一样,我们可以使用一个2比特的数字来完成这件事情。然而,我们可以利用非均匀分布这个特点,使用更短的编码来描述更可能的事件,使用更长的编码来描述不太可能的事件。我们希望这样做能够得到一个更短的平均编码长度。我们可以使用下面的编码串(哈夫曼编码):0、10、110、111来表示状态$\left\{a,b,c,d\right\}$。传输的编码的平均长度就是:

这个值与上方的随机变量的熵相等。熵和最短编码长度的这种关系是一种普遍的情形Shannon 编码定理表明
熵是传输一个随机变量状态值所需的比特位下界(最短平均编码长度) 。因此,信息熵可以应用在数据压缩方面。这里这篇文章讲的很详细了,我就不赘述了。

证明$0\le H(X)\le logn$

利用拉格朗日乘子法证明: 因为 $p(1)+p(2)+\dots+p(n)=1$ 所以有

目标函数:

约束条件:

1、定义拉格朗日函数:

2、$L(p(1),p(2),\dots,p(n),\lambda)$分别对 $p(1),p(2),p(n),\lambda$ 求偏导数,令偏导数为$0$:

其中,$e$表示自然指数,$\cdot$表示相乘。

3、求出$p(1),p(2),\dots,p(n)$ 的值:

解方程得,

代入$f(p(1),p(2),\dots,p(n))$ 中得到目标函数的极值为

由此可证 $logn$ 为最大值。

条件熵

条件熵 $H(Y|X)$表示在已知随机变量$X$的条件下随机变量$Y$的不确定性。条件熵 $H(Y|X)$ 定义为给定$X$条件下$Y$的条件概率分布的熵对$X$的数学期望:

条件熵 $H(Y|X)$ 相当于联合熵 $H(X,Y)$ 减去单独的熵 $H(X)$,即 $H(Y|X)=H(X,Y)-H(X)$,证明如下:

举个例子,比如环境温度是低还是高,和我穿短袖还是外套这两个事件可以组成联合概率分布$H(X,Y)$,因为两个事件加起来的信息量肯定是大于单一事件的信息量的。假设 $H(X)$对应着今天环境温度的信息量,由于今天环境温度和今天我穿什么衣服这两个事件并不是独立分布的,所以在已知今天环境温度的情况下,我穿什么衣服的信息量或者说不确定性是被减少了。当已知$H(X)$ 这个信息量的时候,$H(X,Y)$ 剩下的信息量就是条件熵:

因此,可以这样理解,描述$X$ 和 $Y$ 所需的信息是描述 $X$ 自己所需的信息,加上给定 $X$ 的条件下具体化 $Y$ 所需的额外信息。关于条件熵的例子可以看这篇文章,讲得很详细。

相对熵

理解了熵,我们就知道有多少信息蕴含在数据之中,现在我们就可以计算当我们用一个带参数的概率分布来近似替代原始数据分布的时候,到底损失了多少信息。这就需要用到我们下面要介绍的相对熵。

相对熵 (Relative entropy),也称KL散度 (Kullback–Leibler divergence)。

设 $p(x)$、$q(x)$ 是 离散随机变量 $X$ 中取值的两个概率分布,则 $p$ 对 $q$ 的相对熵是:

显然,根据上面的公式,K-L散度其实是数据的原始分布p和近似分布q之间的对数差值关于原始分布p的期望。所以相对熵越小,两个分布越接近。

性质:

  • 如果 $p(x)$ 和 $q(x)$ 两个分布相同,那么相对熵等于0
  • $D_{KL}(p||q)\not=D_{KL}(q||p)$,相对熵具有不对称性。大家可以举个简单例子算一下。
  • $D_{KL}(p||q)\geq0$

在证明之前,先了解一下吉布斯不等式,内容如下:

若$\sum_{i=1}^{n} p_{i}=\sum_{i=1}^{n} q_{i}=1$,且$p_{i}, q_{i} \in(0,1]$,则有:

当且仅当$p_{i}=q_{i} \forall i$时等号成立。

证明如下

总结:相对熵可以用来衡量两个概率分布之间的差异,上面公式的意义就是求 $p$ 与 $q$ 之间的对数差在 $p$ 上的期望值

交叉熵

(Cross entropy) 现在有关于样本集的两个概率分布 $p(x)$ 和 $q(x)$,其中 $p(x)$ 为真实分布, $q(x)$非真实分布。如果用真实分布 $p(x)$ 来衡量识别别一个样本所需要编码长度的期望(平均编码长度)为:

如果使用非真实分布 $q(x)$ 来表示来自真实分布 $p(x)$的平均编码长度,则是:

因为用$q(x)$ 来编码的样本来自于分布 $q(x)$ ,所以 $H(p,q)$ 中的概率是 $p(x)$。此时就将 $H(p,q)$ 称之为交叉熵

举个具体的例子。考虑一个随机变量 $x$,他的可取值为$\{1,2,3,4\}$,真实分布(即每一个取值的概率)$p(x)= \left(\displaystyle\frac{1}{2},\frac{1}{4},\frac{1}{8},\frac{1}{8} \right)$,非真实分布(即预测分布中每一个取值的概率)$q(x)=\left( \displaystyle\frac{1}{4},\frac{1}{4},\frac{1}{4},\frac{1}{4} \right)$, 则$H(p)=1.75\ bits$(最短平均码长),交叉熵为

由此可以看出根据非真实分布 $q(x)$ 得到的平均码长大于根据真实分布 $p(x)$ 得到的平均码长。

我们再化简一下相对熵的公式。

有没有发现什么?

熵的公式 $H(p)=-\displaystyle\sum_{x}p(x)logp(x)$

交叉熵的公式 $H(p,q)=\displaystyle\sum _{x}p(x)log\frac{1}{q(x)}=-\sum _{x}p(x)logq(x)$

所以有:

当用非真实分布 $q(x)$ 得到的平均码长比真实分布 $p(x)$得到的平均码长多出的比特数就是相对熵。

又因为 $D_{KL}(p||q)\geq0$ 所以 $H(p,q)\geq H(p)$(当 $p(x)=q(x)$时取等号,此时交叉熵等于信息熵),并且 当 $H(p)$ 为常量时(注:在机器学习中,训练数据分布是固定的),最小化相对熵 $D_{KL}(p||q)$等价于最小化交叉熵 $H(p,q)$ 也等价于最大化似然估计(具体参考Deep Learning 5.5)

在机器学习中,我们希望在训练数据上模型学到的分布 $P(model)$ 和真实数据的分布 $P(real)$ 越接近越好,所以我们可以使其相对熵最小。但是我们没有真实数据的分布,所以只能希望模型学到的分布 $P(model)$ 和训练数据的分布 $P(train)$ 尽量相同。假设训练数据是从总体中独立同分布采样的,那么我们可以通过最小化训练数据的经验误差来降低模型的泛化误差。即:

1.希望学到的模型的分布和真实分布一致,$P(model)\simeq P(real)$
2.但是真实分布不可知,假设训练数据是从真实数据中独立同分布采样的,$P(train)\simeq P(real)$
3.因此,我们希望学到的模型分布至少和训练数据的分布一致,$P(train)\simeq P(model)$

根据之前的描述,最小化训练数据上的分布$P(train)$ 与最小化模型分布 $P(model)$ 的差异等价于最小化相对熵,即 $D_{KL}(P(train)||P(model))$。此时,$P(train)$ 就是$D_{KL}(p||q)$ 中的 $p$,即真实分布,$P(model)$ 就是 $q$。又因为训练数据的分布 $p$是给定的,所以求 $D_{KL}(p||q)$ 等价于求 $H(p,q)$。 得证,交叉熵可以用来计算学习模型分布与训练分布之间的差异。交叉熵广泛用于逻辑回归的Sigmoid和Softmax函数中作为损失函数使用。下面我们简单的介绍一下。

分类问题的交叉熵

我们先将交叉熵的公式写出来

既然我们知道了相对熵(KL散度)可以衡量两个分布的差异。而机器学习中训练数据的分布通常是给定的,所以求相对熵(KL散度)等价于求交叉熵。机器学习问题中,分类问题是一个特别常见的问题,那么我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即$D_{KL}(y||a)$,由于KL散度中的前一部分$H(y)$不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。

其中,$y_j$为指示变量(0或1),如果样本的类别为$j$就是1,否则是0;$a_{j}$表示样本属于类别$j$的预测概率;$n$并不是样本个数,而是类别个数。观察$H(p,q)$和$loss$的区别,这里简单的解释下(这个问题我想了好久,深深地被自己的智商感动了,为何有的时候简单的问题需要想好久~)。

$H(p,q)$的表达式中$p(x_j)$表示随机变量$X$在$p$分布中取$j$的概率,但是在机器学习问题中,label是已知的,也就是对于一个确定的样本,它是否属于第$j$类是已知的,属于的话就是1,不属于的话就是0,这也就解释了$loss$表达式中指示标量$y_i$的来源。另外,$H(p,q)$的表达式中$q(x_j)$表示随机变量$X$在$q$分布中取$j$的概率,而$loss$表达式中$a_{j}$表示样本属于类别$j$的预测概率,两者的含义是相同的。总结来说,$H(p,q)$和$loss$均衡量是两个分布之间的差距。但是在$loss$中,label概率分布是已知的,对于每一个样本,其是否属于一类也是确定的。

对于批量样本的交叉熵计算公式是:

$m$是样本数,$n$是分类个数。其中,$y_{ij}$为指示变量(0或1),如果样本$i$的类别为$j$就是1,否则是0;$a_{ij}$表示样本$i$属于类别$j$的预测概率。

二分类问题

有一类特殊问题,就是事件只有两种情况发生的可能,比如“学会了”和“没学会”,称为0-1分布或二分类。对于这类问题,由于$n=2$,所以交叉熵可以简化为:

二分类对于批量样本的交叉熵计算公式是:

当y=1时,即标签值是1,是个正例:

横坐标是预测输出,纵坐标是损失函数值。y=1意味着当前样本标签值是1,当预测输出越接近1时,Loss值越小,训练结果越准确。当预测输出越接近0时,Loss值越大,训练结果越糟糕。

当y=0时,即标签值是0,是个反例:

此时,损失值与预测值的关系是:

我们改变一下上面的例子,假设出勤率高的同学都学会了课程,我们想建立一个预测器,对于一个特定的学员,根据TA的出勤率来预测:

出勤率
学会了课程的真实值统计10
根据学员的高出勤率的预测
预测10.60.4
预测20.70.3

那么这个预测与真实统计之间的交叉熵损失函数值是:

由于0.7是相对准确的值,所以loss2要比loss1小,反向传播的力度也会小。

多分类问题

最后输出层使用Softmax激活函数,并且配合One-Hot编码使用。

等级初级中级高级
出勤率很低100
出勤率中等010
出勤率很高001
对于一个出勤率很高的同学的预测
预测10.10.60.3
预测20.10.30.6

我们想建立一个预测器,预测一个出勤率很高的学员的学习等级,很显然,根据标签值,应该属于$[0,0,1]$。

假设开始时不太准确,一个学员的出勤率很高,但预测出的值为:$[0.1, 0.6, 0.3]$,这样得到的交叉熵是:

如果预测出的值为:$[0.1, 0.3, 0.6]$,标签为:$[0, 0, 1]$,这样得到的交叉熵是:

可以看到,0.51比1.2的损失值小很多,这说明预测值越接近真实标签值(0.6 vs 0.3),交叉熵损失函数值越小,反向传播的力度越小。

为什么不能使用均方差做为分类问题的损失函数?

  1. 回归问题通常用均方差损失函数,可以保证损失函数是个凸函数,即可以得到最优解。而分类问题如果用均方差的话,损失函数的表现不是凸函数,就很难得到最优解。而交叉熵函数可以保证区间内单调。

  2. 分类问题的最后一层网络,需要分类函数,Sigmoid或者Softmax,如果再接均方差函数的话,其求导结果很复杂,运算量比较大。用交叉熵函数的话,可以得到比较简单的计算结果,利用程序性能。

总结

1.信息熵是衡量随机变量分布的混乱程度,是随机分布各事件发生的信息量的期望值,随机变量的取值个数越多,状态数也就越多,信息熵就越大,混乱程度就越大。当随机分布为均匀分布时,熵最大;信息熵推广到多维领域,则可得到联合信息熵;条件熵表示的是在
$X$ 给定条件下,$Y$ 的条件概率分布的熵对 $X$的期望。
2. 相对熵可以用来衡量两个概率分布之间的差异。即当我们用一个带参数的概率分布来近似替代原始数据分布的时候,到底损失了多少信息。所以相对熵越小,两个分布越接近。
3.交叉熵可以来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小。

或者从编码的角度理解:
1.信息熵是传输一个随机变量状态值所需的比特位下界(最短平均编码长度)。
2. 相对熵是指用 $q$ 来表示分布 $p$ 额外需要的编码长度。
3.交叉熵是指用分布 $q$ 来表示本来表示分布 $p$ 的平均编码长度。

问题

取均值

对于损失函数,假如有$m$个样本,通常会求出$m$个样本的平均损失。这里之所以求平均,是为了更加准确的刻画网络在数据上的拟合程度,方便loss之间的比较,比如一个数据集有10w条样本,而另一个有1000条,如果不求均值,那么即使在10w条样本上的那个网络性能更好,也有可能loss比在1000条上的大。

参考

详解机器学习中的熵、条件熵、相对熵和交叉熵
相对熵(KL散度)
如何理解K-L散度(相对熵)
最小化交叉熵损失与极大似然
概率分布_百度百科
伯努利分布_百度百科
03.2-交叉熵损失函数.md
RNN(recurrent neural network)(二)——动手实现一个RNN

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道