1.损失函数概念
现在了解一下Pytorch中的Loss:
class _loss(Module):
def __init__(self, size_average=None, reduce=None, reduction='mean'):
super(_loss,self).__init__()
if size_average is not None or reduce is not None:
self.reduction = _Reduction.legacy_get_string(size_average, reduce)
else:
self.reduction = reduction
Pytorch中的Loss还是继承于Module,所以Loss相当于一个网络层。init()初始化函数中有三个参数,其中size_average和reduce即将被舍弃,其功能在reduction中已经被实现。
nn.CrossEntropyLoss
公式中的P是真实的概率分布,也就是训练集中样本的分布,Q是模型输出的分布,所以在机器学习模型优化交叉熵等价于优化相对熵,因为交叉熵公式中的信息熵 H ( P ) H§ H§是训练集的信息,因为训练集是固定的,所以 H ( P ) H§ H§是一个常数,所以交叉熵在优化的时候是优化相对熵。
熟悉了信息熵、相对熵、交叉熵的信息后,现在正式了解Pytorch中的nn.CrossEntropyLoss。交叉熵的计算公式如下:
公式中的x是一个概率值,class是一个类别值,括号中执行的是softmax操作,softmax的作用是将概率值归一化到和为1的概率值。
对比交叉熵的公式定义,公式中有一个 P ( x i ) ,这个在展开公式中值为1,因为样本是固定的,所以 P ( x i )是定值。因为只计算一个样本,所以没有公式定义中的求和。
现在看一下nn.CrossEntropyLoss()的主要参数,第一个参数weight,其功能为各个类别的loss设置权值,加了权值的交叉熵计算公式为:
比如说第零类,为了让模型更关注第零类,可以将其weight设置为1.2倍,这是weight的作用;
第二个参数是ignore_index,用于指定某一类别不用计算损失,例如一千类的分类任务中,忽略第999类的损失,可以设置ignore_index=999。
第三个参数为reduction,用于指定计算模型,有三种计算模型,分别为none/sum/mean,none是逐个元素计算损失,sum是所有元素的损失求和,返回标量,mean是对所元素的损失进行加权平均,返回标量。在mean模型中,如果不设置参数weight的时候,就是单纯的期望平均。
nn.NLLLoss
nn.BCELoss
nn.BCEWithLogitsLoss
nn.BCAWithLogitsLoss中参数pos_weight的作用是均衡正负样本,其作用是正样本的loss乘于pos_weight系数,比如正样本有100个,负样本有300个,正负样本的比例为 1: 3 ,所以pos_weight可以设置为3,也就是正样本的loss乘于3,这样就等价于正样本为300个,负样本为300个,实现正负样本的均衡。