binary_cross_entropy和binary_cross_entropy_with_logits的区别

binary_cross_entropy和binary_cross_entropy_with_logits的区别

引言

二分类问题是常见的机器学习任务之一,其目标是将样本分为两个类别。为了训练一个二分类模型,通常使用交叉熵作为损失函数。

二分类交叉熵损失函数有两种不同的形式,分别是 binary_cross_entropy_with_logits 和 binary_cross_entropy。在 PyTorch 中,这两种损失函数都是可用的,它们的区别在于输入的形式不同,以及它们分别是在什么情况下使用更合适。


无论生活中发生什么,你都可以选择快乐。 悲伤从来都不是一种选择。 快乐的关键是要知道你可以控制你接受什么和放弃什么。

主要区别与说明

binary_cross_entropy_with_logits 通常用于二元分类问题,其中每个样本都只属于两个类别之一。此损失函数的输入应该是模型的预测值和真实标签,通常是使用sigmoid函数将最终的输出值转换为概率值。

binary_cross_entropy 也是用于二元分类问题的损失函数,但其输入应该是模型的预测值和真实标签的概率值。因此,在使用此损失函数时,需要将模型的输出值使用sigmoid函数转换为概率值,然后再将其与真实标签进行比较。

总之,binary_cross_entropy_with_logits 适用于模型输出未经过概率变换的情况,而 binary_cross_entropy 适用于模型输出已经是概率值的情况。

实例说明

以下是一个基于PyTorch的实例,展示如何使用两种损失函数:

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

# 创建一个样例数据
y_true = torch.Tensor([1, 0, 1, 1])
y_pred = torch.Tensor([0.9, 0.1, 0.8, 0.7])

# 使用binary_cross_entropy_with_logits计算损失函数
loss_logits = nn.BCEWithLogitsLoss()(y_pred, y_true)
print("loss with logits:", loss_logits)

# 错误示例
loss_sigmoid_error = nn.BCELoss()(y_pred, y_true)
print("注意:错误示例 loss with sigmoid_error:", loss_sigmoid_error)  # !!!注意:可以直接计算,但是这样的计算式错误的

# 使用binary_cross_entropy计算损失函数
y_pred_sigmoid = torch.sigmoid(y_pred)
print("y_pred_sigmoid:", y_pred_sigmoid)
loss_sigmoid = nn.BCELoss()(y_pred_sigmoid, y_true)
print("loss with sigmoid:", loss_sigmoid)

运行输出如下:

bash 复制代码
loss with logits: tensor(0.4650)
注意:错误示例 loss with sigmoid_error: tensor(0.1976)
y_pred_sigmoid: tensor([0.7109, 0.5250, 0.6900, 0.6682])
loss with sigmoid: tensor(0.4650)

其中,使用nn.BCEWithLogitsLoss()函数计算binary_cross_entropy_with_logits损失函数,而使用nn.BCELoss()函数计算binary_cross_entropy损失函数。在实际使用中,建议优先使用binary_cross_entropy_with_logits损失函数。

总结

binary_cross_entropy_with_logits 和 binary_cross_entropy 两者都是用于二分类问题中的损失函数。它们的主要区别在于输入的形式以及计算方式。

binary_cross_entropy_with_logits的输入是网络输出的logits(未经sigmoid函数激活的),并且该函数会自动进行sigmoid函数激活处理。而binary_cross_entropy的输入是经过sigmoid函数激活的概率值。因此使用binary_cross_entropy_with_logits会更加方便且稳定,因为它可以避免数值计算溢出的情况。

这里的logits指的是,该损失函数已经内部自带了计算logit的操作,无需在传入给这个loss函数之前手动使用sigmoid/softmax将之前网络的输入映射到0,1之间。事实上,官方是推荐使用函数带有with_logits的,解释是

This loss combines a Sigmoid layer and the BCELoss in one single class. This version is more numerically stable than using a plain Sigmoid followed by a BCELoss as, by combining the operations into one layer, we take advantage of the log-sum-exp trick for numerical stability.

翻译一下就是说将sigmoid层和binaray_cross_entropy合在一起计算比分开依次计算有更好的数值稳定性,这主要是运用了log-sum-exp技巧。

reference

@misc{BibEntry2023Oct,

title = {{pytorch损失函数binary{ _ \_ }cross{ _ \ }entropy和binary{ _ \ }cross{ _ \ }entropy{ _ \ }with{ _ \ _}logits的区别-CSDN博客}},

year = {2023},

month = oct,

urldate = {2023-10-06},

language = {chinese},

note = {Online; accessed 6. Oct. 2023},

url = {https://blog.csdn.net/u010630669/article/details/105599067}

}

相关推荐
不像程序员的程序媛44 分钟前
maven基础
python·pycharm·maven
xiaogai_gai2 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
benchmark_cc2 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu2 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
估值探索者3 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
田里的水稻4 小时前
PyTorch_Dataloader\TensorBoard---数据加载与可视化
人工智能·pytorch·python·神经网络·机器学习
Dmz丶4 小时前
前端转 AI 100 天 Day 27:Docker 容器化——从“我电脑能跑“到“到处能跑“
python
卿卿的产品经理日记4 小时前
【AI产品经理实战】Day 38|try-except 踩坑实录:报错是数据
人工智能·笔记·python·学习·产品经理
全栈练习生4 小时前
文档智能与实践
python·ai
隐擎fox4 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip