2

J'écris un réseau neuronal de base en Java et j'écris les fonctions d'activation (actuellement je viens d'écrire la fonction sigmoïde). J'essaye d'employer double s (comme apposé à BigDecimal) avec des espoirs que la formation prendra réellement une quantité raisonnable de temps. Cependant, j'ai remarqué que la fonction ne fonctionne pas avec des entrées plus grandes. À l'heure actuelle ma fonction est:À quel point une fonction d'activation doit-elle être précise et quelle sera sa taille?

public static double sigmoid(double t){ 

    return (1/(1 + Math.pow(Math.E, -t))); 

} 

Cette fonction retourne des valeurs très précises tout en bas quand t = -100, mais quand t >= 37 la fonction retourne 1.0. Dans un réseau de neurones typique lorsque l'entrée est normalisée, est-ce correct? Un neurone obtiendra-t-il des intrants sommant plus de 37? Si la taille de la somme des entrées introduites dans la fonction d'activation varie de NN à NN, quels sont les facteurs qui l'affectent? Aussi, est-il possible de rendre cette fonction plus précise? Existe-t-il une alternative plus précise et/ou plus rapide?

Répondre

2

Oui, dans un réseau normalisé double est très bien à utiliser. Mais cela dépend de votre entrée, si votre couche d'entrée est plus grande, votre somme d'entrée sera plus grande bien sûr.

J'ai rencontré le même problème en utilisant C++, après t devenir grand, le compilateur/rte ne prend même pas en compte E^-t et renvoie plain 1, car il ne calcule que la partie 1/1. J'ai essayé de diviser l'entrée déjà normalisée par 1000-1000000 et cela fonctionnait parfois, mais parfois non car j'utilisais une entrée randomisée pour la première époque et ma couche d'entrée était une matrice 784x784. Néanmoins, si votre couche d'entrée est petite, et votre entrée est normalisée cela vous aidera

2

La réponse surprenante est que le double est en réalité plus de précision que nécessaire. This blog article by Pete Warden affirme que même 8 bits sont assez de précision. Et pas seulement une idée académique: les nouvelles puces Pascal de NVidia mettent l'accent sur leur performance en précision simple par-dessus tout, car c'est ce qui importe pour l'apprentissage en profondeur.

Vous devriez normaliser vos valeurs de neurones d'entrée. Si des valeurs extrêmes se produisent encore, il est préférable de les définir sur -1 ou +1. En fait, this answer montre cela explicitement. (D'autres réponses sur cette question sont également intéressantes - la suggestion de juste pré-calculer 100 ou alors des valeurs, et ne pas utiliser Math.exp() ou Math.pow() du tout!)