PyTorch交叉熵明确

愛在花開的季節  金牌会员 | 2024-6-26 10:02:08 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 789|帖子 789|积分 2367

PyTorch 中的交叉熵丧失

CrossEntropyLoss

PyTorch 中使用CrossEntropyLoss 计算交叉熵丧失,常用于分类任务。交叉熵丧失衡量了模子输出的概率分布与实际标签分布之间的差异,目标是最小化该丧失以优化模子。
我们通过一个详细的案例来详细阐明 CrossEntropyLoss 的计算过程。
假设我们有一个简单的分类任务,共有 3 个类别。我们有 2 个样本的猜测和实际标签。
输入



  • 模子的猜测(logits,未经过 softmax 激活)
  • 实际标签
  1. import torch
  2. import torch.nn as nn
  3. # 模型的预测(logits)
  4. logits = torch.tensor([[2.0, 1.0, 0.1],
  5.                        [0.5, 2.0, 0.3]])
  6. # 实际标签
  7. labels = torch.tensor([0, 2])
复制代码
计算步骤



  • 步骤 1: Softmax 激活
首先,将 logits 通过 softmax 激活函数转换为概率分布。
  1. softmax = nn.Softmax(dim=1)
  2. probabilities = softmax(logits)
  3. print(probabilities)
复制代码
输出
  1. tensor([[0.6590, 0.2424, 0.0986],
  2.         [0.1587, 0.7113, 0.1299]])
复制代码


  • 步骤 2: 计算交叉熵
交叉熵丧失的计算公式为:
                                    C                         r                         o                         s                         s                         E                         n                         t                         r                         o                         p                         y                         L                         o                         s                         s                         =                         −                                   ∑                                       i                               =                               1                                      N                                            log                            ⁡                            (                                            p                                       i                               ,                                           y                                  i                                                       )                              CrossEntropyLoss=-\sum_{i=1}^{N}{\log{(}}{{p}_{i,{{y}_{i}}}})                  CrossEntropyLoss=−∑i=1N​log(pi,yi​​)
此中 N 是样本数量,                                             p                                       i                               ,                                           y                                  i                                                            p_{i,y_i}                  pi,yi​​是第 i个样本在实际标签                                              y                            i                                       y_i                  yi​ 位置上的猜测概率。
我们手动计算每个样本的交叉熵丧失:


  • 对于第一个样本,实际标签为 0,猜测概率为 0.6590
                                                         l                               o                               s                               s                                      1                                  =                         −                         log                         ⁡                         (                         0.6590                         )                         ≈                         0.4171                              {{loss}_{1}}=-\log{(}0.6590)\approx 0.4171                  loss1​=−log(0.6590)≈0.4171


  • 对于第二个样本,实际标签为 2,猜测概率为 0.1299
                                                         l                               o                               s                               s                                      2                                  =                         −                         log                         ⁡                         (                         0.1299                         )                         ≈                         2.0406                              {{loss}_{2}}=-\log{(}0.1299)\approx 2.0406                  loss2​=−log(0.1299)≈2.0406
平均丧失为:
                                    m                         e                         a                         n                         =                                              0.4171                               +                               2.0406                                      2                                  ≈                         1.2288                              mean=\frac{0.4171+2.0406}{2}\approx 1.2288                  mean=20.4171+2.0406​≈1.2288


  • 步骤 3: 使用 PyTorch 的 CrossEntropyLoss 计算
我们使用 PyTorch 的 CrossEntropyLoss 函数来验证计算结果:
  1. criterion = nn.CrossEntropyLoss()
  2. loss = criterion(logits, labels)
  3. print(loss.item())
复制代码
输出
  1. 1.2288230657577515
复制代码


  • 步骤4:依据公式使用 PyTorch 计算
依据前面的公式使用 PyTorch 计算来验算结果
  1. neg_log_p = -torch.log(probabilities)
  2. loss_cal = neg_log_p[torch.arange(neg_log_p.shape[0]), labels].mean()
  3. print(loss_cal.item())
复制代码
输出
  1. 1.228823184967041
复制代码
结果根本一致。
总结


  • CrossEntropyLoss 担当未经过 softmax 的 logits 作为输入。
  • 内部首先对 logits 应用 softmax,将其转换为概率分布。
  • 然后根据实际标签计算交叉熵丧失。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表