摘要 计算机的错误计算(四)探讨了计算机对一元二次方程的计算精度问题。本文讨论导数的计算精度问题。
任给一个单变元函数与一个自变量的值,有两类方法可以计算函数在该值处的导数:数值法与符号法。其中前者是根据导数的定义或其变种来计算,而后者是先求出导函数然后将值代入而得。
下面通过一个案例来讨论用数值法计算导数时计算机的计算结果的精度问题。
例1[1]. 用中心差商公式求 在
的如下导数值:
从理论上说,步长 越小,计算结果就越准确,但实际情况是怎样呢?
首先,导数的准确值为
假设 ,用下列C代码计算
则Visual Studio 2010 下,输出为 0.288675134607619。这样,正确有效数字有 9 位。
但是,若缩小步长,比如取 (即改上面代码中的
为
),则同样的环境,输出为 0.333066907387547。这时,没有 1 位 正确数字。计算机算出的结果毫无价值。
您若不方便编程验证,那么可以拷贝
(sqrt(3+1e-5)-sqrt(3-1e-5))/(2*1e-5)
或
(sqrt(3+1e-15)-sqrt(3-1e-15))/(2*1e-15)
至 Excel 的单元格中计算(先输入 = ,然后 粘贴进去,再 回车),看看效果如何。
最后再总结一句:梯度是许多个偏导数的组合,并且在人工智能中被广泛应用于优化算法中。因此,建议人工智能专家关注导数计算精度对模型训练和预测的影响。
参考文献
[1] 曾喆昭, 文卉. 数值计算.北京: 清华大学出版社, 2005.