我想出了這個代碼:這是一個正確的方法來找到python sigmoid函數的派生?
def DSigmoid(value):
return (math.exp(float(value))/((1+math.exp(float(value)))**2))
一)將這個返回正確的衍生物。?
b。)這是一種有效的方法嗎?
友好的問候,
Daquicker
我想出了這個代碼:這是一個正確的方法來找到python sigmoid函數的派生?
def DSigmoid(value):
return (math.exp(float(value))/((1+math.exp(float(value)))**2))
一)將這個返回正確的衍生物。?
b。)這是一種有效的方法嗎?
友好的問候,
Daquicker
看起來正確的給我。通常,檢查這種衍生計算的兩種好方法是:
Wolfram Alpha。輸入sigmoid函數1/(1+e^(-t))
,我們給出了一個明確的公式,該公式與您的匹配。爲了更直接一點,您可以輸入D[1/(1+e^(-t)), t]
以獲得沒有所有附加信息的衍生產品。
將其與數值近似進行比較。在你的情況下,我會假設你已經有一個功能Sigmoid(value)
。以
Dapprox = (Sigmoid(value+epsilon) - Sigmoid(value))/epsilon
一些小epsilon
,並將其與你的函數DSigmoid(value)
的輸出應該抓住所有,但最微小的錯誤。一般來說,即使您已經確定了公式,並且幾乎不費吹灰之力,對數值上的導數進行數值估算也是最好的方法來檢查您是否已經正確編寫了導數。
謝謝你的確認,當然你的答案的第二部分非常有趣! – Daquicker
如果數值穩定性是一個問題,還有另外一種可能:前提是你必須提供(如scipy)良好的執行乙狀結腸可以實現它:
from scipy.special import expit as sigmoid
def sigmoid_grad(x):
fx = sigmoid(x)
return fx * (1 - fx)
請注意,這在數學上等同於其他表達式。
在我的情況下,這個解決方案工作,而直接執行導致浮點溢出時計算exp(-x)
。
對不起,如果它看起來很迂腐,但你定義的函數是導數,這個函數不會返回一個導數。它返回一個浮點數。看起來是正確的,應該足夠有效。 –
猜你錯過了兩個指數中的一些'-' ... – Davide