自学内容网 自学内容网

【深度学习】损失函数介绍及代码实现

损失函数

​ 在深度学习中,损失函数是用来横向模型参数质量的函数,衡量的方式是比较网络输出和真实输出的差异

在这里插入图片描述

损失函数的不同名称:

  • 损失函数 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)!