35 votes

Comment faire apprendre des organismes virtuels à l'aide de réseaux de neurones?

Je suis en train de faire un simple apprentissage de la simulation, où il y a plusieurs organismes à l'écran. Ils sont censés apprendre à manger, à l'aide de simples réseaux de neurones. Ils ont 4 neurones, chaque neurone s'active mouvement dans une direction (c'est un plan en 2D vu de l'oiseau du point de vue, donc, il y a seulement quatre directions, ainsi, les quatre sorties sont nécessaires). Leur seule entrée sont des "quatre yeux". Un seul œil peut être active à la fois, et il sert essentiellement comme un pointeur vers l'objet le plus proche (soit une nourriture verte bloc, ou un autre organisme).

Ainsi, le réseau peut être imaginé comme ceci: enter image description here

Et un organisme ressemble à ceci (à la fois dans la théorie et le réel de la simulation, où ils sont vraiment blocs rouges avec leurs yeux autour d'eux):

enter image description here

Et ce est la façon dont il semble tout à fait (c'est une ancienne version, où les yeux ne fonctionne toujours pas, mais c'est pareil):

enter image description here

Maintenant que j'ai décrit mon idée générale, permettez-moi d'aller au cœur du problème...

  1. Initialisation| Tout d'abord, je créer des organismes et de la nourriture. Ensuite, tous les 16 poids dans leurs réseaux de neurones sont fixés à des valeurs aléatoires, comme ceci: poids = random.random()*seuil*2. Le seuil est une valeur globale qui décrit comment chaque neurone doit obtenir dans le but d'activer ("feu"). Elle est généralement fixée à 1.

  2. Apprentissage| Par défaut, le poids dans les réseaux de neurones sont abaissés de 1% à chaque étape. Mais, si certains organisme gère réellement quelque chose à manger, la connexion entre le dernier active d'entrée et de sortie est renforcé.

Mais, il y a un gros problème. Je pense que ce n'est pas une bonne approche, car ils n'ont pas appris quelque chose! Seuls ceux qui ont eu leur poids initiaux définie de façon aléatoire pour être bénéfique aurez la chance de manger quelque chose, et ensuite seulement d'entre eux ont leurs poids renforcé! Que dire de ceux qui ont configuré une connexion de mal? Ils vont mourir, de ne pas apprendre.

Comment puis-je éviter cela? La seule solution qui vient à l'esprit est au hasard d'augmenter/diminuer le poids, de sorte que finalement, quelqu'un aura la bonne configuration, et de manger quelque chose par hasard. Mais je trouve cette solution très brut et le truand. Avez-vous des idées?

EDIT: Merci pour vos réponses! Chacun d'entre eux a été très utile, certains étaient tout simplement plus pertinentes. J'ai décidé d'utiliser l'approche suivante:

  1. Mis tout le poids de nombres aléatoires.
  2. Diminution du poids au fil du temps.
  3. Parfois, au hasard d'augmentation ou de diminution de poids. La plus réussie de l'unité est, le moins c'est le poids va se changer. NOUVEAU
  4. Lorsqu'un organisme mange quelque chose, augmenter le poids entre les entrées et les sorties.

10voto

kwatford Points 11658

Comme mentionné par Mika Fischer, ce qui ressemble à la vie artificielle problèmes, de sorte que c'est une avenue que vous puissiez l'examiner.

Il sonne un peu comme vous êtes en train de réinventer l'Apprentissage par Renforcement. Je recommande la lecture par le biais de l'Apprentissage par Renforcement: Une Introduction, qui est disponible gratuitement sous forme de documents HTML à ce site, ou acheté dans l'arbre mort format. Exemple de code et des solutions sont également proposés sur cette page.

L'utilisation de réseaux de neurones (et d'autres de la fonction approximators) et les techniques de planification est abordé plus loin dans le livre, donc ne vous découragez pas si le premier genre de choses semble trop basique ou non-applicable à votre problème.

10voto

tom10 Points 19886

Ceci est similaire à des problèmes en essayant de trouver un minimum global, où il est facile de rester coincé dans un minimum local. Envisager d'essayer de trouver le minimum global pour le profil ci-dessous: vous placez la balle dans des endroits différents et de le suivre comme il roule en bas de la colline, au minimum, mais selon l'endroit où vous le placez, vous pouvez rester coincé dans un local du dip.enter image description here

C'est, dans les situations compliquées, vous ne pouvez pas toujours obtenir la meilleure solution de tous les points de départ à l'aide de petits optimisation des incréments. Les solutions générales sont à varier les paramètres (c'est à dire, le poids, dans ce cas) plus vigoureusement (et généralement de réduire la taille des fluctuations comme vous le progrès de la simulation comme le recuit simulé), ou simplement se rendre compte que un tas de points de départ ne vont pas aller n'importe où intéressante.

6voto

ccoakley Points 2657

Comment voulez-vous apprendre? Vous n'aimez pas le fait que de façon aléatoire organismes meurent ou prospérer, mais le temps que vous fournir de la rétroaction dans votre organisme, est de savoir si ils aléatoirement obtenir de la nourriture.

Laissez-le modèle de ce que le chaud et le froid. Actuellement, tout ce qui nourrit retour "à froid", sauf lorsque l'organisme est à droite sur le dessus de la nourriture. Donc, la seule possibilité d'apprendre est accidentellement en cours d'exécution au niveau de la nourriture. Vous pouvez serrer cette boucle de fournir plus de retour en continu si vous le désirez. Commentaires plus chaud si il y a un mouvement vers la nourriture, le froid s'éloigne.

Maintenant, le revers de la médaille c'est qu'il n'y a pas d'entrée pour autre chose. Vous avez seulement une nourriture demandeur d'apprentissage technique. Si vous voulez que vos organismes de trouver un équilibre entre la faim et quelque chose d'autre (par exemple, la surpopulation de l'évitement, de l'accouplement, etc), l'ensemble du mécanisme probablement besoin d'être repensée.

4voto

Nicholas McCarthy Points 127

Il existe plusieurs algorithmes qui peuvent être utilisés pour optimiser le poids dans un réseau de neurones, dont la plus commune est la backpropogation algorithme.

À la lecture de votre question, je suppose que vous essayez de construire de réseau de neurones de robots qui vont chercher de la nourriture. La manière d'y parvenir avec backpropogation serait d'avoir une première période d'apprentissage, où les poids sont initialement définie de façon aléatoire (comme vous le faites) et perfectionné à l'aide de la backpropogation algorithme jusqu'à ce qu'ils atteignent un niveau de performance que vous êtes heureux avec. À ce stade, vous pouvez arrêter de leur apprentissage et de leur permettre de s'ébattre librement dans flatland.

Cependant, je pense qu'il pourrait y avoir quelques problèmes avec la conception de votre réseau. Tout d'abord, si il est à seulement 1 oeil active à tout moment, il serait plus logique d'avoir un seul nœud d'entrée et de garder trace de l'orientation d'une autre façon (si je comprends bien). Tout simplement, si il n'y a qu'un seul œil et quatre actions possibles (avant, arrière, gauche, droite), puis les entrées de l'inactivité yeux (sans doute de zéro) n'aurait aucune incidence sur la décision de sortie, en fait, je soupçonne le poids pour chaque entrée à toutes les sorties converger, ce qui correspond principalement à la même fonction. En outre, il augmente inutilement la complexité du réseau et augmente le temps d'apprentissage. Deuxièmement, vous n'avez pas besoin que beaucoup de neurones de sortie pour représenter toutes les actions possibles. Comme vous l'avez décrit, votre sortie sera {1,0,0,0} = droite, {0,1,0,0} = gauche et ainsi de suite. Selon le type de neurone de la modélisation, ce qui peut être fait avec 2 ou même 1 neurone de sortie. Si vous utilisez un binaire neurone (chaque sortie est 1 ou 0), puis faire quelque chose comme {0,0} = retour, {1,1} = avant, {1,0} = gauche, {0,1} = droite. À l'aide d'une fonction sigmoïde de neurones (la sortie peut être un nombre réel à partir de 0..1), vous pourriez faire {0} = retour, {0.33} = gauche, {0.66} = droite, {1} = vers l'avant.

3voto

Novak Points 1966

Je peux voir un tas de problèmes potentiels.

D'abord et avant tout, je ne suis pas clair à propos de l'algorithme que des mises à jour de votre poids. J'aime le recul de 1% en tant que concept-- il semble que vous essayez de réduction de lointains souvenirs, ce qui est bon dans le principe, mais le reste n'est probablement pas suffisant. Vous avez besoin de regarder certains de la norme de mise à jour des algorithmes tels que les, mais ce n'est qu'un début, parce que....

...Que vous êtes seulement de donner à votre réseau crédit pour la dernière étape de manger de la nourriture. Il ne semble pas comme il y a un mécanisme direct pour l'obtention de votre réseau progressivement plus près de la nourriture, ou à des amas de nourriture. Même en prenant la directionnalité des yeux à la valeur nominale, vos yeux sont très simples, et il n'y a pas beaucoup de mémoire à long terme.

Aussi, si votre diagramme de réseau est exacte, ce n'est probablement pas suffisant. Vous voulez vraiment avoir une couche cachée (au moins un) entre les capteurs et les actionneurs, si vous utilisez quelque chose en rapport avec les. Il existe des mathématiques derrière cette déclaration, mais il se résume à de la, "Les couches cachées permettra à de bonnes solutions de plus en plus de problèmes."

Maintenant, vous remarquerez que beaucoup de mes commentaires sont de parler de l'architecture du réseau, mais seulement en termes généraux sans dire concrètement, "Cela fonctionne", ou "qui va travailler." C'est parce que je ne sais pas non plus (bien que je pense Kwatford la suggestion de l'apprentissage par renforcement est un très bon produit.) Parfois, vous pouvez évoluer les paramètres du réseau ainsi que le réseau des instances. Une telle technique est Neuroevolution d'Augmenter les Topologies, ou "PROPRE". Peut-être en valeur un regard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X