Si usted tiene una gran cantidad de nodos en los que el valor de x está fuera de la caja -10 .. + 10, puede simplemente dejar de calcular esos valores en absoluto, por ejemplo, al igual que ..
if(x < -10)
y = 0;
else if(x > 10)
y = 1;
else
y = 1/(1 + Math.exp(-x));
return y;
Por supuesto, esto implica la sobrecarga de las comprobaciones condicionales para CADA cálculo, por lo que solo vale la pena si tiene muchos nodos saturados.
Otra cosa que vale la pena mencionar es, si está utilizando la retropropagación, y tiene que lidiar con la pendiente de la función, es mejor calcularla en partes en lugar de 'como está escrito'.
No recuerdo la inclinación en este momento, pero esto es de lo que estoy hablando usando un sigmoide bipolar como ejemplo. En lugar de calcular esta manera
y = (1 - exp(-x))/(1 + exp(-x));
que llega a exp() dos veces, se puede almacenar en caché los cálculos costosos en variables temporales, al igual que
temp = exp(-x);
y = (1 - temp)/(1 + temp);
Hay un montón de lugares para poner este tipo de cosas para usar en redes BP.
¿Se repiten los valores de x o es más probable que siempre sean diferentes cada vez que se llame al método? – DaveJohnston
Además, ¿qué tan preciso debe ser el resultado? –
@Dave - depende de la precisión deseada, pero todos son números flotantes, por lo que es bastante único – Simon