以python语言计算sigmoid和cost函数为例介绍。
- python的正无穷大,负无穷大
a = float('Inf')
b = np.log(0) #结果为-Inf
-a == b #True
- 计算精度问题
理论上 0.0 < a = sigmoid(z) < 1.0
实际上,对python中的float64类型常量值,
sigmoid(36) == 0.9999999999999998
sigmoid(37) == 1.0
sigmoid(-709) == 1.216780750623423e-308
sigmoid(-710) == 0.0
而在计算代价函数时,需要计算
cost_i = - y*log(a) - (1-y)*log(1-a),由于理论上0.0 < a = sigmoid(z) < 1.0,所以理论上不会出现log(0)的情况。
但在python工程实现时,
出现z>=37时,a为1,log(1-a)就为-Inf,此时,若y为0,则cost_i为Inf
出现z<=710时,a为0,log(a)就为-Inf,此时,若y为1,则cost_i为Inf
此时,样本i是预测错误的,而且错误非常大。但在计算代价时,如果把样本i的代价加入总代价J,则J也将成为Inf。所以,通常计算总代价J时,采用np.nansum(...)来忽略这些极端错误的预测,但实际上,样本i错的程度非常大,而被忽略了。
本文探讨了在Python中使用浮点数计算Sigmoid函数和Cost函数时遇到的精度问题,尤其是在处理极大或极小数值时,如z>=37或z<=710,可能导致Sigmoid函数输出为1或0,进而引起Cost函数计算不准确,甚至出现无穷大的情况。文章还介绍了如何通过np.nansum函数来忽略这些极端错误预测,以确保总代价J的正确计算。
196

被折叠的 条评论
为什么被折叠?



