NLP & fastai | Sequence-to-Sequence Model (seq2seq)

Pierre Guillou
7 min readFeb 6, 2020

--

L’encodeur traite chaque élément (token) de la séquence d’entrée, il compile les informations qu’il capture dans un vecteur (appelé le vecteur de contexte ou d’état caché). Après avoir traité toute la séquence d’entrée, le codeur envoie le vecteur de contexte au décodeur, qui commence à produire la séquence de sortie élément par élément. (Image source: Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention))

Ce post concerne les vidéos 12 et 14 du cours fastai de Rachel Thomas sur NLP (A code-first introduction to NLP) et la vidéo 11 (notes, 2018) du cours de Jeremy Howard (Introduction to Machine Learning for Coders). Son objectif est d’expliquer les concepts clés des modèles sequence-to-sequence en NLP présentés dans les vidéos et leurs notebooks associés: 7-seq2seq-translation.ipynb (NLP, 2019), bleu_metric.ipynb (NLP, 2019), 7b-seq2seq-attention-translation.ipynb (NLP, 2019), translate.ipynb (fastai 0.7, DL2, 2018) et translate.ipynb (fastai 1.0, DL2, 2018).

Autres posts de la série NLP & fastai: Topic Modeling | Sentiment Classification | Language Model | Transfer Learning | ULMFiT | MultiFiT | French Language Model | Portuguese Language Model | RNN | LSTM & GRU | SentencePiece | Attention Mechanism | Transformer Model | GPT-2

Motivation

De nombreux processus de transformation ou création délivrent une sortie comme un texte dont la taille n’est ni fixe, ni prévisible. Il peut s’agir par exemple de processus de traduction, de création de titres ou résumés à partir d’un texte, de création de légendes d’images…

Les modèles classiques de Deep Learning (Full Connected Network, ConvNet, RNN…) ne peuvent alors être utilisés pour ce type de processus puisque leur sortie est de taille fixe que ce soit une ou plusieurs classes, une ou plusieurs valeurs ou même une image.

En revanche, les modèles seq2seq de Deep Learning (DL) s’appliquent parfaitement à ces processus puisque par nature leur sortie n’est pas contrainte par une taille fixe.

Applications des modèles seq2seq

En plus des processus de traduction, les applications des modèles seq2seq sont multiples comme le montre le slide suivant:

Utilisation des modèles seq2seq bidirectionnels avec attention (image source: vidéo 11 du cours de Jeremy Howard de 2018)

Cependant, comme les principes sont les mêmes quelque soit les applications, il est intéressant de comprendre le codage d’un seq2seq pour la traduction afin de pouvoir le réutiliser pour d’autres situations.

Neural Machine Translation (NMT)

Ainsi, les modèles seq2seq avec Deep Learning (DL) sont utilisés avec succès depuis 2015 pour le Neural Machine Translation (NMT) et ont dépassé en terme de performance les modèles statistiques de traduction dès 2016 selon la métrique BLEU.

Progrès des modèles seq2seq de Deep Learning en NMT depuis 2015 (image source: vidéo 11 du cours de Jeremy Howard de 2018)

Le slide suivant met en avant 4 raisons pour lesquelles le NMT améliore nettement les résultats de traduction:

4 raisons pour lesquelles le NMT améliore nettement les résultats de traduction (image source: vidéo 11 du cours de Jeremy Howard de 2018)

Architecture | Encoder/Decoder

De manière générale, il faut 3 choses pour entraîner un modèle de Machine Learning: des données, une architecture et une fonction de coût.

3 choses sont nécessaires pour entraîner un modèle de Machine Learning: des données, une architecture et une fonction de coût (source: video 11 du cours Deep Learning Part 2 2018)

En fonction de l’objectif (classification, régression, entrée/sortie de taille fixe ou variable…), une peut être plus importante que les autres. Lorsqu’il s’agit de modèle seq2seq, c’est bien l’architecture du modèle qui est le point le plus important car c’est elle qui autorise que les données en entrée et sortie soient de taille variable et c’est elle qui permet au modèle d’avoir une mémoire et de faire attention au contexte.

Diagramme

Voici ci-dessous un diagramme de l’architecture d’un modèle seq2seq:

Diagram from Smerity’s Peeking into the neural network architecture used for Google’s Neural Machine Translation

Principe

Le principe général est le suivant:

  1. chaque token en entrée (ici des mots ou ponctuation) est transformé en vecteur d’embedding (word vector) de taille identique (dimension de l’espace des embeddings, généralement de 200 ou 300) qui via l’encoder (RNN du backbone) va être transformé à son tour en vecteur d’état (ou vecteur de contexte).
  2. Une fois que l’ensemble des tokens de la séquence sont ainsi transformés, un vecteur d’état de l’ensemble de la séquence est généré (s: state vector, context vector, hidden vector ou hidden state): il contient donc toutes les informations décrivant la séquence (sa taille est généralement de 256, 512 ou 1024).
  3. Il est alors mis en entrée d’un decoder (un autre RNN) qui va générer au fur et à mesure les tokens de la séquence de sortie.
Principe d’un modèle Seq2Seq: encoder (RNN) qui produit un vecteur d’état (hidden state vector) qui est passé à un decoder (RNN) (source: video 11 du cours Deep Learning Part 2 2018)

BLEU | Evaluation d’un modèle Seq2Seq

(source: Wikipedia) BLEU (BiLingual Evaluation Understudy) est un algorithme pour évaluer la qualité du texte qui a été traduit automatiquement d’une langue naturelle à une autre. La qualité est considérée comme la correspondance entre la traduction d’une machine et celle d’un humain: “plus une traduction automatique est proche d’une traduction humaine professionnelle, mieux c’est” — telle est l’idée centrale derrière BLEU. BLEU a été l’une des premières mesures à revendiquer une forte corrélation avec les jugements humains de qualité et demeure l’une des mesures automatisées et les moins chères les plus populaires.

Les scores sont calculés pour chaque segment traduit, généralement des phrases, en les comparant à un ensemble de traductions de référence de bonne qualité. Ces scores sont ensuite moyennés sur l’ensemble du corpus pour obtenir une estimation de la qualité globale de la traduction. L’intelligibilité ou la correction grammaticale ne sont pas prises en compte.

La sortie de BLEU est toujours un nombre compris entre 0 et 1. Cette valeur indique la similitude du texte candidat avec les textes de référence, les valeurs plus proches de 1 représentant des textes plus similaires. Peu de traductions humaines atteindront un score de 1, car cela indiquerait que le candidat est identique à l’une des traductions de référence. Pour cette raison, il n’est pas nécessaire d’atteindre un score de 1. Parce qu’il y a plus de possibilités de correspondance, l’ajout de traductions de référence supplémentaires augmentera le score BLEU.

Conseils pour améliorer un modèle Seq2Seq

3 procédés classiques peuvent être appliqués à un modèle Seq2Seq pour améliorer sa performance: Bidirectional (encoder), Teacher forcing et Attention.

Bidirectional

Vidéo & notes de la leçon 11 (DL2, 2018) — Timestamp [ 1:16:33 ] — notes

Ce procédé s’applique uniquement à l’encoder. Cependant, avec plusieurs couches dans l’encoder (Google Translate en a 8), il faut choisir laquelle(s) des couches est bidirectionnelle sinon des problèmes de performance comme le temps d’entraînement peuvent apparaître (Google Translate applique le procédé bidirectionnel seulement dans la première couche de son modèle Seq2Seq).

Teacher Forcing

Vidéo & notes de la leçon 11 (DL2, 2018) — Timestamp [ 1:22:39 ] — notes

Au début de l’entraînement, le modèle ne sait rien (paramètres avec des valeurs aléatoires) et donc s’il n’est pas aidé lors de la génération des premiers tokens par le decoder (comme un professeur peut aider un élève au début d’un exercice), il va avoir beaucoup de mal à commencer à apprendre.

Le procédé de Teacher Forcing permet ainsi de fournir en entrée de l’encoder les premiers tokens corrects de la séquence cible.

Attention

Vidéo & notes de la leçon 11 (DL2, 2018) — Timestamp [ 1:31:00 ] — notes

Pourquoi utiliser seulement le vecteur d’état final de la séquence (et espérer qu’il sera suffisant pour obtenir au moment du décodage toutes les caractéristiques de la séquence d’entrée) alors que nous disposons du vecteur d’état après chaque nouveau token de la séquence d’entrée?

Dans l’encoder, un vecteur d’état est généré à chaque nouveau token de la séquence d’entrée (Image source: Deep Learning 2: Part 2 Lesson 11)

En entraînant un réseau neuronal, nous pouvons alors apprendre une matrice de valeurs pondérées de chacun de ces vecteurs d’état de la séquence d’entrée, ce qui permettra de prendre en compte de manière relative et appropriée chacun des tokens de la séquence d’entrée au moment de générer un token de la séquence de sortie par le decoder.

Ces valeurs pondérées représentent à chaque fois une estimation de l’attention à porter aux différents tokens de la séquence d’entrée lors de la génération séquentielle d’un nouveau token (par exemple, dans le cadre d’un modèle Seq2Seq de traduction de l’allemand vers le français, il faudra porter une attention aussi sur les derniers tokens de la phrase allemande en entrée lors de la génération des tokens de verbe de la phrase française en sortie et pas seulement sur les tokens correspondants en terme de position dans la séquence).

Image source: Attention and Augmented Recurrent Neural Networks

Pour aller plus loin

À propos de l’auteur: Pierre Guillou est consultant en Intelligence Artificielle au Brésil et en France. Merci de le contacter via son profil Linkedin.

--

--