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.
InformationsquelleAutor li.davidm | 2010-12-20