Ускорение математических вычислений в Java

У меня есть нейронная сеть, написанная на Java, которая использует сигмоидную передаточную функцию, определенную следующим образом:

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

и это называется много раз во время обучения и вычислений с использованием сети. Есть ли способ ускорить это? Дело не в том, что он медленный, просто он используется много, поэтому небольшая оптимизация здесь будет большим общим выигрышем.

4 ответов


для нейронных сетей, Вам не нужно точное значение функции сигмовидной. Таким образом, вы можете предварительно вычислить 100 значений и повторно использовать значение, которое ближе всего к вашему входу, или даже лучше (как указано в комментарии) сделать интерполяцию из соседних значений.

Как вы можете это сделать, описано в этой статьи (ссылка украдена у ответ s-lott).

Это сигмовидная функция:Sigmoid function graph

Как вы можете см., только значения -10


Edit: мне жаль, что я показал здесь неправильный график. Я исправил это.


Если у вас много узлов, где значение x находится вне -10..+ 10 box, вы можете просто опустить, чтобы вычислить эти значения вообще, например, так ..

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

конечно, это влечет за собой накладные расходы условных проверок для каждого расчета, поэтому это стоит, только если у вас есть много насыщенных узлов.

еще одна вещь стоит упомянуть, если вы используете backpropagation, и вам нужно иметь дело с наклоном функции, лучше вычислить его в пьесы, а не "как написано".

Я не могу вспомнить наклон на данный момент, но вот что я говорю об использовании биполярного сигмоида в качестве примера. Вместо того, чтобы вычислять таким образом

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

который дважды попадает в exp (), вы можете кэшировать дорогостоящие вычисления во временных переменных, например

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

есть много мест, чтобы положить такого рода вещи для использования в сетях BP.


Это довольно гладкая функция, поэтому схема поиска и интерполяции, вероятно, будет более чем достаточной.

когда я строю функцию в диапазоне -10 <= x <= 10, Я получаю точность пять мест в крайностях. Этого достаточно для вашего заявления?


с математической точки зрения, я не вижу никакой возможности оптимизировать его.