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

本文介绍了交叉熵损失函数在机器学习中的概念,包括其在分类任务中的作用,以及在多分类和二分类问题中的具体应用形式。重点讲解了PyTorch中的实现,并通过例子展示了BCELoss和CrossEntropyLoss之间的区别。
摘要由CSDN通过智能技术生成

交叉熵损失函数

交叉熵主要是用来判定实际的输出与期望的输出的接近程度。在做分类训练的时候,如果一个样本属于第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))

tensor(0.3190)
tensor(0.7971)

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值