
通过这篇文章我们需要分别知道分类任务的损失函数知道回归任务的损失函数。一、什么是损失函数在深度学习中,损失函数是用来衡量模型参数的质量的函数,衡量的方式是比较网络输出和真实输出的差异损失函数在不同的文献中名称是不一样的主要有以下几种命名方式二、多分类任务损失函数在多分类任务通常使用softmax将logits转换为概率的形式所以多分类的交叉熵损失也叫做softmax损失它的计算方法是其中:1.y是样本x属于某一个类别的真实概率2.而f(x)是样本属于某一类别的预测分数3.S是softmax激活函数,将属于某一类别的预测分数转换成概率4.L用来衡量真实值y和预测值f(x)之间差异性的损失结果上图中的交叉熵损失为从概率角度理解我们的目的是最小化正确类别所对应的预测概率的对数的负值(损失值最小)如下图所示代码演示 案例 演示多分类任务的交叉熵损失函数。 损失函数介绍 概述 损失函数也叫成本函数目标函数代价函数误差函数就是用来衡量 模型好坏模型拟合情况的。 分类 分类问题 多分类交叉熵损失CrossEntropyLoss 二分类交叉熵损失BCELoss 回归问题 MAE: Mean Absolute Error, 平均绝对误差 MSE: Mean Squared Error均分误差 RMSE: Root Mean Squared Error, 均方根误差 SmoothL1: 结合上述两个的特点做的升级优化。 多分类交叉熵损失CrossEntropyLoss 设计思路 Loss -∑ylog(S(f(x))) 简单记忆 x样本 f(x): 加权求和 S(f(x)): 映射后的概率 y: 样本x属于某一个类别的 真实概率 大白话解释 损失函数结果 正确类别概率的对数的最小负数…… 细节 CrossEntropyLoss Softmax() 损失计算 后续如果用过这个损失函数则输出层就不用额外调用 softmax() 激活函数了 # 导包 import torch import torch.nn as nn # 1.定义函数演示多分类交叉熵损失函数 def dm01(): # 1.手动创建样本的真实值 - 就是上述公式中的 y y_true torch.tensor([[0,1,0],[1,0,0]],dtypetorch.float) # 和下面效果一致 # y_true torch.tensor([1,2]) # 2.手动创建样本的预测值 - 就是上述公式中的 f(x) y_pred torch.tensor([[0.1,0.8,0.1],[0.7,0.2,0.1]],requires_gradTrue,dtypetorch.float) # 3.创建多分类交叉熵损失函数。 criterion nn.CrossEntropyLoss() # 平均损失来源于参数reductionmean # 4.计算损失值 loss criterion(y_pred, y_true) print(f损失值{loss}) # 2.测试 if __name__ __main__: dm01()三、二分类任务损失函数在处理二分类任务时我们不再使用softmax激活函数而是使用sigmoid激活函数那损失函数也相应的进行调整使用二分类的交叉熵损失函数其中:1.y是样本x属于某一个类别的真实概率2.而y^是样本属于某一类别的预测概率3.L用来衡量真实值y与预测值y^之间差异性的损失结果。在pytorch中实现时使用nn.BCELoss() 如下所示 案例 演示二分类任务的损失函数。 二分类任务的损失函数 公式 Loss -ylog(预测值) - (1-y)log(1-预测值) 细节 因为公式中没有包含Sigmoid激活函数所以使用BCEloss的时候还需要手动指定 Sigmoid. # 导包 import torch import torch.nn as nn # 1.定义函数演示二分类任务的损失函数。 def dm01(): # 1.设置真实值。 y_true torch.tensor([0, 1, 0], dtypetorch.float) # 2.设置预测值概率 y_pred torch.tensor([0.6901, 0.5423, 0.2639]) # 3.创建二分类交叉熵损失函数。 criterion nn.BCELoss() loss criterion(y_pred, y_true).detach().numpy() print(f损失值{loss}) # 2.测试 if __name____main__: dm01()四、回归任务损失函数-MAE损失函数Mean absolute loss(MAE)也被称为L1 Loss是以绝对误差作为距离。损失函数公式:特点是1.由于L1 loss具有稀疏性为了惩罚较大的值因此常常将其作为正则项添加到其他loss中作为约束。2.L1 loss的最大问题是梯度在零点不平滑导致会跳过极小值。五、回归任务损失函数-MSE损失函数Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss或欧氏距离它以误差的平方和的均值作为距离。损失函数公式:曲线如下图所示特点是1.L2 loss也常常作为正则项。2.当预测值与目标值相差很大时,梯度容易爆炸。六、回归任务损失函数-Smooth L1损失函数Smooth L1说的是光滑之后的L1。损失函数公式:其中f(x)−y 为真实值和预测值的差值。从右图中可以看出该函数实际上就是一个分段函数1.在[-1,1]之间实际上就是L2损失这样解决了L1的不光滑问题2.在[-1,1]区间外实际上就是L1损失这样就解决了离群点梯度爆炸的问题代码演示 案例 演示 回归任务的损失函数介绍 回归任务常用损失函数如下 MAEMean Absolute Error, 平均绝对误差。 公式 误差绝对值之和 / 样本总数 类似于L1正则化权重可以降维0数据会变得稀疏。 弊端 在0点不平滑可能错过最小值。 MSE: Mean Squared Error, 均方误差 公式 误差平方和 / 样本总数 弊端 如果差值过大可能存在梯度爆炸的情况w新 w旧 - 学习率*梯度 Smooth L1 就是基于MAE和MSE做的综合在[-1,1]是L2MSE其它段时L1. 这样即解决了L1不平滑的问题又解决了MSE的梯度爆炸问题 # 导包 import torch import torch.nn as nn # 1.定义函数演示MAE 损失函数。 def dm01(): # 1.定义变量记录真实值 y_true torch.tensor([2.0, 2.0, 2.0], dtypetorch.float) # 2.定义变量记录预测值。 y_pred torch.tensor([1.0, 1.0, 1.9], requires_gradTrue, dtypetorch.float) # 3.创建MAE损失函数对象 criterion nn.L1Loss() # 4.计算损失函数 loss criterion(y_pred, y_true) # 5.输出损失 print(fMAE:{loss}) # 2.定义函数演示MSE 损失函数。 def dm02(): # 1.定义变量记录真实值 y_true torch.tensor([2.0, 2.0, 2.0], dtypetorch.float) # 2.定义变量记录预测值。 y_pred torch.tensor([1.0, 1.0, 1.9], requires_gradTrue, dtypetorch.float) # 3.创建MSE损失函数对象 criterion nn.MSELoss() # 4.计算损失函数 loss criterion(y_pred, y_true) # 5.输出损失 print(fMSE:{loss}) # 3.定义函数演示Smooth L1 损失函数。 def dm03(): # 1.定义变量记录真实值 y_true torch.tensor([2.0, 2.0, 2.0], dtypetorch.float) # 2.定义变量记录预测值。 y_pred torch.tensor([1.0, 1.0, 1.9], requires_gradTrue, dtypetorch.float) # 3.创建SmoothL1损失函数对象 criterion nn.SmoothL1Loss() # 4.计算损失函数 loss criterion(y_pred, y_true) # 5.输出损失 print(fMSmoothL1:{loss}) # 4.测试 if __name____main__: # dm01() # dm02() dm03()七、总结1.分类任务的损失函数多分类的交叉熵损失函数二分类的交叉熵损失函数2.回归任务的损失函数lMAEMSEsmooth L1损失函数