我想出了这段代码:
def DSigmoid(value):
return (math.exp(float(value))/((1+math.exp(float(value)))**2))
a。)这会返回正确的衍生物吗?
b。)这是一种有效的方法吗?
友好的问候,
Daquicker
答案 0 :(得分:5)
对我来说是正确的。通常,检查这种衍生计算的两种好方法是:
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)
的输出进行比较,应该捕获除最小的错误之外的所有错误。一般来说,数字估计导数是仔细检查你是否真正正确编码导数的最好方法,即使你已经确定了公式,也几乎不需要费力。
答案 1 :(得分:1)
如果数值稳定性存在问题,还有另一种可能性:如果您可以很好地实现可用的sigmoid(例如在scipy中),则可以将其实现为:
from scipy.special import expit as sigmoid
def sigmoid_grad(x):
fx = sigmoid(x)
return fx * (1 - fx)
请注意,这在数学上等同于另一个表达式。
在我的情况下,此解决方案有效,而直接实现在计算exp(-x)
时导致浮点溢出。