数值问题简述:数值溢出、病态条件

一、上溢和下溢

一种毁灭性的舍入误差是 下溢(underflow)。当接近零的数被四舍五入为零时发生下溢。许多函数在其参数为零而不是一个很小的正数时才会表现出质的不 同。例如,我们通常要避免被零除(一些软件环境将在这种情况下抛出异常,有些会返回一个非数字 (not-a-number, NaN) 的占位符,比如python和MATLAB中)或避免取零的对数(这通常被视为 −∞,进一步的算术运算会使其变成非数字)。

另一个极具破坏力的数值错误形式是 上溢(overflow)。当大量级的数被近似为 ∞ 或 −∞ 时发生上溢。进一步的运算通常会导致这些无限值变为非数字。

必须对上溢和下溢进行数值稳定的一个例子是 softmax 函数(softmax func-tion)。softmax在机器学习中常用在输出层。定义为:

上面这个例子其实也告诉我们,可以用一些数学方法来避免下溢、上溢现象的发生。针对不同的算式我们有不同的方法来处理数值溢出问题,由于种类太多我们不一一举例细讲,大家遇到时可以去搜索解决方法。

开发者要做的就是:在实现机器学习、深度学习算法过程汇总,牢记数值问题!

在某些情况下,我们有可能在实现一个新的算法时自动保持数值稳定。Theano (Bergstra et al., 2010a; Bastien et al., 2012a) 就是这样软件包的一个例子,它能自动检测并稳定深度学习中许多常见的数 值不稳定的表达式。

二、病态条件

关于病态矩阵的话题,我在之前一篇博文《 Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”》中提到过,还举了一个实例,大家看一下那个例子就能很直观地理解。下面只补充讲个概念:条件数。

条件数表征函数相对于输入的微小变化而变化的快慢程度。输入被轻微扰动而迅速改变的函数对于科学计算来说可能是有问题的,因为输入中的舍入误差可能导致输出的巨大变化。

考虑一个函数:

当A具有特征值分解时,其条件数为:

(什么是特征值分解?什么是SVD分解?参见《矩阵的特征分解和奇异值(SVD)分解——求法和意义》)

条件数式子意义就是最大和最小特征值的模之比 。当该数很大时,矩阵求逆对输入的误差特别敏感。这种敏感性是矩阵本身的固有特性,而不是矩阵求逆期间舍入误差的结果。即使我们乘以完全正确的矩阵逆,病态条件的矩阵也会放大预先存在的误差(见上上面博文里的例子)。在实践中,该错误将与求逆过程本身的数值误差进一步复合,一直传导下去,最后可能会导致巨大的误差。所以矩阵的形态问题不容忽视。

猜你喜欢

转载自blog.csdn.net/lyxleft/article/details/84932449