Comment puis-je améliorer la stabilité de mon réseau neuronal?

11

J'utilise le neuralnet en R pour construire un NN avec 14 entrées et une sortie. Je construis / forme le réseau plusieurs fois en utilisant les mêmes données de formation d'entrée et la même architecture / paramètres de réseau.

Une fois que chaque réseau est produit, je l'utilise sur un ensemble autonome de données de test pour calculer certaines valeurs prédites. Je trouve qu'il y a une grande variance dans chaque itération des données prédites, malgré toutes les entrées (à la fois les données de formation et les données de test) restant les mêmes chaque fois que je construis le réseau.

Je comprends qu'il y aura des différences dans les pondérations produites dans le NN à chaque fois et qu'il n'y aura pas deux réseaux de neurones identiques, mais que puis-je essayer de produire des réseaux plus cohérents dans chaque train, étant donné les données identiques?

tfb
la source
Pouvez-vous nous donner un peu plus de détails sur l'algorithme d'apprentissage et l'architecture que vous (ou le package R) avez utilisé? Combien de couches possède le NN?
Lucas
Salut Lucas, j'utilise le lien neuralnet du package R qui a un bon lien explicatif ici . J'utilise une couche cachée de 8 neurones. L'algorithme d'apprentissage est une rétropropagation résiliente avec retour en arrière du poids.
tfb

Réponses:

8

En général, vous obtiendrez plus de stabilité en augmentant le nombre de nœuds cachés et en utilisant une décroissance de poids appropriée (alias pénalité de crête).

Plus précisément, je recommanderais d'utiliser le caretpackage pour obtenir une meilleure compréhension de votre précision (et même de l'incertitude de votre précision.) Le caret est également celui avNNetqui fait qu'un apprenant d'ensemble de plusieurs réseaux de neurones réduit l'effet des graines initiales. Personnellement, je n'ai pas vu d'énormes améliorations à l'aide, avNNetmais cela pourrait répondre à votre question initiale.

Je m'assurerais également que vos entrées sont toutes correctement conditionnées. Les avez-vous orthogonalisés puis redimensionnés? Caret peut également effectuer ce prétraitement pour vous via sa pcaNNetfonction.

Enfin, vous pouvez envisager de lancer certaines connexions de couche de saut. Vous devez vous assurer qu'il n'y a pas de points aberrants / de levier dans vos données pour fausser ces connexions.

Parkes de karité
la source
Fait intéressant, j'ai basculé la formation du net sur la fonction 'nnet' (disponible dans le package du même nom) et les résultats sur l'ensemble de données de test sont devenus beaucoup plus stables - peut-être quelque chose à voir avec la façon différente dont les poids sont initialisé entre les deux packages?
tfb
Dans les nnetpoids initiaux sont tous initialisés à un nombre aléatoire uniforme entre -0,7 et 0,7 si je me souviens bien. Et vous pouvez contrôler la magnitude d'un paramètre. Honnêtement, j'ai eu une bonne chance avec le nnetpackage et je n'ai jamais essayé aucune des autres options. Bonne chance!
Shea Parkes
1

Je n'ai pas travaillé avec R, donc je ne peux que donner des conseils plus généraux.

Avez-vous vérifié si l'algorithme a convergé? Une explication possible pourrait être que les différents ensembles de paramètres sont tous quelque part à mi-chemin du même optimum.

Si l'algorithme converge toujours mais vers un optimum local différent, il existe de nombreuses heuristiques que vous pouvez essayer d'éviter. Une stratégie simple lors de l'utilisation de la descente de gradient stochastique (SGD) consisterait à utiliser des lots plus petits et une plus grande dynamique . Les lots plus petits introduisent effectivement un peu de bruit dans la formation, ce qui peut aider à échapper à certains optima locaux. Une stratégie beaucoup plus sophistiquée consisterait à initialiser les poids à l'aide des encodeurs automatiques .

Lucas
la source
Tout comme un FYI, aussi longtemps qu'il est en utilisant la nnetde la base R, il utilise la méthode d'optimisation de BFGS R de optim. Il calcule en fait les gradients pour obtenir une image de la surface. Il n'y a pas de traitement par lots et aucun paramètre de moment fixe dans son implémentation. Cela dit, il peut facilement ne pas converger; surtout avec des ordures.
Shea Parkes
@SheaParkes merci pour les commentaires et réponses Shea. J'utilise en fait le paquet neuralnet - voir le commentaire ci-dessus. Il utilise un algorithme de rétropropagation résilient avec retour de poids
tfb
Alors mes excuses Lucas, j'ai raté cette friandise. Je suis content que vous ayez réussi à régler tfb.
Shea Parkes