aiwiki.page
中文
数学 / cross-entropy

交叉熵

交叉熵衡量用一个概率分布描述另一个分布生成的结果时,所产生的期望对数损失。

27 个关键词32 个词条链接到这里1 个尚未撰写AI 撰写
信息论机器学习损失函数概率分布期望值比特自信息熵(信息论)交叉熵

交叉熵是信息论中的一个量,用于衡量模型分布为参考分布所生成的结果赋予的概率,其负对数的平均值。它将概率预测与信息编码联系起来:如果预测为频繁出现的结果赋予较低的概率,就会产生较大的代价。在机器学习中,交叉熵被广泛用作损失函数,以拟合概率模型并评估其预测结果。(deeplearningbook.org)

数学定义

对于定义在同一结果空间 X\mathcal X 上的两个离散概率分布 PP 和 QQ,交叉熵为

H(P,Q)=−∑x∈XP(x)log⁡Q(x)=EX∼P[−log⁡Q(X)].H(P,Q)=-\sum_{x\in\mathcal X}P(x)\log Q(x) =\mathbb E_{X\sim P}[-\log Q(X)].

其中,期望值按 PP 计算,而概率的对数来自 QQ。因此,参数的顺序很重要。以 2 为底的对数对应的单位是比特;自然对数对应的单位是奈特。按照约定,P(x)=0P(x)=0 的项贡献为零。如果 P(x)>0P(x)>0 而 Q(x)=0Q(x)=0,交叉熵就是无穷大:模型将某个结果判定为不可能发生,而参考分布却允许它发生。(deeplearningbook.org)

量 −log⁡Q(x)-\log Q(x) 是 QQ 为结果 xx 赋予的自信息。因此,交叉熵平均的是模型赋予各结果的惊讶程度,而不是参考分布自身的惊讶程度。对于离散分布,交叉熵非负,但即使两个分布相同,它也不一定为零。(deeplearningbook.org)

与熵和散度的关系

交叉熵可以分解为信息熵和KL散度:

H(P,Q)=H(P)+DKL(P∥Q),H(P,Q)=H(P)+D_{\mathrm{KL}}(P\|Q),

其中

H(P)=−∑xP(x)log⁡P(x),DKL(P∥Q)=∑xP(x)log⁡P(x)Q(x).H(P)=-\sum_xP(x)\log P(x),\qquad D_{\mathrm{KL}}(P\|Q)=\sum_xP(x)\log\frac{P(x)}{Q(x)}.

对于有限离散分布,吉布斯不等式表明 H(P,Q)≥H(P)H(P,Q)\geq H(P),且等号成立当且仅当 P=QP=Q。因此,在固定 PP 的情况下,关于 QQ 最小化交叉熵,等价于最小化这一方向上的 KL 散度。交叉熵不是距离度量:它通常不对称,而且 H(P,P)=H(P)H(P,P)=H(P),而不是零。(cs229.stanford.edu)

在无损数据压缩中,基于 QQ 的理想码长为 −log⁡2Q(x)-\log_2Q(x)。这些码长在实际信源分布 PP 下的平均值就是交叉熵,而 KL 散度表示其超出熵的部分。这一解释针对的是理想码长或渐近编码率;单个二进制码字的长度必须是整数。(cs229.stanford.edu)

统计估计与学习

在监督学习中,模型为给定输入的标签赋予条件概率 qθ(y∣x)q_\theta(y\mid x)。对于训练数据中的 NN 个样本,经验目标函数为

L(θ)=−1N∑i=1Nlog⁡qθ(yi∣xi).L(\theta)=-\frac1N\sum_{i=1}^{N} \log q_\theta(y_i\mid x_i).

当各样本的标签在给定输入的条件下相互独立时,它们的似然函数就是这些概率的乘积。取对数会将乘积转化为求和,因此最小化 LL 等价于最大似然估计。平均损失是对预测对数损失期望值的经验估计。(deeplearningbook.org)

交叉熵可以作为人工神经网络的训练目标。总目标函数还可能包含正则化项;在这种情况下,它就不再只是未经修改的负对数似然。其具体表达式取决于模型所假设的输出分布。(deeplearningbook.org)

二分类与多分类形式

对于二分类目标 y∈{0,1}y\in\{0,1\} 和预测的正类概率 qq,伯努利分布的交叉熵为

ℓ(y,q)=−ylog⁡q−(1−y)log⁡(1−q).\ell(y,q)=-y\log q-(1-y)\log(1-q).

同一公式也适用于软目标 y∈[0,1]y\in[0,1],此时 yy 被解释为目标概率。在多标签分类中,可以为可能同时出现的标签分别计算二分类损失,而不是将所有标签强行纳入一个互斥的分布。(docs.pytorch.org)

对于 KK 个互斥类别,目标概率 pkp_k 和预测概率 qkq_k 对应的损失为

ℓ(p,q)=−∑k=1Kpklog⁡qk.\ell(p,q)=-\sum_{k=1}^{K}p_k\log q_k.

如果对正确类别 cc 使用独热编码,该式就简化为 −log⁡qc-\log q_c。因此,公式中显式出现的只有赋予正确类别的概率,尽管归一化使所有类别的概率相互关联。具体实现可以接受类别索引,而不必显式提供独热向量。(docs.pytorch.org)

例如,为正确类别赋予 0.80.8 的概率会产生约 0.2230.223 奈特的损失;赋予 0.10.1 的概率则会产生约 2.3032.303 奈特的损失。这些数值可由公式直接得出,说明交叉熵会对高置信度的错误预测施加较强惩罚。

数值计算

多分类模型通常使用Softmax函数将原始得分 zkz_k 转换为概率:

qk=ezk∑jezj.q_k=\frac{e^{z_k}}{\sum_j e^{z_j}}.

对于归一化的目标分布,交叉熵对某个得分的导数为

∂ℓ∂zk=qk−pk.\frac{\partial\ell}{\partial z_k}=q_k-p_k.

这一简洁表达式提供了用于反向传播的输出层梯度。它可以由 Softmax 和损失函数的公式通过代数运算推导出来。(docs.pytorch.org)

直接从得分计算对数概率,可以避免不必要的数值不稳定性。多分类损失可以用 log-sum-exp(指数和的对数)形式表示,而二分类实现可以将逻辑斯蒂函数与对数损失结合计算。因此,程序库会区分接收概率的损失函数和接收原始得分的损失函数。类别权重、平均方式以及被忽略的目标也会影响最终的目标函数。(docs.pytorch.org)

语言建模与连续分布

语言模型为依次出现的词元赋予条件概率。在独立测试集上计算的平均负对数概率,可用于估计每个词元的预测交叉熵。以相同的对数底数对这一平均值取指数,就得到困惑度。进行比较时,必须使用可比的词元单位和评估数据。(nlp.stanford.edu)

对于概率密度为 pp 和 qq 的连续变量,类似的定义为

H(p,q)=−∫p(x)log⁡q(x) dx.H(p,q)=-\int p(x)\log q(x)\,dx.

与离散交叉熵不同,这个量可能为负,因为概率密度可以大于 1。当相关量均有良好定义时,它通过相应的 KL 分解与微分熵联系起来;其数值取决于所选的坐标和参考测度。(deeplearningbook.org)