用Java加速数学计算

用Java加速数学计算,java,neural-network,mathematical-optimization,Java,Neural Network,Mathematical Optimization,我有一个用Java编写的神经网络,它使用一个sigmoid传递函数,定义如下: private static double sigmoid(double x) { return 1 / (1 + Math.exp(-x)); } 这在使用网络进行训练和计算时被多次调用。有没有办法加快速度?这并不是说它很慢,只是因为它被大量使用,所以这里的一个小的优化将是一个很大的整体收益。从数学的角度来看,我看不到任何优化它的可能性。对于神经网络,你不需要sigmoid函数的精确值。因此,您可以预先计

我有一个用Java编写的神经网络,它使用一个sigmoid传递函数,定义如下:

private static double sigmoid(double x)
{
    return 1 / (1 + Math.exp(-x));
}

这在使用网络进行训练和计算时被多次调用。有没有办法加快速度?这并不是说它很慢,只是因为它被大量使用,所以这里的一个小的优化将是一个很大的整体收益。

从数学的角度来看,我看不到任何优化它的可能性。

对于神经网络,你不需要sigmoid函数的精确值。因此,您可以预先计算100个值并重用最接近您输入的值,或者(如注释所述)从相邻值进行插值

如何做到这一点,请参见本节(从中窃取的链接)

这是S形函数:

如您所见,只有-10

编辑:很抱歉,我在这里显示了错误的图表。我已经更正了。

这是一个非常平滑的函数,因此查找和插值方案可能就足够了


当我在
-10范围内绘制函数时,如果有许多节点的x值在-10..+10框之外,则可以完全忽略计算这些值,例如,这样

if( x < -10 )
    y = 0;
else if( x > 10 )
    y = 1;
else
    y = 1 / (1 + Math.exp(-x));
return y;
这会两次命中exp(),您可以将代价高昂的计算缓存在临时变量中,如下所示

temp = exp(-x);
y = (1 - temp) / (1 + temp);

在BP网络中有很多地方可以使用这种方法。

x的值是否曾经重复过,或者每次调用该方法时它们是否总是不同?此外,结果需要多精确?@Dave-取决于所需的精度,但它们都是浮点数,非常独特,你对程序进行了分析,了解到改进这一点将显著提高整体性能吗?@Refactor加速计算实际上是NN理论家们的共同话题,所以我发现这个反应是多么老套,非常幽默:)如果你想更精确一点,可能超过100。一个包含5000个(甚至可能1000个)值的查找表绝对足够IMHO。为了获得更高的精度,最好在最近的两个值之间进行线性插值。问题是对称的,因此您只需要一半的值。计算另一面很简单。这是一个完全不同的函数图。erf(x)很难计算,exp(x)不是。@Ha:捕捉得好。这看起来像是双极乙状结肠功能。OP中的S形函数具有水平渐近线0和1。
temp = exp(-x);
y = (1 - temp) / (1 + temp);