熵 信息熵 交叉熵
在信息论当中,我们经常用熵来表示信息的混乱程度和不确定程度。熵越大,信息的不确定性就越强。
熵的公式如下:
(注:log默认以2为底)
把这个公式拆开来看其实非常简单:一个负号,一个p(x)以及log(p(x))。我们知道一个事件发生的概率是0-1之间的,这样一个概率值送入log函数(如下图),肯定是小于0的,所以外面再加一个符号,就可以得到我们常见的正值的熵了。
当概率值趋于0或者1时(即确定性很强),则p(x)或者log(p(x))会趋于0,熵就会小;当概率值趋于1/2时(即不确定性很强),则p(x)或者log(p(x))都不趋于0,熵就会大。
举个例子,假设一共有4个球。
1.假设全是黑球(不确定性最小),其熵为:-1*log1=0
2.假设2黑球2白球(开始具有不确定性),熵为:-0.5log0.5-0.5log0.5=0.301
3.假设1黑球1白球1黄球1篮球(不确定性极高),熵为:-0.25log0.25--0.25log0.25-0.25log0.25-0.25log0.25 = 0.602
评估分类结果
我们知道了熵可以用来看信息的不确定性,那么我们就可以用熵来评估分类任务的效果,比如我们有四张图片,两张猫猫图:猫1,猫2,两周狗狗图:狗1,狗2。我们将其送入分类器,显然这是一个二分类问题,现在我们的两个模型分别得到了如下结果:
模型一:(猫1,猫2)/(狗1,狗2)。
模型二:(猫1,狗2)/(猫2,狗1)。
显然,将模型1的分类结果投入熵的计算公式,我们可以得到0的熵,即不确定性为0,说明每一类都分类正确。而将模型2的分类结果进行计算,会发现熵值非常大,说明模型分类效果不好。
当然,上面这种只是利用熵评估分类任务的简单例子,只适用于无监督任务。
交叉熵
更多情况下,我们的分类任务是有标签的,对于监督学习,我们使用交叉熵来进行评估。交叉熵的思路与上面不同,它从每一个样本出发,计算每一个样本的预测值与期望值的距离(我们就叫它交叉熵),公式为:
其中p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵。
比如还是对于猫狗分类任务,我们假设猫为10,狗为01,则如果模型把猫分类成了狗,则此时p=10,q=01,H(p,q)=-(1*log(0)+0*log(1))=∞。 这里算出无穷并不奇怪,因为简直是完全相反了,所以算出的“距离”非常大。更多数情况下,我们会有类似q=(0.1,0.9)这样的值,此时算出的熵就是一个非无穷但也同样较大的值了。
信息熵解决称重次数问题
信息熵的用处非常之广泛,比如我们经常会遇到这样一类经典问题:有n个小球,其中只有一个球重量与其他球不同(比其他球重),问我们通过天平称重的方式,最少几次可以找出这个球?
如果我们没有学习信息论,上来第一时间想到的方法就是二分法了:“把小球们分成两部分,保留重的那一部分,再二分……”之类的。但通过计算信息熵的方法,我们可以脱离出实际的称重方法,直接从“上帝视角”来得出最终答案——这就是应用信息熵的奇妙之处。
如何来解决呢?我们知道有n个球,每一个球是较重的那个球的概率都是1/n,那么总共的信息量是:
H(x) = n* (-1/n)*log(1/n) = logn
上面用了“信息量”来描述这个结果,信息量是信息论中一个和熵密切相关的另一个变量——看公式可知计算信息量的方法似乎也非常好理解且与熵公式密切相关。(信息量更直接的计算公式为 I=log2(1/p))
而每次称重一次,我们可以得到三种结果:左偏,右偏以及一样重。因此可以消除的信息量就是:
H(y)=3*(-1/3)*log(1/3)=log3
因此,最少需要的称重次数为H(x)/H(y)=logn/log3次。
上面这个只是一个非常简单的例子,有的时候我们不知道与众不同的那个球是重还是轻,此时我们对整体的不确定性又会增加,即总信息量H(x)也会变化——具体增加的思路就是:找出与众不同的球需要logn的信息量,判断征球是重是轻又需要log2的信息量,因此总信息量H(x)为log2+logn=log2n。
此时最少需要的称重次数为H(x)/H(y)=log2n/log3次。
这篇文章主要梳理了下信息熵、交叉熵之类的概念和用法,最后又简单扩展到了信息论中使用信息量解决天平称重问题。本来还想再写一个三门问题(也可以从信息熵思路来看),但感觉逐渐跑题和扯远了……就到此为止吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了