这是在python中找到sigmoid函数的导数的正确方法吗?

时间:2011-09-27 17:26:46

标签: math

我想出了这段代码:

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

a。)这会返回正确的衍生物吗?
b。)这是一种有效的方法吗?

友好的问候,
Daquicker

2 个答案:

答案 0 :(得分:5)

对我来说是正确的。通常,检查这种衍生计算的两种好方法是:

  1. Wolfram Alpha。输入sigmoid函数1/(1+e^(-t)),我们给出了一个与你的匹配的派生的显式公式。为了更直接一点,您可以输入D[1/(1+e^(-t)), t]来获取衍生产品而不需要所有其他信息。

  2. 将其与数值近似值进行比较。在您的情况下,我假设您已经有一个函数Sigmoid(value)

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

    对于某些小epsilon并将其与函数DSigmoid(value)的输出进行比较,应该捕获除最小的错误之外的所有错误。一般来说,数字估计导数是仔细检查你是否真正正确编码导数的最好方法,即使你已经确定了公式,也几乎不需要费力。

答案 1 :(得分:1)

如果数值稳定性存在问题,还有另一种可能性:如果您可以很好地实现可用的sigmoid(例如在scipy中),则可以将其实现为:

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

请注意,这在数学上等同于另一个表达式。

在我的情况下,此解决方案有效,而直接实现在计算exp(-x)时导致浮点溢出。