使用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,提问作者지영채
相关产品推荐
相关产品推荐

