sigmoid函数被定义为
我发现使用C内置函数exp()
计算f(x)
值很慢。有没有更快的算法来计算f(x)
?
最好先在硬件上进行测量。只是一个快速的基准测试脚本显示,在我的机器上1/(1+|x|)
是最快的,tanh(x)
是接近的第二个。错误功能erf
也相当快。
% gcc -Wall -O2 -lm -o sigmoid-bench{,.c} -std=c99 && ./sigmoid-bench
atan(pi*x/2)*2/pi 24.1 ns
atan(x) 23.0 ns
1/(1+exp(-x)) 20.4 ns
1/sqrt(1+x^2) 13.4 ns
erf(sqrt(pi)*x/2) 6.7 ns
tanh(x) 5.5 ns
x/(1+|x|) 5.5 ns
我期望结果可能会有所不同,取决于架构和所使用的编译器,但erf(x)
(自C99以来),tanh(x)
并x/(1.0+fabs(x))
可能是快速的
你不必在神经网络算法中使用实际的精确S形函数,可以用具有相似特性但计算速度更快的近似版本替换它。
例如,你可以使用“fast sigmoid”功能
f(x) = x / (1 + abs(x))
如果f(x)的参数不接近零,那么使用exp(x)的系列展开式的第一项不会有太大的帮助,而且如果参数是“large”。
另一种方法是使用表查找。也就是说,你可以对给定数量的数据点预先计算S形函数的值,然后在它们之间进行快速(线性)插值。