Ich versuche ein rekurrentes neuronales Netzwerk zu implementieren, wobei sigmoid
als Aktivierungsfunktion ausgewählt wird.Was ist der schnellste Weg, Sigmoid zu berechnen?
Mein erster Prototyp ist in python
geschrieben und ich finde sigmoid
ist irgendwie der Flaschenhals des Programms, entfallen ~ 30% der gesamten Laufzeit.
# x is a fixed size vector here
def sigmoid(x):
return numpy.reciprocal(1.0 + numpy.exp(-x))
Also habe ich versucht, eine weitere Implementierung
def sigmoid(x):
y = numpy.exp(x)
return y/(1+y)
und überraschend fand es 50% schneller als der erste Ansatz ist.
Ich habe auch versucht, einen dritten Ansatz
def sigmoid(x):
return (1.0+numpy.tanh(x/2.0))/2.0
, die etwas langsamer als der erste Ansatz ist.
Später habe ich alle 3 Implementierungen in C++ getestet. Die ersten beiden Ansätze haben kaum einen Unterschied, und tanh
ist leicht (~ 5%) schneller. Warum passiert das? Ich denke, numpy
wurde in C++ geschrieben.