郭震 AI公众号:郭震AI

13 定义损失函数

发布日期:

分类: Pytorch小白

预计阅读: 3 分钟

定义损失函数流程图查看大图
定义损失函数流程图

损失函数告诉模型什么叫错。回归、二分类、多分类的 loss 不同,输出张量形状和标签格式也要匹配。

定义损失函数核对图查看大图
定义损失函数核对图

遇到 loss 不下降,我会先检查三件事:模型输出形状、标签形状、损失函数是否适合任务。

在机器学习中,损失函数是衡量模型输出与真实值之间差异的指标。为了保证我们训练的模型能够有效地进行预测,我们需要定义一个合适的损失函数。本文将深入探讨如何在 PyTorch 中定义和使用损失函数,并与上一篇中提到的激活函数和下一篇关于优化器的内容相连接。

为什么损失函数重要?

损失函数的核心作用是指导优化器如何调整模型参数,使得最终模型的预测结果尽可能接近目标输出。通过计算损失函数的值,优化器能够了解当前模型的表现,从而在训练过程中不断地进行调整。

PyTorch损失函数判断卡查看大图
PyTorch损失函数判断卡

定义 PyTorch 损失函数时,先看分类或回归任务、输出形状、标签格式、 reduction 设置和梯度稳定性。

常见的损失函数

PyTorch 中,有多种损失函数可供选择,以下是一些常见的损失函数:

PyTorch阅读地图卡查看大图
PyTorch阅读地图卡

《定义损失函数》适合边看图边读正文。先确认问题和判断标准,再看概念解释与练习步骤,信息会更容易连成一条线。

  1. 均方误差损失 (MSELoss): 适用于回归问题,定义为预测值与真实值之间差值的平方和的平均值。

    MSELoss=1ni=1n(yiy^i)2\text{MSELoss} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
  2. 交叉熵损失 (CrossEntropyLoss): 常用于分类问题,能够处理多类别标签。

    CrossEntropyLoss=1ni=1nj=1Cyijlog(y^ij)\text{CrossEntropyLoss} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{C} y_{ij} \log(\hat{y}_{ij})

    其中,CC为类别数,yijy_{ij}为真实标签,y^ij\hat{y}_{ij}为预测概率。

  3. 二元交叉熵损失 (BCELoss): 适用于二分类问题。

    BCELoss=1ni=1n[yilog(y^i)+(1yi)log(1y^i)]\text{BCELoss} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]

在 PyTorch 中定义损失函数

让我们通过一个简单的示例来了解如何在 PyTorch 中定义损失函数。假设我们正在训练一个简单的回归模型,使用均方误差损失。

示例代码

import torch
import torch.nn as nn
import torch.optim as optim

# 创建一个简单的线性模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

# 初始化模型、损失函数和优化器
model = SimpleModel()
criterion = nn.MSELoss()  # 策略(定义损失函数)
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 待讲解的优化器

# 示例输入输出
x = torch.tensor([[1.0], [2.0], [3.0]], requires_grad=True)
y = torch.tensor([[2.0], [4.0], [6.0]])

# 训练过程
for epoch in range(100):
    model.train()
    
    # 清零梯度
    optimizer.zero_grad()

    # 前向传播
    outputs = model(x)
    
    # 计算损失
    loss = criterion(outputs, y)  # 计算损失
    print(f'Epoch {epoch+1}, Loss: {loss.item()}')

    # 反向传播
    loss.backward()
    
    # 更新参数
    optimizer.step()

在上面的代码中,我们首先定义了一个简单的线性模型,然后使用 nn.MSELoss() 来定义均方误差损失。每次迭代中,我们计算输出与真实值之间的损失,并通过梯度下降法更新模型参数。

定义损失函数应用复盘卡查看大图
定义损失函数应用复盘卡

复习《定义损失函数》时,建议把关键概念、操作步骤和可见结果放在同一页里回看。

定义损失函数应用检查卡查看大图
定义损失函数应用检查卡

练习《定义损失函数》时,建议把输入条件、处理动作和可见结果写在一起,方便下次复查。

总结

定义合适的损失函数是模型训练过程中非常重要的一步。它直接影响模型的学习方向与效果。在 PyTorch 中,我们可以轻松地通过 torch.nn 模块中的内置损失函数来实现。

在下一篇中,我们将讨论如何选择优化器,为模型的训练提供更有效的参数更新策略。希望通过上篇的激活函数、当前篇的损失函数以及接下来的优化器选择,使大家能够更全面地掌握模型训练的关键要素。

相关教程

相关页面

AI 教程列表
微博邮件

延伸教程

AI 教程列表

相关内容

相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...