> LVSD <-metaprop(event = Event, n=Total, data= LVSD, studlab = paste(Author))Error in runGLMM(list.prop, method.tau = method.tau, method.random.ci = method.random.ci, : Error in (function (ai, bi, ci, di, n1i, n2i, x1i, x2i, t1i, t2i, xi, : Cannot fit ML model (set 'verbose=TRUE' to obtain further details).
最好先在硬件上进行测量。只是一个快速的基准测试脚本显示,在我的机器上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形函数的值,然后在它们之间进行快速(线性)插值。