Skip to content

交叉熵辨析

2025-01-27 · 926字 · 4分钟

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

H(p,q)=Ep[logq]

其连续形式为

H(p,q)=xXp(x)logq(x)dx

其离散形式为

H(p,q)=xXp(x)logq(x)

其经验形式为

H(p,q)=i=1Nlogq(xi),xii.i.d.p

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

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

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

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

相应的对数似然为

logP(D)=i=1Nlogq(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:xWjTx,此时映射的复杂部分主要是特征提取的工作,即 xfeature=gneural net(xin)

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

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

而概率分布 q 可以写成

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

那么对数似然就等于

logq(y|x)=k=1Clog1{y=k}q(y=k|x)=logq(ytrue|x)

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

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

logP(D)=i=1Nlogexp(fyi(xi))jexp(fj(xi))

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

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

logP(D)=i=1Nlogexp(WkTxi)jexp(WjTxi)

一般文献中常见的形式。

返回

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