Я пытаюсь реализовать рекуррентную нейронную сеть, где sigmoid
выбран в качестве функции активации.
Мой первый прототип написан на python
и я нахожу sigmoid
является каким-то узким местом программы, составляет ~ 30% от общего времени выполнения.
# x is a fixed size vector here
def sigmoid(x):
return numpy.reciprocal(1.0 + numpy.exp(-x))
Поэтому я попробовал другую реализацию
def sigmoid(x):
y = numpy.exp(x)
return y/(1+y)
и неожиданно обнаружили, что это на 50% быстрее, чем при первом подходе.
Я также попробовал третий подход
def sigmoid(x):
return (1.0+numpy.tanh(x/2.0))/2.0
, что немного медленнее, чем первый подход.
Позже я протестировал все 3 реализации в C ++. Первые два подхода практически не имеют различий, и tanh
немного (~ 5%) быстрее. Почему это происходит? я думаю numpy
был написан на C ++.
На основе этот кажется, твоя лучшая ставка scipy.special.expit
Других решений пока нет …