2011-09-27 5 views
2

이 코드를 생각해 냈습니다.이것은 파이썬에서 시그 모이 드 함수의 파생어를 찾는 올바른 방법입니까?

def DSigmoid(value): 
    return (math.exp(float(value))/((1+math.exp(float(value)))**2)) 

a.) 올바른 파생물을 반환합니까?
b.) 효율적인 방법입니까?

친절한 안부,
Daquicker

+0

미안하지만 미약 한 것처럼 보이지만 파생물로 함수를 정의하면이 함수는 파생물을 반환하지 않습니다. float를 반환합니다. 올바르게 보이고 충분히 효율적이어야합니다. –

+0

두 지수 모두에'-'가 누락 된 것 같습니다 ... – Davide

답변

5

나에게 올바른 찾습니다. 일반적으로, 미분 연산에 의하면 두 가지 좋은 방법은 :

  1. Wolfram Alpha. 시그 모이 드 함수 1/(1+e^(-t))을 입력하면 우리는 당신과 일치하는 파생어에 대한 공식을 얻게됩니다. 좀 더 직접적으로하기 위해 D[1/(1+e^(-t)), t]을 입력하면 모든 추가 정보없이 파생물을 얻을 수 있습니다.

  2. 숫자 근사치와 비교하십시오. 귀하의 경우에는 귀하가 이미 Sigmoid(value) 기능을 가지고 있다고 가정합니다. 몇 가지 작은 epsilon에 대한

    Dapprox = (Sigmoid(value+epsilon) - Sigmoid(value))/epsilon

    촬영하고 기능 DSigmoid(value)의 출력과 비교하면 가장 작은 오류를 제외하고 모두 잡을 것이다. 일반적으로 미분을 수치로 추정하는 것은 공식에 대해 이미 알고있는 경우에도 파생물을 실제로 코딩했는지 다시 확인하는 가장 좋은 방법이며 거의 아무런 노력을하지 않습니다.

    수치 안정성이 문제가되는 경우
+0

확인을 위해 고맙습니다. 물론 답의 두 번째 부분은 매우 흥미 롭습니다! – Daquicker

1

, 또 다른 가능성이있다 : (예 : scipy에서와 같이) 사용할 수있는 S 자형의 좋은 구현을 가지고 제공하는 당신이로 구현할 수 있습니다

from scipy.special import expit as sigmoid 
def sigmoid_grad(x): 
    fx = sigmoid(x) 
    return fx * (1 - fx) 

이것은 수학적으로 다른 표현식과 같습니다.

내 솔루션에서는 exp(-x)을 계산할 때 직접 구현으로 인해 부동 소수점 오버플로가 발생했지만이 솔루션이 효과가있었습니다.

관련 문제