Vous avez très certainement entendu parler de ces deux intelligences artificielles qui ont inventé d’elles-mêmes un langage, à tel point que les chercheurs de Facebook (leurs créateurs) étaient incapables de les comprendre… Beaucoup de journaux (plus ou moins) scientifiques ont alors titré « Que se disent ces deux IA, prévoient-elles notre destruction ? Les chercheurs ont dû les débrancher ! ».

Je les arrête tout de suite : l’expérience n’a pas du tout dérapée, la langue « inventée » était juste une modification de l’anglais optimisant les échanges et manipulant l’IA d’en-face. Le texte en lui-même n’avait pas vraiment de signification particulière, comme on va le voir dans ce focus.

On va donc apprendre ensemble qu’est-ce qui se cache derrière ces deux intelligences artificielles dont la mission est de troquer tout en s’enrichissant un maximum ! Ensuite, on verra comment les mettre en place sur votre ordinateur de manière très simple, et vous pourrez les tester chez vous et même les affronter. On reviendra enfin sur cette fameuse langue générée par nos amies les IA.

Temps estimé du TP : 20 minutes

I. Outils théoriques pour comprendre la démarche de Facebook

1) Les règles du jeu

Toutes les interactions humaines, à une échelle ou à une autre, reposent sur de la négociation (des compromis). Vouloir apprendre à une intelligence artificielle les ficelles du métier, c’est lui donner les moyens d’échanger avec nous (et de prendre l’ascendant lors d’une conversation).

Dans cette expérience du FAIR, voici quel était le but du jeu :

  • De 5 à 7 objets parmi des chapeaux, des balles et des livres sont tirés au hasard
  • Chacun se voit assigner une valeur par défaut, propre à chaque joueur, de sorte que le prix total de la collection d’objets fasse 10 par personne
  • Chaque type d’objet vaut plus de 0 pour au moins 1 personne
  • Au moins un objet ne vaut pas 0 pour les 2 joueurs

De cette manière, le jeu est garanti « intéressant » car tous les objets ont un minimum de valeur et il y aura un conflit sur certains d’entre eux.

Les 2 joueurs devront alors décider ensemble de comment répartir les objets entre eux pour avoir le score maximal (le plus haut score gagne). S’ils s’accordent sur une répartition, mais au moment de donner changent les nombres, alors tout le monde perd !

Note : les schémas sont tirés de l’article soumis par Facebook, car ils sont très clairs et bien expliqués.

2) La préparation des données

Une très grosse partie du travail, comme bien souvent en deep learning, a été exécutée sur la préparation des données. Si Facebook n’avait pas sous la main les exemples de négociation dont il avait besoin, des humains ont été recrutés pour constituer une telle base en… jouant entre eux.

Bien entendu, pour que l’expérience ne soit pas biaisée, ils étaient rémunérés (taux fixe + prime de victoire) ! Grâce à cela, plus de 5 000 exemples ont pu être générés.

Ensuite, ils ont rapproché ces exemples de ce qu’ils voulaient, c’est-à-dire deux échanges du point de vue des négociateurs, pour pouvoir entraîner leurs IA à prendre la place des deux humains en compétition.

C’est ce que représente l’image ci-contre, à gauche les données recueillies avec les résultats et à droite la perspective de chaque agent.

3) Les algorithmes !

Comme on va le voir, ils se déroulent en 2 phases. Dans la première, un algorithme est entraîné pour imiter le jeu des humains desquels il apprend (pour pouvoir générer plein de parties ensuite). Dans la seconde, une intelligence artificielle pré-entraînée combat l’algorithme jusqu’à devenir plus forte.

modes d'entraînement
Image tirée de l’article du FAIR

Phase I : apprentissage supervisé

Dans cette phase, un algorithme est entraîné grâce aux données d’apprentissage (d’où l’aspect supervisé) pour simuler la totalité d’un échange. Il va donc « imaginer » l’échange entre les deux participants à leur place (ce sera le modèle de simulation des décisions pour chaque IA), et servira de pré-entraînement pour nos deux participants.

Basé sur les réseaux « sequence to sequence » (seq2seq) il est composé de :

  • 4 réseaux de neurones récurrents de type GRU (Gated Recurrent Unit).

Pour rappel, un réseau de neurones récurrents est un réseau qui utilise des données temporelles pour prédire l’avenir. Par exemple, à partir des 5 derniers mots tapés sur votre clavier, il prédira le suivant, puis le suivant du suivant, et ainsi de suite. Le type GRU est une architecture particulière qui n’exerce aucun contrôle sur les données cachées (à l’inverse des LSTM qui sont plus connus).

Phase II : apprentissage par renforcement

L’apprentissage par renforcement est la technique d’intelligence artificielle la plus répandue. Contrairement à un algorithme de machine learning, on laisse évoluer le système « librement » et surtout explorer toutes les pistes qu’il souhaite. Une récompense est alors attribuée à chacune de ses actions, ce qui va l’encourager à poursuivre dans cette voie (mais les récompenses sont également déterminées par l’IA et par le système).

Par exemple, une IA placée dans un labyrinthe essaiera au hasard des déplacements. Si elle perd (piège), elle obtiendra une récompense négative et notera les déplacements qu’elle a fait et menant à cette conclusion négativement (de manière décroissante bien- sûr). Si elle trouve la sortie, elle renforcera le chemin qui l’y mène. Si en plus chaque déplacement lui coûte de l’énergie (récompense négative), alors elle finira par trouver le plus court chemin vers la sortie et le renforcer !

  • L’IA que l’on veut entraîner affronte donc en boucle l’algorithme supervisé qui a appris à imiter les humains (sans aucune initiative derrière) jusqu’à devenir meilleure, en trouvant comment le battre systématiquement (elle découvre donc nos « failles »).

Pour la prédiction finale, l’intelligence artificielle négociatrice va donc avoir un ensemble d’univers possibles dans lesquels elle va estimer le gain. Elle choisira ensuite la phrase (proposition commerciale) qui lui rapportera le plus, à l’image d’un jouer d’échec qui place ses pièces.

Grâce à ce système, elle est capable de bluffer et de tromper la confiance de l’autre joueur en faisant semblant de s’intéresser à un article (lui laissant croire qu’il vaut cher) pour finalement en concéder un autre (qui est vraiment cher lui) !

4) Une véritable prouesse

Si le système parait vraiment simple au final, il n’en reste pas moins incroyable. L’équipe du FAIR a pu entraîner une IA à gagner à un jeu « humain », dans un langage naturel. A aucun moment il ne faut coder, ou remplir des cases !

A mon sens, la prouesse est donc vraiment dans cette capacité d’échange naturelle, couplée aux idées innovantes qu’a eu l’équipe.

II. Mise en place de l’intelligence artificielle négociatrice

Contrairement à de nombreux tutoriels, celui fourni par Facebook pour utiliser leur projet nommé end-to-end-negociator est très simple et rapide à mettre en place, à quelques petites erreurs près. Préparez-vous, ça va aller vite !

1) Préparation de l’environnement

On va avoir besoin d’installer quelques outils, le plus important étant le framework de deep learning PyTorch via Anaconda.

a. Anaconda

Outil destiné aux data scientists pour leur simplifier la vie en regroupant gestionnaire de paquet, Python et IDE, Anaconda est le premier outil à télécharger (car certains package ne sont disponibles que dessus).

Je travaille sous Windows, mais vous êtes libres d’appliquer ce tutoriel à n’importe quel autre OS.

Télécharger Anaconda

Installez Anaconda et ajoutez au Path (je vous recommande de cocher la case à l’installation si vous avez le moindre doute, c’est plus simple ou d’utiliser les variables utilisateur) :

PATH=D:\Tools\Anaconda3;D:\Tools\Anaconda3\Scripts;D:\Tools\Anaconda3\Library\bin;%PATH%;

Anaconda vous permet de créer des environnements virtuels sur lesquels tout ce que vous faites reste cantonné (à la manière d’une VM). Pour ne pas casser d’autres installations (dont TensorFlow qui ne marchait plus chez moi à cause d’une différence de version de hdf5) ouvrez Anaconda Prompt dans le menu démarrer et saisissez les commandes suivantes :

conda create -n negociator python=3 anaconda

Vous venez de créer un environnement virtuel en Python 3 nommé negociator, qu’il faut activer pour travailler dessus (pour le désactiver, écrivez simplement « deactivate »)

activate negociator

b. PyTorch

PyTorch est un framework de Deep Learning concurrent de TensorFlow (par Google), développé par NVIDIA. Sa grande particularité est sa rapidité d’exécution, boostée par le savoir-faire de la compagnie et optimisée grâce aux cartes graphiques GeForce.

Pour l’installer, on va utiliser le channel (= repository) de peterjc123. Au passage, on va également installer Cuda 8 (ou Cuda 9 suivant la configuration de votre ordinateur), qui permettra d’utiliser sa carte graphique dans les calculs :

conda install -c peterjc123 pytorch cuda80

(pour Cuda 9, remplacez cuda80 par cuda90)

Remarque : Si vous avez le moindre problème pour installer Cuda, n’hésitez pas à l’indiquer dans les commentaires et je partagerai en détail toute l’installation qu’il y a autour (si elle est nécessaire).

c. Autres dépendances

Installons

  • TorchVision qui regroupe des datasets et permet de travailler sur l’analyse d’image avec des convolutions
  • Visdom dont l’objectif est de fournir des visualisation des résultats
pip install torchvision
pip install visdom

d. Les sources de Pensée Artificielle

Tout le projet est disponible sur notre Github, avec deux petits correctifs, et tous les fichiers générés (modèles et conversations), donc si vous bloquez à une étape n’hésitez pas à utilisez ce qu’on a partagé plutôt que le projet de Facebook.

Le projet à télécharger si besoin (sinon prenez celui de la partie suivante et partez de zéro)

e. Le projet à l’origine : Facebook Artificial Intelligence Research

Enfin, je souhaiterais vraiment remercier l’équipe de Facebook FAIR (Facebook Artificial Intelligence Research) qui a mis la totalité des sources en libre accès !

  • Voici leur projet Github, à télécharger si vous voulez partir de zéro (rien de généré)
  • Et voilà leurs explications 🙂

ATTENTION : Si vous partez de ce projet, il sera peut-être nécessaire de faire deux modifications liées à l’évolution des frameworks : il y a des erreurs car le programme s’attend à avoir des tensor.cuda.Long et reçoit des tensor.cuda.Int, donc une conversion est nécessaire (ajoutez la partie en gras si les scripts crashent) :

  • modules.py
    • ligne 107 : cnt = ctx.index_select(0, cnt_idx.type(torch.cuda.LongTensor))
    • ligne 108 : val = ctx.index_select(0, val_idx.type(torch.cuda.LongTensor))
  • agent.py
    • ligne 155 : choices_logits.append(torch.gather(logits[i], 0, idxs.type(torch.cuda.LongTensor)).unsqueeze(1))

2) Entraînement des deux bots !

Tout est prêt, vous allez voir comme c’est simple. Activez votre environnement Anaconda si vous l’avez perdu en cours de route (l’invite de commande commencera alors par « negociator ») et allez dans le dossier où sont vos scripts

activate negociator
cd D:\workspaces\MyPyProjects\tp-negotiator-from-facebook\src

Exécutez le fichier train.py avec les paramètres suivants

python train.py --data data/negotiate --cuda --bsz 16 --clip 0.5 --decay_every 1 --decay_rate 5.0 --dropout 0.5 --init_range 0.1 --lr 1 --max_epoch 30 --min_lr 0.01 --momentum 0.1 --nembed_ctx 64 --nembed_word 256 --nesterov --nhid_attn 256 --nhid_ctx 64 --nhid_lang 128 --nhid_sel 256 --nhid_strat 128 --sel_weight 0.5 --model_file sv_model.th
  • –data indique le répertoire où sont le fichiers d’entraînement. Ceux-ci proviennent de plusieurs milliers d’échanges entre humains, payés par Facebook
  • –lr fixe le learning rate de départ, qui est abaissé jusqu’à –min_lr (pour améliorer la précision de l’algorithme une fois qu’il est proche de sa limite)
  • –max_epoch donne le nombre d’itérations d’entraînement maximal que va faire train.py, à moins qu’il n’atteigne son seuil de –dropout avant
  • –model_file est le modèle qui va être créé à la fin de l’entraînement

Si tout se passe bien, vous devriez obtenir la console suivante.

train negociator
Crédit : Facebook

L’algorithme a atteint une bonne précision globale (32 epoch) en une vingtaine de minutes.

3) Renforcement des intelligences artificielles

Alice et Bob vont devoir, à présent, apprendre de l’entraînement précédent et devenir vraiment forts au jeu de la négociation.

python reinforce.py --data data/negotiate --cuda --bsz 16 --clip 1 --context_file data/negotiate/selfplay.txt --eps 0.0 --gamma 0.95 --lr 0.5 --momentum 0.1 --nepoch 4 --nesterov --ref_text data/negotiate/train.txt --rl_clip 1 --rl_lr 0.2 --score_threshold 6 --sv_train_freq 4 --temperature 0.5 --alice_model sv_model.th --bob_model sv_model.th --output_model_file rl_model.th

Et voilà ! Les modèles d’Alice et Bob ont été créés dans sv_model.th !

N’hésitez pas à varier les paramètres pour obtenir de meilleures IA, surtout si vous voulez qu’elles inventent un nouveau langage…

reinforce negociator
Crédit : Facebook

4) Jeu automatique : Alice VS Bob

Vos négociateurs sont prêts, vous pouvez les voir s’affronter dans un match à mort grâce à la commande

python selfplay.py --alice_model_file rl_model.th --bob_model_file sv_model.th --context_file data/negotiate/selfplay.txt --temperature 0.5 --log_file selfplay.log --ref_text data/negotiate/train.txt

Un fichier selfplay.log est généré, et vous pouvez y lire l’ensemble des parties jouées par nos deux IA. Dans mon entraînement, Alice s’est avérée meilleure que Bob et l’a pour ainsi dire écrasé à chaque match : elle insistait tellement qu’il finissait par renoncer !

selfplay1 negociator
Crédit : Facebook

Voici un exemple de discussion (remportée par Alice 9 à 4) :

Alice : i want the hat and the balls <eos>
Bob   : i need the book and the balls <eos>
Alice : you can have the book if i get the rest <eos>
Bob   : deal . <eos>

Ainsi qu’une autre partie mieux disputée, plus tard dans les échanges :

selfplay2 negociator
Crédit : Facebook

5) Partie personnalisée : Vous VS Alice !

Enfin, vous pouvez vous amuser à échanger avec Alice et essayer de la battre. Lancez simplement

python chat.py --model_file rl_model.th --smart_ai --context_file data/negotiate/selfplay.txt  --temperature 0.5 --ref_text data/negotiate/train.txt

Saisissez votre offre en texte libre, Alice comprendra automatiquement ce que vous lui proposez et répondra en conséquence. En ne se décontenançant pas, vous devriez pouvoir la battre assez facilement (mais attention à ne pas arriver à un rejet, sinon vous remporterez 0 point !).

match vs alice
Crédit : Facebook

III. Invention d’un langage pour mieux vendre

Même si vous l’aurez compris en lisant l’article, je souhaiterais démystifier cette fameuse « invention d’un langage par une IA » qui « a forcé Facebook à l’éteindre », comme titres de nombreux articles scientifiques.

Comme on l’a vu, les IA négociatrices parlent de manière naturelle. Tant qu’elles échangent avec un humain, elles apprennent de nos réponses et répondent « de la même manière », car elles s’entraînent avec nous !

Si deux IA s’affrontent pendant suffisamment longtemps, de petites erreurs grammaticales vont être renforcées aléatoirement (si elle permet de gagner).

  • Par exemple, vous être l’IA 1 et demandez « deux livres livres » et gagnez. Vous en concluez que l’échange était positif, peut-être parce que vous avez insisté sur le mot « livre » et que cela a incité l’adversaire à accepter votre proposition. L’IA 2, pour sa part, a enregistré qu’en demandant « deux livres livres » vous vous attendiez à recevoir livre x2.
  • Quelques fois plus tard, en réitérant l’expérience, vous finissez par demander « livres livres » en omettant le « deux » et gagnez (car l’IA 2 a appris que « livres livres » = livre x2, tout comme « deux livres » avant)
  • Un nouveau « langage » a ainsi été créé, et vous pourrez dire « livres livres livres » pour 3 livres !

Après un certain temps, vous direz peut-être « livr » au lieu de « livre », etc… et à terme obtiendrez un langage que l’IA 2 comprend, que VOUS comprenez, mais qui n’a plus aucun sens pour des humains ! Qui comprendrait que si la réponse à « je t’échange 3 livres contre 2 chapeaux » est « livr livr » alors l’IA 2 propose en fait un échange de seulement 2 livres contre les 2 chapeaux ?

Pour en revenir à Facebook, ils n’ont donc pas créé des IA qui discutent de manière secrète à l’insu de tous les humains et planifient notre destruction, mais « juste » une expérience impensable il y a quelques années. Ceci étant, rien n’exclut l’hypothèse qu’en laissant tourner les algorithmes suffisamment « longtemps », un véritable langage avec plus de sens qu’initialement prévu puisse naître d’un tel système (mais vu les capacités de calcul actuelles ça parait impossible avant au moins 10 ans) et donner naissance à une IA consciente.

Au final, s’ils ont éteint leurs serveurs, c’est simplement car l’expérience était terminée.

Crédit de l’image de couverture : image retouchée à partir de QIHAN TechnologyCC0 1.0

1 commentaire