4.1 上溢和下溢
连续数学在数字计算机上的根本困难是,我们需要通过有限数量的位模式来表示无限多的实数。这意味着我们在计算机中表示实数时,几乎总会引入一些近似误差。在许多情况下,这仅仅是舍入误差。舍入误差会导致一些问题,特别是当许多操作复合时,即使是理论上可行的算法,如果在设计时没有考虑最小化舍入误差的累积,在实践时也可能会导致算法失效。
一种极具毁灭性的舍入误差是下溢(underflow)。当接近零的数被四舍五入为零时发生下溢。许多函数在其参数为零而不是一个很小的正数时才会表现出质的不同。例如,我们通常要避免被零除(一些软件环境将在这种情况下抛出异常,有些会返回一个非数字(not-a-number,NaN)的占位符)或避免取零的对数(这通常被视为−∞,进一步的算术运算会使其变成非数字)。
另一个极具破坏力的数值错误形式是上溢(overflow)。当大量级的数被近似为∞或−∞时发生上溢。进一步的运算通常会导致这些无限值变为非数字。
必须对上溢和下溢进行数值稳定的一个例子是softmax函数(softmax function)。softmax函数经常用于预测与Multinoulli分布相关联的概率,定义为
考虑一下当所有xi都等于某个常数c时会发生什么。从理论分析上说,我们可以发现所有的输出都应该为。从数值计算上说,当c量级很大时,这可能不会发生。如果c是很小的负数,exp(c)就会下溢。这意味着softmax函数的分母会变成0,所以最后的结果是未定义的。当c是非常大的正数时,exp(c)的上溢再次导致整个表达式未定义。这两个困难能通过计算softmax(z)同时解决,其中z=x−maxi xi。简单的代数计算表明,softmax解析上的函数值不会因为从输入向量减去或加上标量而改变。减去maxi xi导致exp的最大参数为0,这排除了上溢的可能性。同样地,分母中至少有一个值为1的项,这就排除了因分母下溢而导致被零除的可能性。
还有一个小问题。分子中的下溢仍可以导致整体表达式被计算为零。这意味着,如果我们在计算log softmax(x)时,先计算softmax再把结果传给log函数,会错误地得到−∞。相反,我们必须实现一个单独的函数,并以数值稳定的方式计算log softmax。我们可以使用相同的技巧来稳定log softmax函数。
在大多数情况下,我们没有明确地对本书描述的各种算法所涉及的数值考虑进行详细说明。在实现深度学习算法时,底层库的开发者应该牢记数值问题。本书的大多数读者可以简单地依赖保证数值稳定的底层库。在某些情况下,我们有可能在实现一个新的算法时自动保持数值稳定。Theano(Bergstra et al.,2010a;Bastien et al.,2012a)就是这样软件包的一个例子,它能自动检测并稳定深度学习中许多常见的数值不稳定的表达式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论