Un réseau de neurones génèrent les textes de JUL !

Maxime Pawlak
12 min readNov 9, 2020

Introduction

Dans ce post, nous allons étudier une application concrète des réseaux de neurones récurrents sur des données textuelles (RNN dans la littérature). Ces architectures de réseaux permettent de gérer des données ayant une notion de temporalité, un historique ou une sorte d’écoulement (pensez simplement à une phrase dont le sens dépend de l’ordre des mots précédents, des phrases précédentes, des paragraphes précédents…).

GPT-3

Une petite parenthèse sur GPT-3 s’impose. A l’heure où j’écris ces lignes, GPT-3 défraie la chronique dans le domaine de la génération de textes.

Présenté en mai 2020 par OpenAI, ce modèle au 175 milliards de paramètres (c’est énorme, son petit frère sorti en 2019 n’en avait “que” 1,5 milliards) est capable d’une multitude de tâches dans le domaine du traitement automatique du langage — NLP (Natural Langage Processing) : traduction, rédaction automatique de texte, réponse à des questions fermées. Ses performances sont juste bluffantes et beaucoup de personnes se sont amusées avec depuis.

En septembre 2020, OpenAI a annoncé un partenariat avec Microsoft pour l’utilisation de ce modèle. En effet, ils ont préféré ne pas publier le code source de leurs travaux par précaution d’usages malveillants et de potentiels biais (entre autres).

Je ne peux que vous inviter à lire le billet de blog présentant plusieurs usages ici : https://openai.com/blog/openai-api/ et de jeter un coup d’oeil au papier de recherche là : https://arxiv.org/pdf/2005.14165.pdf .

GPT-3 n’est pas composé de RNN, mais se base sur une architecture de Transformers. C’est en quelque sorte l’évolution technologique des RNNs (mais c’est une autre histoire).

Pour montrer comment il est possible d’exploiter ces réseaux, nous allons nous appuyer sur un artiste incontournable de ces dernières années : Jul.

Source : mouv.fr

Jul

Ce chanteur marseillais a révolutionné la musique française (pour les intimes : il a tué le game). Parti de rien en 2013, en 2020 il est le rappeur français a avoir vendu le plus en moins de 7 années de carrière. En 2020, son album “La machine” explose à nouveau les records. Quelques semaines après, en octobre 2020, sort un nouvel album 100% marseillais regroupant des figures de la chanson française : Akhenaton, Soprano, Keny Arkana, Alonzo, SCH, … Ce projet pulvérise les statistiques lors de son premier week-end sur les plateformes de streaming. Son single “Bande Organisée” devient disque de diamant en 1 mois, ce qui en fait le single le plus rapide à décrocher cette certification.

Pourquoi avons-nous choisi Jul ?

Car s’il est autant adulé que décrié, il n’en reste pas moins productif. A travers ces différents projets (13 albums studios, plusieurs albums gratuits et encore d’autres mixtapes), nous avons pu nous procurer près de 800 de ses textes. Or vous le savez sûrement, pour entraîner des modèles de Deep Learning, il faut un nombre conséquent de données. Ce n’est donc pas vers {ajouter ici le nom d’un artiste dont vous avez oublié le nom} que nous nous tournons dans ce projet.

Mais cessons de parler ce Jul.

Dans ce post, nous allons aborder les points suivants :

  • Présentation des Réseaux Neuronaux Récurrents
  • Description du projet LyricsAI feat. Jul
  • Analyse des résultats

RNN

Les réseaux neuronaux récurrents sont un sous-ensemble des réseaux de neurones (a.k.a. Deep Learning). La particularité est que les neurones sont agencés pour gérer des données séquentielles ou temporelles. La prédiction ne dépend plus seulement de l’état à l’instant t, mais également des états aux instants t-1, t-2, t-3 …

Photo by Aron Visuals on Unsplash

LSTM

Un problème qui survient avec ces réseaux récurrents est le fait que plus une donnée est éloignée dans le temps, plus rapidement elle est oubliée. Autrement, dit ils ont une mémoire court terme et ils ont du mal à traiter de longues séquences. C’est ce qu’on appelle le phénonème de disparition de gradient (Vanishing Gradient).

Face à cela, en 1997, des chercheurs ont proposée les réseaux LSTM (Long Short-Term Memory). L’idée principale est que chaque cellule est constituée d’une mémoire avec un système de portes (gates) permettant de mémoriser ou pas une information.

Photo by Falco Negenman on Unsplash

GRU

Suite aux LSTM, est apparue en 2014 une variante : les réseaux GRU (Gated Recurrent Unit). Ils ont des performances similaires aux LSTM sur certaines tâches mais possèdent moins de paramètres (certaines portes sont fusionnées). Qui dit moins de paramètres dit un entraînement de modèle plus rapide et des prédictions plus rapides.

Applications

Ces types de réseaux sont utilisés dans tous les systèmes nécessitant un traitement temporel : reconnaissance de la parole, traduction de textes, et … génération de textes.

Vous en avez sûrement entedu récemment. Jusqu’à maintenant, le grand public s’étonnait de voir l’apparition de DeepFakes sur les photos. Si vous ne voyez pas de quoi il s’agit, je vous invite à découvrir ce site comportant des photos ultra-réalistes de personnes n’existant pas : This Person Does Not Exist (https://thispersondoesnotexist.com/).

Cette personne n’existe pas…

Mais les Deep Fakes ne concernent pas uniquement les photos. Au sens plus large, un Deep Fake est un contenu généré par un modèle afin de simuler du contenu réaliste. Et les articles écrits n’échappent bien évidemment pas à la règle. Vous trouverez pléthore d’articles expliquant ce phénomène sur les internets. Mais revenons à nos moutons, enfin nos neurones.

Projet LyricsAI

Maintenant que nous avons vu le principe des Réseaux de Neurones Récurrents, nous allons enfin pouvoir plonger nos mains dans le cambouis. Dans cette partie, nous allons aborder les points suivants, le déroulé traditionnel d’un projet de Data Science :

  • Récupérer les données
  • Pré-traiter les données
  • Construire le modèle
  • Entraîner le modèle
  • Analyser les résultats
  • Hyper tuner le modèle
Photo by Erlend Ekseth on Unsplash

Récupérer les données

Comme je l’énonçais en introduction, j’ai choisi l’artiste Jul car il est extrêmement prolifique. A titre de comparaison, j’ai trouvé 790 chansons de Jul, alors que je n’en ai trouvé que 180 de Jean-Jacques Goldman. Cela m’a beaucoup surpris car pour avoir été bercé par Jean-Jacques, je pensais trouver beaucoup plus d’écrits venant de lui. Je ne compte là que les chansons où JJG est interprète (en tant que JJG, et non sous ses pseudonymes). Je n’ai pas considéré les chansons où il est auteur ou compositeur.

Récupérer les textes des chansons n’a pas été une mince affaire :

  • trouver les sites de paroles de chansons
  • garder ceux qui ont une API
  • garder ceux qui ont une API gratuite ou utilisable

Je reste étonné de voir que certaines API payantes proposent en gratuit les 2/3 des paroles des chansons. Quel intérêt ? C’est inutilisable sauf pour étudier le premier couplet. Soit, passons.

Finalement, mon choix s’est porté sur la plateforme Genius https://genius.com/ et pour gagner du temps j’ai utilisé la bibliothèque lyricsgenius. https://github.com/johnwmillr/LyricsGenius/

Source : raprnb.com

Après avoir fait tourner un petit script pour sauvegarder tous les textes, nous étions fin prêts à ouvrir notre notebook.

Le travail qui suit s’appuie en grande partie sur ce notebook Colab.

Pré-traiter les données

Après avoir importé les données, nous avons plus de 2,6 million de caractères à travers ses 790 chansons, soit 68.560 lignes de textes.

Nous en déduisons le vocabulaire, c’est à dire les caractères qui composent cet ensemble : 152. Nous retrouvons, les 26 lettres de l’alphabet, les chiffres, les signes de ponctuation et même quelques emojis.

Pour le moment, nous ne faisons pas de traitement particulier. Dans un deuxième temps, nous pourrons effectivement venir élaguer certains caractères pour réduire le vocabulaire.

Photo by Iñaki del Olmo on Unsplash

Entraîner le modèle

Le principe de la partie prédiction est assez simple finalement : étant donné une séquence de caractères, quel est le caractère suivant le plus probable ?

L’entrée du modèle est une séquence de caractères, la sortie est le caractère prédit.

Nous construisons un modèle assez classique pour ce genre de tâches :

  • une couche d’entrée Embedding
  • un réseau RNN GRU
  • un réseau dense de sortie

Nous obtenons un total de 4 millions de paramètres à entraîner.

Pour l’entraînement, nous choisissons la fonction objectif (loss function) de sparse categorical crossentropy, bien adaptée à cette tâche. En ce qui concerne l’optimizer, nous choisissons Adam avec ses paramètres par défaut.

Nous configurons les training_checkpoint pour sauvegarder les poids du modèle à la fin de chaque passe sur le jeu de données (epoch en anglais). Nous lançons l’entraînement pour 50 passes. Si vous avez besoin de revoir précisément ce qu’est une passe, je vous redirige vers cet excellent article de Machine Learning Mastery. Sample, batch et epoch, il revient sur toutes ces notions que nous avons tendance à mélanger au début.

Pour l’entraînement, je suis resté dans Colab afin de bénéficier des GPUs proposés par Google.

Photo by lucas Favre on Unsplash

Le modèle est entraîné. Nous sommes fin prêts. Nous allons commencer à jouer.

Analyser les résultats

Pour cela nous allons sélectionner une température. Pour faire simple, la température représente la capacité du modèle à “prendre des risques”. Plus la température est élevée, plus il se chauffe et prédit des choses moins probables qu’avec une température moindre. Un peu, comme ce tonton après l’apéritif, qui est devenu trop chaud pour débattre politique au repas de Noël (enfin débattre de manière raisonnable et réfléchie). Pour en savoir plus sur la température, je vous recommande cet article de Quora.

Dans un premier temps, nous avons généré du texte en partant des mots “Ma Jolie”.

Avec une température de 1, les paroles ne sont pas vraiment compréhensibles. Nous retrouvons bien la structure de la chanson : couplets et refrain. Ceci étant, beaucoup de mots sont simplement un alignement de lettres aléatoires et ne correspondent à aucune entrée du dictionnaire.

Les textes générés aux différentes températures sont disponibles ici :

[Refrain : Alors
Et nors ok, tentin on n’e dit Salahla, aile la bisol
Échange bah sur, le chelle dans le chamis)
J’regretele, moi j’ai padais plus tâls cabreinnée

Avec une température de 0.5, le texte devient plus compréhensible. Tous les mots ne sont pas français, mais avec une mélodie un peu sympa… ça passe.

[Refrain : Jul]
Mais j’ai trop d’chez mis le temps pas l’héricharde
Tu vas les rester la chatine
Tu fais l’bande de dis qu’ça fait qu’il voit le bélé le wick elle ce soir et dans le gros comme un parait des lauts
J’ai pas l’ceux qui contre
J’suis dans l’game en traîtres, elle m’a fait le mils on t’as changé
J’vais tout les balants et j’vais pas d’sourire comme Nike, j’ai vu des potos parter les balles de tout
J’ai pas de pas d’percon dans les parles parles
J’pourrais même plus au tiek wich the watardasis chiches
J’suis en fait le coller les venies mais t’as comme chauffe
C’est Marseille c’est comme un viens ma tête c’est le tour les balles

Lorsque la température est de 0.2, plus de mots français sont reconnaissables :

[Refrain : Jul]
Mais j’ai trop d’chez mis le temps pas l’héricharde
Tu vas les rester la chatine
Tu fais l’bande de dis qu’ça fait qu’il voit le bélé le wick elle ce soir et dans le gros comme un parait des lauts
J’ai pas l’ceux qui contre
J’suis dans l’game en traîtres, elle m’a fait le mils on t’as changé
J’vais tout les balants et j’vais pas d’sourire comme Nike, j’ai vu des potos parter les balles de tout
J’ai pas de pas d’percon dans les parles parles
J’pourrais même plus au tiek wich the watardasis chiches
J’suis en fait le coller les venies mais t’as comme chauffe

Lorsque nous reproduisons l’expérience avec d’autres mots pour alimenter le modèle (“Oui ma gâtée”, “Wesh”), nous obtenons des punchlines comme :

Oui ma gâtée y’a des pours mais t’es pas le poto

C’est Marseille c’est comme un viens ma tête c’est le tour les balles

Oui ma gâtées comme chez moi j’vais pas l’charger

J’vais m’en fouille, tu vas l’autre
J’vais tout pas les marrier sur l’arriver (ouais ouais)

Ou encore :

[Refrain] J’ai pas d’la montal, j’ai le baller le wick elle me fais le monde pas d’la tête à l’autre de la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la la

Wesh (Ghattard)
J’connais là, j’m’en fais la faute la machine, j’fais des cives (ouais)
Parce qui parlent d’anti-É en autre, j’vis des chits
Tiens pas l’chone perté, j’ai persé c’est trop du personne

J’ai passé la bague à Tchikita Terre
Pour les femmes
J’ai préser dégun j’ai dans l’carris les pas sous faire en courtant

En commençant par “J’ai passé la bague à Tchikita”, un texte entièrement composé de refrain est généré. C’est original et ça pose peut-être le futur de la chanson française (ou pas).

Suite du projet : un featuring avec Jul ?

Nous n’avons réalisé qu’une seule passe sur ce projet. Il y aurait une multitude de paramètres à peaufiner :

  • pré-traiter le texte davantage : supprimer les caractères inutiles, remplacer les diminutifs (par exemple remplacer “j’fais” par “je fais”)
  • ne garder que les textes en solo et pases chansons où Jul partage le micro
  • faire des prédictions au niveau des mots et non plus au niveau des caractères pour tirer profit de la couche Embedding
  • modifier la dimension de la couche Embedding
  • modifier le nombre de passes d’entraînement (epoch)
  • tester les réseaux LSTM au lieu de GRU
Photo by Roger Harris on Unsplash

Conclusion

Je me suis beaucoup amusé à réaliser ce projet. Le but n’était bien évidemment pas de générer un texte pour espérer un featuring avec Jul, mais plus d’appréhender les technologies de Deep Learning derrière la génération de texte. (ceci dit, Jul, je suis dispo pour une collab’)

Dans un projet qui partirait en production, beaucoup d’étapes sont encore nécessaires pour nettoyer les données et peaufiner le modèle.

Pour en savoir plus sur la génération de texte, je vous redirige vers la documentation de TensorFlow : https://www.tensorflow.org/tutorials/text/text_generation

Vous avez un projet de Deep Learning ou une problématique Data ? Discutons-en : maxime.pawlak@amatek.fr .

Restez informés des dernières actualités de l’IA grâce à la newsletter hebdomadaire FocusAI, les dernières news IA en moins de 3 minutes, tous les vendredis matins : https://focusai.substack.com/

--

--

Maxime Pawlak

#dataScientist #techplorator #prototypeur #entrepreneur