先说结论:在学习交叉熵的过程中,我发现当真实值与预测值相等时,交叉熵并不会更趋近于0。实际上会等于0的应该是KL散度(相对熵)。之所以我们常说损失函数用的是交叉熵,是因为我们实际上在进行模型优化时需要用到的是预测值(以函数表示)中的权重,也就是对预测值进行求偏导。在求偏导时,交叉熵与KL散度是等价的。以下是具体说明:
信息量(风险度)
首先引入信息量的概念。
在一个事件中,事件的信息量I(x)与该事件发生的概率p(x)成反比(一个事件发生的概率越小,信息量越大)。
所以信息量定义为概率的倒数:1/p(x),用log表示后I(x)=log(1/p(x))=-log(p(x))。如图:
熵(香农熵Shanon Entropy)
然后介绍一下熵的定义
熵H(p)
针对的不是一个事件,而是概率分布,表述的是一个概率分布的平均信息量
对于概率分布来说,概率密度更均匀(每个事件发生的概率相近),产生的随机变量的不确定性就更高,熵就更大。
熵计算公式:
如图:
举个例子:
可以发现,当俩种事件发生的概率相差越大,熵就越小。相反,概率相差越小,事件发生的不确定性越强,熵就越大。
交叉熵(Cross Entropy)
从估计概率分布的角度对真是概率分布的平均信息量的一个估计值(涉及到了真实值和预测值)
交叉熵计算公式:
真实值是p,此时的信息量用的是预测值q的信息量
举个例子:
此时,我发现,在第一种情况,预测值和真实值一致时,交叉熵并没有如想象一样为0(在我们的印象里,损失函数用的是交叉熵,损失函数越小证明预测值与真实值越接近)。
KL散度(相对熵)
然后我发现损失函数真正用的应该是相KL散度
KL散度计算公式:
举例说明:
可以发现,当真实值与预测值离得越近时,KL散度越小。
那为什么我们常说损失函数用的是交叉熵呢
从目的来说:损失函数是用来评估模型性能(损失函数越小,证明预测值和真实值越接近,模型越好),而评估性能的目的是——优化模型,也就是使预测值更接近真实值。
预测值是以函数的形式来呈现,也就是q=f(x)
在这个函数中x是样本,q是预测出来值。
但此时,样本x和预测值q均为已知条件。优化模型就是找最合适的参数
如:q=ax+b。我们实际要找的是参数a和b
如:q=ax^2+bx+c。我们实际要找的是参数a、b、c
求参
一个函数里有很多参数,现在统一用θ来表示。θ={θ1,θ2,θ3,...θn}(补充:在深度学习中,这个θ指的就是权重,常用ω来表示)
预测函数q=f(x),是没有可供求参的条件
但是对于KL散度来说,我们要使KL散度最小(极值点),那就是对KL散度求偏导,使得偏导数为0。
求偏导的时候,我们会发现,对于一个确定的预测任务来说,我们的熵H(p)是一个常量
所以对KL散度求偏导就等价于对交叉熵H(p,q)求偏导。