损失函数
损失函数概念
损失函数:衡量模型输出与真实标签的差异
损失函数(Loss Function):
计算一个样本
代价函数(Cost Function):
计算整个样本的损失函数的均值。
目标函数(Objective Function):
- Cost:代价函数
- Regularization: 正则项
损失函数是什么
class _Loss(Module):
#size_average=None, reduce=None将被舍弃
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
交叉熵损失函数
nn.CrossEntropyLoss
nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
功能:nn.LogSoftmax()与nn.NLLLoss()结合,进行交叉熵计算
主要参数:
- weight: 各类别的loss设置权值
- ignore_index: 忽略某个类别
- reduction: 计算模式,可为none/sum/mean
none - 逐个元素计算
sum - 所有元素求和,返回标量
mean - 加权平均,返回标量
交叉熵 = 信息熵 + 相对熵
熵(信息熵)
自信息的期望
自信息
相对熵(KL散度)
衡量两个分布之间的差异,或着距离,但是这不是一个距离函数,因为它没有对称性,p到q的距离不等于q到p的距离。
交叉熵
nn.NLLLoss
nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')
功能:实现负对数似然函数中的负号功能
主要参数:
- weight: 各类别的loss设置权值
- ignore_index: 忽略某个类别
- reduction: 计算模式,可为none/sum/mean
none - 逐个元素计算
sum - 所有元素求和,返回标量
mean - 加权平均,返回标量
nn.BCELoss
nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')
功能:二分类交叉熵
注意事项:输入值取值在[0, 1]
主要参数:
- weight: 各类别的loss设置权值
- ignore_index: 忽略某个类别
- reduction: 计算模式,可为none/sum/mean
none - 逐个元素计算
sum - 所有元素求和,返回标量
mean - 加权平均,返回标量
nn.BCEWithLogitsLoss
nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)
功能:结合Sigmoid与二分类交叉熵
注意事项:网络最后不加sigmoid函数
主要参数:
- pos_weight:正样本的权值
- weight:各类别的loss设置权值
- ignore_index: 忽略某个类别
- reduction:计算模式,可为none/sum/mean
none - 逐个元素计算
sum - 所有元素求和,返回标量
mean - 加权平均,返回标量