深度学习实现时存在的计算精度问题

以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错的程度非常大,而被忽略了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值