Rapide sigmoïde algorithme
La fonction sigmoïde est défini comme
J'ai trouvé que l'utilisation de la C de la fonction intégrée dans exp()
pour calculer la valeur de f(x)
est lente. Est-il plus rapide de l'algorithme pour calculer la valeur de f(x)
?
Vous devez vous connecter pour publier un commentaire.
vous n'avez pas à utiliser le réel, exact fonction sigmoïde dans un réseau de neurones algorithme, mais peut remplacer avec un pseudo version qui a des propriétés similaires, mais il est plus rapide de calcul.
Par exemple, vous pouvez utiliser le "fast sigmoïde" fonction
À l'aide de premiers termes du développement en série de exp(x) n'aide pas trop si les arguments de f(x) ne sont pas près de zéro, et vous avez le même problème avec un développement en série de la fonction sigmoïde si les arguments sont "grands".
Une alternative est d'utiliser la table de recherche. Qui est, vous précalculer les valeurs de la fonction sigmoïde pour un nombre donné de points de données, puis faire rapide interpolation (linéaire) entre eux si vous le souhaitez.
Il est préférable de mesurer sur votre matériel tout d'abord. Juste un rapide benchmark script montre, que sur ma machine
1/(1+|x|)
est le plus rapide, ettanh(x)
est la seconde près. La fonction d'erreurerf
est assez rapide aussi.Je m'attends à ce que les résultats peuvent varier en fonction de l'architecture et du compilateur utilisé, mais
erf(x)
(depuis C99),tanh(x)
etx/(1.0+fabs(x))
sont susceptibles d'être rapide artistes interprètes ou exécutants.x/sqrt(1+x^2)
au lieu de1/sqrt(1+x^2)
.Les gens d'ici sont principalement préoccupés par la façon rapide d'une fonction par rapport à l'autre et de créer des micro test pour voir si
f1(x)
pistes de 0,0001 ms plus vite quef2(x)
. Le gros problème, c'est que c'est la plupart du temps inutiles, parce que ce qui compte est la vitesse de votre réseau apprend avec votre fonction d'activation en essayant de minimiser vos coûts de fonction.Que de la théorie actuelle, redresseur de fonction et softplus
Alors je vous suggère de jeter des micro-optimisation, et de prendre un coup d'oeil à la fonction qui permet un apprentissage plus rapide (en prenant aussi en regardant divers autres fonction de coût).
À faire NN plus souple généralement utilisé quelques alpha taux de changement de l'angle de graphique autour de 0.
La fonction sigmoïde ressemble:
Près équivalent, (mais plus rapide de la fonction) est:
Vous pouvez vérifier les graphiques ici
Lorsque j'utilise la fonction abs réseau devient plus rapide+ de 100 fois.
Cette réponse n'est probablement pas pertinente pour la plupart des cas, mais je voulais juste jeter là-bas que pour CUDA informatique, j'ai trouvé
x/sqrt(1+x^2)
pour être le plus rapide de la fonction de loin.Par exemple, fait avec de simple précision float intrinsèques:
Aussi vous pouvez utiliser la version grossière de la sigmoïde (il des différences non supérieure à 0,2% de l'original):
Optimisation de RoughSigmoid fonction avec l'aide de l'ESS:
Optimisation de RoughSigmoid fonction avec l'aide de AVX:
Vous pouvez utiliser un simple mais efficace, en utilisant la méthode à deux formules:
Cela va ressembler à ceci:
Deux graphiques pour une sigmoïde {en Bleu: (0.5/(1+(x^2))), Jaune: (-0.5/(1+(x^2)))+1}
À l'aide de Eureqa à la recherche d'approximations sigmoïde j'ai trouvé
1/(1 + 0.3678749025^x)
se rapproche de lui. C'est très proche, juste se débarrasser d'une opération, avec la négation de x.Certaines autres fonctions montrées ici sont intéressants, mais c'est le fonctionnement de la puissance vraiment lent? Je l'ai testé et il a effectivement fait plus rapidement qu'ailleurs, mais ça pourrait simplement être un coup de chance. Si donc, il devrait être tout aussi rapide ou plus rapide que tous les autres.
EDIT:
0.5 + 0.5*tanh(0.5*x)
et moins précis,0.5 + 0.5*tanh(n)
fonctionne également. Et vous pourrait simplement se débarrasser de l'une des constantes suivantes si vous ne se soucient pas de faire entre l'intervalle [0,1] comme sigmoïde. Mais il suppose que tanh est plus rapide.La fonction tanh peut être optimisé dans certaines langues, le rendant plus rapide qu'une mesure x/(1+abs(x)), tel est le cas de Julia.
Je ne pense pas que vous pouvez faire mieux que dans le haut-exp (), mais si vous voulez une autre approche, vous pouvez utiliser l'extension de la série. WolframAlpha peut calculer pour vous.