IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Méthodes prédictives Discussion :

Apprentissage par renforcement sur réseaux de neurones


Sujet :

Méthodes prédictives

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut Apprentissage par renforcement sur réseaux de neurones
    Bonjour à tous,

    Dans le cadre de mon "auto-formation" dans le domaine de l'IA et plus particulièrement des réseaux de neurones (j'apprécie le bio-mimétisme), je souhaite pouvoir développer un agent capable d'apprendre par renforcement.

    Je me suis alors lancé dans l'idée de créer un petit "jeux" assez simple où, dans un environnement dynamique et, à terme, non déterministe, l'agent doit collecter des points au sein d'un milieu hostile ; une sorte de mix entre un jeu de snake et un pacman en somme. En entrée, l'agent reçoit les positions et le type de tous les éléments présents dans son champ de vision, et en sortie deux valeurs réelles comprises entre -1 et 1 (un actionneur pour la rotation, un actionneur pour la translation).

    Je me suis donc penché un peu sur le Q-Learning, couplé aux réseaux de neurones, mais rapidement, je m’aperçoit que ce n'est peut-être pas vraiment la meilleur solution pour mon problème. En effet, les actionneurs de mon agent sont la rotation et la translation, donc, techniquement, même si je limite l'environnement à une simple fenêtre, de 800 * 600, cela fait déjà au minimum 480000 états possibles pour l'agent, et en théorie, il existe une infinité d'actions possibles pour chaque entrée...

    Je me demandais alors si oui ou non le Q-Learning était une solution viable pour mon problème, et, dans tous les cas, quels autres algorithmes d'apprentissage pouvaient s'avérer être de bonnes pistes, compte tenu du fait que je tiens vraiment à généraliser au maximum via réseaux de neurones.


    D'avance, merci pour vos retours !

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Bonjour BioKore,

    Je ne sais pas quel algorithme utiliser pour ton besoin présent, par contre j'ai un doute sur le choix que tu as fait pour tes données en entrée.

    En entrée, l'agent reçoit les positions et le type de tous les éléments présents dans son champ de vision
    J'aurai plutôt eu tendance à gérer en entrée la perception de l'agent, qu'est-ce qui est dans le champ de vision par exemple.

    Cordialement,

  3. #3
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Bonjour,

    Merci pour ce retour. J'ai un peu avancé sur ma compréhension du Q-Learning, mais même si le caractère "grand" de la dimension de mon espace d'état est finalement géré et généralisé grâce au réseau de neurones, le caractère "infini" de mon espace d'actions, lui, reste un problème....

    En ce qui concerne ta question sur ce qui est présent dans le champ de vision de l'agent, pour le moment, il s'agit simplement de tout ce qui est à l'écran, soit : la position des "cibles" (les trucs à récupérer) et la position des monstres. Je n'ai pas encore implémenté l'aspect "champ de vision" ; je pense faire ça ultérieurement, une fois que j'aurais trouvé une réponse au sujet de l'apprentissage...

    Je ne comprends vraiment pas ton retour :
    J'aurai plutôt eu tendance à gérer en entrée la perception de l'agent, qu'est-ce qui est dans le champ de vision par exemple.
    Car finalement, si je lui donne en entrée les positions et le type de chaque élément visible, cela revient un peu à ce que tu proposes non ?

    Merci.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 133
    Par défaut
    Car finalement, si je lui donne en entrée les positions et le type de chaque élément visible, cela revient un peu à ce que tu proposes non ?
    Alors ce que je te propose concernant les entrées est l'exact opposé de ce que tu veux faire. En effet, tu veux que ton agent ait une certaine omnipotence de tous les éléments qu'il doit récupérer.

    Moi je te propose, et ça n'engage que moi, de donner une vision du monde limité à ton agent. Non seulement il ne saura pas où seront les éléments a récupérer mais il ne saura pas dans un premier temps les distinguer par rapport à d'autres éléments qu'il pourrait rencontrer, un élément nocif par exemple. Tu peux donner des codes couleur différents a un élément a récupérer et à un élément à ne pas récupérer.

    Il y a plusieurs avantages à procéder ainsi. D'abord tu ne t'inquiètes plus de la taille de ton monde virtuel. Ensuite, et contrairement à ce que tu obtiendrais avec l'omnipotence, si tu entraines ton agent avec des éléments à des dispositions précises, changer leur dispositions ne rendra pas l'agent inopérant.

  5. #5
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Bonjour, et merci pour ce retour.

    Cette vision m'a l'air intéressante, mais je ne suis pas sure de tout comprendre. En fait, ton idée c'est de dire à l'agent : "" découvre le monde tout seul et tu te rendras compte tout seul que "manger" les objets verts est une bonne chose et "se faire manger" par les objets rouges est une mauvaise chose "". C'est bien ça ?

    Je pense comprendre en partie ton idée, et cela me parait pas mal, mais je ne vois vraiment pas trop comment formuler la chose....
    Au risque de paraître lourd, saurais-tu détailler un peu plus ton idée ?

    Pour info, le monde dans lequel évolue l'agent est en évolution permanente, d'où l'idée de vouloir lui faire comprendre ce qu'il faut et ne faut pas faire ; l'entraînement DOIT donc se faire dans ce type d'environnement.

    Pour en revenir à mon problème initial et au code tel que je le conçois actuellement, je pense avoir trouvé une idée, je vous laisse me dire si celle-ci est viable ou pas :

    Entraînement :
    Un premier réseau de neurone pour apprendre les relations des Q-Values. En entrée (pour le moment) les positions de tous les éléments sur l'écran + une action aléatoire.
    On propage, on effectue l'action, on rétro propage avec la récompense obtenue à l'état 's+1'
    On reboucle tant que l'erreur entre la récompense prédite par le réseau et la récompense réelle est supérieure à x%.

    Une fois l’entraînement fait, on peut utiliser la méthode Q-Learning générale (Q[s,a] = r + gama * max(Q[s+1, ar])) où le max Q(s+1,ar) est trouvé en faisant varier l'action 'ar' sur 500 valeurs d'actions aléatoires.

    Comme ça, ça devrait pouvoir marcher, en partie, mais je me rend compte de plusieurs choses :
    - pas d'apprentissage online pur (dans ce cas précis) --> mais là c'est avant tout mes compétences de développeur qui limitent la chose
    - solution pas nécessairement optimale car les actions sont choisies sur 500 possibilités aléatoires (arbitraire, j'aurais pu mettre 2000) ce qui limite le champ.
    - je ne saurais pas quoi dire, mais quelque chose la dedans me chiffonne... In fine, ce que je veux de mon agent, c'est de récupérer ce qu'il perçois, de le traiter pour sortir une action optimale vis-à-vis d'un objectif donné, soit un réseau avec en entrée, situation actuelle + ordre, et en sortie on récupère une action optimale.


    Aussi, je pensais peut-être essayer de trouver un moyen de limiter l'espace des actions par des actions plus macro. Par exemple, au lieu de dire qu'une action est "tourne de 2° et avance avec un facteur de 0.34", lui dire "rapproche toi de tel objet" ou "évite absolument tel objet". Mais là aussi, il faudrait que j’entraîne des réseaux spécifiques à chaque action finalement. Bref, c'est une idée que j'essaierais de développer plus tard.


    Merci.

  6. #6
    Membre éclairé Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Par défaut
    Bonjour à tous,

    Bon, bien que le sujet n'ait pas l'air d'attirer les foules, je vais tout de même continuer d'exposer mon projet et mes problèmes au fil du temps ici...

    Pour résumer : j'ai créé un petit jeu avec SFML (en C++ donc), dans lequel nous avons des humains, des zombies, et des objets à récupérer. L'objectif final pour moi est d'apprendre aux humains à récupérer les objets répartis aléatoirement au milieu d'un champ remplis de zombies ; un objet récupéré = +5 points. Bien entendu, si un humain se fait attraper par un zombie, son score retourne à 0 et il est réinitialisé aléatoirement sur la carte.
    En parallèle, les zombies doivent apprendre à attraper des humain (et eux ne peuvent pas être réinitialisés). Un humain attrapé offre un score de 10 + score de l'humain en question.

    Étant assez machiavélique, je décide alors dans un premier temps, d'apprendre aux zombies d'attraper des humains.

    L'environnement est représenté par des positions réelles comprises entre 0 et 800 sur les X (largeur horizontale de fenêtre) et entre 0 et 600 sur les Y (hauteur verticale de fenêtre).
    Nom : game_intro.jpg
Affichages : 654
Taille : 31,9 Ko

    Ici, tous les points jaunes représentent les humains et les zombies (oui, je n'ai pas encore trop compris comment changer la couleur des éléments dans le constructeur compte tenu de l’héritage de classe, mais bon, ça viendra).

    Chaque zombie possède un réseau de neurones pour déterminer les Q-Values de chaque état du jeu. En entrée, le réseau prends donc en compte les positions de chaque humain sur la carte, et en sortie, il restitue 9 Q-Values correspondant à la récompense estimée pour chaque action possible. Ces actions sont "NOTHING, UP, DOWN, RIGHT, LEFT, UP_RIGHT, UP_LEFT, DOWN_RIGHT, DOWN_LEFT". Les actions RIGHT et LEFT déterminent en fait l'angle du vecteur position (un peu comme la souris dans un FPS). UP et DOWN donnent la valeur de la translation suivant le vecteur donné.

    L'apprentissage du réseau se fait par Batch (Experience Replay sur 32 états aléatoires [s, a, r, s']), et les Q-Values "réelles" à apprendre pour chaque batch sont obtenues via :
    Q[s,a*] <- r(s') + gama * max(Q[s', a*]) où r = reward (10 + score si on attrape un humain, -0.01 sinon), gama = 0.86 (pour éviter les divergences)

    Quand au Q[s,a*], il s'agit en fait de la Q-Value de chaque action possible dans l'état 's', calculée via le réseau.

    Quant aux actions, elles sont définies par le indexMax(Q[s,a*]) à hauteur de 20% et aléatoires sinon (on favorise l'exploration).


    Bon, je ne détaillerais pas plus, pour le moment, le fonctionnement global, mais dans l'idée générale, ce fonctionnement parait-il correct ? J'ai déjà implémenté la chose mais il me reste une petite erreur aléatoire à corriger avant de pouvoir dire si oui ou non cela fonctionne. A première vue, sur 1 minute de jeu, absolument aucun progrès n’apparaît ; de plus, les déplacements aléatoires font que, étant donné la taille de l'environnement (fenêtre) l'agent a tendance à se déplacer très lentement. Selon vous, parait-il viable de procéder ainsi ou vaut-il mieux trouver une approche fondamentalement différente ?

    Quoi qu'il en soit, en tout premier lieu, je dois corriger cette erreur de segmentation aléatoire qui fait très certainement partie de mon Experience Replay...


    Merci d'avance !

Discussions similaires

  1. [IA] Implémentation d'un apprentissage par renforcement
    Par shinigami dans le forum Méthodes prédictives
    Réponses: 9
    Dernier message: 16/07/2019, 22h25
  2. [java] Apprentissage par renforcement et Tic-Tac-Toe
    Par Champialex dans le forum Contribuez
    Réponses: 0
    Dernier message: 16/06/2010, 01h30
  3. [Algo] Apprentissage par renforcement
    Par adretto dans le forum Méthodes prédictives
    Réponses: 1
    Dernier message: 24/05/2007, 19h25
  4. Apprentissage par Renforcement
    Par Le Furet dans le forum Méthodes prédictives
    Réponses: 4
    Dernier message: 11/08/2005, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo