BCEWithLogitsLoss

BCELoss------Binary Cross Entropy二元交叉熵损失

用来衡量 "两个概率分布之间距离" 。

简单说就是:你的预测值(0~1的概率)和真实值(0或1)离得有多远?

对于每一个样本,假设:

  • y : 真实标签 (Target),取值只能是 01

  • x : 模型预测的概率 (Input),取值范围 [0, 1]。(这里必须已经经过 Sigmoid 处理)。


BCEWithLogitsLoss

Logits : 指的是模型最后一层全连接层输出的原始数值 ,也就是没有经过 Sigmoid 激活函数的数值。范围是**(−∞,+∞)**。

BCEWithLogitsLoss = Sigmoid +BCELoss

令 x 为模型的输出 Logits**(−∞,+∞)** ,标准的BCELoss:

但这样直接手动计算log(sigmoid(x)),当 x 非常大或非常小时(例如 x=100或 x=−100),Sigmoid 函数会输出极其接近 1 或 0 的值。计算机的浮点数精度有限,可能会导致:

  • 下溢(Underflow): log⁡(0)log(0) 会变成负无穷(−∞ / NaN)。

  • 梯度消失/爆炸: 在反向传播时导致数值不稳定。

BCEWithLogitsLoss 使用了 LogSumExp 技巧 (Log-Sum-Exp Trick)在数学层面上进行了化简,避免了直接计算 log⁡(σ(x)),从而保证了数值稳定性

这个公式避免了直接对极小值取对数,无论 xx 是正无穷还是负无穷,计算结果都不会溢出。


python 复制代码
import torch
import torch.nn as nn

# 1. 定义 Loss
criterion = nn.BCEWithLogitsLoss()

# 2. 模拟模型输出 (Logits)
# 假设 batch_size=3,是个二分类问题,输出维度为 (3, 1)
# 注意:这里不需要加 torch.sigmoid()
logits = torch.tensor([[-10.0], [0.1], [5.0]], requires_grad=True)

# 3. 定义标签 (Target)
# 标签必须是 float 类型,且维度与 logits 一致
targets = torch.tensor([[0.0], [1.0], [1.0]])

# 4. 计算 Loss
loss = criterion(logits, targets)

print(f"Loss: {loss.item()}")

# 验证数值稳定性:
# 第一样本 logits=-10 (很小), target=0 -> 预测正确,loss应很小
# 第三样本 logits=5 (很大), target=1 -> 预测正确,loss应很小
相关推荐
lili-felicity3 分钟前
CANN异步推理实战:从Stream管理到流水线优化
大数据·人工智能
做人不要太理性4 分钟前
CANN Runtime 运行时组件深度解析:任务下沉执行、异构内存规划与全栈维测诊断机制
人工智能·神经网络·魔珐星云
不爱学英文的码字机器4 分钟前
破壁者:CANN ops-nn 仓库与昇腾 AI 算子优化的工程哲学
人工智能
晚霞的不甘7 分钟前
CANN 编译器深度解析:TBE 自定义算子开发实战
人工智能·架构·开源·音视频
愚公搬代码8 分钟前
【愚公系列】《AI短视频创作一本通》016-AI短视频的生成(AI短视频运镜方法)
人工智能·音视频
哈__8 分钟前
CANN内存管理与资源优化
人工智能·pytorch
极新9 分钟前
智启新篇,智创未来,“2026智造新IP:AI驱动品牌增长新周期”峰会暨北京电子商务协会第五届第三次会员代表大会成功举办
人工智能·网络协议·tcp/ip
island131410 分钟前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
艾莉丝努力练剑11 分钟前
深度学习视觉任务:如何基于ops-cv定制图像预处理流程
人工智能·深度学习
禁默16 分钟前
大模型推理的“氮气加速系统”:全景解读 Ascend Transformer Boost (ATB)
人工智能·深度学习·transformer·cann