定义
计算机在表示实数时,一般都会在一些近似误差,这是二进制本身的表示方法造成的。在许多情况下,计算机会对这些值进行舍入,简单的说,就是如果该数只能保留 5 位小数,那么如果该数的值为 1 0 − 6 10^{-6} 10−6 ,那么该值可能被计算机舍入为 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=x−maxixi
由于所有的输入全部减去或加上了一个值,输入的大小比例不变,进而 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),此时分子很小,就会得到输出为 ∞ ∞ ∞进而造成上溢。