一种极具毁灭性的舍入误差是下溢(underflow)。当接近零的数被四舍五入为零时发生下溢。另一个极具破坏力的数值错误形式是上溢(overflow)。当大量级的数被近似为 ∞ 或 -∞ 时发生上溢。进一步的运算通常会导致这些无限值变为非数字。必须对上溢和下溢进行数值稳定的一个例子是softmax 函数(softmax function)。softmax 函数经常用于预测与 Multinoulli 分布相关联的概率,定义为
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!
softmax直白来说就是将原来输出是[3,1,-3][3,1,-3] 通过softmax函数一作用,就映射成为(0,1)的值为(0.88,0.12,0),而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!
但是:
- 从数值计算上说,如果 c 是很小的负数,exp(c) 就会下溢。这意味着 softmax 函数的分母会变成 0,所以 最后的结果是未定义的。
- 当 c 是非常大的正数时,exp(c) 的上溢再次导致整个表达 式未定义。
- 这也是深度学习训练过程常见的一个错误,看了本文之后,以后出现inf的时候,至少可以考虑softmax运算的上溢和下溢
解决方法
解决办法很简单:
对任意a都成立,这意味着我们可以自由地调节指数函数的指数部分,一个典型的做法是取 x1x1 、....xnxn 中的最大值:a=max{x1,x2.....xn}
这可以保证指数最大不会超过0,于是你就不会上溢出。即便剩余的部分下溢出了,加了a之后,你也能得到一个合理的值。
正确性证明证明softmax不受输入的常数偏移影响,即
softmax(x)=softmax(x+c)
也就是证明加了偏移c之后,对整个softmax层的作用不起影响。如下: