Skip to content

交叉熵辨析

2025-01-27 · 926字 · 4分钟 · 浏览量

交叉熵这个概念来自信息论。设 p(x),q(x) 为两个分布,其交叉熵定义为

H(p,q)=−Ep[log⁡q]

其连续形式为

H(p,q)=−∫x∈Xp(x)log⁡q(x)dx

其离散形式为

H(p,q)=−∑x∈Xp(x)log⁡q(x)

其经验形式为

H(p,q)=−∑i=1Nlog⁡q(xi),xi∼i.i.d.p

经验形式即上述积分的 Monte-Carlo 估计。注意到这里有若干符号的滥用,其中数据样本 xi 是可重复的值,而在理论形式中 x 则是在测度空间中的唯一值。经验形式中没有出现 p(x) 是因为此时分布在某一特定值的权重或密度 p(x) 本身由采样得到的相同值的频率刻画。

在机器学习提到的交叉熵主要是指其经验形式。在机器学习的语境下,p 通常指数据的真实分布,但其解析形式不可知,只能把数据点看成是其独立同分布样本,而 q 则是对数据真实分布进行建模的代理分布,该分布是有具体解析形式的。

我们需要指出交叉熵的经验形式,其实正是负对数似然函数的形式,由于此时我们假设了数据分布的解析形式为 q,那么由于数据点的独立同分布性可知数据集的似然函数为

P(D)=∏i=1Nq(xi)

相应的对数似然为

log⁡P(D)=∑i=1Nlog⁡q(xi)

于是最小化交叉熵就意味着最大化对数似然即最大化似然函数。

而在机器学习的语境中,交叉熵的语义实际更加特殊,它专指类别分布的负对数似然函数。所谓类别分布是伯努利分布的推广,即 x∈{1,2,⋯,C}, 每个类别的权重为 pj, 且满足 ∑j=1Cpj=1。这种类别分布往往利用 Softmax 函数来建模,它可以数据点的特征向量(feature vector) x 对应的分数(logit) lj=fj(x) 标准化为概率值,即

qk({l1,...,lC})=exp⁡(lk)∑jexp⁡(lj),k∈{1,...,C}

这里需要解释一下,所谓的分数 l 通常是模型的最后一层输出,它指的是未标准化以前的分数,实际上是某种概率的刻画。给定第 i 个数据点的特征 xi,它属于第 j 类的分数为通过一个映射 lij=fj(xi) 得到。通常这一映射通常由神经网络来完成。但我们更常见到的是非常简单的分数函数,如分数矩阵 Wj 的投影 fj:x↦WjTx,此时映射的复杂部分主要是特征提取的工作,即 xfeature=gneural net(xin)。

在分类问题中, q 是对条件分布 q(y|x) 的建模,其中 y 是 x 的类别标签。因此

q(yi=k|xi)=exp⁡(fk(xi))∑jexp⁡(fj(xi))

而概率分布 q 可以写成

q(y|x)=∏k=1Cq(y=k|x)1{y=k}

那么对数似然就等于

log⁡q(y|x)=∑k=1Clog⁡1{y=k}q(y=k|x)=log⁡q(ytrue|x)

这里 ytrue 代表 x 的真实类。即唯一使示性函数 1{y=k} 非零的值。

如果把每个数据点都代入,整体的对数似然就等于

log⁡P(D)=∑i=1Nlog⁡exp⁡(fyi(xi))∑jexp⁡(fj(xi))

这个是 Pytorch 文档 torch.nn.CrossEntropy 中的交叉熵形式,需要注意的是那里的 x 是此处的 f(x),也就是上面的 logit l。

再把矩阵形式的分数代入就得到:

log⁡P(D)=∑i=1Nlog⁡exp⁡(WkTxi)∑jexp⁡(WjTxi)

一般文献中常见的形式。

返回

人同此心,心同此理;如风沐面,若水润心