损失函数的目的是为了定量描述不同模型(例如神经网络模型和人脑模型)的差异。
交叉熵,顾名思义,与熵有关,先把模型换成熵这么一个数值,然后用这个数值比较不同模型之间的差异。
为什么要做这一步转换,原因是要直接比较两个模型,前提是两个模型是同一种类型,比如都是高斯分布,我们可以比较均值和方差。但现实中,我们要比较的两种模型往往不是同一种类型,甚至我们都不知道是什么类型。所以我们通过熵实现不同类型概率模型的公度。
熵的前置知识
1. 信息量
衡量一个信息有没有信息量,不是看这个消息你知不知道,关键是看能带来多少确定性,也可以说能消除多少不确定性。
例如有8支队伍参加比赛,其中一支队伍名为“AI小队”。理论上来说,“AI小队”夺冠概率为1/8。但如果告诉你“AI小队”夺冠了,夺冠概率从1/8变为百分之百;但如果告诉你“AI小队”进入总决赛了,夺冠概率从1/8变为1/2,但直观上感觉这个信息量不如夺冠信息的信息量高。
通过上述例子我们大概能明白不同的信息,含有的信息量是不同的。那如何定义信息量呢?
***题外话***
所谓定义,就是人为规定它的意义,给出一个表达式,至于这个表达式为什么这么写而不那么写,原因是最先提出的人就是这么写的,并且逻辑得到了自洽,后人为了统一标准,便沿用了这个定义。你也可以给出自己的定义,但为了让体系自洽,可能其他与该定义相关的表达式就要重写。
首先,从直观上来说,一件事发生的概率越低,其包含的信息量越大;反之一件事发生的概率越大,包含的信息量越少。例如,我告诉你太阳每天东升西落,这对你来说没有任何信息量,因为这件事情的概率是1;但假如我告诉你下一期双色球中奖号码是某某某(假如是正确的话),那这个消息的信息量就很大了。因此信息量与事件发生的概率是相关的。
其次,假如一个事件可以被分解成多个事件,该事件的信息量等于多个事件信息量的和。现在我们假设是信息量的一个表达式,根据上面举的例子,该表达式应该满足如下要求:
(AI小队夺冠(进决赛且赢得决赛)) =
(AI小队进入决赛)+
(AI小队进入决赛后还赢了决赛)
乘法变加法,熟悉的感觉,是log!!!信息量能不能定义成呢,其中
为事件
发生的概率。如此以来第二个条件满足了,但是这样的话信息量会随着事件发生概率的增大而增大,那怎么办呢?加个负号。
所以如果我们把一个事件的信息量定义为如下公式,逻辑就能自洽:
通常我们log以2为底,计算出的信息量的单位是比特(bit)。原因是计算机是二进制的,我们的信息量衡量了一个信息的最短编码(不理解的同学可忽略)。
2.熵
通过上面的分析,我们给出了信息量的定义。信息量可以理解成一个事件从原来的不确定性变得确定难度有多大,信息量比较大说明难度比较高。熵的理解也类似,不过熵衡量的不是某个具体事件,而是一个系统中所有的事件,即一个系统从原来的不确定到确定,其难度有多大。
我们可以把一场比赛看作一个系统。假如两个实力相近的队伍比赛,两只队伍胜利的概率都是,那这两只队伍赢球的信息量都是:
但如果是两只实力悬殊的队伍比赛,队伍A胜利的概率是99%,队伍B胜利的概率为1%,那两只队伍赢球的信息量分别为:
那球赛的熵是两只队伍赢球的信息量的加和么?
显然不是,因为如果是加和的话,实力悬殊队伍的比赛结果相对来说是确定的,大概率是实力强的队伍赢得比赛,所以它的不确定性是低的,但此时它的熵却是高的,所以熵并不是信息量的简单加和。
我们需要考虑每个事件对系统贡献的信息量,事件只有发生了,才会贡献信息量,所以系统的熵定义为信息量的期望:
3.相对熵(KL散度)
我们的目的是要比较两个模型,最简单的方法就是把概率模型的熵计算出来然后直接比较熵的数值,但并不是所有概率模型我们都能求熵。因此引出另外一个概念——相对熵,也叫KL散度,其定义如下:
KL散度等于0表明两个分布是一样的,不等于0表示两者有差别。其中和
分别表示两个概率分布,
表示以
为基准(
在前),用
近似
式损失了多少信息,
表示某个事件在系统Q中的信息量,
表示交叉熵,
表示概率分布
的熵,我们以
为基准的话,这个值是不会变的。
由公式可知,和
都是大于0的,但是两者谁更大呢?这是很重要的,因为如果KL散度大于零,要使得KL越接近于0,就得让交叉熵越小;如果KL散度小于0,要使得KL散度越接近于0,就得让交叉熵越大。
吉布斯不等式已经证明KL散度是恒大于等于0的(感兴趣的小伙伴可自行检索证明过程),那现在我们如果想让概率分布接近
,只需要最小化两者的交叉熵即可,也就是说交叉熵可作为损失函数对模型进行优化。
通过前置知识,我们引出了交叉熵,并且明白了为什么交叉熵可以衡量两个概率分布之间的差异,也就是说可以用作损失函数。那么在神经网络中,我们该如何利用交叉熵呢?首先我们回顾一下交叉熵的定义:
我们只需要用训练神经网络场景中的变量替换公式中的变量即可。
表示分类的个数,在判断图像是不是猫的二分类任务中,
的取值只有两个,即
表示图像是猫,
表示图像不是猫;对应的,
表示每个事件发生的概率,即当前图像是猫的概率和不是猫的概率,在模型训练场景中,我们以人脑中的概率模型为基准,即以标签为基准,所以
,
,其中
表示人类给图像的标签,是猫为1,不是猫为0;
则对应模型预测的当前图像是猫的概率,即
,而不是猫的概率就是
,所以交叉熵用于神经网络中的形式如下:
当然这里是二分类的情况,如果是多分类,交叉熵可进一步写为:
其中表示类别数,
表示是类别
的概率(标签),
表示模型预测的是类别
的概率。
至此,我们通过信息量和熵引出交叉熵,并介绍了交叉熵是如何用于损失计算的,希望能够对有需要的伙伴提供帮助,如果文中有歧义或者有错误的地方,欢迎大家在评论区指出!