DeepLearning-Numerical Stability数值稳定性
Numerical Stability
讨论一些用于提高数值稳定性的方法。
Softmax Numerical Stability
1.softmax激活函数
z_j=w_j * x+b (w_j x 均为向量)
使用softmax计算神经元的激活值时,首先要根据线性加权计算得到的z进行指数运算,但由于z可能比较大,就会导致栈溢出的情况
# softmax在映射之前,需要先计算z=wx+b---->e^z(如果z太大有可能会导致栈溢出)
for z in [500, 600, 700, 800]:
ez = np.exp(z)
zs = "{" + f"{z}" + "}"
print(f"e^{zs} = {ez:0.2e}") # e800导致栈溢出
def my_softmax(z):
ez = np.exp(z)
sm = ez / np.sum(ez)
return sm
z_tmp = np.array([[500, 600, 700, 800]])
print(my_softmax(z_tmp))
2.进行优化
#####
# 优化
# softmax: ai=e^zi/(e^z1+.....+e^zn) (i=1...n)
# 优化后 ai=e^zi * e^-x/(e^z1+.....+e^zn)*e^-x (i=1...n x=max(z)) 上下同时乘以e^(-x),ai不会受到影响且可防止e^zi过大导致栈溢出
#####
def my_softmax_ns(z):
"""numerically stablility improved"""
bigz = np.max(z)
ez = np.exp(z - bigz)
sm = ez / np.sum(ez)
return sm
z_tmp = np.array([[500, 600, 700, 800]])
print(my_softmax_ns(z_tmp))
Cross Entropy Loss Numerical Stability
使用softmax激活函数,在计算交叉熵时,同样可以进行优化。
1.损失函数
以目标值y=2为例,其损失为:
2.进行优化
利用log(a/b) = log(a) - log(b)化简