深度学习关于数值计算的学习笔记
1、上溢和下溢
由于计算机是用有限数量的位模式表现无限多可能的实数,所以计算机表示实数会带有一定的误差(特别是浮点数的运算)。因此多次计算中不断地产生的误差累加起来可能会导致算法的失效
(1) 下溢:由于数值精度不够导致接近零的数被四舍五入或截断为零(在某些算法中会直接导致算法失效,例如除数上有0,或者对数取0等,使得算数运算变为非数字。)
(2)上溢:由于某种数据类型的数值精度不够,在记录一些超出了该数据类型的表示范围的数值时会导致上溢。(例如C语言中的int类型赋值100000000时)
2.解决上溢和下溢问题
对于Softmax函数:
当xi很小的时候,exp(xi)会下溢,softmax函数的分母会是0
所以怎样所以怎样规避这些问题呢?我们可以用同一个方法解决他们:
令 M = max(xi), i =1,2,3,….,n,即M为所有xi 中最大的值,那么我们只需要计算f(xi - M)的值,就可以解决上溢出、下溢出的问题了,并且,计算结果理论上仍然和f(xi) 保持一致。
举个实例:还是以前面的图为例,本来我们计算 f(z2)是用“常规”方法来算的:
其中,
M=3是z1,z2,z3中的最大值。可见计算结果并未改变。
通过这样的变换,对任何一个 xi,减去M之后,e 的指数的最大值为0,所以不会发生上溢出;同时,分母中也至少会包含一个值为1的项,所以分母也不会下溢出(四舍五入为0)。