为什么使用交叉熵代替二次代价函数_机器学习基础——详解机器学习损失函数之交叉熵...
·
点击上方蓝字,和我一起学技术。
今天这篇文章和大家聊聊机器学习领域的熵。我在看paper的时候发现对于交叉熵的理解又有些遗忘,复习了一下之后,又有了一些新的认识。故写下本文和大家分享。熵这个概念应用非常广泛,我个人认为比较经典的一个应用是在热力学当中,反应一个系统的混乱程度。根据热力学第二定律,一个孤立系统的熵不会减少。比如一盒乒乓球,如果把盒子掀翻了,乒乓球散出来,它的熵增加了。如果要将熵减小,那么必须要对这个系统做功,也就是说需要有外力来将散落的乒乓球放回盒子里,否则乒乓球的分布只会越来越散乱。开创了信息论的香农大佬灵光一闪,既然自然界微观宏观的问题都有熵,那么信息应该也有。于是他开创性地将熵这个概念引入信息论领域,和热力学的概念类似,信息论当中的熵指的是信息量的混乱程度,也可以理解成信息量的大小。
今天这篇文章和大家聊聊机器学习领域的熵。我在看paper的时候发现对于交叉熵的理解又有些遗忘,复习了一下之后,又有了一些新的认识。故写下本文和大家分享。熵这个概念应用非常广泛,我个人认为比较经典的一个应用是在热力学当中,反应一个系统的混乱程度。根据热力学第二定律,一个孤立系统的熵不会减少。比如一盒乒乓球,如果把盒子掀翻了,乒乓球散出来,它的熵增加了。如果要将熵减小,那么必须要对这个系统做功,也就是说需要有外力来将散落的乒乓球放回盒子里,否则乒乓球的分布只会越来越散乱。开创了信息论的香农大佬灵光一闪,既然自然界微观宏观的问题都有熵,那么信息应该也有。于是他开创性地将熵这个概念引入信息论领域,和热力学的概念类似,信息论当中的熵指的是信息量的混乱程度,也可以理解成信息量的大小。
信息量
举个简单的例子,以下两个句子,哪一个句子的信息量更大呢?- 我今天没中彩票
- 我今天中彩票了

信息熵
我们上面的公式定义的是信息量,但是这里有一个问题,我们定义的只是事件X的一种结果的信息量。对于一个事件来说,它可能的结果可能不止一种。我们希望定义整个事件的信息量,其实也很好办,我们算下整个事件信息量的期望即可,这个期望就是信息熵。期望的公式我们应该都还记得:我们套入信息量的公式可以得到信息熵H(x):相对熵(KL散度)
在我们介绍相对熵之前,我们先试着思考一个问题,我们为什么需要相对熵这么一个概念呢?原因很简单,因为我们希望测量我们训练出来的模型和实际数据的差别,相对熵的目的就是为了评估和验证模型学习的效果。也就是说相对熵是用来衡量两个概率分布的差值的,我们用这个差值来衡量模型预测结果与真实数据的差距。明白了这点之后,我们来看相对熵的定义:如果把看成是一个事件的所有结果,那可以理解成一个事件的一个结果。那么所有的和就可以看成是两个关于事件X的概率分布。样本真实的分布,我们可以求到。而是我们模型产出的分布。KL散度越小,表示这两个分布越接近,说明模型的效果越好。光看上面的KL散度公式可能会云里雾里,不明白为什么能反应P和Q两个分布的相似度。因为这个公式少了两个限制条件:对于单个来说,当然越大越小。但由于所有的的和是1,当前的i取的值大了,其他的i取的值就要小。我们先来直观地感受一下,再来证明。我们假设只有0和1两个取值,也就是一个事件只有发生或者不发生。我们再假设,我们画一下的图像:


交叉熵
通过上面一系列证明,我们可以确定,KL散度可以反映两个概率分布的距离情况。由于P是样本已知的分布,所以我们可以用KL散度反映Q这个模型产出的结果与P的距离。距离越近,往往说明模型的拟合效果越好,能力越强。我们把上面定义的C(P, Q)带入KL散度的定义,会发现:对于一个确定的样本集来说,是定值,所以我们可以抛开左边不用管它,单纯来看右边。右边我们刚刚定义的C(P, Q)其实就是交叉熵。说白了,交叉熵就是KL散度去除掉了一个固定的定值的结果。KL散度能够反映P和Q分布的相似程度,同样交叉熵也可以,而且交叉熵的计算相比KL散度来说要更为精简一些。如果我们只考虑二分类的场景,那么由于结果已知,并且:。我们令所以上式可以变形为:这个式子就是我们在机器学习书上最常见到的二分类问题的交叉熵的公式在信息论上的解释,我们经常使用,但是很少会有资料会将整个来龙去脉完整的推导一遍。对于我们算法学习者而言,我个人觉得只有将其中的细节深挖一遍,才能真正获得提升,才能做到知其然,并且知其所以然。理解了这些,我们在面试的时候才能真正做到游刃有余。当然,到这里其实还没有结束。仍然存在一个问题,我们把真实类别和预测类别计算均方差不能作为损失函数吗?而且还有其他的一些损失函数,为什么我们训练模型的时候单单选择了交叉熵呢,其他的公式不行吗?为什么呢?分析
我们来实际看个例子就明白了,假设我们对模型:选择MSE(均方差)作为损失函数。假设对于某个样本x=2,y=0,那么,此时。此时。我们对它求关于的偏导:所以如果我们通过梯度下降来学习的话,。这个式子看起来很正常,但是隐藏了一个问题,就是我们这样计算出来的梯度实在是太小了。通过梯度下降去训练模型需要消耗大量的时间才能收敛。如果我们将损失函数换成交叉熵呢?我们回顾一下交叉熵求梯度之后的公式:我们带入上面具体的值,可以算出来如果使用交叉上来训练,我们算出来的梯度为1.96,要比上面算出来的0.04大了太多了。显然这样训练模型的收敛速度会快很多,这也是为什么我们训练分类模型采用交叉熵作为损失函数的原因。究其原因是因为如果我们使用MSE来训练模型的话,在求梯度的过程当中免不了对sigmoid函数求导。而正是因为sigmoid的导数值非常小,才导致了我们梯度下降的速度如此缓慢。那么为什么sigmoid函数的导数这么小呢?我们来看下它的图像就知道了:
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)