【pytorch19】交叉熵

分类问题的loss

  • MSE
  • Cross Entropy Loss
  • Hinge Loss (SVN用的比较多)
    • ∑ i m a x ( 0 , 1 − y i ∗ h θ ( x i ) ) \sum_imax(0,1-y_i*h_\theta(x_i)) imax(0,1yihθ(xi))

Entropy(熵)

  • Uncertainty(也叫不确定性)
  • measure of surprise(惊喜度)
  • higher entropy = less info
    • E n t r o p y = − ∑ i P ( i ) log ⁡ P ( i ) Entropy=-\sum_iP(i)\log P(i) Entropy=iP(i)logP(i)

Entropy就是熵,也叫做不确定性,从某种程度上讲是惊喜度

比如你长得很帅,我说你很帅,这句话的内容就比较少,uncertainty就比较低,entropy比较高

比如某个人能力很差,但是有一天中了大奖,这个消息的Uncertainty就比较高,信息量就比较大,就是说没有能力但是却突然很有钱了,意味着这句话很惊喜,Uncertainty比较高,entropy比较低

entropy定义为每个i的probability再乘以log probability

具体的例子
在这里插入图片描述

熵稳定效应是指在信息论中,熵越高的系统越不稳定,而熵越低的系统越稳定。

每个数字的中奖概率相同时,这个分布的熵比较高,因为不确定性大(不知道哪个数字会中奖)

a为[0.1,0.1,0.1,0.7]的时候,4这个数字的中奖率比较高,其他数字的中奖率只有0.1。此时的熵是比较低的。这是因为熵是衡量随机变量不确定性的度量,而在这个分布中,数字4的中奖概率远高于其他数字,这意味着结果的不确定性较低,因为数字4的中奖几乎是确定的。

a为[0.001,0.001,0.001,0.999]的时候,非常极端的情况,前面都不可能中奖,这个熵非常低,因为几乎可以确定第四个结果会发生

Cross Entropy (交叉熵)

Entropy:指的是一个分布,比如说p本身的一个稳定性
Cross Entropy (交叉熵):一般指的是两个分布,衡量两个分布的稳定性

在这里插入图片描述

第一步可以推导为第二步 H ( p ) H(p) H(p)再加上 D k l ( p ∣ q ) D_{kl}(p|q) Dkl(pq) D k l ( p ∣ q ) D_{kl}(p|q) Dkl(pq)这一部分是kl divergence,也叫KL散度,是真正衡量两个概率分布差异的方法

举例,两个高斯分布
在这里插入图片描述
重叠部分比较少,因此它的kl散度比较高,假设是2

完全重合,kl散度就接近于0了

根据定义如果P和Q相等,cross Entropy = Entropy

如果采用01编码比如说[0,1,0,0]只有第二项是1,所以是1log1,所以entropy是0 ,一般分类问题都是01编码,对于01编码来说,这个H§的entropy就等于0,然后根据H(p,q)推导之后的式子,如果H( p )等于0的话,H(p,q)就等于 D k l ( p ∣ q ) D_{kl}(p|q) Dkl(pq),也就意味着当我们去优化P和Q的交叉熵的时候,如果是01编码相当于直接优化P和Q的KL散度,KL散度刚好衡量的是两个分布重叠的情况,如果用网络预测出θ条件的分布,还有一个真实的分布,这两个分布的kl散度接近于0的话,意味着P=Q,恰好是我们需要的情况

cross entropy 对于01编码来说就是kl散度,而kl散度又说明了,如果交叉熵接近于0那kl散度就接近于0,意味着p和q的分布越来越近,恰好是我们要优化的目标

二分类问题

二分类问题的交叉熵如何运算
在这里插入图片描述
首先H(P,Q)是P乘以log Q再求和的问题

在这里插入图片描述

只有cat和dog两种分类,所以只有两种求和,但是由于P(dog)=1-P(cat),也就是说非猫即狗,这里假设P(cat)是y,Q(cat)是p,那式子就可以改写为y和p的式子,因为PQ分布使用的是01编码,所以y就是实际的值,p就是模型预测出的概率分布,由于二分类问题,非猫即狗,最后就会得出上图中y和p的表达式

如何解释这个y和p的表达式

如果y等于1的话,式子等于H(P,Q)=-log p,要最小化这个式子,有负号所以要最大化log p,即最大化p,最大化输入x,y=1的概率
如果y等于0的话,式子等于H(P,Q)=-log(1-p),要最小化这个式子,有负号所以要最大化log(1-p),就是要最小化p,最小化输入x,y=1的概率,即最大化输入x,y=0的概率(切记这里是二分类,不是0就是1)

例子:
在这里插入图片描述
当前的实例时一只小狗,P值就是真实分布,Q值就是模型预测分布,经过softmax预测是对的,但是可能性不高,看一下交叉熵约等于0.9

如果变成图右下角的情况就非常理想,狗的概率就非常高,这时交叉熵是0.02,也就是说变好了,交叉熵也从0.9下降到了0.02,说明了 p θ p_{θ} pθ越来越逼近 p r p_{r} pr

可以看出与MSE一样,都能够很好的迫使我们的预测朝着我们想要的方向去进行

总结

在这里插入图片描述
为什么分类问题不适用MSE,而使用Cross Entropy?

  1. 如果使用sigmoid和mse搭配的话,很容易出现sigmoid饱和的情况,会出现梯度弥散
  2. cross entropy概率的梯度信息更大,更容易收敛的更快,比如说当前label趋近于1,如果q的分布没有靠近1的话,例如在左端,就会发现loss会非常大,所以梯度会很大,会收敛的很快,当接近于1的时候,梯度就开始慢慢变小
  3. 如果发现cross entropy不行也可以试mse,因为mse的梯度求导更加简单

在这里插入图片描述
神经网络的结构,最后一层(可以横着看)叫logit,后面经过softmax层再经过cross entropy做计算,对于pytorch来说灰色部分是由一个现成的网络结构的,如果把softmax和cross entropy分开的话会出现一个数据不稳定的情况,所以一般不建议大家直接自己用softmax来处理,最好直接得到logit的输出以后,用pytorch一次完成不要自己去处理,因为会出现数据不稳定的情况

实例
在这里插入图片描述
F.cross_entropy函数中必须使用logits,因为pytorch中已经把softmax和log打包再一起了,如果传入pred_log就意味着再做一遍softmax,会导致数据非常小

如果一定要自己计算的话用F.nll_loss就行,但是这里就必须传入softmax之后的数据

F.cross_entropy函数等于softmax操作+log操作+F.nll_loss操作

相关推荐

  1. PyTorch交叉理解

    2024-07-10 21:58:04       18 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 21:58:04       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 21:58:04       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 21:58:04       4 阅读
  4. Python语言-面向对象

    2024-07-10 21:58:04       7 阅读

热门阅读

  1. 【对抗算法复现】CW

    2024-07-10 21:58:04       6 阅读
  2. vscode无法切换env环境

    2024-07-10 21:58:04       8 阅读
  3. GCN-LSTM实现时空预测

    2024-07-10 21:58:04       7 阅读