C/C++教程

【2024年】第3天 神经网络模块(nn)中的损失函数(pytorch)

本文主要是介绍【2024年】第3天 神经网络模块(nn)中的损失函数(pytorch),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  • 损失函数是决定模型学习质量的关键。
  • 无论什么样的网络结构,如果使用的损失函数不正确,那么最终将难以训练出正确的模型。
  • 损失函数主要是用来计算输出值和目标值之间的误差的。
  • 该误差在训练模型中,配合反向传播使用。
  • 为了在反向传播中找到最小值,要求损失函数必须是可导的。

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}^nt=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中还封装了其他的损失函数。
  1. SmoothLyLoss:平滑版的L1损失函数。
    • 此损失函数对于异常点的敏感性不如MSE-loss。
    • 在某些情况下(如Fast R -CNN模型中),它可以防止梯度"爆炸"。
    • 这个损失函数也称为Huber loss。
  2. NLLLoss:负对数似然损失函数,在分类任务中经常使用。
  3. NLLLoss2d:计算图片的负对数似然损失函数,即对每个像素计算NLLLoss。
  4. KLDivLoss:计算KL散度损失函数。
  5. BCELoss:计算真实标签与预测值之间的二进制交叉熵。
  6. BCEWithLogitsLoss:带有Sigmoid激活函数层的BCELoss,即计算target与Sigmoid(output)之间的二进制交叉熵。
  7. MarginRankingLoss:按照一个特定的方法计算损失。
    • 计算给定输入x1和x2(一维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值。
    • 如果y=1,那么第一个输入的值应该大于第二个输入的值。
    • 如果y=-1,则相反。
  8. HingeEmbeddingLoss:用来测量两个输入是否相似,使用L1距离。
    • 计算给定一个输入x(二维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值
  9. MultiLabelMarginLoss:计算多标签分类的基于间隔的损失函数(hinge loss)。
    • 计算给定一个输入x(二维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值。
    • 其中y表示最小批次中样本类别的索引。
  10. SoftMarginLoss:用来优化二分类的逻辑损失。
    • 计算给定一个输入x(二维张量)和对应的标签y(一维张量,取值为-1和1)之间的损失值。
  11. MultiLabelSoftMarginLoss:基于输入x(二维张量)和目标y(二维张量)的最大交叉熵,优化多标签分类(one-versus-all)的损失。
  12. CosineEmbeddingLoss:使用余弦距离测量两个输入是否相似,一般用于非线性emdedding或者半监督学习。
  13. MultiMarginLoss:用来计算多分类任务的hinge loss。
    • 输入是x(二维张量)和y(一维张量)。
    • 其中y代表类别的索引。

6. 总结:损失算法的选取

  • 用输入标签数据的类型来选取损失函数:
    1. 如果输入是无界的实数值,那么损失函数使用平方差。
    2. 如果输入标签是位矢量(分类标识),那么使用交叉熵会更合适。
  • 当然还有一些特殊的损失函数,是根据样本和任务的特性,来使用相应的损失函数。
  • 我们的损失函数不止可以使用类的方式实现,还可以直接以函数的形式呈现,在torch.nn.functional模块中,可以找到对应的定义。
这篇关于【2024年】第3天 神经网络模块(nn)中的损失函数(pytorch)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!