Если у вас есть много узлов, где значение х находится вне -10 .. + 10 коробки, вы можете просто опустить, чтобы вычислить эти значения на всех, например, как так ..
if(x < -10)
y = 0;
else if(x > 10)
y = 1;
else
y = 1/(1 + Math.exp(-x));
return y;
Конечно, это приводит к накладным расходам условных проверок для расчета EVERY, поэтому это стоит того, если у вас много насыщенных узлов.
Еще одна вещь, о которой стоит упомянуть, заключается в том, что если вы используете backpropagation, и вам приходится иметь дело с наклоном функции, лучше вычислить ее на куски, а не «как написано».
Я не могу вспомнить наклон в данный момент, но вот что я говорю об использовании биполярного сигмоида в качестве примера. Вместо того, чтобы вычислить этот путь
y = (1 - exp(-x))/(1 + exp(-x));
который бьет ехр() дважды, вы можете кэшировать до дорогостоящих вычислений во временных переменных, например, так
temp = exp(-x);
y = (1 - temp)/(1 + temp);
Есть много мест, чтобы поставить такого рода вещи для использования в сетях BP.
Являются ли значения x когда-либо повторяющимися или это более вероятно, что они всегда будут отличаться при каждом вызове метода? – DaveJohnston
Кроме того, насколько точным должен быть результат? –
@Dave - зависит от желаемой точности, но все они являются числами с плавающей запятой, поэтому довольно много уникальных – Simon