【深度学习】损失函数介绍及代码实现
损失函数
在深度学习中,损失函数是用来横向模型参数质量的函数,衡量的方式是比较网络输出和真实输出的差异
损失函数的不同名称:
- 损失函数 loss function
- 代价函数 cost function
- 目标函数 objective function
- 误差函数 error function
分类任务损失函数
多分类任务损失函数
在多分类任务通常使用softmax将logits转换为概率的形式, 所以多酚类的交叉熵损失也叫做softmax损失,他的计算方法是:
其中:
y是样本x属于某一个类别的真实概率
而f(x)是样本属于某一类别的预测分数
S是softmax激活函数,将属于某一类别的预测分数转换成概率
L用来衡量真实值y和预测值f(x)之间差异性的损失结果
上图中的交叉熵损失为:
从概率角度理解,我们的目的是最小化正确类别所对应的预测概率的对数的负值(损失值最小),如下图所示:
# 分类损失函数:交叉熵损失使用nn.CrossEntropyLoss()实现。nn.CrossEntropyLoss()=softmax + 损失计算
def test():
# 设置真实值: 可以是热编码后的结果也可以不进行热编码
# y_true = torch.tensor([[0, 1, 0], [0, 0, 1]], dtype=torch.float32)
# 注意的类型必须是64位整型数据
y_true = torch.tensor([1, 2], dtype=torch.int64)
y_pred = torch.tensor([[0.2, 0.6, 0.2], [0.1, 0.8, 0.1]], dtype=torch.float32)
# 实例化交叉熵损
loss = nn.CrossEntropyLoss() # 计算损失结果
my_loss = loss(y_pred, y_true).numpy()
print('loss:', my_loss)
二分类任务损失函数
在处理二分类任务时,我们不再使用softmax激活函数,而是使用sigmoid激活函数,损失函数也进行相应的调整,使用二分类的交叉验证损失函数:
其中:
y是样本x属于某一个类别的真实概率
而y^是样本属于某一类别的预测概率
L用来衡量真实值y与预测值y^之间差异性的损失结果。
在pytorch中实现时使用nn.BCELoss() ,如下所示:
def test2():
# 1 设置真实值和预测值
# 预测值是sigmoid输出的结果
y_pred = torch.tensor([0.6901, 0.5459, 0.2469], requires_grad=True)
y_true = torch.tensor([0, 1, 0], dtype=torch.float32)
# 2 实例化二分类交叉熵损失
criterion = nn.BCELoss()
# 3 计算损失
my_loss = criterion(y_pred, y_true).detach().numpy()
print('loss:', my_loss)
回归任务损失函数
MAE损失函数
Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离。损失函数公式:
-
特点是:
- 由于L1 loss 具有稀疏性, 为了惩罚较大的值, 常常将其作为正则项添加到其他的loss中作为约束
- L1 loss 最大问题在于梯度在零点不平滑,导致会跳过极小值
# 计算算inputs与target之差的绝对值 def test3(): # 1 设置真实值和预测值 y_pred = torch.tensor([1.0, 1.0, 1.9], requires_grad=True) y_true = torch.tensor([2.0, 2.0, 2.0], dtype=torch.float32) # 2 实例MAE损失对象 loss = nn.L1Loss() # 3 计算损失 my_loss = loss(y_pred, y_true).detach().numpy() print('loss:', my_loss)
MSE损失函数
Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss,或欧氏距离,它以误差的平方和的均值作为距离
损失函数公式:
- 特点是:
- L2 loss也常常作为正则项
- 当预测值与目标值相差很大时,梯度容易爆炸
def test4():
# 1 设置真实值和预测值
y_pred = torch.tensor([1.0, 1.0, 1.9], requires_grad=True)
y_true = torch.tensor([2.0, 2.0, 2.0], dtype=torch.float32)
# 2 实例MSE损失对象
loss = nn.MSELoss()
# 3 计算损失
my_loss = loss(y_pred, y_true).detach().numpy()
print('myloss:', my_loss)
smooth L1损失函数
smooth L1 平滑之后的L1 其中:𝑥=f(x)−y 为真实值和预测值的差值。
该函数实际上就是一个分段函数
在[-1,1]之间实际上就是L2损失,这样解决了L1的不光滑问题
在[-1,1]区间外,实际上就是L1损失,这样就解决了离群点梯度爆炸的问题
def test5():
# 1 设置真实值和预测值
y_true = torch.tensor([0, 3])
y_pred = torch.tensor ([0.6, 0.4], requires_grad=True)
# 2 实例smmothL1损失对象
loss = nn.SmoothL1Loss()
# 3 计算损失
my_loss = loss(y_pred, y_true).detach().numpy()
print('loss:', my_loss)
原文地址:https://blog.csdn.net/weixin_57336987/article/details/143771386
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!