交叉熵在机器学习中的使用

交叉熵的介绍

1、信息量

概率越小,信息量越大,事件 X = x 0 X=x_0 X=x0的信息量为:
I ( x 0 ) = − l o g ( p ( x 0 ) ) I(x_0)=-log(p(x_0)) I(x0)=log(p(x0))

2、熵

熵表示所有信息量的期望:
H ( x ) = − ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) H(x)=-\sum_{i=1}^n p(x_i)log(p(x_i)) H(x)=i=1np(xi)log(p(xi))
其中n代表事件X有n种可能

3、相对熵(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(xi)p(xi))
物理意义:如果用P来描述目标问题,而不是用Q来描述问题,得到的信息增量

在机器学习中,P往往表示样本的真实分布,q表示模型预测的分布,相对熵越小,表示q分布和p分布越接近

4、交叉熵 (越小越好)

相对熵可以变形为:
D K L ( p ∣ ∣ q ) = − H ( p ( x ) ) + [ − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) ] D_{KL}(p||q)=-H(p(x))+[-\sum_{i=1}^np(x_i)log(q(x_i))] DKL(pq)=H(p(x))+[i=1np(xi)log(q(xi))]
等式的前半部分是p的熵,后半部分就是交叉熵:
H ( p , q ) = − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) H(p,q)=-\sum_{i=1}^np(x_i)log(q(x_i)) H(p,q)=i=1np(xi)log(q(xi))
在机器学习中,我们需要评估labl和predicts之间的差距,可以使用KL散度,但由于KL散度前半部分不变,故在优化过程中,只需要关注交叉熵就行,所以一般在机器学习中直接用交叉熵作为loss函数,评估模型。

分析

在回归问题中,常用MSE做loss函数,但在逻辑分类中却用不好,这时需要用交叉熵

1. 为什么MSE不适用于分类问题?

当sigmod函数和MSE一起使用时会出现梯度消失,原因是在使用MSE时,w、b的梯度均与sigmoid函数对z的偏导有关系,而sigmoid函数的偏导在自变量非常大或非常小是,偏导数的值接近与0,这将导致w、b的梯度将不会变化,也就是出现所谓的梯度消失现象。而使用交叉熵时,梯度就不会出现上述情况。所以MSE不适用于分类问题。

2. 交叉熵不适用于回归问题

当MSE和交叉熵同事应用于多分类场景下,MSE对每个输出结果都非常看重,而交叉熵只对正确分类的结果看重。可见MSE除了让正确的分类尽量变大,还会让错误的分类变得平均,这对回归问题显得很重要,所以MSE适合回归问题的loss函数。

机器学习中交叉熵的应用

1、交叉熵在单分类中的使用

  • 这里的单类别指:每个样本只能有一个类别
  • 交叉熵在单分类问题上的loss函数:
    l o s s = − ∑ j = 1 m ∑ i = 1 n y j i l o g ( y ^ j i ) loss=-\sum_{j=1}^m\sum_{i=1}^ny_{ji}log(\hat{y}_{ji}) loss=j=1mi=1nyjilog(y^ji)
  • 这里的预测概率是通过softmax计算,概率合为1

2、交叉熵在多分类中使用

  • 这里的多类别指:每个样本可以有多个类别
  • 交叉熵在多分类问题上的loss问题:
    l o s s = ∑ j = 1 m ∑ i = 1 n − y j i l o g ( y ^ j i ) − ( 1 − y j i ) l o g ( 1 − y ^ j i ) loss=\sum_{j=1}^m\sum_{i=1}^n-y_{ji}log(\hat{y}_{ji})-(1-y_{ji})log(1-\hat{y}_{ji}) loss=j=1mi=1nyjilog(y^ji)(1yji)log(1y^ji)
  • 这里的预测是通过sigmoid计算,每个label都是独立分布的,输出归一化

交叉熵在pytorch的使用

nn.CrossEntropyLoss()

这个损失函数和通常的交叉熵函数公式不一样,它是nn.logSoftmax()和nn.NLLLoss()的整合,公式如下:
loss ⁡ ( x ,  class  ) = − log ⁡ ( exp ⁡ ( x [  class  ] ) ∑ j exp ⁡ ( x [ j ] ) ) = − x [  class  ] + log ⁡ ( ∑ j exp ⁡ ( x [ j ] ) ) \operatorname{loss}(x, \text { class })=-\log \left(\frac{\exp (x[\text { class }])}{\sum_{j} \exp (x[j])}\right)=-x[\text { class }]+\log \left(\sum_{j} \exp (x[j])\right) loss(x, class )=log(jexp(x[j])exp(x[ class ]))=x[ class ]+log(jexp(x[j]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值