我有一个用Java编写的神经网络,其中使用sigmoid转移函数定义如下:
private static double sigmoid(double x)
{
return 1 / (1 + Math.exp(-x));
}
在训练和使用网络进行计算时,这个操作被多次调用。有没有什么方法可以加速它?并不是说它很慢,只是因为它经常被使用,所以在这里进行小优化将会产生大的整体收益。
我有一个用Java编写的神经网络,其中使用sigmoid转移函数定义如下:
private static double sigmoid(double x)
{
return 1 / (1 + Math.exp(-x));
}
在训练和使用网络进行计算时,这个操作被多次调用。有没有什么方法可以加速它?并不是说它很慢,只是因为它经常被使用,所以在这里进行小优化将会产生大的整体收益。
if( x < -10 )
y = 0;
else if( x > 10 )
y = 1;
else
y = 1 / (1 + Math.exp(-x));
return y;
y = (1 - exp(-x)) / (1 + exp(-x));
如果您需要多次使用exp()函数,可以将昂贵的计算缓存到临时变量中,如下所示:
temp = exp(-x);
y = (1 - temp) / (1 + temp);
在BP网络中有很多地方可以利用这种东西。
这是一个非常平滑的函数,因此查找和插值方案可能已经足够。
当我在-10 <= x <= 10
的范围内绘制该函数时,在极端情况下可以获得五位精度。对于您的应用程序来说,这是否足够好呢?