深度学习(7):损失函数
一、线性回归损失函数
1、MAE损失
MAE(Mean Absolute Error,平均绝对误差)通常也被称为 L1-Loss,通过对预测值和真实值之间的绝对差取平均值来衡量他们之间的差异。

特点:
-
鲁棒性:与均方误差(MSE)相比,MAE对异常值(outliers)更为鲁棒,因为它不会像MSE那样对较大误差平方敏感。
-
物理意义直观:MAE以与原始数据相同的单位度量误差,使其易于解释。
应用场景:
MAE通常用于需要对误差进行线性度量的情况,尤其是当数据中可能存在异常值时,MAE可以避免对异常值的过度惩罚。
import torch
import torch.nn as nn
# 初始化MAE损失函数
mae_loss = nn.L1Loss()
# 假设 y_true 是真实值, y_pred 是预测值
y_true = torch.tensor([3.0, 5.0, 2.5])
y_pred = torch.tensor([2.5, 5.0, 3.0])
# 计算MAE
loss = mae_loss(y_pred, y_true)
print(f'MAE Loss: {loss.item()}')
#MAE Loss: 0.3333333432674408
2、MSE损失
均方差损失,也叫L2Loss。
MSE(Mean Squared Error,均方误差)通过对预测值和真实值之间的误差平方取平均值,来衡量预测值与真实值之间的差异

特点:
-
平方惩罚:因为误差平方,MSE 对较大误差施加更大惩罚,所以 MSE 对异常值更为敏感。
-
凸性:MSE 是一个凸函数,这意味着它具有一个唯一的全局最小值,有助于优化问题的求解。
应用场景:
MSE被广泛应用在神经网络中。
import torch
import torch.nn as nn
# 初始化MSE损失函数
mse_loss = nn.MSELoss()
# 假设 y_true 是真实值, y_pred 是预测值
y_true = torch.tensor([3.0, 5.0, 2.5])
y_pred = torch.tensor([2.5, 5.0, 3.0])
# 计算MSE
loss = mse_loss(y_pred, y_true)
print(f'MSE Loss: {loss.item()}')
#MSE Loss: 0.1666666716337204
3、SmoothL1Loss
SmoothL1Loss可以做到在损失较小时表现为 L2 损失,而在损失较大时表现为 L1 损失。 
特点:
-
平滑过渡:当误差较小时,损失函数表现为 L2 Loss(平方惩罚);当误差较大时,损失函数逐渐向 L1 Loss过渡。这种平滑过渡既能对大误差有所控制,又不会对异常值过度敏感。
-
稳健性:对于异常值更加稳健,同时在小误差范围内提供了较好的优化效果。
应用场景:
SmoothL1Loss常用于需要对大误差进行一定控制但又不希望完全忽略小误差的回归任务。特别适用于目标检测任务中的边界框回归,如 Faster R-CNN 等算法中。
import torch
import torch.nn as nn
# 创建模型的预测值和真实值
predictions = torch.tensor([1.0, 2.0, 3.0, 4.0])
targets = torch.tensor([3.0, 2.5, 3.5, 4.5])
# 计算损失方式1
smooth_loss = nn.SmoothL1Loss()
loss1 = smooth_loss(predictions, targets) # 0.46875
# 计算损失方式2
loss2 = nn.functional.smooth_l1_loss(predictions, targets)
print("模型预测值:", predictions)
print("真实值:", targets)
print("均方误差损失:", loss1, loss2)
"""
模型预测值: tensor([1., 2., 3., 4.])
真实值: tensor([3.0000, 2.5000, 3.5000, 4.5000])
均方误差损失: tensor(0.4688) tensor(0.4688)
"""
二、CrossEntropyLoss
交叉熵损失函数,使用在输出层使用softmax激活函数进行多分类时,一般都采用交叉熵损失函数。
对于多分类问题,CrossEntropyLoss 公式如下:

其中:
-
C是类别的总数。
-
y 是真实标签的one-hot编码向量,表示真实类别。
-
y^ 是模型的输出(经过 softmax 后的概率分布)。
-
y_i 是真实类别的第 i 个元素(0 或 1)。
-
y^i是预测的类别概率分布中对应类别 i的概率。
特点:
-
概率输出:CrossEntropyLoss 通常与 softmax 函数一起使用,使得模型的输出表示为一个概率分布(即所有类别的概率和为 1)。
-
惩罚错误分类:该损失函数在真实类别的预测概率较低时,会施加较大的惩罚,这样模型在训练时更注重提升正确类别的预测概率。
-
多分类问题中的标准选择:在大多数多分类问题中,CrossEntropyLoss 是首选的损失函数。
应用场景:
CrossEntropyLoss 广泛应用于各种分类任务,包括图像分类、文本分类等,尤其是在神经网络模型中。
import torch
from torch import nn
# 多元交叉熵损失函数,在pytorch框架中内置了softmax
# 在使用交叉熵函数时,不需要显式调用softmax
def test01():
# 假设有三个类别,模型输出是未经softmax的logits
# 输出层的输出值,还没有被softmax处理
x = torch.tensor([[1.5, 2.0, 0.5], [0.5, 1.0, 1.5]])
# 真实的标签
y = torch.tensor([1, 2]) # 第一个样本的真实类别为1,第二个样本的真实类别为2
criterion = nn.CrossEntropyLoss(reduction='sum')
loss = criterion(x, y)
print(loss)#tensor(1.2844)
if __name__ == '__main__':
test01()
三、BCELoss
二分类交叉熵损失函数,使用在输出层使用sigmoid激活函数进行二分类时。
对于二分类问题,CrossEntropyLoss 的简化版本称为二元交叉熵(Binary Cross-Entropy Loss),公式为:

log的底数一般默认为e,y是真实类别目标,根据公式可知L是一个分段函数

import torch
from torch import nn
# 二元交叉熵
def test02():
# y 是模型的输出,已经被sigmoid处理过,确保其值域在(0,1)
y = torch.tensor([[0.7], [0.2], [0.9], [0.7]])
# targets 是真实的标签,0或1
t = torch.tensor([[1], [0], [1], [0]], dtype=torch.float)
# criterion = nn.BCELoss()
# BCEWithLogitsLoss:二元交叉熵损失函数整合了sigmoid激活函数
# 做二分类模型,优先使用BCEWithLogitsLoss
criterion = nn.BCEWithLogitsLoss()
loss = criterion(y, t)
print(loss)
if __name__ == '__main__':
test02()
四. 总结
-
当输出层使用softmax多分类时,使用交叉熵损失函数;
-
当输出层使用sigmoid二分类时,使用二分类交叉熵损失函数, 比如在逻辑回归中使用;
-
当功能为线性回归时,使用smooth L1损失函数或均方差损失-L2 loss。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)