Jonathan Suru

L'Awalé rencontre l'IA : Un voyage dans l'apprentissage par renforcement (Partie1).

Introduction

Dans le cadre de mes expériences en intelligence artificielle, j'ai décidé d'apprendre le Renforcement Learning (RL). Pour ce faire, je me suis lancé dans un projet intéressant : apprendre à une IA à jouer à l'Awalé. Ce jeu traditionnel africain est un excellent terrain d'expérimentation pour l'apprentissage par renforcement. Dans cet article, je vais vous présenter les premières étapes de mon projet, notamment la création de l'environnement de jeu.

Qu'est-ce que l'apprentissage par renforcement ?

L'apprentissage par renforcement (RL) est une technique de machine learning qui entraîne les logiciels à prendre des décisions pour obtenir les meilleurs résultats. Elle imite le processus d'apprentissage par essais et erreurs des humains. Les actions du logiciel qui contribuent à atteindre l'objectif sont renforcées, tandis que celles qui y nuisent sont ignorées.

Les algorithmes de RL utilisent un système de récompenses et de punitions. Ils apprennent du retour d'information de chaque action et découvrent par eux-mêmes les meilleures stratégies. Ils peuvent même différer la gratification, acceptant des sacrifices à court terme pour une meilleure stratégie globale.

L'Awalé : Un défi intéressant pour l'IA

L'Awalé est un jeu de stratégie joué sur un plateau de 12 trous, chacun contenant initialement 4 graines. Les joueurs déplacent ces graines selon des règles spécifiques, avec pour objectif de capturer plus de graines que l'adversaire.

Ce jeu est particulièrement intéressant pour l'apprentissage par renforcement car :

  1. Il offre un espace d'états gérable, mais suffisamment complexe
  2. Ses règles sont claires avec des conséquences à long terme
  3. Il nécessite un équilibre entre stratégie et tactique

Choix technologiques : JAX

Pour ce projet, j'ai choisi d'utiliser JAX, une bibliothèque de calcul numérique développée par Google. Voici pourquoi :

Implémentation de l'environnement de jeu

J'ai d'abord construit une simple classe Awale pour implémenter un premier environnement de jeu sans JAX. Ensuite, j'ai essayé d'intégrer JAX pour profiter de ses accélérations. Examinons maintenant en détail les différentes parties de notre classe `AwaleJAX` et leurs rôles :

Initialisation du jeu


def __init__(self, player: jnp.int8 = 0):
    self.current_player = player  # 0 ou 1
    self.action_space = jnp.arange(player * 6, (player + 1) * 6, dtype=jnp.int8)
    self.state = jnp.array([4] * 12, dtype=jnp.int8)  # 12 trous avec 4 graines chacun
    self.scores = jnp.zeros(2, dtype=jnp.int8)  # 2 joueurs avec un score de 0 chacun
            

Cette méthode initialise l'état du jeu, définissant le joueur actuel, l'espace d'actions, l'état initial du plateau et les scores.

La méthode step


def step(self, action):
    reward = -0.1  # Légère pénalité pour chaque action
    # Logique de distribution des graines...
    self.state, captured = capture_seeds(current_pit)
    self.scores = self.scores.at[self.current_player].add(captured)
    reward += 0.5 * captured  # Récompense pour la capture
    # Vérification de fin de partie et changement de joueur...
    return self.state, reward, done, info
            

Cette méthode gère le déroulement d'un tour complet, y compris la distribution des graines, la capture, et le calcul des récompenses.

Vérification de la validité du mouvement


@jit
def is_valid_move(action: jnp.int8) -> jnp.bool_:
    in_range = jnp.logical_and(
        self.current_player * 6 <= action,
        action < (self.current_player + 1) * 6,
    )
    has_seeds = self.state[action] > 0
    return jnp.logical_and(in_range, has_seeds)
            

Cette fonction vérifie si le mouvement est valide en s'assurant que l'action est dans la plage des trous du joueur actuel et que le trou choisi contient des graines.

Capture des graines


@jit
def capture_seeds(last_pit) -> jnp.int8:
    opponent_side = (1 - self.current_player) * 6
    # ... [logique de capture avec lax.while_loop]
            

Cette fonction gère la capture des graines, utilisant une boucle optimisée de JAX pour capturer les graines de l'adversaire si les conditions sont remplies.

Gestion de fin de partie

Plusieurs fonctions auxiliaires gèrent les différents aspects de la fin de partie, comme le calcul de la récompense finale, la détermination du gagnant, et la vérification si un côté du plateau est vide.

Optimisations avec JAX

Notre implémentation utilise plusieurs fonctionnalités de JAX pour optimiser les performances :

Défis rencontrés et en cours

La création de cet environnement a présenté et continue de présenter plusieurs défis intéressants :

  1. L'implémentation précise des règles de l'Awalé
  2. L'optimisation des performances avec JAX
  3. La gestion des conditions de fin de partie
  4. La détermination d'une méthode de récompense optimale

Ce dernier point est particulièrement crucial et complexe. Actuellement, notre système de récompense est relativement simple :


reward = -0.1  # Légère pénalité pour chaque action
# ...
reward += 0.5 * captured  # Récompense pour la capture de graines
            

Cependant, je cherche à développer une méthode de récompense plus sophistiquée qui pourrait mieux refléter la stratégie à long terme nécessaire dans l'Awalé. Quelques pistes que j'explore incluent :

Prochaines étapes

Pour la construction de mon environnement, je me suis basé sur les environnements de Jumanji d'InstaDeep. Actuellement, l'environnement fonctionne mais n'est pas encore totalement conforme aux normes de Jumanji.

Les prochaines étapes du projet seront :

  1. Réécrire ma classe pour profiter pleinement des avantages de JAX
  2. Expérimenter avec différentes structures de récompense
  3. Développer un agent d'apprentissage par renforcement
  4. Entraîner l'agent contre lui-même
  5. Évaluer les performances et analyser les stratégies
  6. Explorer des techniques avancées pour améliorer l'agent

Conclusion

La création de cet environnement de jeu Awalé est la première étape d'un projet passionnant à l'intersection de l'IA et des jeux traditionnels. Cela ouvre la voie à des expériences intéressantes en apprentissage par renforcement.

Dans les prochains articles, je détaillerai non seulement le développement de l'agent IA et son processus d'apprentissage, mais aussi mes expériences avec différentes structures de récompense et leur impact sur les performances de l'agent. Cette exploration de la conception des récompenses est un aspect fascinant de l'apprentissage par renforcement, particulièrement dans un jeu aussi stratégique que l'Awalé.

N'hésitez pas à partager vos idées sur des méthodes de récompense potentielles ou sur d'autres aspects du projet !

Pour aller plus loin

Si vous souhaitez en savoir plus sur l'apprentissage par renforcement, l'Awalé ou JAX, voici quelques ressources utiles :

Ma recommandation musicale du jour : à écouter sans modération !

Écouter sur YouTube