ToB企服应用市场:ToB评测及商务社交产业平台

标题: PyTorch交叉熵明确 [打印本页]

作者: 愛在花開的季節    时间: 2024-6-26 10:02
标题: PyTorch交叉熵明确
PyTorch 中的交叉熵丧失

CrossEntropyLoss

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


  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])
复制代码
计算步骤


首先,将 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]])
复制代码

交叉熵丧失的计算公式为:
                                    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​ 位置上的猜测概率。
我们手动计算每个样本的交叉熵丧失:

                                                         l                               o                               s                               s                                      1                                  =                         −                         log                         ⁡                         (                         0.6590                         )                         ≈                         0.4171                              {{loss}_{1}}=-\log{(}0.6590)\approx 0.4171                  loss1​=−log(0.6590)≈0.4171

                                                         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

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

依据前面的公式使用 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
复制代码
结果根本一致。
总结


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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4