愛在花開的季節 发表于 2024-6-26 10:02:08

PyTorch交叉熵明确

PyTorch 中的交叉熵丧失

CrossEntropyLoss

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



[*] 模子的猜测(logits,未经过 softmax 激活)
[*] 实际标签
import torch
import torch.nn as nn

# 模型的预测(logits)
logits = torch.tensor([,
                     ])

# 实际标签
labels = torch.tensor()
计算步骤



[*]步骤 1: Softmax 激活
首先,将 logits 通过 softmax 激活函数转换为概率分布。
softmax = nn.Softmax(dim=1)
probabilities = softmax(logits)
print(probabilities)
输出
tensor([,
      ])


[*]步骤 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 函数来验证计算结果:
criterion = nn.CrossEntropyLoss()
loss = criterion(logits, labels)
print(loss.item())
输出
1.2288230657577515


[*]步骤4:依据公式使用 PyTorch 计算
依据前面的公式使用 PyTorch 计算来验算结果
neg_log_p = -torch.log(probabilities)
loss_cal = neg_log_p), labels].mean()
print(loss_cal.item())
输出
1.228823184967041
结果根本一致。
总结


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

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