加快Java中的数学计算

时间:2010-05-22 11:03:25

标签: java neural-network mathematical-optimization

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

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

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

4 个答案:

答案 0 :(得分:21)

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

article(从answer of s-lott中窃取的链接)中描述了如何执行此操作。

这是sigmoid函数:Sigmoid function graph

如您所见,只有-10 <10的值。 x&lt; 10都很有趣。并且,正如另一条评论所述,该功能是对称的。您只需要存储一半的值。


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

答案 1 :(得分:5)

如果你有很多节点,其中x的值在-10 .. + 10框之外,你可以省略计算这些值,例如,如此...

if( x < -10 )
    y = 0;
else if( x > 10 )
    y = 1;
else
    y = 1 / (1 + Math.exp(-x));
return y;

当然,这会产生每次计算的条件检查的开销,所以只有你有很多饱和节点才值得。

另一件值得一提的是,如果你使用反向传播,并且你必须处理函数的斜率,最好将它计算成碎片而不是“写入”。

我不记得此刻的斜率,但这就是我所说的以双极S形为例。而不是以这种方式计算

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

两次点击exp(),你可以在临时变量中缓存昂贵的计算,如此

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

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

答案 2 :(得分:1)

这是一个非常流畅的功能,因此查找和插值方案可能已经绰绰有余了。

当我在-10 <= x <= 10的范围内绘制函数时,我在极端情况下得到五位精度。这对你的申请来说足够好吗?

答案 3 :(得分:0)

从数学的角度来看,我认为没有任何优化它的可能性。