Un réseau de neurones génèrent les textes de JUL !
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.
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 …
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.
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/).
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
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/
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.
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.
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 personneJ’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
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/