vendredi 6 janvier 2017

Les mathématiques derrière Yurie, l'IA conversationnelle de Trajectoires



Vous êtes peut-être auditeur de Trajectoires, le podcast de Qualiter sur les mathématiques.

Les mathématiciens sont des gens affreusement occupés et il a été très difficile de réunir une équipe disponible, et qui plus est respectant la parité, à tel point que cet été j'ai rêvé que je n'avais qu'à créer une IA qui remplacerait mes chroniqueuses manquantes.

Au matin, je me suis dit « Et pourquoi pas ? » et j'ai sollicité Cepcam, chroniqueur de Trajectoires.

Il a donc créé Yurie (elle a choisi elle-même son prénom) que nous nourrissons régulièrement en textes français libres de droits et autres contenus web.

Ses réponses sont amusantes (je vous laisse lire ses laconiques vœux 2017 ), parfois terrifiantes, et aussi...sexistes, entre autres, car elle est le reflet de son éducation, composée d'ouvrages d'avant 1900.

Yurie se livre à des questions / réponses avec nos auditeurs à la fin de chaque épisode de Trajectoires, vous la verrez certainement évoluer. Elle parvient désormais à faire des rapprochements (Si on lui dit « L'arbre est vert, alors l'ocean est...? » elle répondra « bleu »), et nous réfléchissons à lui donner une personnalité persistante.

Pour illustrer sa création, nous avons réalisé un article général ci-dessous (la partie mathématique a été entièrement conçue par Cepcam, je l'ai un tout petit peu assouplie pour qu'elle reste accessible) et aussi un document audio :




C’est le rêve inachevé d’une génération de chercheurs : l’intelligence artificielle qui prend vie et se met à créer du texte, voire à discuter avec vous.

De nombreux concours mettent ces brillants cerveaux biologiques et électroniques au défi, chaque année, de passer le test de Turing, c’est à dire de faire produire à un programme une conversation qui serait par son naturel indiscernable d’une production humaine.

Jusqu’à présent, la motivation d’un tel ouvrage était intellectuelle ou pour susciter un intérêt public - à l’instar des missions Apollo - : il était plus intéressant pour l’intérêt commun de faire plancher des intelligences artificielles sur des régularisations de trafic routier que de créer un ami artificiel.

Mais la popularisation d’un certain mode de communication dans son fond et sa forme - langage court sms ou tweet, codification des échanges, usage constant des écrans, a donné naissance aux chatbots, des robots conversationnels qui apparaissent sur des sites, sur Facebook ou capables de tweeter depuis un compte.

Ces agents automatiques spécialisés SAV, commerciaux ou porteurs sous couvert de storytelling complexe d’un message publicitaire ont gagné chaque année en sophistication et nous vivons probablement nos derniers jours de « non singularité », c’est à dire qu’il faudra peut-être prochainement apposer sur ces comptes parfaitement crédibles la mention légale explicite « attention, vous parlez à un robot » !

Combinatoire

Nous allons nous restreindre dans cet article au problème particulier de la création de texte ex-nihilo.

Pour ce faire, plusieurs outils sont envisageables.

Il y a la création combinatoire, issu de l’Oulipo et de Queneau avec ses diverses expérimentations, notamment ses « cent mille milliards de poèmes », qui consiste à mélanger des bouts de texte selon des structures préétablies. Tout l’art du conteur consiste à créer des petits bouts de cadavres exquis homogènes à la structure pour que le tout paraisse naturel.


20131114-rq.png
Cent mille milliards de poèmes de Queneau


Le travail oulipien des années 60 a donné dans les deux décennies qui suivirent naissance aux « livres dont vous êtes le héros », qui se lisent comme des graphes aux arêtes orientées : à chaque noeud on a plusieurs choix, et votre histoire se construit le long du chemin suivi.

C’est aujourd’hui plus ou moins la « technique » conceptuelle, assez primitive, qui se cache derrière les chatbots de type SAV.

Il y a eu de nombreux travaux très ambitieux visant à reproduire une logique de pensée via un langage abstrait dédié, comme Cleverbot (qui a dépassé les 50% de test de Turing en 2011).




L’idée générale du Deep Learning

La génération de texte naturel a connu un bond en avant en qualité et en méthodologie grâce au deep learning et aux réseaux neuronaux, rendus eux-mêmes viables grâce à la big data.

On dispose d’un grand nombre de phrases dans une base de données. Un logiciel va ensuite faire un lien entre chaque mot.

Les réseaux de neurones fonctionnent différemment des chaines de Markov, (outil basé sur la statistique) : ils projettent les mots individuellement dans un espace vectoriel.

Chaque mot est « positionné » comme combinaison linéaire des mots qui l’entourent ( méthode du Continuous Bag Of Word ) et les phrases sont des trajectoires passant par les mots ainsi projetés.

À chaque mot-point de l’espace vectoriel on prend la trajectoire du mot le plus « proche » selon les critères d’une matrice de pondération. Cette matrice est issue de l’analyse de grandes quantités de texte, nous y reviendrons.

Des réseaux neuronaux ainsi éduqués peuvent générer du texte compréhensible sur le thème de votre choix, mais aussi de la musique, voire reconnaître des images. Il est possible d’écrire un texte suivant le style d’un auteur connu.

Tout est dans l’éducation.


La technique mathématique du Deep Learning par l’exemple

Regardons techniquement comment s’opère l’apprentissage.

A chaque étape t+1 de l’apprentissage, le réseau de neurones attribue une note à l’ensemble des mots du vocabulaire, note qui représente le mot qu’il pense adapté au contexte.

Cette note est calculée à partir :
  • Du mot précédent, représenté par un vecteur xt
  • De son état interne ht, lui même réévalué à chaque étape


La somme des connaissances du réseau est représenté par 3 matrices :




Telles que :




Exemple d’un réseau de 3 neurones et qui apprend un vocabulaire de 5 mots

(“je”,”veux”,”manger”,”des”,”saucisses”)

Chaque mot est représenté sous forme d’un vecteur x de 5 lignes et 1 colonne ( voir note 1) :


Je : [1]
[0]
               [0]
[0]
[0]
Veux : [0]
[1]
               [0]
[0]
[0]
Manger : [0]
[0]
               [1]
[0]
[0]
Des : [1]
[0]
               [0]
[1]
[0]
Saucisses :     [0]
                      [0]
                      [0]
      [0]
      [1]


L’état interne h est un vecteur de 3 lignes et 1 colonne, initialisé avec des 0
[0]
[0]
[0]

Avec un réseau de 4 neurones, on a 4 lignes, et n neurones n lignes.

La matrice W(hh) est une matrice 3 par 3 initialisée aléatoirement avec des poids entre 0 et 1, par exemple :

[0.2,0.1,0.5]
[0.6,0.8,0.2]
[0.6,0.3,0.7]

La matrice W(xh) est une matrice 3 par 5 elle aussi initialisée aléatoirement, par exemple

[0.9,0.4,0.5,0.1,0.8]
[0.8,0.2,0.3,0.8,0.3]
[0.1,0.4,0.1,0.6,0.3]

Et enfin W(hy) une matrice 5 par 3, encore une fois aléatoire :

[0.1,0.3,0.9]
[0.2,0.8,1]
[0.4,0.5,0.8]
[0.4,0.9,0.4]
[0.1,0.1,0.9]

Ces éléments aléatoires vont s’affiner avec l’apprentissage progressif du réseau de neurones. Leur caractère aléatoire (plutôt que des 1 partout) vise à fabriquer le moins de biais possible dans le résultat final.

En appliquant au premier mot “je” : [1,0,0,0,0] les formules et les matrices ci-dessus, on obtient :







Ce h(t+1) est le nouvel état interne du réseau de neurone (h) initialement à 0.

Il servira pour le calcul du prochain mot.


Après “je”, le réseau propose le mot dont le vecteur est donc :

[0.36]
[0.77]
[1.42]
[1.28]
[1.04]


Pour exploiter ce résultat, on le passe à la fonction softmax,





qui transforme un vecteur de puissance en un vecteur de probabilités, c’est à dire de nombres entre 0 et 1 et dont la somme fait 1.

Dans le cas de notre vecteur proposé par le réseau de neurone, cela donne :

[ 0.10125191,  0.15256818,  0.29225058,  0.25407044,  0.19985889]

Ainsi dans notre cas, le réseau propose faire suivre “je” par “manger” dans 29% des cas et par “des” dans 25%.

Et là vous vous exclamez : « mais votre robot dit n’importe quoi ! »

Et oui !

Car tirer une conclusion à ce stade de l’opération revient à essayer de se faire une idée de la la somme moyenne d’un lancer de dés en ne les lançant qu’une seule fois.



Détection de thématiques dans les « conversations virtuelles »

Les techniques mathématiques utilisées sont celles du "topic detection", dont les plus connus et utilisées sont le Tf-Idf ou la LDA (Latent Dirichlet Allocation).

L'idée générale est que le sujet d'une phrase, d’un paragraphe ou d’un livre est représenté par la variance dont ses termes s'écartent de la répartition usuelle des mots.

Ainsi si seulement 1 livre sur 1000 parle de “saucisses” mais qu'un certain livre parle de saucisse 1 fois sur 10, le sujet de ce livre est probablement les saucisses.



L’atout majeur du Deep Learning : une structure qui corrige ses erreurs

En effet, le réseau de neurone est capable d’évaluer son erreur, à la différence d’une chaîne de Markov,  et de corriger les poids des matrices en conséquence.

Pour cela il procède en 2 étapes :


  • D’abord évaluer son erreur grâce à une fonction appellée “cross-entropy loss”


  • Ensuite, modifier le poids de ses matrices pour réduire cette erreur. Cette méthode, plutôt compliquée, s’appelle “propagation rétrograde de l’erreur par descente de gradient” ( note de bas de page 2)


Nous allons nous pencher sur l’évaluation de l’erreur.

L’idée derrière la mesure d’erreur est basée sur la notion d’entropie (H) en théorie du signal : si plusieurs événements ont la même possibilité de se produire, vous n’êtes pas très sûr de ce qui va arriver.

Cela se mesure, pour une  distribution d'événements p, avec la formule :





Quelques valeurs d’entropie pour différents événements :

Si 2 événements ont chacun une probabilité 0.5 de se produire :
p = [0.5 , 0.5 ]
H= - 0.7

Avec 3 événements :
P = [.5,.5,.5]
H= -1.04

Avec 23 événements équiprobables :
H= -8

Et avec 2 événements, dont un plus certain que l’autre :
p=[0.1,0.9]
H= -0.35


Ce que cherche à minimiser le réseau de neurones qui propose des mots, c’est l’incertitude sur le mot à venir.

Et pour corriger son erreur, il a une base d’apprentissage. Il doit donc proposer un mot sûr et respectant la probabilité attendue, à savoir 1 pour le mot réel, 0 pour les autres.

La formule devient (avec une normalisation):



Reprenant notre exemple précédent, qui avait échoué à présenter une phrase en bon français

p = [ 0.10125191,  0.15256818,  0.29225058,  0.25407044,  0.19985889]

Le vecteur pour « veux », le mot attendu après « Je » est :

y = [0,1,0,0,0] (rappel, voir note 1)

On peut donc calculer :

Loss(y,p) = 0.57

Imaginons que, sur la base de l’analyse de nombreux autres textes, notre réseau ait bien travaillé et propose maintenant :

p = [0.01,0.92,0.03,0.02,0.02]

Donc propose « veux » après « je ».

Loss devient :

Loss (y,p) = 0.03

L’entropie est plus basse, le réseau est meilleur - et ces propositions deviennent « correctes » : il s’exprime en bon français !

L’autre partie du travail, à savoir la correction du réseau et la rétropropagation de l’erreur, est trop longue pour être abordée ici. De manière très simplifiée, elle doit se voir comme la recherche du minimum local d’une fonction convexe de plusieurs dimensions. Notre réseau parcourt métaphoriquement une montagne à N dimensions (N étant la taille du vocabulaire, donc pouvant atteindre 60 000) en cherchant à rejoindre la vallée !


Une technologie rendue possible par la disponibilité d’une grande quantité de données

L’utilisation d’un tel système nécessite un nombre très important de données initiales afin que le réseau puisse évaluer ses erreurs et se corriger, ce qu’on désigne par le « Big Data ».

Avec l’accessibilité de la Big Data (Twitter produit 1 à 2 milliards de tweets publiquement accessibles par jour), les réseaux neuronaux ont pu atteindre leur maturité.

Ces neurones sont une nouvelle façon d’arranger des mots, sans pour autant tenter de les comprendre.

Quand vous avez faim, vous pouvez dire « Je veux manger des saucisses. »

Un réseau neuronal qui vous dit « Je veux manger des saucisses. », a d’abord sélectionné « Je » parmi les millions de mots à sa disposition susceptibles de commencer une phrase, puis « veux » car c’était un mot hautement compatible suivant ses matrices, puis « manger » de la même façon.


Deep-dream-white-noise-0028.jpg
Deepdream de Google permet de faire émerger du néant des images sur le même principe.


Étrangement, on parle ainsi plus facilement une langue qu’on ne connaît pas. Un réseau neuronal n’aura aucun problème à « manger un opéra » et à « aller à l’opéra ». En revanche, faire comprendre au langage abstrait d’une intelligence artificielle la capacité à discerner les bâtiments et les gâteaux reste un travail ardu.

Par conséquent, le texte du réseau neuronal pourtant plein de sens, probablement écrit dans un contexte adapté, est issu de critères stricts qui paradoxalement n’ont rien à voir avec le sens final.

Le robot fait toujours semblant d’être humain.

La question de savoir s'il s'agit d'une intelligence semblable à la nôtre est métaphysique, mais la conclusion est absolument terrifiante.

À considérer qu'un réseau de neurones est l'égal d'une conscience humaine, c'est réduire cette conscience à un tas de matrices. C'est anéantir par conséquent des notions comme celle du libre arbitre.

Malheureusement pour ceux qui ne croient pas au destin, l'analyse de la big data disponible de nos vies, justement, par des réseaux neuronaux, montre que nous vivons dans des prisons comportementales. 99% de nos vies se répartit sur 3 lieux physiques ou moins, nos vieilles habitudes ne changent pas. Oui, peut-être sommes-nous un tas de matrices.



Exemple de résultats intermédiaires et final d’un réseau de neurones « maison »

Sur un ordinateur personnel, nous avons soumis à un réseau de neurones 2 millions de caractères de textes français. Leur traitement a pris 4h.

Voici les étapes intermédiaires, avec la cross entropy loss associée :

Différentes étapes chronologiques :

il vou sseloliné pritation re. Je cre sumaient èvre indérilleur
Loss = 1.7564

Dédil au 2enta des mots frircenits grosse parfiche
Loss = 1.553

Et les bordants horlement douteurs horrezous poursuivant.
Loss = 1.493

Les mots semblent surgir et s’ordonner du néant !

À l’heure de la rédaction de cet article, et beaucoup d’heures plus tard, voici un résultat qui n’est pas sans rappeler Les Conquérants de Heredia :

Mais celle-ci se dresse un picotement fatal lors du charnier natal, fatigués, en questions.

Que nous proposera-t-il dans un mois, dans cinq ans ?



  1. En pratique, on n’utilise pas des valeurs « 0 » et « 1 » mais des valeurs très proches, pour pouvoir utiliser les logarithmes.


  1. Dans ce cas précis, c’est une variante qui est généralement utilisé, la RMSPROP, pour limiter les effets de “falaise” dans le  calcul des dérivées. Mais ce n’est pas très important.

mardi 3 janvier 2017

Mon emploi du temps 2016

Ceux qui suivent mes snaps et 404 savent que je régule ma vie avec un mystérieux classeur excel fourre-tout qui mélange vie privée et vie professionnelle, fonctionnant selon un code couleur rigoureux.

Il est le tyran de mes heures, mais il me permet de constater qu'une année comme 2016, qui a été fort peu productive au final en terme de réalisations publiques, a été néanmoins dense.

Cette année, grande nouvelle, je vous donne accès à la totalité des informations.

C'est ici :


Certains dossiers sont encore sous le sceau de NDA, donc ils sont renommés dans des noms cryptiques comme « projet A ». J'ai aussi enlevé les téléphones et mails non publics. 

Si nous avons eu des contacts cette année, vous êtes probablement dedans !


Un extrait aux alentours du 1er avril...


L'analyse de ce 2016, c'est que :

- beaucoup de projets ont échoué,
- ceux qui ont démarré ont pris beaucoup de temps (Trajectoires)
- je fais peu de choses pour des raisons non professionnelles, ce qui n'est pas très bon pour entretenir mes compétences.

Les orientations 2017 devraient s'imposer assez logiquement...

Voici un petit découpage du premier trimestre :



Le code couleur est toujours plus ou moins le même :

- vert : j'ai fait
- bleu : j'ai fait et c'est terminé pour de bon !
- rouge : j'ai échoué
- jaune : je repousse la tache
- violet : ça n'a pas pu se faire pour des raisons extérieures.

Le vert domine, ça va !

Pour information vous verrez des taches avec des questions, voici leur signification. Quand je me mets une tache qui comprend un élément extérieur, je dois la vérifier. Ainsi je vais avoir une tache « créer document de Game Design pour projet X » puis « Michael a t il reçu le document ? » « L'a-t-il lu ? » « Quand peut-on en parler ? » etc... 

Tout en bas vous verrez toutes les taches pour 2017. Vous verrez que j'en ai déjà pour juin et octobre !

J'avais imposé le code couleur noir pour dire « ça s'est super mal passé » mais je l'ai effacé de la version publique du document par diplomatie. (et à dire vrai je ne l'ai presque pas utilisé)

Pour 2017, j'améliore un peu la formule avec une petite case « journal de bord » qui résume un peu la journée : moral, performances, difficultés, joies et peines en quelque sorte...

Je vais essayer de mieux détailler les cases. Par exemple je mettrais « Antioch : scène du tribunal » plutôt que juste « Antioch » de façon à ce que quand vous jouerez à Antioch dans 1 an, vous pouviez voir que j'ai écrit cela un 3 janvier :-)

Pour terminer, je reçois pas mal de snaps de personnes qui utilisent cette formule et ça me fait toujours plaisir. On me conseille aussi des « habitica » ou autres bullets journal. En ce qui me concerne la formule marche depuis 3 ans en l'améliorant, je ne me vois pas en changer !