Générer des mèmes québécois avec l’intelligence artificielle

Jérémi DeBlois-Beaucage
8 min readMar 31, 2021

Cet article couvre un projet universitaire réalisé à l’automne 2019 avec Justine Massicotte et Vincent Espanol, dans le cadre du cours Apprentissage automatique I de HEC Montréal, donné par le professeur Laurent Charlin.

This article is also available in English.

L’intelligence artificielle peut-elle générer du contenu drôle et intéressant? Est-ce qu’un algorithme peut créer de bons mèmes québécois? Telles sont les questions que mes collègues et moi nous sommes posées il y a quelques mois déjà. Notre réponse : oui, mais de qualité très variable.

Le mème est défini par le Oxford English Dictionary comme un « élément d’une culture ou d’un système de comportements qui se transmet d’un individu à l’autre par imitation ».

Exemple de mème, sous un format populaire : une image et une légende.

Je vous présente ici un aperçu de notre projet : comment bâtir un algorithme capable générer des mèmes à partir de n’importe quelle image.

Table des matières

  1. Trouver, importer et nettoyer les images et les légendes
  2. Bâtir et entraîner le modèle: réseau de neurones de type encodeur-décodeur
  3. Générer des mèmes à partir de nouvelles images (avec exemples de mèmes générés par notre algorithme! 🎉 )

Trouver, importer et nettoyer les images et les légendes

L’intelligence artificielle et l’apprentissage automatique sont des domaines très en vogue depuis quelques années déjà. Ces domaines requièrent de grandes quantités de données, souvent considérées comme de nouvelles mines d’or d’information.

Un des défis pour générer des mèmes spécifiquement québécois était donc de rassembler les données : aucun jeu de données n’était disponible, et les mèmes se retrouvent habituellement sur plusieurs pages de différents réseaux sociaux.

Au final, nous avons pu avoir accès à quelques milliers de mèmes publiés par des pages québécoises bien connues.

Exemples de mèmes dans notre banque de données.

Nettoyer les données

La première étape a été de nettoyer les données collectées :

  • D’abord, diviser la légende de l’image. Pour ce faire, nous avons utilisé la reconnaissance optique des caractères (Optical Character Recognition, ou OCR), avec l’outil Tesseract de Google.
  • Ensuite, nettoyer les légendes : la ponctuation et les mots trop peu fréquents ont été retirés. Seuls les 6000 mots les plus fréquemment utilisés dans notre banque de données de mèmes sont conservés, dans ce qu’on appelle le dictionnaire de l’algorithme.

Le résultat? Près de 4000 mèmes québécois et leur légende, prêts à être utilisés.

Une plus grande quantité de mèmes aurait été souhaitable, mais le temps et l’envergure du projet nous ont limités dans la collecte de données.

Restructurer les données

À haut niveau, la tâche de l’algorithme est plutôt simple : on présente une image à l’algorithme, et celui-ci génère une légende humoristique en lien avec l’image.

Pour ce faire, l’algorithme procède de façon itérative. Il utilise d’abord l’image — en analysant les contenus de l’image, par exemple en détectant certains objets ou visages — pour prédire ce que pourrait être le 1er mot de la phrase. Puis, l’algorithme utilise l’image et le 1er mot pour générer le 2e, puis l’image et les 2 premiers mots pour générer le 3e, et ainsi de suite, jusqu’à prédire la fin de la phrase.

Voici un exemple de ce à quoi ressembleraient les données entrées (Input) et une prédiction parfaite de l’algorithme (Target Word).

Mème (en haut) et données (en bas).

Bâtir et entraîner le modèle : réseau de neurones de type encodeur-décodeur

La génération de mèmes peut être comparée à une tâche de description d’image : générer une légende qui correspond à l’image. Dans notre cas, la contrainte supplémentaire est que la légende doit être humoristique.

Une telle tâche requiert une solution de type encodeur-décodeur. D’abord, un réseau de neurones encode l’image : on extrait de l’image certaines informations. Cette phase d’encodage nous donne un vecteur de 2048 dimensions, qui représente l’image. Pour ce projet, nous avons utilisé le réseau pré-entraîné Inception V3.

Entraînement

Lors de la phase d’entraînement, on donne à l’algorithme cette image encodée avec les premiers mots de la légende; l’algorithme doit alors prédire quel est le prochain mot de la légende. Si l’algorithme prédit le bon mot, l’algorithme est en quelque sorte récompensé pour sa prédiction. La fonction de coût de l’algorithme est la categorical cross-entropy.

Concrètement, il y a deux entrées différentes à l’algorithme.

Le modèle complet utilisé, sous structure encodeur-décodeur.

D‘un côté, les premiers mots de la légende sont entrés. Ceux-ci sont d’abord encodés grâce à des word embeddings, soit des représentations vectorielles des mots (plus d’information sur les word embeddings ici). Puis, ces embeddings sont entrés dans un réseau de neurones récurrents de type Long Short-Term Memory (LSTM), qui transforme la séquence de mots en un seul vecteur. Ce vecteur représente, aux yeux de l’algorithme, l’idée de la phrase.

De l’autre côté, l’image est entrée. Celle-ci est encodée puis passe à travers une couche dense de neurones. Le résultat est un vecteur qui représente, aux yeux de l’algorithme, l’idée de l’image.

Les deux vecteurs finaux sont ensuite réunis, et avec ce vecteur final, on prédit quel sera le prochain mot, parmi le dictionnaire des 6000 mots possibles.

Mesures de performance

Il est difficile de contraindre l’entraînement avec des mesures de performance : au final, le but est de faire rire. Cependant, un modèle aurait une bonne performance s’il arrivait à répéter exactement des mèmes déjà vus, ce qui ne répond pas à l’objectif. Nous devions donc trouver un certain équilibre : l’algorithme doit proposer des légendes sensées, mais celles-ci ne doivent pas être copiées intégralement de mèmes déjà vus.

Plusieurs outils sont utilisés pour calibrer cette créativité, notamment le nombre de fois que le modèle est entraîné (ou nombre d’epochs) et le facteur aléatoire dans la sélection des mots (ou la température du modèle).

Deux métriques différentes ont été utilisées pour évaluer les modèles : la qualité humoristique (à quel point le mème nous fait personnellement rire) et la perplexité (plus d’information sur la perplexité ici).

Enjeu de langue

Les mèmes posent un défi supplémentaire à travers l’usage de termes familiers. À cette difficulté s’ajoute l’aspect bilingue des mèmes québécois: on y retrouve souvent des mots en anglais et en français dans une même phrase.

Notre solution a été d’utiliser deux corpus de word embeddings différents. Nous avons associé à chaque mot une représentation française si elle existait (du corpus fastText), sinon anglaise (du corpus GloVe).

Générer des mèmes

Une fois le modèle entraîné, nous pouvons passer à la meilleure partie : générer de nouveaux mèmes.

Le processus est le suivant: la nouvelle image est d’abord reformatée puis encodée, puis le 1er mot est décodée. Avec l’image et le 1er mot, on décode le 2e mot, et ainsi de suite, jusqu’à ce que l’algorithme prédise la fin de la légende.

Architecture utilisée lors de la génération de mème : les mots sont prédits un à la fois, jusqu’à prédire la fin de la légende.

Bâtir la légende

Au final, la prédiction effectuée par le modèle entraînée est probabiliste : l’algorithme attribue une probabilité entre 0 et 1 pour chacun des 6000 mots du dictionnaire. Une fois ces probabilités calculées, deux techniques pour bâtir une phrase ont été considérées.

  • Choisir un mot à la fois
    Dans ce modèle, l’algorithme choisit un mot à la fois, en suivant la distribution des probabilités. Si le modèle prédit une valeur de 0.1 pour un mot, ce mot a 10% de chance d’être sélectionné. On peut ajuster la créativité du modèle grâce à la température. La température du modèle contrôle à quel point les probabilités sont normalisées : plus la température est basse, plus les mots improbables ont de chance d’être choisis.
  • Choisir des combinaisons de mots à la fois
    Ce modèle, appelé beam search, considérera plusieurs combinaisons de mots à la fois. Dans notre cas, le modèle choisissait des combinaisons probables de 3 mots consécutifs à la fois. Plus de détails sur le beam search ici.

Plusieurs expérimentations ont été faites, sous plusieurs hyperparamètres différents : nombre d’epochs durant lesquelles le modèle a été entraîné, température du modèle et type de prédiction.

Voici quelques exemples de mèmes générés par l’algorithme.

Mèmes générés par l’algorithme.

Conclusion

Le but initial de ce projet était de générer des mèmes humoristiques à saveur québécoise à partir de n’importe quelle image. Cet objectif a été atteint, en partie.

D’abord, beaucoup des meilleurs mèmes étaient, selon nous, très absurdes. Ici, l’incongruité de l’algorithme apporte un aspect humoristique.

Exemples de mèmes incongrus générés par l’algorithme.

Mais les meilleurs mèmes seraient ceux qui, dans leur incongruité, restent pertinents et intelligents, ce que l’algorithme n’a pas su générer.

Il est également difficile de savoir si l’algorithme prenait correctement le contexte de la photo en compte. Plusieurs mèmes présentaient une déconnexion entre l’image et la légende, même si certaines entités étaient reconnues, comme une personne ou un objet.

Ce projet ne se voulait qu’un bref aperçu de l’application de l’intelligence artificielle dans le monde de l’humour. À l’avenir, plusieurs avenues seraient intéressantes à explorer.

  • Générer un caractère à la fois, et non des mots complets
    L’algorithme génère ici des mots, mais une autre avenue souvent utilisée dans des projets similaires est de prédire un caractère à la fois.
  • Avoir un meilleur jeu de données
    Il serait intéressant d’avoir plus de mèmes, et que l’image et la légende des mèmes soient extraits avec plus de précision.
  • Ne pas fixer les poids de l’encodeur
    Dans ce projet, l’encodeur était fixe : lors de l’entraînement du modèle, si le modèle avait « mal » reconnu certaines entités de l’image, il n’était pas pénalisé.
  • Ne pas fixer les poids du word embedding
    Les premiers mots du mème donnent le contexte au reste de la phrase, et ces premiers mots étaient « compris » par le modèle à travers les word embeddings. Si le modèle comprenait « mal » les mots, il n’était pas pénalisé.
  • Ajouter de l’attention
    L’attention a suscité l’intérêt de beaucoup de chercheurs dans le domaine. Plus de détails ici.

Si l’intelligence artificielle est encore loin d’un stand-up comique au Bordel Comédie Club, elle a tout de même réussi à nous faire rire à plusieurs occasions. L’avenir du domaine nous paraît très excitante!

Question, commentaires, idées? N’hésitez pas à me contacter via LinkedIn.

Le code Python utilisé est disponible sur GitHub (mise en garde: le code a été publié en 2019 et n’a pas été révisé)

--

--