我正在尝试实现一个循环神经网络,其中选择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
第二种方法比第一种略慢。
后来我在C++中测试了这3种实现。前两种方法几乎没有区别,而tanh
稍微快一些(约5%)。为什么会这样?我想numpy
是用C++编写的。