KL散度和交叉熵

本文主要包括:
1. k l 散 度 和 交 叉 熵 的 概 念 比 较 {\color{red}1. kl散度和交叉熵的概念比较} 1.kl
2. 交 叉 熵 在 分 类 任 务 中 的 本 质 {\color{red}2. 交叉熵在分类任务中的本质} 2.

在学习机器学习的过程中,我们经常会碰到这两个概念:KL散度(kl divergence)以及交叉熵,并且经常是同时出现的。很多同学对这两个概念都理解的不是很透彻,造成经常会搞混他们两者。本文最主要的目的就是带大家深入理解这两个重要的概念,同时搞懂,区别的理解他们,保证以后不会再搞混它们。
首先,这两个概念都来自信息论。
交叉熵:当我们使用模型Q来编码(表示)来自分布P的数据时,所需要的平均bit数。
交叉熵数学定义为:
H ( p , q ) = − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) H(p,q)=-\sum_{i=1}^n p(x_i)log(q(x_i)) H(p,q)=i=1np(xi)log(q(xi))

KL散度: 也就是相对熵, 是当我们使用模型(分布)Q来编码,而不是使用真实的P分布来编码数据时,额外需要的平均bit数。(重点在“额外”,也就是“相对”----交叉熵相对熵额外的那部分熵,就是KL散度)
KL散度的数学定义为:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(\frac{p(x_i)}{q(x_i}) DKL(pq)=i=1np(xi)log(q(xip(xi))
对KL散度数学定义进行分解:
在这里插入图片描述
等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵。可以看出,交叉熵减去熵等于KL散度。也就是,交叉熵是,如果用q代替p产生x, 得到的熵,而相对熵,是相对用自身概率p,而新增的那部分信息(熵)。

其中,在分类任务中, 熵这一项,就是分类类别的熵,这个值为0(因为一条记录的label是确定属于某个类别的,也就是没有任何信息可言,熵就是0,或者说,指定的那个类别为1,其他为0,通过熵的计算公式也可以知道,熵为0),所以,在分类任务中,最小化KL散度和最小化交叉熵是一样的(实际上,我们在分类任务中,常用的就是交叉熵)

接下来我们来探究下交叉熵在分类预测中的本质。也就是说,在分类中,交叉熵损失为0的模型是完美的模型,那>0的交叉熵究竟意味着什么呢?怎么理解交叉熵损失不同的取值?
下面这段代码可以看下,从分布完全匹配到两个分布完全相反,这过程中的交叉熵变化。

# cross-entropy for predicted probability distribution vs label
from math import log
from matplotlib import pyplot

# calculate cross-entropy
def cross_entropy(p, q, ets=1e-15):
	return -sum([p[i]*log(q[i]+ets) for i in range(len(p))])

# define the target distribution for two events
target = [0.0, 1.0]
# define probabilities for the first event
probs = [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0]
# create probability distributions for the two events
dists = [[1.0 - p, p] for p in probs]
# calculate cross-entropy for each distribution
ents = [cross_entropy(target, d) for d in dists]
# plot probability distribution vs cross-entropy
pyplot.plot([1-p for p in probs], ents, marker='.')
pyplot.title('Probability Distribution vs Cross-Entropy')
pyplot.xticks([1-p for p in probs], ['[%.1f,%.1f]'%(d[0],d[1]) for d in dists], rotation=70)
pyplot.subplots_adjust(bottom=0.2)
pyplot.xlabel('Probability Distribution')
pyplot.ylabel('Cross-Entropy (nats)')
pyplot.show()

输出的图最终如下所示:

在这里插入图片描述
就像预期的那样,当预测的概率分布和目标分布完全匹配的时候,交叉熵是为0的,随着分布差别越来越大,交叉熵也是平稳增加的。只要当分布完全相反是,交叉熵才会飙升很大。当然,在实际的分类任务中,肯定是不会出现这样跟实际分布完全相反的分布的。如果把这种极端完全相反的去掉,代码如下:

# cross-entropy for predicted probability distribution vs label
from math import log
from matplotlib import pyplot

# calculate cross-entropy
def cross_entropy(p, q, ets=1e-15):
	return -sum([p[i]*log(q[i]+ets) for i in range(len(p))])

# define the target distribution for two events
target = [0.0, 1.0]
# define probabilities for the first event
probs = [1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]
# create probability distributions for the two events
dists = [[1.0 - p, p] for p in probs]
# calculate cross-entropy for each distribution
ents = [cross_entropy(target, d) for d in dists]
# plot probability distribution vs cross-entropy
pyplot.plot([1-p for p in probs], ents, marker='.')
pyplot.title('Probability Distribution vs Cross-Entropy')
pyplot.xticks([1-p for p in probs], ['[%.1f,%.1f]'%(d[0],d[1]) for d in dists], rotation=70)
pyplot.subplots_adjust(bottom=0.2)
pyplot.xlabel('Probability Distribution')
pyplot.ylabel('Cross-Entropy (nats)')
pyplot.show()

在这里插入图片描述
从以上的结果我们可以回答以下问题: 多大的交叉熵分值才是好的分值?
如果是使用的是nat (以e为底的log), 平均交叉熵低于0.2就不错。小于0.1或者0.05就更加的好了。否则,如果得到的交叉熵大于0.2或者0.3,你还可以继续优化;如果你得到的交叉熵要大于1了,那说明你肯定在很多的样本上的预测的概率非常的差。
总结如下:
Cross-Entropy = 0.00: Perfect probabilities.
Cross-Entropy < 0.02: Great probabilities.
Cross-Entropy < 0.05: On the right track.
Cross-Entropy < 0.20: Fine.
Cross-Entropy > 0.30: Not great.
Cross-Entropy > 1.00: Terrible.
Cross-Entropy > 2.00 Something is broken.
熟悉这个,能够帮助你很好的解释你的LR或者神经网络模型的交叉熵损失。
你还可以给每个类分开计算交叉熵,这样你能够看下你的模型在每个类上的表现。

参考资料

[1]: https://machinelearningmastery.com/cross-entropy-for-machine-learning/
[2]:https://machinelearningmastery.com/divergence-between-probability-distributions/

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KL散度交叉熵是在机器学习中用于比较两个概率分布之间相似性的概念,但在一些方面它们也有所不同。KL散度用于衡量两个概率分布之间的差异,而交叉熵则用于衡量模型预测和真实标签之间的差异。 具体来说,KL散度衡量的是从一个概率分布到另一个概率分布的信息损失。它是非对称的,即KL(P||Q)不等于KL(Q||P)。KL散度的值越小,表示两个概率分布越相似。 交叉熵是在给定真实标签的情况下,衡量模型预测与真实标签之间的差异。它是对数损失函数的一种形式,用于评估模型的性能。交叉熵的值越小,表示模型的预测越接近真实标签。 总结来说,KL散度用于比较两个概率分布之间的差异,而交叉熵用于衡量模型预测和真实标签之间的差异。它们在使用和应用上有所区别,但都在机器学习中有广泛的应用。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [KL散度交叉熵的对比介绍](https://blog.csdn.net/qq_33431368/article/details/130397363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [KL散度交叉熵](https://blog.csdn.net/Allenalex/article/details/103443060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值