sigmoid函数定义为
我发现使用C内置函数exp()
计算f(x)
的值很慢。有没有更快的算法来计算f(x)
的值
发布于 2012-05-24 16:33:54
您不必在神经网络算法中使用实际的、精确的sigmoid函数,但可以用具有类似属性但计算速度更快的近似版本来替换它。
例如,您可以使用"fast sigmoid“函数
f(x) = x / (1 + abs(x))
如果f(x)的参数不接近于零,则使用exp(x)的级数展开的第一项不会有太大帮助,如果参数“大”,则使用sigmoid函数的级数展开也会遇到同样的问题。
另一种方法是使用表查找。也就是说,您可以预先计算给定数量的数据点的sigmoid函数的值,然后根据需要在它们之间进行快速(线性)插值。
发布于 2013-03-29 21:13:31
最好先在硬件上进行测量。快速基准测试script显示,在我的机器上,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))
可能是执行速度最快的。
发布于 2013-04-27 19:24:37
为了使神经网络更灵活,通常使用一些alpha率来改变图形的角度,使其在0附近。
sigmoid函数如下所示:
f(x) = 1 / ( 1+exp(-x*alpha))
几乎等同的(但更快的函数)是:
f(x) = 0.5 * (x * alpha / (1 + abs(x*alpha))) + 0.5
您可以查看图形here
当我使用abs功能时,网络变得更快,100+时间。
https://stackoverflow.com/questions/10732027
复制相似问题