Это правильный способ найти производную сигмоидальной функции в Python? - PullRequest
2 голосов
/ 27 сентября 2011

Я придумал этот код:

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

a.) Вернет ли это правильную производную?
b.) Это эффективный метод?

С уважением,
Daquicker

Ответы [ 2 ]

5 голосов
/ 27 сентября 2011

выглядит правильно для меня. В общем, два хороших способа проверки таких производных вычислений:

  1. Wolfram Alpha . Ввод сигмовидной функции 1/(1+e^(-t)) дает нам явную формулу для производной, которая соответствует вашей. Чтобы быть немного более прямым, вы можете ввести D[1/(1+e^(-t)), t], чтобы получить производную без всей дополнительной информации.

  2. Сравните это с числовым приближением. В вашем случае я предполагаю, что у вас уже есть функция Sigmoid(value). Принимая

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

    для небольшого числа epsilon и сравнение его с выводом вашей функции DSigmoid(value) должно отлавливать все, кроме самых мелких ошибок. В целом, числовая оценка производной - это лучший способ перепроверить, правильно ли вы закодировали производную, даже если вы уже уверены в формуле, и это почти не требует усилий.

1 голос
/ 17 апреля 2015

В случае, если численная стабильность является проблемой, существует другая возможность: при условии, что у вас есть хорошая реализация доступной сигмоиды (например, в scipy ), вы можете реализовать ее как:

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

Обратите внимание, что это математически эквивалентно другому выражению.

В моем случае это решение работало, в то время как прямая реализация вызывала переполнение с плавающей запятой при вычислении exp(-x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...