[英]Speeding up Math calculations in Java
我有一个用Java编写的神经网络,它使用如下定义的sigmoid传递函数:
private static double sigmoid(double x)
{
return 1 / (1 + Math.exp(-x));
}
这是训练和使用网络计算中多次调用。 有没有办法加速这个? 这并不是说它很慢,只是它被大量使用,所以这里的一个小优化将是一个很大的整体收益。
如果你有很多节点,其中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网络中有很多地方可以使用这种东西。
这是一个非常流畅的函数,因此查找和插值方案可能绰绰有余。
当我在-10 <= x <= 10
的范围内绘制函数时,我在极端情况下得到五位精度。 这对你的申请来说足够好吗?
从数学的角度来看,我认为没有任何优化它的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.