Explicaiton de l'encodeur/décodeur - SEQ 2 SEQ/

Author Profile - Paul Claret

By Paul Claret

10 minutes read - 07/12/24

Prérequis

Avant de lire cet article, je voudrai m’assurer que vous connaissez bien les éléments suivants:
- DeepLearning –> Mon article ici
- RNN –> Mon article ici
- Facultatif mais préférable (LSTM model et GRUmodel)

J’assume que vous connaissez et comprenez déjà ce qui est dit dans ces articles sinon vous risquerez de ne pas comprendre celui-ci.

Histoire et contexte

Le principe d’encodeur et décodeur est une invention relativement récente. Elle a été inventé dans le début des années 2010. Elle a été incorporé dans l’algorithme de google traduction depuis 2016. Pasted image 20241207163146.png Il a aussi été utilisé dans de nombreuses autres application comme la reconnaissance vocale ou encore le sous-titrage vidéo. Pasted image 20241207163248.png

C’est l’un des 3 piliers des IA génératives textuelles (et plus) récente. A la date de cette article (07/12/2024), ils ne sont plus utilisé en tant que tel mais plutôt sous des formes modifiés/sous stéroïdes. On les appelles, “attention” et “tranformers”. Ils se basent chacuns sur les inventions des autres donc il est impératif de les étudier dans l’ordre (seq2seq, attention, transformers). Pour information le GPT dans ChatGPT veut dire “Generative pre-training transformers”. Donc vous voyez qu’on est déjà dans du récent en terme de technologie dans ces articles 😉. Pasted image 20241207161127.png Si vous voulez donc créer des IAs génératives parmis les plus performantes et précises dans le domaine de NLP (Natural Language Processing), cet article est une étape essentielle pour comprendre ensuite le principe d’attention et des transformers.

Le principe

Le but du seq2seq est de mapper des mots/entrée dans des vecteurs (encoder) et ensuite de les passer dans un decodeur qui en sort les mots/entrées. On peut faire le parallèle avec les talky walky. Ils “encodent” votre voix en signal éléctrique et le transmettent à une autre station qui la “décode”. Pasted image 20241207165107.png Ce principe de prendre les ondes auditives produite par l’interlocuteur, les encoder en signaux éléctriques et de prendre ces mêmes signaux pour reproduire pour être entendu est le même pour le model d’encodeur, décodeur. Dans le model s2s, on encode une entrée dans un “vecteur” qui résume tout le sens de la phrase et on peut ensuite le passer dans un décodeur et toute la phrase est regénérable. C’est comme zipper un fichier. Quand vous le dézippez, vous n’avez rien perdu mais ça prennait moins de place avant.

L’architecture

Avec toutes ces explications, il est temps de passer à un beau schéma avec des termes techniques. Dans l’image ci-dessous, vous pouvez voir un RNN qui prend 3 entrées et qui en sortie du 3ème, sort un vecteur encodé. Ce vecteur encodé n’est autre que le hidden state du 3ème RNN. Pasted image 20241207162947.png En prennant ce dernier hidden state et en le passant dans un décodeur (ici en rouge) on peut regénérer le phrase d’entrée. On dit donc que grâce au vecteur (ici en vert), on a généré un vecteur qui contient tout le sens de la phrase.

Le vecteur en question

Vous vous demandez surement qu’est ce que ce vecteur encodé ? C’est juste le dernier hidden state de notre réseaux de RNN. Rien de plus 😄. Maintenant que vous ce schéma n’a plus rien d’intimidant, on peut entrer dans les détails.

Les calculs

La partie verte du schéma, prend notre entrée (les mots d’une phrase). Les RNN calculent leurs hidden states et les passent à la cellule RNN suivante jusqu’à la dernière cellule. Cette dernière cellule renvoie son hidden state. Si vous vous rappelez de mon article sur les RNN, vous vous souvenez surement que le premier hidden state h1, pour un RNN classique est initialisé à 0. Sauf que nous allons utiliser ce vecteur encodé comme hidden state du RNN du décodeur de cette façon les deux sont liés.

Pour ceux qui aiment les détails mathématiques:

1. Encodage (vert): Dans un RNN simple (une cellule/un rectangle vert): On calcul le produit matriciel de l’entrée x et sa matrice de poids Whx. On fait de même avec le hidden state precedent (ou vecteur d’initialization = 0 pour la première cellule) ht1 et sa matrice de poids Whh. On ajoute les poids bx et on passe le tout dans la fonction d’activation: ht=f(Whhht1+Whx.xt+bx) On envoie ensuite ce hidden state au RNN suivant qui refait le même calcul (avec le nouveau hidden state et sa propre entrée). Ici on ne fait pas la seconde partie du calcul où l’on multiplie le hidden state par une matrice Wy pour avoir une sortie, rappelez vous, on veut juste encoder toute notre phrase dans un seul vecteur.

  1. vecteur encodé: Une fois toute les données d’entrées traités, on garde le tout dernier hidden state. En théorie, il contient tout le sens de la phrase en lui. (comme le fichier zip)

  2. Décodage (rouge): On va maintenant générer une sortie y contrairement à la partie encodage. Le calcul est presque le même que pour un RNN simple. On prend notre hidden state et le multiplie par une matrice de poids. Après cela, on le fait passer dans une fonction d’activation. Sauf que ce calcul ne nous donne pas la sortie en elle même mais un nouveau hidden state que l’on donnera au RNN suivant.: ht=f(Whh.ht1) Si l’on veut avoir notre sortie y il faut le multiplier par une autre matrice: yt=softmax(Wyy.ht) On obtient ensuite une distribution de probabilité (ce que nous donne la fonction softmax) et donc la prédiction de la cellule.

Comment sait-on que l’on a fini de générer notre sortie ?

La question que les plus malins se posent. Eh bas oui, comment on sait d’ailleurs si on a fini de lire notre entrée. Pour nos humain, les phrases commencent par une majuscule et finissent par un point. Pour un ordinateur, on a deux choses un peu différentes que l’on appelle (start token et end token ou start of sequence et end of sequence). Ce sont des charactères spéciales qui marquent comme leurs nom l’indiquent, le début et la fin de la séquence. Vous allez surement les voir sous la forme: <SOS> et <EOS>. Lorsque le RNN qui encode voit un <EOS>, il arrête d’encoder et sait qu’il est à la fin de la séquence. Lorsque le RNN qui décode, GENERE un <EOS>, il sait qu’il a fini son travail et s’arrête. Un autre point important: le nombre de mots dans la phrase que l’on encode ne sera pas forcement le nombre de mots dans la phrase que l’on décode. Par example: on peut écrire une phrase en Français, l’encoder et utiliser un décodeur “anglais” qui va prendre notre vecteur encodé et générer les mots jusqu’à ce qu’il écrive un <EOS>. Cependant, tant que le <EOS> ne serra pas généré le RNN fonctionnera. Cela veut dire que notre phrase qui fait 4 mots ne peut faire que 3 en anglais: “Les étudiants travaillent” -> “The students are working”

Les problèmes commencent

En théorie cette architecture est géniale ! Mais en pratique pas vraiment. Vous vous rappelez du problème des vanishing gradient et exploding gradient ? Eh oui !! Eux ils n’ont pas disparu. On peut utiliser des LSTM pour réduire ce problème mais après des années d’essais, les résultats ne sont pas convainquant. On a beaucoup de mal à faire des phrases relativement longue ou élaborés. Alors comment faire si même en utilisant des LSTM on peut pas aligner 2 phrases ? C’est le but de mes prochains articles sur l’attention et les transformers !

Petite note de fin

L’intelligence artificielle est une science que je trouve personnellement plus expérimentale que théorique ou rigoureuse. Quand on y pense, tout se base au départ sur des statistiques. Rien ne dit par A+B que le model marchera forcement au bout d’un certain nombre d’epoch. Pasted image 20241207173727.png Il existe plus d’une solution à un même problème et parfois bien que différentes, elles se valent. Ce que j’essaie de vous dire, c’est que si vous ne comprenez pas tout dans le détails et êtes confus par deux articles qui disent des choses pas tout à fait similaire sur internet, c’est normal. Chaque ingénieur et chercheur modifient les models des uns et des autres et obtient un résultat tout aussi cohérent.

Si vous voulez approfondir le sujet de seq2seq je vous met cette ressource (en anglais): https://www.youtube.com/watch?v=QuELiw8tbx8&list=PL3FW7Lu3i5Jsnh1rnUwq_TcylNr7EkRe6&t=1190s

https://medium.com/analytics-vidhya/encoder-decoder-seq2seq-models-clearly-explained-c34186fbf49b

https://www.youtube.com/watch?v=PSs6nxngL6k&t=354s

Vous voulez apprendre l'IA en autonomie ?

Si vous êtes nouveau sur mon site, je vous invite à aller voir ma page sur Roadmap IA qui regroupe tous mes articles dans l'ordre pour vous facilitez l'apprentissage.