[英]Avoiding overflow error for exp in numpy
我在numpy中實現以下功能:
def weak_softmax(a):
b=np.exp(a)
return b/(1+np.sum(b))
數組a
的大小很小,但條目有時可能很大,可能多達1000
。 因此,由於指數函數的溢出,我經常收到以下錯誤:
a=np.array([1000,1000])
a=weak_softmax(a)
上面的代碼返回向量a=[nan nan]
並引發以下警告:
Warning: overflow encountered in exp
有什么聰明的方法可以避免此問題,但仍按預期返回數組b
? 這是因為b
所有條目都小於一個,並且我認為必須可以通過一些技巧來避免此問題。
對於大小合適的c
您可以簡單地將分子和分母除以相同的系數exp(c)
。
以下代碼使用np.finfo
檢查是否可能發生溢出並計算c
。
def modified_soft_max(a, SAFETY=2.0):
mrn = np.finfo(a.dtype).max # largest representable number
thr = np.log(mrn / a.size) - SAFETY
amx = a.max()
if(amx > thr):
b = np.exp(a - (amx-thr))
return b / (np.exp(thr-amx) + b.sum())
else:
b = np.exp(a)
return b / (1.0 + b.sum())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.