上溢和下溢

时间:2025-04-03 19:07:16

定义

计算机在表示实数时,一般都会在一些近似误差,这是二进制本身的表示方法造成的。在许多情况下,计算机会对这些值进行舍入,简单的说,就是如果该数只能保留 5 位小数,那么如果该数的值为 1 0 − 6 10^{-6} 106 ,那么该值可能被计算机舍入为 0 。这种舍入所导致的问题在 复合操作 中特别常见。

下溢:当接近于零的数被四舍五入为零时,发生下溢。
上溢: 当大量级的数被近似为 ∞ ∞ 时,发生上溢

其实上溢和下溢在梯度下降过程中就是 梯度消失梯度爆炸 ,无论发生哪一种现象,都会导致模型训练的失败。

例子

softmax 函数是一个典型的很容易发生上溢和下溢的函数,该函数的形式如下:

s o f t m a x ( x ) = e x p ( x i ) ∑ j = 1 n e x p ( x j ) softmax(x)=\frac{exp(x_i)}{\sum_{j=1}^n exp(x_j)} softmax(x)=j=1nexp(xj)exp(xi)

假设所有的 x i x_i xi 等于一个常数 c,那么通过上面的 softmax 函数,所有的输出都为 1 n \frac{1}{n} n1

我们可以大致的估量一下,当 c 很小时, e x p ( x i ) exp(x_i) exp(xi) 就很小,接近于 0 ,即 e x p ( x i ) exp(x_i) exp(xi) 可能发生下溢,进而导致 softmax 函数的输出未定义(分母不能为 0 )。同理,exp© 也可能发生上溢,导致分子和分母都无限大,进而使整个表达式未定义。

解决方案

解决 softmax 上溢和下溢的方式有很多,比如对传入的数值进行处理,即:
s o f t m a x ( z ) z = x − m a x i x i softmax(z) \\ z = x-max_ix_i softmax(z)z=xmaxixi

由于所有的输入全部减去或加上了一个值,输入的大小比例不变,进而 softmax 函数输出的大小比例也不变,即大值还是大值,小值还是小值。

上列式子可以保证,当 c 很大时,z 的最大也仅仅为 0 ,exp© 为 1。进而防止上溢
也可以保证,softma 函数式子的分母必定大于等于 1 ,因为最大的 x i x_i xi - m a x i x i max_ix_i maxixi 等于 0,则 exp(z)为 1,有效的防止了下溢。

附加

除却分母可能造成上溢或者下溢,分子也有可能造成上溢或者下溢,如 log softmax(x),此时分子很小,就会得到输出为 ∞ ∞ 进而造成上溢。