RuntimeWarning: overflow encountered in exp

今天在sigmoid 函數中使用 numpy.exp 的時候,遇到了 RuntimeWarning: overflow encountered in exp ,看到其他人的博客裏面的解決方法。

# https://www.cnblogs.com/zhhy236400/p/9873322.html
def sigmoid(inx):
    if inx>=0:      #對sigmoid函數的優化,避免了出現極大的數據溢出
        return 1.0/(1+exp(-inx))
    else:
        return exp(inx)/(1+exp(inx))

作者其實說清楚了,但是我自己看得時候,總覺得不太直觀,差那麼一點意思。於是就自己寫一下。

f(x)=exf(x) = e^x 的函數如下圖:
在這裏插入圖片描述

x>=0x >= 0 時,exe^xxx 增長比較快,就很容易上溢。

對於 sigmoid 函數,
sigmoid=11+ex sigmoid = \frac{1}{1 + e^{-x}}
如果在使用過程中 x<0x < 0exe^{-x} 就非常容易上溢。

RuntimeWarning: overflow encountered in expsigmoid 本身沒有關係,只和 exe^{-x} 有關。

  • x<0,t=x,t>0,etx < 0, 令 t = -x, 則t > 0, e^t 就非常容易上溢出。
  • x>0,t=x,t<0,et(0,1)x > 0, 令 t = -x, 則t < 0, e^t \in (0, 1) 就不會有什麼問題。


11+ex=exex+1 \frac{1}{1 + e^{-x}} = \frac{e^x}{e^{x} + 1}
那麼就可以根據 xx 是否大於零,來選擇兩個公式。

但是 x>0x > 0 時,exe^x 同樣有下溢的風險。
只是 numpy 報了 warning ,而 python 沒有報而已,兩者並沒有任何差別。

參考:
https://www.cnblogs.com/zhhy236400/p/9873322.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章