Comment mettre en place un espace d'action contraint dans l'apprentissage par renforcement?

13

Je code un modèle d'apprentissage par renforcement avec un agent PPO grâce à la très bonne bibliothèque Tensorforce , construite au-dessus de Tensorflow.

La première version était très simple et je plonge maintenant dans un environnement plus complexe où toutes les actions ne sont pas disponibles à chaque étape.

Disons qu'il y a 5 actions et leur disponibilité dépend d'un état interne (qui est défini par l'action précédente et / ou le nouvel espace état / observation):

  • 2 actions (0 et 1) sont toujours disponibles
  • 2 actions (2 et 3) ne sont disponibles que lorsque le internal_state == 0
  • 1 action (4) n'est disponible que lorsque le internal_state == 1

Par conséquent, 4 actions sont disponibles lorsque internal_state == 0 et 3 actions disponibles lorsque internal_state == 1.

Je pense à quelques possibilités de mise en œuvre:

  1. Modifiez l'espace d'action à chaque étape, selon l'état_interne. Je suppose que cela n'a aucun sens.
  2. Ne rien faire: laissez le modèle comprendre que le choix d'une action non disponible n'a aucun impact.
  3. Ne - presque - rien: impact légèrement négatif sur la récompense lorsque le modèle choisit une action indisponible.
  4. Aidez le modèle: en incorporant un entier dans l'espace d'état / d'observation qui informe le modèle quelle est la valeur internal_state + puce 2 ou 3

Y a-t-il d'autres façons de mettre cela en œuvre? D'après votre expérience, laquelle serait la meilleure?

Max
la source

Réponses:

5

La solution la plus simple consiste à simplement rendre chaque action «légale», mais à mettre en œuvre une correspondance cohérente et déterministe des actions potentiellement illégales aux différentes actions en justice. Chaque fois que l'implémentation PPO que vous utilisez sélectionne une action illégale, vous la remplacez simplement par l'action légale à laquelle elle correspond. Votre algorithme PPO peut alors se mettre à jour comme si l'action illégale était sélectionnée (l'action illégale devient simplement ... un "surnom" pour l'action légale à la place).

Par exemple, dans la situation que vous décrivez:

  • 2 actions (0 et 1) sont toujours disponibles
  • 2 actions (2 et 3) ne sont disponibles que lorsque le internal_state == 0
  • 1 action (4) n'est disponible que lorsque le internal_state == 1

Dans les cas où internal_state == 0, si une action a 4été sélectionnée (une action illégale), vous pouvez toujours l'échanger contre l'une des autres actions et la jouer à la place. Peu importe (théoriquement) celui que vous choisissez, tant que vous êtes cohérent à ce sujet. L'algorithme n'a pas besoin de savoir qu'il a choisi une action illégale, chaque fois qu'il choisira cette même action illégale à l'avenir dans des états similaires, il sera systématiquement mappé à la même action juridique à la place, vous ne faites que renforcer selon ce comportement.


La solution décrite ci-dessus est très simple, probablement la plus simple à implémenter, mais bien sûr elle "sent" un peu "hacky". Une solution plus propre impliquerait une étape dans le réseau qui définit les sorties de probabilité des actions illégales à et renormalise le reste pour résumer à nouveau. Cela nécessite cependant beaucoup plus de soin pour vous assurer que vos mises à jour d'apprentissage sont toujours effectuées correctement, et est probablement beaucoup plus complexe à implémenter au-dessus d'un cadre existant comme Tensorforce (s'il n'est pas déjà pris en charge d'une manière ou d'une autre).01


Pour la première "solution", j'ai écrit plus haut que la façon dont vous choisissez le mappage n'a pas d'importance "théoriquement". Je m'attends absolument à ce que vos choix ici aient un impact sur la vitesse d'apprentissage dans la pratique. En effet, dans les étapes initiales de votre processus d'apprentissage, vous aurez probablement une sélection d'actions presque aléatoire. Si certaines actions "apparaissent plusieurs fois" dans les sorties, elles auront une plus grande probabilité d'être sélectionnées avec la sélection initiale d'action close-tor-andom. Ainsi, il y aura un impact sur votre comportement initial, ce qui a un impact sur l'expérience que vous collectez, ce qui à son tour a également un impact sur ce que vous apprenez.

Je m'attends certainement à ce qu'il soit bénéfique pour les performances si vous pouvez inclure des fonctionnalités d'entrée pour la internal_statevariable.

Si certaines actions légales peuvent être identifiées d'une manière ou d'une autre "sémantiquement proches" de certaines actions illégales, il pourrait également être avantageux pour les performances de connecter spécifiquement ces actions "similaires" dans le "mappage" des actions illégales aux actions légales si vous choisissez d'y aller avec cette solution. Par exemple, si vous avez une action "sauter vers l'avant" qui devient illégale dans les États où le plafond est très bas (parce que vous vous cognez la tête), il peut être préférable de mapper cette action à une action "avancer" (qui est toujours un peu similaire, ils vont tous les deux en avant), que ce ne serait de le mapper à une action "reculer". Cette idée d'actions "similaires" ne sera applicable qu'à certains domaines, cependant, dans certains domaines, il peut n'y avoir aucune similitude entre les actions.

Dennis Soemers
la source
2

L'objectif est de concevoir un composant d'optimisation de stratégie proximale qui a des contraintes spécifiques sur l'espace d'action dépendant de règles induites par l'état, en utilisant un cadre comme Tensorforce.

Options de conception énumérées dans la question

Ces options sont répertoriées ici pour référence rapide lors de la lecture de l'analyse initiale ci-dessous.

  • Modifiez l'espace d'action à chaque étape, selon l'état_interne. Je suppose que cela n'a aucun sens.
  • Ne rien faire: laissez le modèle comprendre que le choix d'une action non disponible n'a aucun impact.
  • Ne - presque - rien: impact légèrement négatif sur la récompense lorsque le modèle choisit une action indisponible.
  • Aidez le modèle: en incorporant un entier dans l'espace d'état / d'observation qui informe le modèle quelle est la valeur internal_state + puce 2 ou 3

Analyse initiale

Il est en effet judicieux de changer l'espace d'action pour chaque mouvement. C'est, en fait, une représentation appropriée du problème tel qu'indiqué et de la façon normale dont les humains jouent à des jeux et de la façon dont les ordinateurs battent les humains dans Chess and Go.

L'apparence insensée de cette idée n'est qu'un artefact des progrès le long de la feuille de route du projet Tensorforce et des progrès le long de la théorie du renforcement, tous deux jeunes dans le tableau d'ensemble. En lisant la documentation et la FAQ de Tensorforce, il ne semble pas que le framework soit conçu pour brancher un moteur de règles pour déterminer l'espace d'action. Ce n'est pas une lacune de l'open source. Il ne semble pas y avoir d'articles fournissant de la théorie ou proposant des algorithmes pour la décision en chaîne de Markov conditionnée par des règles.

L'option de ne rien faire est celle qui s'inscrit dans les stratégies actuellement disponibles représentées dans la littérature. Le faire-presque-rien est probablement l'approche qui produira un comportement souhaitable plus fiable et peut-être plus immédiat.

Le problème avec le concept d'aider le modèle est qu'il n'est pas une idée aussi forte que l'extension du modèle. En open source, cela se ferait en étendant les classes qui représentent le modèle, ce qui nécessiterait un travail théorique avant de coder en

    a. Represent rule-conditioned learning in nomenclature
    b. Represent convergence mathematically using the new nomenclature
    c. Determining a method of convergence
    d. Proving convergence
    e. Rechecking
    f. Defining a smooth and efficient algorithm
    g. Providing PAC learning information for planning
    f. Peer review
    g. Extending the classes of the library
    h. Proof of concept with the current problem above
    i. Additional cases and metrics comparing the approach with the others
    j. Extending the library flexibility to support more such dev

L'extension des systèmes d'apprentissage pour couvrir le cas de règles restreintes est une excellente idée pour une thèse de doctorat et pourrait voler dans les laboratoires de recherche en tant que proposition de projet avec de nombreuses applications possibles. Ne laissez pas toutes les étapes dissuader le chercheur. Il s'agit essentiellement d'une liste d'étapes pour toute thèse de doctorat ou projet de laboratoire d'IA financé.

Pour une solution à court terme, aider le modèle pourrait fonctionner, mais ce n'est pas une bonne stratégie pour faire avancer les idées de l'IA le long du parcours d'apprentissage du renforcement. En tant que solution à court terme pour un problème particulier, cela peut fonctionner correctement. L'idée de ne rien faire peut être plus judicieuse, car elle s'inscrit dans les preuves de convergence qui ont conduit à l'implémentation particulière que Tensorforce est susceptible d'utiliser.

Le renommer de ne rien faire pour aider à la convergence peut aider à développer la bonne perspective avant de l'essayer. Il se peut que vous deviez atténuer l'assistance lorsque vous approchez de la convergence pour éviter un dépassement, tout comme avec un taux d'apprentissage.

Douglas Daseeco
la source
3
Ce qui se produit généralement, par exemple dans AlphaGo, est que la représentation de bas niveau dans le réseau neuronal représente un très grand espace d'action, dont la plupart est impossible dans l'état actuel (il le fait en raison des limitations des NN simples qui produisent des vecteurs de taille fixe ). Ensuite, une autre partie du code applique un filtre pour sélectionner et normaliser les probabilités uniquement pour les mouvements autorisés. Le NN et le filtre combinés font partie de l'agent. Il est donc juste de dire que l'agent dans son ensemble "changera l'espace d'action pour chaque mouvement" - je ne sais pas comment cela pourrait être réalisé à l'intérieur de la bibliothèque Tensorforce.
Neil Slater
1

Normalement, l'ensemble des actions que l'agent peut exécuter ne change pas avec le temps, mais certaines actions peuvent devenir impossibles dans différents états (par exemple, tous les mouvements ne sont pas possibles dans n'importe quelle position du jeu TicTacToe).

Jetez un œil comme exemple au morceau de code https://github.com/haje01/gym-tictactoe/blob/master/examples/base_agent.py :

ava_actions = env.available_actions()
action = agent.act(state, ava_actions)
state, reward, done, info = env.step(action)
madpower2000
la source