当前位置:   article > 正文

交叉熵损失函数 nn.BCELoss()和crossentropyloss()

nn.bceloss

交叉熵损失函数

交叉熵主要是用来判定实际的输出与期望的输出的接近程度。在做分类训练的时候,如果一个样本属于第K类,那么这个类别所对应的输出节点的输出值应该为1,而其他节点的输出为0,即[0,0,0,1,0……,0,0],这个数组也就是样本的Lable,是神经网络最期望的输出结果。也就是说用它来衡量网络的输出与标签的差异,利用这种差异经过反向传播去更新网络参数。

在多分类问题中输出层的函数是Softmax函数,在二分类问题中的输出层的函数时Sigmod函数。

CrossEntropy损失函数适用于总共有N个类别的分类。当N=2时,即二分类任务,只需要判断是还是否的问题,就可以使用二分类交叉损失函数BCELoss

交叉熵原理

**信息量:**用来衡量一个事件的不确定性;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。假设X是一个离散型随机变量,其取值集合为X,概率分布函数为 p ( x ) = P ( X = x ) , x ∈ X p(x)=P(X=x),x\in X p(x)=P(X=x),xX,我们定义事件 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)) p ( x 0 ) = 1 p(x_0)=1 p(x0)=1时,信息量将等于0,也就是说该事件的发生不会导致任何信息量的增加。

**熵:**用来衡量一个系统的混乱程度,代表一个系统中信息量的总和;信息量总和越大,表明这个系统不确定性就越大。

**交叉熵:**它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则

H ( p , q ) = − Σ x ( p ( x ) l o g q ( x ) ) + ( 1 − p ( x ) ) l o g ( 1 − q ( x ) ) ) H(p,q)=-\varSigma _x(p(x)logq(x))+(1-p(x))log(1-q(x))) H(p,q)=Σx(p(x)logq(x))+(1p(x))log(1q(x)))

当实际输出概率和期望概率差不多时,交叉熵会小

pytorch交叉熵实现

交叉熵损失是分类中最常用的一个损失函数。在Pytorch中是基于下面的公式实现的。

L o s s ( x ^ , x ) = Σ n i = 1 x log ⁡ ( x ^ ) Loss\left( \widehat{x},x \right) =\underset{i=1}{\overset{n}{\varSigma}}x\log \left( \widehat{x} \right) Loss(x ,x)=i=1Σnxlog(x )

其中 x x x是真实标签, x ^ \widehat x x 是预测的类分布(通常是使用softmax将模型输出转换为概率分布)

BCELoss

L o s s = − 1 N Σ n i = 1 [ y i l o g ( p i ) + ( 1 − y i ) l o g ( 1 − p i ) ] Loss=-\frac{1}{N}\underset{i=1}{\overset{n}{\varSigma}}[y_i log(p_i)+(1-y_i)log(1-p_i)] Loss=N1i=1Σn[yilog(pi)+(1yi)log(1pi)]

crossentropyloss

H ( p , q ) = − Σ x ( p ( x ) l o g q ( x ) ) + ( 1 − p ( x ) ) l o g ( 1 − q ( x ) ) ) H(p,q)=-\varSigma _x(p(x)logq(x))+(1-p(x))log(1-q(x))) H(p,q)=Σx(p(x)logq(x))+(1p(x))log(1q(x)))

L o s s ( x ^ , x ) = Σ n i = 1 x log ⁡ ( x ^ ) Loss\left( \widehat{x},x \right) =\underset{i=1}{\overset{n}{\varSigma}}x\log \left( \widehat{x} \right) Loss(x ,x)=i=1Σnxlog(x )

crossentropyloss()和BCELoss()原理是一样的,但是具体的计算结果是不一样的,首先是公式就不一样

import torch
import torch.nn as nn
from math import log
bce_loss = nn.BCELoss()
pred_pro = torch.tensor([0.8, 0.2, 0.4], dtype=torch.float)
label = torch.tensor([1, 0, 0], dtype=torch.float)

print(bce_loss(pred_pro, label))

cro = nn.CrossEntropyLoss()
print(cro(pred_pro, label))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
tensor(0.3190)
tensor(0.7971)
  • 1
  • 2

实验证明两个结果是不一样的,但是经过计算发现不止是公式不同,本人知识有限,没有再深究了 欢迎各位补充

大概知道什么意思能能用就行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/486207
推荐阅读
相关标签
  

闽ICP备14008679号