Si vous avez beaucoup de noeuds où la valeur de x est en dehors de -10 .. + 10 boîte, vous pouvez simplement omettre de calculer ces valeurs à tous, par exemple, comme si ..
if(x < -10)
y = 0;
else if(x > 10)
y = 1;
else
y = 1/(1 + Math.exp(-x));
return y;
Bien sûr, cela entraîne la surcharge des contrôles conditionnels pour CHAQUE calcul, donc cela ne vaut que si vous avez beaucoup de nœuds saturés. Une autre chose qui vaut la peine d'être mentionnée est que, si vous utilisez la rétropropagation, et que vous devez gérer la pente de la fonction, il est préférable de la calculer en morceaux plutôt que «tel qu'écrit».
Je ne me souviens pas de la pente pour l'instant, mais voici ce dont je parle en utilisant un sigmoïde bipolaire comme exemple. Plutôt que de calculer cette façon
y = (1 - exp(-x))/(1 + exp(-x));
qui frappe exp() deux fois, vous pouvez mettre en cache les calculs coûteux dans les variables temporaires, comme si
temp = exp(-x);
y = (1 - temp)/(1 + temp);
Il y a beaucoup d'endroits pour mettre ce genre de chose à utiliser dans les moustiquaires BP.
Les valeurs de x sont-elles répétées ou est-il plus probable qu'elles seront toujours différentes chaque fois que la méthode est appelée? – DaveJohnston
En outre, à quel point le résultat doit-il être précis? –
@Dave - dépend de la précision désirée, mais ils sont tous des nombres à virgule flottante, donc à peu près unique – Simon