赞
踩
损失函数:衡量模型输出与真实标签之间的差异。与损失函数有关的还有代价函数和目标函数。
所以在衡量模型的输出和真实标签之间的差异时的损失函数其实是指代价函数,下面看一下pytorch中的损失函数:
_loss也继承了nn.Module类,说明loss也是一层,也有nn.Module中的8个参数字典。参数有size_average、reduce、reduction,其中size_average和reduce已经被舍弃不再使用,重点关注reduction参数。下面以人民币的二分类中交叉熵损失函数为例,看损失函数是如何创建和使用的,背后运行的机制是什么?
# 在train.py文件的损失函数创建处打上断点,进行调试
criterion = nn.CrossEntropyLoss()
可看出程序进入到了loss.py文件中的 CrossEntropyLoss(_WeightedLoss):交叉熵损失类的__init__方法, 这里发现交叉熵损失函数继承_WeightedLoss这个类:
继续debug,就到了class _WeightedLoss(_Loss):这个类里面,就会发现这个类继承_Loss, 那么我们继续步入,就到了_Loss这个类里面去,会发现这个继承Module
在_loss中继承了Module类,所以损失函数的初始化和模型的初始化类似,也调用了Module初始化方法,最终会有8个属性字典,如下:
然后在_loss类中设置reduction参数,至此,损失函数的创建过程已完成。下面看一下损失函数的运行机制
# 在此处设置断点,损失函数前向传播
loss = criterion(outputs, labels)
损失函数_loss继承了Module,那么在前向传播时也会调用Module的forward方法,继续debug可看到
所以在forward中调用了F中对应的损失函数,而cross_entroy又是由nll_loss计算而来。以上就是损失函数的创建和内部运行机制。
下面来看pytorch中损失函数的具体使用。
nn.CrossEntropyLoss: nn.LogSortmax() 与 nn.NLLLoss() 结合,进行交叉熵计算。
torch.nn.CrossEntropyLoss(weight=None,
size_average=None,
ignore_index=- 100,
reduce=None,
reduction='mean', label_smoothing=0.0)
参数:
在了解交叉熵之前先来了解几个概念:
自信息:单个事件的不确定性, I ( x ) = − l o g [ p ( x ) ] I(x) = -log[p(x)] I(x)=−log[p(x)]
熵(信息熵):描述一个事件的不确定性,一个事件越不确定,熵越大, H ( P ) = E x ∼ p [ I ( x ) ] = − ∑ i N P ( x i ) l o g P ( x i ) H(P)=E_{x\sim p}[I(x)] = -\sum_{i}^{N}P(x_{i})logP(x_{i}) H(P)=Ex∼p[I(x)]=−∑iNP(xi)logP(xi)
交叉熵:衡量两个分布之间的差异程度,P表示数据的原始分布,Q表示模型的输出分布,交叉熵越小说明两个分布越接近 , H ( P , Q ) = − ∑ i = 1 N P ( x i ) l o g Q ( x i ) H(P, Q) = -\sum_{i=1}^{N}P(x_{i})logQ(x_{i}) H(P,Q)=−
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。