- 损失函数是决定模型学习质量的关键。
- 无论什么样的网络结构,如果使用的损失函数不正确,那么最终将难以训练出正确的模型。
- 损失函数主要是用来计算输出值和目标值之间的误差的。
- 该误差在训练模型中,配合反向传播使用。
- 为了在反向传播中找到最小值,要求损失函数必须是可导的。
1. L1损失函数
- L1损失函数线计算模型的输出y’和目标y之间差的绝对值,再将绝对值结果进行平均值计算。
loss(y', y) = mean(|y' - y|)
- L1损失函数是以类的形式封装的。
- 也就是说,需要对其先进行实例化再使用。
import torch
loss = torch.nn.L1Loss()(pre, label)
- pre代表公式中的y’,label代表公式中的y。
- 在对L1损失函数进行实例化时,还可以传入size_average。
- 如果size_average为False,那么不进行均值计算。
2.均值平方差(MSE)损失函数
- 均值平方差损失(mean Squared Error, MSE)也称"均方误差"。
- 在神经网络中主要是表达预测值和真实值之间的差异,在数理统计中,均方误差是指参数估计值和参数真值之差的平方期望值。
- MSE的数学定义如下,主要是对每一个真实值和预测值相减后的平方取平均值。
MSE= 1/n ∑t=1n\sum_{t=1}^n∑t=1n (observedt - predictedt)2
- MSE的值越小,表明模型越好。
- 类似的损失算法还有均方根误差(ROOt MSE, RMSE; 将MSE开平发)、平方均值误差(Mean Absolute Deviation, MAD,对一个真实值和预测值相减后的绝对值取平均值。
- 在神经网络计算中,预测值要与真实值在同样的数据分布内。
- 假设将预测值输入Sigmoid激活函数后得到取值范围规定在0到1之间,那么真实值也应该归一化至0到1之间。
- 这样在进行损失计算时才会有更好地效果。
- MSE损失函数是以类的形式封装的。
- 也就是说,需要先对其进行实例化再使用。
import torch
loss = torch.nn.MSELoss()(pre, label)
- pre代表模型输出的预测值,label代表输入样本对应的标签。
- 在对MSELoss类进行实例化时,还可以传入参数size_average。如果size_average为False,那么不进行均值计算。
3.交叉熵损失(CrossEntropyLoss)函数
- 交叉熵(cross entropy)也是损失函数的一种,可以用来计算学习模型分布与训练分布之间的差异。
- 他一般用在分类问题上,表达的意思为预测输入样本属于某一类的概率。
- 交叉熵的数学定义如下,y代表真实值分类(0或1),a代表预测值。
c = - 1/n ∑x\sum_{x}∑x [xIna + (1-x)In(1-a)] - 交叉熵的值越小代表预测结果越准。
- 这里用于计算的a也是通过分布统一化处理的,或者是经过Sigmoid函数激活的,取值范围为0-1.
- 如果真实值和预测值都为1,那么前面一项yIn(a)就是1xIn(1),也就是0.
- 同时,后一项(1-y)In(1-a)也就是0xIn(0),约定该值等于0.
import torch
loss = torch.nn.CrossEntropyLoss()(pre, label)
- CrossEntropyLoss损失函数是以类的形式封装的。
- 也就是说,需要对其先进行实例化再使用。
- pre代表模型输出的预测值,label代表输入样本对应的标签。
- 在对CrossEntropyLoss类进行实例化时,还可以传入参数size_average。
- 如果size_average为False,那么不进行均值计算。
4. 加权交叉熵
- 加权交叉熵是指交叉熵的基础上将c = - 1/n ∑x\sum_{x}∑x [xIna + (1-x)In(1-a)] 中括号中的第一项乘以系数(加权),以增加或减少正样本在计算交叉熵时的损失值。
- 在训练一个多类分类器时,如果训练样本很不均衡的话,那么可以通过加权交叉熵有效的控制训练模型分类的平衡性。
import torch
loss = torch.nn.CrossEntropyLoss(weight)(pre, label)
- 参数weight是一个一维张量,该张量中含有n(即分类数)个元素,即为每个类分配不同的权重比例。
5. 其他的损失函数
- pytorch中还封装了其他的损失函数。
- SmoothLyLoss:平滑版的L1损失函数。
- 此损失函数对于异常点的敏感性不如MSE-loss。
- 在某些情况下(如Fast R -CNN模型中),它可以防止梯度"爆炸"。
- 这个损失函数也称为Huber loss。
- NLLLoss:负对数似然损失函数,在分类任务中经常使用。
- NLLLoss2d:计算图片的负对数似然损失函数,即对每个像素计算NLLLoss。
- KLDivLoss:计算KL散度损失函数。
- BCELoss:计算真实标签与预测值之间的二进制交叉熵。
- BCEWithLogitsLoss:带有Sigmoid激活函数层的BCELoss,即计算target与Sigmoid(output)之间的二进制交叉熵。
- MarginRankingLoss:按照一个特定的方法计算损失。
- 计算给定输入x1和x2(一维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值。
- 如果y=1,那么第一个输入的值应该大于第二个输入的值。
- 如果y=-1,则相反。
- HingeEmbeddingLoss:用来测量两个输入是否相似,使用L1距离。
- 计算给定一个输入x(二维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值
- MultiLabelMarginLoss:计算多标签分类的基于间隔的损失函数(hinge loss)。
- 计算给定一个输入x(二维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值。
- 其中y表示最小批次中样本类别的索引。
- SoftMarginLoss:用来优化二分类的逻辑损失。
- 计算给定一个输入x(二维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值。
- MultiLabelSoftMarginLoss:基于输入x(二维张量)和目标y(二维张量)的最大交叉熵,优化多标签分类(one-versus-all)的损失。
- CosineEmbeddingLoss:使用余弦距离测量两个输入是否相似,一般用于非线性emdedding或者半监督学习。
- MultiMarginLoss:用来计算多分类任务的hinge loss。
- 输入是x(二维张量)和y(一维张量)。
- 其中y代表类别的索引。
6. 总结:损失算法的选取
- 用输入标签数据的类型来选取损失函数:
- 如果输入是无界的实数值,那么损失函数使用平方差。
- 如果输入标签是位矢量(分类标识),那么使用交叉熵会更合适。
- 当然还有一些特殊的损失函数,是根据样本和任务的特性,来使用相应的损失函数。
- 我们的损失函数不止可以使用类的方式实现,还可以直接以函数的形式呈现,在torch.nn.functional模块中,可以找到对应的定义。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦