Explicaiton de l'encodeur/décodeur - SEQ 2 SEQ/
By Paul Claret
10 minutes read - 07/12/24
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. Il a aussi été utilisé dans de
nombreuses autres application comme la reconnaissance vocale ou encore
le sous-titrage vidéo.
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 😉. 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”. 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.
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
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
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)
Décodage (rouge): On va maintenant générer une sortie
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.: Si l’on veut avoir notre sortie il faut le multiplier par une autre matrice: 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.
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.