J'ai essayé de construire un modèle en utilisant 'Deep Q-Learning' où j'ai un grand nombre d'actions (2908). Après un succès limité avec l'utilisation du DQN standard: ( https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf ), j'ai décidé de faire un peu plus de recherche parce que je figurais le l'espace d'action était trop grand pour permettre une exploration efficace.
J'ai ensuite découvert cet article: https://arxiv.org/pdf/1512.07679.pdf où ils utilisent un modèle acteur-critique et des gradients de politique, ce qui m'a ensuite conduit à: https: //arxiv.org/pdf/1602.01783.pdf où ils utilisent des gradients de politique pour obtenir de bien meilleurs résultats que DQN dans l'ensemble.
J'ai trouvé quelques sites où ils ont mis en œuvre des gradients de stratégie dans Keras, https://yanpanlau.github.io/2016/10/11/Torcs-Keras.html et https : //oshearesearch.com/index.php/2016/06/14/kerlym-a-deep-reinforcement-learning-toolbox-in-keras/ mais je ne sais pas comment ils sont mis en œuvre. Dans le premier (et quand j'ai lu les articles), il semble qu'au lieu de fournir une paire d'entrée et de sortie pour le réseau d'acteurs, vous fournissez les gradients pour tous les poids, puis utilisez le réseau pour le mettre à jour, tandis que dans le dernier ils calculent simplement une paire entrée-sortie.
Je viens de me confondre? Suis-je simplement censé entraîner le réseau en fournissant une paire entrée-sortie et utiliser le standard "fit", ou dois-je faire quelque chose de spécial? Si c'est le dernier, comment puis-je le faire avec le backend Theano? (les exemples ci-dessus utilisent TensorFlow).
l'agent a besoin d'une politique qui est essentiellement une fonction qui mappe un état dans une politique qui est une probabilité pour chaque action. Ainsi, l'agent choisira une action en fonction de sa politique.
c'est-à-dire, politique = f (état)
Le gradient de politique n'a pas de fonction de perte. Au lieu de cela, il essaie de maximiser le retour attendu des récompenses. Et, nous devons calculer les gradients de log (action_prob) * avantage
Je suppose quelque chose comme ça
Nous avons besoin de deux fonctions
Vous savez déjà que ce n'est pas facile à implémenter comme des problèmes de classification typiques où vous pouvez simplement model.compile (...) -> model.fit (X, y)
Cependant,
Afin d'utiliser pleinement Keras, vous devez être à l'aise avec la définition de fonctions de perte et de dégradés personnalisés. Il s'agit essentiellement de la même approche que celle de l'auteur de la première.
Vous devriez lire plus de documentations sur l'API fonctionnelle Keras et keras.backend
De plus, il existe de nombreux types de gradients politiques.
Les implémentations apparemment conflictuelles que vous avez rencontrées sont toutes deux des implémentations valides. Ce sont deux façons équivalentes dont deux mettent en œuvre les gradients de politique.
Dans l'implémentation Vanilla, vous calculez les gradients du réseau de stratégie w.r.t. récompense et met à jour directement les poids dans le sens des gradients. Cela vous obligerait à suivre les étapes décrites par Mo K.
La deuxième option est sans doute une implémentation plus pratique pour les frameworks autodiff comme keras/tensorflow. L'idée est d'implémenter une fonction d'entrée-sortie (état-action) comme l'apprentissage supervisé, mais avec une fonction de perte dont le gradient est identique au gradient de la politique. Pour une politique softmax, cela signifie simplement prédire la "véritable action" et multiplier la perte (entropie croisée) par les rendements/avantages observés. Aleksis Pirinen a quelques notes utiles à ce sujet [1].
La fonction de perte modifiée pour l'option 2 dans Keras ressemble à ceci:
import keras.backend as K
def policy_gradient_loss(Returns):
def modified_crossentropy(action,action_probs):
cost = K.categorical_crossentropy(action,action_probs,from_logits=False,axis=1 * Returns)
return K.mean(cost)
return modified_crossentropy
où 'action' est la véritable action de l'épisode (y), action_probs est la probabilité prédite (y *). Ceci est basé sur une autre question de stackoverflow [2].
Références