Réseau de neurones Produit Toujours Identiques/Similaires, des Sorties pour Toute Entrée
J'ai un problème lorsque j'essaye de créer un réseau de neurones pour Tic-Tac-Toe. Cependant, pour une raison quelconque, la formation du réseau de neurones causes de produire près de la même sortie pour une entrée.
J'ai fait prendre un coup d'oeil à Les réseaux de neurones artificiels de référence, mais mon réseau de mise en œuvre est construite pour les neurones avec la même fonction d'activation de chaque neurone, c'est à dire pas de constante de neurones.
Assurez-vous que le problème n'était pas seulement à cause de mon choix de l'ensemble d'apprentissage (1218 conseil d'administration les états et les mouvements générés par un algorithme génétique), j'ai essayé de former le réseau de reproduire XOR. La logistique de fonction d'activation a été utilisé. Au lieu d'utiliser la dérivée, je multiplie l'erreur par output*(1-output)
certaines sources ont suggéré que c'était équivalent à l'utilisation de la dérivée. Je peux mettre le Haskell source sur HPaste, mais c'est un peu gênant à regarder. Le réseau dispose de 3 couches: la première couche a 2 entrées et 4 sorties, la seconde dispose de 4 entrées et 1 sortie, et la troisième a 1 produit. L'augmentation de 4 neurones de la deuxième couche n'a pas aider, ni l'augmentation de 8 sorties dans la première couche.
J'ai ensuite calculé les erreurs, la sortie du réseau, le biais de mises à jour, et le poids des mises à jour à la main basé sur http://hebb.mit.edu/courses/9.641/2002/lectures/lecture04.pdf pour s'assurer il n'y avait pas une erreur dans les parties du code (il n'y en avait pas, mais je vais probablement le faire à nouveau, juste pour être certain). Parce que je suis en utilisant le lot de la formation, je n'ai pas multiplier par x
dans l'équation (4) il y a des. Je suis ajoutant la variation de poids, bien que http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-2.html suggère de le soustraire à la place.
Le problème a persisté, même dans ce réseau simplifiée. Par exemple, ce sont les résultats après 500 époques de lot de la formation et de l'accroissement de la formation.
Input |Target|Output (Batch) |Output(Incremental)
[1.0,1.0]|[0.0] |[0.5003781562785173]|[0.5009731800870864]
[1.0,0.0]|[1.0] |[0.5003740346965251]|[0.5006347214672715]
[0.0,1.0]|[1.0] |[0.5003734471544522]|[0.500589332376345]
[0.0,0.0]|[0.0] |[0.5003674110937019]|[0.500095157458231]
Soustrayant au lieu d'ajouter du produit le même problème, sauf tout ce qui est de 0,99 quelque chose au lieu de 0,50 quelque chose. 5000 époques produit le même résultat, à l'exception du lot-réseau formé retourne exactement 0,5 pour chaque cas. (Heck, même 10 000 époques n'a pas de travail pour le lot de la formation.)
Est-il quelque chose en général, qui pourrait produire ce comportement?
Aussi, j'ai regardé l'intermédiaire des erreurs progressive de la formation, et bien que les entrées de l'caché d'entrée/de couches variées, l'erreur pour le neurone de sortie est toujours +/-0.12. Pour le lot de la formation, les erreurs ont été en hausse, mais très lentement et que les erreurs ont été tous extrêmement petites (x10^-7). Différents initiale aléatoire des poids et des biais ne fait pas de différence, que ce soit.
Noter que c'est un projet d'école, donc les conseils et les guides de la serait des plus utiles. Bien que de réinventer la roue et de faire mon propre réseau (dans une langue que je ne sais pas bien!) était une idée horrible, j'ai senti qu'il serait plus approprié pour un projet d'école (donc je sais ce qu'il se passe...du moins en théorie. Il ne semble pas être un professeur d'informatique de mon école).
EDIT: Deux couches, une couche d'entrée de 2 entrées-8 sorties, et une couche de sortie de 8 entrées vers 1 sortie, il produit beaucoup les mêmes résultats: 0.5+/-0.2 (ou presque) pour chaque cas de formation. Je suis aussi en train de jouer autour avec pyBrain, voir si toute la structure du réseau, il y aura du travail.
Edit 2: je suis en utilisant un taux d'apprentissage de 0.1. Désolé pour oublier à ce sujet.
Edit 3: Pybrain du "trainUntilConvergence" ne m'obligez pas à faire une formation entièrement réseau, soit, mais 20000 époques, avec 16 de neurones dans la couche cachée. 10000 époques et 4 neurones, pas tellement, mais à proximité. Donc, en Haskell, avec la couche d'entrée ayant 2 entrées & 2 sorties, une couche cachée avec 2 entrées et 8 sorties, et la couche de sortie, avec 8 entrées et 1 sortie...je reçois le même problème avec 10000 époques. Et avec 20000 époques.
Edit 4: j'ai couru le réseau à la main encore une fois basé sur le MIT PDF ci-dessus, et les valeurs correspondent, de sorte que le code doit être correcte, sauf si je suis de l'incompréhension de ces équations.
Certains de mon code source est à http://hpaste.org/42453/neural_network__not_working; je suis en train de travailler sur le nettoyage de mon code un peu et le mettre dans un Github (plutôt qu'un Bitbucket) référentiel.
Tout le code source est maintenant à https://github.com/l33tnerd/hsann.
- Bravo à vous pour cela; ressemble à un projet intéressant. J'avais d'abord pensez que votre réseau a trop de couches; backprop n'est pas très grande pour que plusieurs couches. Dans votre exemple, quelle est votre dernière couche d'un seul nœud, avec une seule entrée et de sortie en fait censé faire?
- Eh bien...pas grand chose, je suppose. Mais là encore, la modifier, donc il a 4 entrées et 1 sortie n'a pas fait beaucoup pour le réseau.
- Ce taux d'apprentissage avez-vous utilisé?
- J'ai utilisé 0.1.
Vous devez vous connecter pour publier un commentaire.
J'ai eu des problèmes similaires, mais a été en mesure de résoudre en changeant ces:
Espère que cela aide ceux qui trouvent que ce fil de discussion sur Google!
Donc je sais que c'est extrêmement en retard pour le post original, mais je suis tombé sur ce parce que j'ai eu un problème similaire et aucune des raisons posté ici couvrir ce qui n'allait pas dans mon cas.
Je travaillais sur un simple problème de régression, mais à chaque fois j'ai formé le réseau, il serait convergent vers un point où il me donnait le même résultat (ou parfois un peu différentes sorties) pour chaque entrée. J'ai joué avec le taux d'apprentissage, le nombre de couches cachées/nœuds, l'algorithme d'optimisation, etc, mais il ne fait aucune différence. Même quand j'ai regardé un ridiculement simple exemple, en essayant de prévoir le résultat (1d) de deux entrées différentes (1d):
mais ENCORE il était toujours en sortie la valeur moyenne des résultats pour les deux entrées. Il s'avère que la raison est que les dimensions de mes résultats et les objectifs n'étaient pas les mêmes: les objectifs étaient de la Taille[2], et les résultats étaient de Taille[2,1], et pour une raison PyTorch diffusait les sorties à la Taille[2,2] dans l'état d'établissement de perte de, qui salit tout. Une fois que j'ai changé:
à
Il a travaillé comme il se doit. Évidemment, c'était fait avec PyTorch, mais je soupçonne peut-être d'autres bibliothèques de diffusion variables de la même manière.
C'est difficile à dire sans voir un exemple de code, mais un biais bug peut avoir un effet (par exemple l'oubli d'ajouter le biais de l'entrée), donc je voudrais prendre un coup d'oeil à cette partie du code.
C'est difficile à dire sans voir un exemple de code, mais il est possible de se produire pour un net parce que le nombre de ses cachée neron.avec incresing dans nombre de néron et le nombre de couche invisible ils il n'est pas possible de former un net avec un petit ensemble de données d'entraînement.jusqu'à ce qu'il est possible de faire une nette avec la petite couche et nerons il est inutile d'utiliser un plus grand net.donc peut-être que votre problème est résolu avec une attention à cette matière.
En fonction de vos commentaires, je serai d'accord avec @finnw que vous avez un problème de partialité. Vous devez traiter le parti pris de la constante "1" (ou -1 si vous préférez) d'entrée de chaque neurone. Chaque neurone aura également son propre poids pour le biais, de sorte qu'un neurone de sortie doit être la somme pondérée des entrées, plus le biais de fois son poids, transmis par le biais de la fonction d'activation. Biais pondérations sont mises à jour au cours de la formation tout comme les autres poids.
Fausett de "les principes de base des Réseaux de Neurones" (p.300) a un XOR exemple à l'aide des entrées binaires et d'un réseau avec 2 entrées, 1 couche cachée de 4 neurones et un neurone de sortie. Les poids sont initialisé aléatoirement entre +0,5 et -0.5. Avec un taux d'apprentissage de 0,02 à l'exemple de réseau converge après environ 3000 époques. Vous devriez être en mesure d'obtenir un résultat du même ordre de grandeur si vous obtenez le biais de problèmes (et tous les autres bugs) aplanies.
Notez également que vous ne pouvez pas résoudre le problème XOR sans couche cachée dans votre réseau.
Je n'ai pas testé avec le XOR problème dans la question, mais pour mon jeu de données original, basé sur Tic-Tac-Toe, je crois que j'ai perdu le réseau de train un peu (j'ai seulement couru 1000 époques, ce qui n'était pas assez): le quickpropagation réseau peut gagner/cravate plus de la moitié de ses jeux; les pouvez obtenir environ 41%. Les problèmes sont venus vers le bas pour la mise en œuvre des erreurs (les plus petites) et de ne pas comprendre la différence entre l'erreur dérivés (qui est par-poids) et de l'erreur pour chaque neurone, que je n'ai pas de ramasser mes recherches. @darkcanuck réponse sur la formation de la partialité de la même façon pour un poids aurait probablement aidé, même si je n'ai pas la mettre en œuvre. J'ai également réécrit mon code en Python afin que je puisse plus facilement hack avec elle. Par conséquent, bien que je n'ai pas eu le réseau pour correspondre à l'algorithme minimax de l'efficacité, je crois que j'ai réussi à résoudre le problème.
J'ai fait face à un problème similaire plus tôt lors de mes données n'a pas été correctement normalisé. Une fois que j'ai normalisé les données tout a fonctionné correctement.
Récemment, j'ai été confronté à ce problème, encore et après le débogage, j'ai trouvé qu'il peut y avoir une autre raison pour les réseaux de neurones donnant le même résultat. Si vous avez un réseau de neurones qui a un poids de décroissance terme telle que la RSNNS paquet, assurez-vous que votre terme de décroissance n'est pas si grand que tous les poids vont essentiellement à 0.
J'ai été en utilisant le signe paquet dans R. d'Abord, j'ai été en utilisant une décomposition hyper-paramètre = 0.01. Quand j'ai regardé le diagnostic, j'ai vu que le RMSE a été calculée pour chaque pli (cross validation), mais le Rsquared était toujours NA. Dans ce cas, toutes les prédictions étaient venus à la même valeur.
Une fois que j'ai réduit la carie à une beaucoup plus faible valeur (1E-5 et moins), j'ai eu les résultats escomptés.
J'espère que cette aide.
J'ai été en cours d'exécution dans le même problème avec mon modèle, quand le nombre de couches est important. J'ai été en utilisant un taux d'apprentissage de 0,0001. Lorsque je baisse le taux d'apprentissage à 0,0000001 le problème semble résolu. Je pense que les algorithmes coincé sur local minumums lors de l'apprentissage de taux est trop faible
J'ai eu des problèmes similaires avec des algorithmes d'apprentissage automatique et quand j'ai regardé le code, je l'ai trouvé générateurs aléatoires qui ne sont pas vraiment aléatoires. Si vous n'utilisez pas une nouvelle valeur aléatoire (par exemple le temps Unix par exemple, voir http://en.wikipedia.org/wiki/Unix_time) il est alors possible d'obtenir les mêmes résultats, encore et encore.