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?
Réponses:
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
caret
package pour obtenir une meilleure compréhension de votre précision (et même de l'incertitude de votre précision.) Le caret est également celuiavNNet
qui 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,avNNet
mais 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
pcaNNet
fonction.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.
la source
nnet
poids 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 lennet
package et je n'ai jamais essayé aucune des autres options. Bonne chance!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 .
la source
nnet
de la base R, il utilise la méthode d'optimisation de BFGS R deoptim
. 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.