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

使用TensorFlow实现逻辑回归时Cost Value持续返回NaN问题求助

解决Logistic Regression中Cost Value持续为NaN的问题

看起来你遇到的是逻辑回归交叉熵损失计算里的数值不稳定问题,手动实现交叉熵时很容易踩这个坑,我来帮你分析原因并给出具体解决方案:

问题根源

当模型输出的hypothesis(sigmoid结果)趋近于0或者1时,tf.log(hypothesis)或tf.log(1 - hypothesis)会算出-inf(负无穷),再和标签相乘后,最终损失值就会直接变成NaN。比如:

  • 当Y=1且hypothesis≈0时,Y * tf.log(hypothesis)会得到1 * (-inf),直接让cost变成NaN
  • 当Y=0且hypothesis≈1时,(1-Y) * tf.log(1 - hypothesis)同样会得到1 * (-inf),引发NaN

解决方案

这里有两种简单有效的修复方式,任选其一就能解决问题:

方法1:给hypothesis添加数值裁剪,避免log(0)

在计算损失前,用tf.clip_by_value把hypothesis限制在一个极小的安全区间内,比如[1e-10, 1-1e-10],这样就不会出现log(0)的情况了:

hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
# 添加裁剪操作,避免hypothesis趋近于0或1
hypothesis_clipped = tf.clip_by_value(hypothesis, 1e-10, 0.9999999)
cost = -tf.reduce_mean(Y * tf.log(hypothesis_clipped) + (1 - Y) * tf.log(1 - hypothesis_clipped))

方法2:使用TensorFlow内置的稳定损失函数

TensorFlow提供了tf.nn.sigmoid_cross_entropy_with_logits函数,它内部已经处理了数值不稳定的问题,不需要手动计算sigmoid和交叉熵,计算效率也更高:

# 注意这里不需要先算sigmoid,直接用原始的logits(matmul(X,W)+b)
logits = tf.matmul(X, W) + b
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=Y))

用这个方法的话,你可以删掉手动计算的sigmoid步骤,直接把logits传入损失函数即可。

额外小检查

除了数值问题,你可以快速确认两个小细节:

  • 你的y_data是否确实只有0和1两种取值?如果存在其他值也可能导致损失计算异常
  • 数据集的坐标是否做了归一化?虽然不是NaN的直接原因,但归一化后模型收敛会更稳定

修改后再运行训练,应该就能看到正常的cost值变化了。

内容的提问来源于stack exchange,提问作者지영채

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:33:02