You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中binary_cross_entropy为何将ln(0)处理为-100?

PyTorch中binary_cross_entropy处理ln(0)的实现原因

这本质是PyTorch为了数值稳定性做的工程优化,具体逻辑如下:

  • 避免无穷大/NaN的核心需求
    数学上ln(0)确实趋近于负无穷,但直接计算会导致反向传播时梯度爆炸或NaN,彻底中断训练流程。深度学习训练中,模型输出的概率值偶尔趋近于0或1是很常见的,因此必须做截断处理来规避这个问题。

  • 具体截断规则
    PyTorch在计算binary_cross_entropy时,会先把输入的预测概率(第一个参数)钳位到一个极小的安全区间内,避免取到0或1。当概率趋近于0时,会将log(q)的结果截断为-100(对应q≈1e-43,因为ln(1e-43)≈-100)。

    回到你的例子:调用F.binary_cross_entropy(p,q)时,公式展开为:
    H = -[q₀*log(p₀) + q₁*log(p₁)] = -[0.25*ln(1) + 0.75*ln(0)]
    由于ln(0)被截断为-100,最终计算结果就是 - [0 + 0.75*(-100)] = 75,和你实际得到的结果一致。

  • 工程优先的设计思路
    这种处理方式牺牲了严格的数学严谨性,但换来了训练流程的稳定性——这是深度学习框架的通用设计原则,毕竟让训练能持续进行比完全贴合数学定义更重要。

内容的提问来源于stack exchange,提问作者Gustavo Mirapalheta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:55:02