上溢和下溢
计算机通过有限数量的位模式来表示无限多的实数,总会引入一些近似误差。如果涉及时没有考虑最小化舍入误差的累积,在实践时可能会导致算法实效。
下溢:当接近零的数被四舍五入为零时发生下溢。
许多函数在其参数为零而不是一个很小的正数时会表现出质的不同:
避免零除
避免取0的对数
上溢:大量级的数被近似为无穷时发生上溢。
必须对上溢和下溢进行数值稳定的一个例子是softmax函数
softmax(x)i=exp(xi)∑nj=1exp(xj)
softmax(x)i=exp(xi)∑j=1nexp(xj)
问题:假设所有的x_i都等于某个常数c,理论上对所有x_i上式结果为1/n。
如果 c 是很小的负数,exp(c)就会下溢,softmax分母会变成0,最后的结果将为NaN
如果 c 量级很大,exp(c)上溢,导致最后的结果将为NaN
方法:
softmax(z)=softmax(z−maxizi)
softmax(z)=softmax(z−maxizi)
减去最大值导致exp最大为0,排除了上溢的可能性
同样,分母中至少有一个值为1的项(exp(0)=1),从而也排除了因分母=下溢导致被零除的可能性
还需注意分子可能发生下溢,会导致计算 log softmax(x)时得到负无穷。