损失函数是深度学习模型训练过程中不可或缺的一部分,是模型预测值与真实值之间差异的客观衡量标准。它们是模型训练的基础,指导算法调整模型参数,以最小化损失并提高预测准确性。它们衡量了模型预测值与真实值的吻合程度。通过最小化这种损失,模型可以学会做出更准确的预测。在训练时,我们的目标是最小化预测值和真实值之间的损失。深度学习模型的目标是最小化这个损失函数。
损失函数是一种数学函数,用于衡量模型预测值与真实值的匹配程度。它为模型预测的准确性提供了量化指标(quantitative metric),可用于指导模型的训练过程,用于评估算法对数据集的建模效果。如果损失函数的值较低,则表明模型运行良好,否则我们必须更改模型参数以减少或最小化损失。它指导学习算法(learning algorithm)在训练期间调整模型的参数,即权重和偏置。损失函数的目标是指导优化算法调整模型参数,以减少随时间推移的损失。在训练过程中,梯度下降(Gradient Descent)等算法使用损失函数来调整模型的参数,即权重和偏置,旨在减少误差并改善模型的预测。通过量化预测值和真实值之间的差异,损失函数为评估模型的性能提供了基准(benchmark),损失值越低,通常表示性能越好。损失函数的选择会影响学习动态(learning dynamics),包括模型学习的速度以及哪种错误受到的惩罚(penalized)更重。不同的损失函数可以导致不同的学习行为和结果。
损失函数有多种形式,每种形式适用于不同类型的问题。选择正确的损失函数(loss function)对于训练深度学习模型非常重要。损失函数的选择会显著影响模型的性能,因此根据手头的具体任务选择合适的损失函数至关重要。损失函数可分为两种主要类型:回归损失函数和分类损失函数。如果我们要预测的值是连续数值,例如房价或温度,那么我们要执行的任务就是回归任务。如果要预测的值是离散值,那么任务就是分类。
损失函数与成本函数:
(1).损失函数:通常用于衡量单个训练样本的预测值与真实值之间的误差。损失函数将误差量化为一个实数,表示错误预测的"成本"或"惩罚"。然后可以使用此误差调整模型的参数,以减少未来预测中的误差。大多数模型使用梯度下降或其变体来最小化损失函数,该算法计算损失函数相对于模型参数的梯度,并沿梯度的相反方向更新参数。
(2).成本函数:通常是对所有训练样本损失函数的平均或总和,表示了整个数据集上模型预测的总体误差。
PyTorch中损失函数的实现在:torch/nn/modules/loss.py ,支持的损失函数有:L1Loss, NLLLoss, NLLLoss2d, PoissonNLLLoss, GaussianNLLLoss, KLDivLoss, MSELoss, BCELoss, BCEWithLogitsLoss, HingeEmbeddingLoss, MultiLabelMarginLoss, SmoothL1Loss, HuberLoss, SoftMarginLoss, CrossEntropyLoss, MultiLabelSoftMarginLoss, CosineEmbeddingLoss, MarginRankingLoss, MultiMarginLoss, TripletMarginLoss, TripletMarginWithDistanceLoss, CTCLoss
1.Mean Squared Error(MSE) Loss:
(1).函数:nn.MSELoss
(2).用途:可微分,适合基于梯度的优化算法。用于预测连续值的问题,例如回归问题。
(3).说明:计算预测值与真实值之间的平方差的平均值。它对较大的错误施加更严厉的惩罚(显著增加损失值),对异常值很敏感。
2.Mean Absolute Error(MAE) Loss:
(1).函数:nn.L1Loss
(2).用途:用于预测连续值的回归问题。
(3).说明:计算预测值与真实值之间绝对差的平均值。与MSE相比,对异常值的敏感度较低。在零处不可微(不能直接应用梯度下降),这可能会给某些优化算法带来问题。
3.Huber Loss:
(1).函数:nn.HuberLoss
(2).用途:可用于解决回归问题。
(3).说明:结合了MSE和MAE的优点。与MSE相比,它对异常值的敏感度较低;与MAE不同,它处处可微。对异常值具有鲁棒性,可在MSE和MAE之间实现平衡(如果真实值与预测值之间的绝对差小于或等于阈值delta,则应用MSE。否则,如果误差足够大,则应用MAE)。可微分,便于基于梯度的优化。使用时,有个delta超参数的取值需要微调。如果回归数据中有异常值,使用MAE或HuberLoss而不是MSE。
4.Smooth L1 Loss:
(1).函数:nn.SmoothL1Loss
(2).用途:可用于解决回归问题。
(3).说明:对小误差的行为类似于MSE,对大误差的行为类似于MAE。如果数据中有一些异常值,这是一个很好的折衷方案。
5.Binary Cross-Entropy(BCE) Loss:
(1).函数:nn.BCELoss
(2).用途:二元交叉熵损失(也称为对数损失)用于二元分类问题。
(3).说明:适合基于梯度的优化算法。对不平衡的数据集可能很敏感。可能存在多个局部极小值。
6.Binary Cross-Entropy with Logits Loss:
(1).函数:nn.BCEWithLogitsLoss
(2).用途:用于二分类问题,与BCELoss类似,但在数值上更稳定。
(3).说明:将sigmoid激活函数和二元交叉熵损失合并为一步。在处理非常小或非常大的概率时,它更稳定。
7.Cross-Entropy Loss:
(1).函数:nn.CrossEntropyLoss
(2).用途:用于多分类问题。
(3).说明:将softmax层和负对数似然损失(Negative Log-Likelihood Loss)合并为一步。
8.Kullback-Leibler Divergence Loss:
(1).函数:nn.KLDivLoss
(2).用途:通常用于概率建模任务。
(3).说明:测量两个概率分布之间的差异。对概率分布的细微差异很敏感。
9.Hinge Loss:
(1).函数:nn.HingeEmbeddingLoss
(2).用途:通常用于分类任务,尤其是二分类问题以及支持向量机(SVM)中。
(3).说明:在零处不可微。
10.Negative Log-Likelihood Loss:
(1).函数:nn.NLLLoss
(2).用途:用于具有log_softmax输出的分类问题。
(3).说明:仅适用于以softmax函数作为输出激活层的模型。
11.Focal Loss:
(1).用途:可有效解决类别不平衡问题。是对Cross-Entropy Loss的改编,更加专注于难以分类的示例。
(2).说明:使用时,有两个超参alpha和gamma的取值需要微调。
12.Dice Loss:
(1).用途:用于图像分割任务,对不平衡数据集特别有效。
(2).说明:它测量预测分割与ground truth之间的重叠。
用于二分类的损失函数:BCELoss、BCEWithLogitsLoss、HingeEmbeddingLoss
用于多分类的损失函数:CrossEntropyLoss、LLLoss
用于回归的损失函数:MSELoss、L1Loss(MAE)、SmoothL1Loss、HuberLoss
用于图像分割的损失函数:Focal Loss、Dice Loss
在某些情况下,这些损失函数可能不够用,在这些情况下,你可以编写自定义损失函数来满足你的特定条件。
注:以上整理的内容主要来自:
1. https://medium.com/
2. https://www.geeksforgeeks.org
3. https://neptune.ai
GitHub:https://github.com/fengbingchun/NN_Test