赞
踩
交叉熵主要是用来判定实际的输出与期望的输出的接近程度。在做分类训练的时候,如果一个样本属于第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),x∈X,我们定义事件 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))+(1−p(x))log(1−q(x)))
当实际输出概率和期望概率差不多时,交叉熵会小
交叉熵损失是分类中最常用的一个损失函数。在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将模型输出转换为概率分布)
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)+(1−yi)log(1−pi)]
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))+(1−p(x))log(1−q(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)
实验证明两个结果是不一样的,但是经过计算发现不止是公式不同,本人知识有限,没有再深究了 欢迎各位补充
大概知道什么意思能能用就行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。