Les applications de NLP comme l’analyse des sentiments, la détection de spam ou la réponse aux questions nécessitent l’encodage du texte sous une forme compréhensible par les ordinateurs avant tout traitement par des algorithmes. Une tâche accomplie par les word embedding models par exemple . Ceci étant, les algorithmes de word embedding convertissent les mots/phrases en vecteurs numériques. Selon le modèle utilisé, ces vecteurs contiennent plus ou moins des informations sur la sémantique et la syntaxe du mot selon le contexte dans lequel il a été utilisé. Il existe de nombreuses techniques de word embedding. Cet article vise à introduire trois d’entre eux. Cependant, avant de les aborder, je crois qu’il est important d’introduire d’abord le concept d’apprentissage par transfert au travers de l’utilisation de modèles pré-entraines.
Modèles pré-entraînés
La grande quantité de données et de ressources nécessaires pour de nombreuses applications de deep learning, et les temps de calcul importants pour ceux ci, ont encouragé les chercheurs et les scientifiques des données ( data scientists ) à l’utilisation des modèles pré-entraînés. Une telle approche est appelée: apprentissage par transfert ( transfer learning ). Il consiste à réutiliser un modèle qui a été entraîné sur une tâche spécifique à une autre tâche similaire à la première. Disons qu’une fois vous avez entraîné un bon modèle de classification de chats, et maintenant vous avez besoin d’un modèle pour classifier des tigres. Au lieu d’entraîner un tout nouveau modèle, sachant que les chats et les tigres ont des caractéristiques similaires, vous pouvez simplement réutiliser votre modèle entraîné a la classification des chats et y apporter quelques modifications pour l’adapter à votre nouveau jeu de données. De ce fait, a Baamtu l’un de nos projets de NLP nous a conduit a l’utilisation de modèles de prolongement de mots pré-entraînés notamment : camembert et universal sentence encoder, et une variante de Word2vec que nous avons nous même entraîné bien qu’il existe également un modèle pré-entraînés pour ce dernier.
Word2vec
Word2vec est un word embedding models populaire créé par Mikolov et al à google en 2013. Il utilise une couche du réseau de neurone pour soit prédire les mots voisins au mot cible (contexte) dans le cas de l’architecture skip gram, soit le mot a partir de ses voisins dans le cas du CBOW (Continuous bag of words). L’entrée et la sortie de word2vec est un encodage one-hot des mots du vocabulaire du jeu de données. Pendant l’entraînement, une fenêtre glisse à travers le corpus de sorte que pour chaque mot, le réseau de neurone est entraîné à prédire ses mots voisins ou un mot cible en attribuant une probabilité aux mots du vocabulaire. La représentation vectorielle d’un mot est la couche du réseau après entrainement.
Continuous bag of words (CBOW)
Cbow word2vec : Lorenzo Ferrone, Fabio Massimo Zanzotto,
Skip-gram model
Skip-gram model : Manish Nayak, an intuitive introduction of word2vec by building a word2vec from scratch.
Word2vec est connu comme un modèle «sans contexte» dans le sens où il produit un vecteur unique pour un mot quel que soit le contexte dans lequel il a été utilisé. En fait, ce modèle ne prend en compte le contexte des mots que lors de l’entrainement. Au moment du test on ne recalcule pas les ‘word emddings’ mais on fait juste appels a ceux obtenus après apprentissage (Word2vec n’apprend pas du contexte des données de test). De plus, étant donne que pendant l’entrainement Word2vec produit des vecteurs de mots, si dans les données de test il y’a un mot absent du vocabulaire d’entrainement, il n’y aura pas de vecteur numérique pour ce mot. En d’autres termes, word2vec fonctionne mieux pour les mots du vocabulaire et quand ceux ci sont utilises dans le même contexte dans le corpus d’apprentissage et dans les données de test.
En raison de ces limitations, pour un encodage de nos données textuelles, à Baamtu nous avons entraînés FastText, une variante de Word2vec. Comme Word2vec, FastText utilise les architectures Skip-gram et CBOW mais au lieu de faire uniquement le word embedding, il peut également faire du character level embedding. En effet, si l’encodage des n-grams est activée, FastText représente les mots sous forme de n-grams de caractères avant de les encoder. Par exemple, pour n = 3 (trigram), le mot «matter» sera représenté par <ma, mat, att, tte, ter, er>. Cette fonctionnalité est utile car elle permet au modèle d’obtenir des encodages des mots hors vocabulaire.
Camembert une gourmandise française!
Camembert est un modèle de langage entraîné et publié en 2019 par des chercheurs de Facebook AI. Il se base sur l’architecture RoBERTa, une variante de BERT. Camembert se distingue des autres modèles à base de BERT du fait qu’il a été entraîné sur un corpus en français. Il n’y a pas beaucoup de documentation sur Camembert en ligne mais heureusement pour nous, comprendre comment fonctionne BERT suffit pour comprendre tous les autres modèles qui utilise la même architecture. Penchons-nous donc sur BERT et l’ingéniosité derrière.
BERT: Bidirectional Encoder Representations from Transformers
BERT est un modèle de langage bidirectionnel et pré-entraîné basé sur l’architecture du transformateur. Je n’essaierai pas d’expliquer ce que sont les transformateurs car il y a beaucoup de blog incroyable qui en parle, je recommande particulièrement cet article de JayAllamar . Cependant, retenez que Bert est composé de 12 encodeurs empilés et d’une couche a plusieurs self-attention. Il a été pré-entrainé avec des données non supervisées pour la modélisation du langage masqué et pour le next sentence prediction. La première tâche consiste à prédire la phrase d’entrée à partir d’une entrée déformée où quelques mots (15%) ont été masqués aléatoirement. Le deuxième objectif d’entrainement consiste à prédire a partir de deux phrase concaténées la prochaine phrase après la première.
Modélisation du langage masqué ( Masked language modelling )
Modélisation du langage masqué Bert :
Parmi les 15% des mots du corpus sélectionnés au hasard pour être masqués, 80% sont remplacés par le token [MASk], 10% sont remplacés par un mot aléatoire du corpus et 10% restent inchangés. La modélisation du langage masqué donne a BERT la possibilité d’entraîner efficacement un transformateur pour apprendre le contexte gauche et droit d’un mot.
Prédiction de la phrase suivante ( Next sentence prediction )
BERT Next sentence prediction :
La prédiction de la phrase suivante en essayant d’apprendre la relation entre deux phrases encode la signification de la première dans le neurone du token de classification [CLS]. Cependant, l’encodage incorporé dans [CLS] doit être utilisé uniquement pour la classification. Pour d’autres tâches, il faudra utiliser les encodages de tous les autres neurones pour obtenir le sentence embedding. Cependant, en ce qui concerne la couche sur laquelle obtenir les encodages, je vous conseillerai d’essayer différentes couches et de choisir celle qui produit la meilleure performance.
RoBERTa: Une approche de BERT robuste et optimisée
RoBERTa est un modèle BERT avec une approche d’entrainement différente. Il supprime les tâches de next sentence prediction (NSP) et ajoute un masquage dynamique, de grands mini-batches et de plus grand Byte-pair encoding. Avec BERT, l’entrée n’est masquée qu’une seule fois de sorte qu’elle a les mêmes mots masqués pour tous les epochs tandis qu’avec RoBERTa, les mots masqués changent d’un epoch à l’autre. Il convient également de noter que, comme il n’y a pas de NSP dans ROBERTa / Camembert, il n’est donc pas nécessaire d’ajouter les token spéciaux [CLS] et [SEP] à la phrase d’entrée du modèle.
Universal sentence encoder ( Encodeur universel de phrases )
Développé par google AI, USE produit les sentence embeddings. Les auteurs ont publié deux architectures USE, l’une basée sur le transformateur ( transformer encoder ) et l’autre est un deep average network (DAN). Selon eux, le USE à architecture à transformateur fonctionne légèrement mieux que le DAN mais il nécessité également plus de temps de calcul.
Transformer encoder ( Encoder a Transformateur ) : le modèle calcule d’abord les word embeddings, puis détermine le vecteur de la phrase en calculant la somme par élément des vecteurs de mots. L’entrée de l’encodeur est une séquence de tokens et la sortie est un vecteur de 512 de taille.
Deep average network: A l’entrée, on calcul d’abord la moyenne des « word embeddings » ainsi que les encodages de leur bigrams, avant de les envoyer à un réseau de neurone profond pour l’encodage des phrases. L’entrée du modèle est également une séquence de tokens et la sortie d’un vecteur de 512 de taille.
Camembert et USE sont deux modèles de langage contextuel, ils utilisent tous deux des transformateurs et le mechanisme d’attention au lieu de RNN ou LSTM pour incorporer les informations séquentielles à leurs embeddings. En plus, contrairement à word2vec ils génèrent des encodages dynamique. Disons que vous avez un modele Camembert ou USE pré-entraîné et vous voulez encoder une phrase. Ces modèles ne vont pas juste vous donner les encodages appris durant entrainement mais pour chaque token dans la phrase a encoder, ils vont calculer les embeddings en utilisant les représentations vectorielles des mots voisins ainsi que les poids obtenu après apprentissage.
Camembert et USE traitent également mieux les mots hors vocabulaire car ils tokenizent la phrase l’entrée ; ce qui fait que de nouveaux mots peuvent être reconstruits avec des tokens présents dans le vocabulaire. Cependant, ils diffèrent par le fait que USE est un modèle multilingue entraîne sur un corpus anglais tandis que Camembert est exclusivement pour le texte français. De plus, le premier est un sentence embedding tandis que le second est un token embedding.
Il pourrait être plus avantageux d’utiliser Camembert pour du data embedding en français, car selon les expériences de Louis Martin et al, dans certains cas, il fonctionne mieux que les modèles multilingues. Par contre, il n’est pas facile d’obtenir de bon sentence embedding a partir de Camembert.
Dans cet article, nous avons présenté Word2vec, Camembert et USE. J’espère que cela vous a permis de mieux comprendre ces modèles, si vous voulez apprendre à les utiliser pour une tâche de classification sur python restez à l’écoute pour le prochain post.
References
- https://medium.com/towards-artificial-intelligence/an-intuitive-introduction-of-word2vec-by-building-a-ord2vec-from-scratch-a1647e1c266c
- https://towardsdatascience.com/fasttext-under-the-hood-11efc57b2b3
- http://jalammar.github.io/illustrated-bert/
- https://mccormickml.com/2019/05/14/BERT-word-embeddings-tutorial/
- https://medium.com/@adriensieg/from-pre-trained-word-embeddings-to-pre-trained-language-models-focus-on-bert-343815627598
- https://yashuseth.blog/2019/06/12/bert-explained-faqs-understand-bert-working/
- https://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/
- https://towardsdatascience.com/a-comprehensive-hands-on-guide-to-transfer-learning-with-real-world-applications-in-deep-learning-212bf3b2f27a
- https://camembert-model.fr/
- https://medium.com/swlh/painless-fine-tuning-of-bert-in-pytorch-b91c14912caa
- https://towardsdatascience.com/use-cases-of-googles-universal-sentence-encoder-in-production-dd5aaab4fc15