在从事涉及神经网络的 C++ 项目时,我受到 NaN 结果的阻碍。经过大量追踪(试图找到 NaN 的起源),我意识到它的来源是我的 sigmoid 导函数,如下所示。
double sigDer(double n){
return 2*exp(-n) / pow(1 + exp(-n), 2);
}
尽管它有一个全实数域,但诸如 -1008.3 这样的值会导致 NaN 的结果。根据mathematica,正确的结果应该非常接近于零——2.522*10^-438。我已经通过以下方式避免了这个问题:
double sigDer(double n){
double res = 2*exp(-n) / pow(1 + exp(-n), 2);
if( isnan(res) ){
return 0;
} else{
return res;
}
}
有了这个简单的假设,我的代码按预期运行;但是,我仍然不明白为什么 sigDer(<# with large mass>) 不返回〜0。有人可以告诉我C++(Xcode IDE)中NaN的原因,而不是除以零并取负的偶数根吗?
提前致谢!我还想知道为什么 signer(-1008.3) 返回 NaN 以及如何更好/更有效地跟踪 NaN 值的来源。