Une brève introduction aux LLMs (2/2)
L’architecture Transformers qui sous-tend les réseaux de neurones du même nom comprend deux facettes distinctes dédiées d’une part à l’encodage et d’autre part au décodage, qui sont mobilisables soit ensemble soit indépendamment l’une de l’autre. Ces types de “stacks” encodage-décodage préexistaient aux LLM dans des modèles NLP de type seq2seq par exemple mais sans le principe de l’attention. Dans cet assemblage polyvalent, le composant dédié à l’encodage traite l’input (texte, image, audio…) et le décodeur génère l’output (texte, image, audio…). De plus ces deux traitements peuvent chacun être orientés de manière bidirectionelle ou unidirectionnelle, selon que le modèle considère les données dans les deux sens du début à la fin et de la fin au début (par exemple quand il prend en compte les mots précédents et les mots suivants prédire un mot masqué dans une séquence) ou qu’il n’effectue les calculs que dans une seule direction (avec seulement les mots précédents).
Comment se positionnent les LLM dans ce paysage ?
Les LLM dédiés à la génération de contenu y compris les plus populaires (GPT, Llama, Mistral etc…) adoptent une architecture Transformers de type “decoder-only” et unidirectionnelle projetée vers l’avant : cela signifie que les données d’entrée sont introduites directement dans le décodeur sans être transformées en une représentation plus complexe et plus abstraite par un encodeur, et que les données en sortie résulte de la prédiction du token suivant dans une séquence orientée de tokens priorisés par le mécanisme de l’attention. L’avantage d’évacuer le processus d’encodage consiste à augmenter l’efficience et la rapidité du modèle pour certaines tâches, par exemple la génération de texte, la traduction ou la création de résumés.
Certains modèles d’embeddings (comme ceux de la famille Bert) fonctionnent avec des Transformers de type bidirectionnels et “encoder-only” qui convertissent un input en une représentation vectorielle abstraite dont la sémantique intrinsèque est approximée par des dispositifs calculatoires (géométriques, probabilistes…).
Enfin d’autres modèles (comme les modèles de la famille T5 par exemple) sont conformes à l’acception originelle du Transformer et ont la double casquette encodeur-décodeur.
Vecteurs, tokens, embeddings
Un vecteur est une représentation géométrique orientée d’une donnée caractérisée à la fois par une “ampleur” et une direction et ne pouvant pas être décrite par un seul chiffre (un déplacement de A à B à une certaine vitesse par exemple, une force magnétique…).
L’objet des modèles d’embeddings est de :
- tokeniser chaque mot - ou partie de mot ou groupe de mots selon le tokenizer - d’une phrase : de la segmenter en unités linguistiques en conservant tous les mots (y compris les stopwords). A l’échelle d’un corpus textuel, cela revient donc à créer un vocabulaire de tokens uniques.
from transformers import BertTokenizer
HF_TOKEN = "your_huggingface_token"
model = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model,token=HF_TOKEN)
tokenizer_output = tokenizer.tokenize("Data lakes and data warehouses have several key differences")
print(tokenizer_output)
#returns ['data', 'lakes', 'and', 'data', 'warehouses', 'have', 'several', 'key', 'differences']
- puis représenter mathématiquement chaque token par un vecteur en le mappant sur un identifiant numérique
from transformers import AutoTokenizer
HF_TOKEN = "your_huggingface_token"
model = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model,token=HF_TOKEN)
text = "Data lakes and data warehouses have several key differences"
token = tokenizer.encode(text)
print(token)
#returns [101, 2951, 6597, 1998, 2951, 23319, 2031, 2195, 3145, 5966, 102]
#dans l'autre sens (décodage)
decoded_text = tokenizer.decode(token)
print(decoded_text)
#returns (avec des marqueurs de début et fin de séquence) :
#[CLS] data lakes and data warehouses have several key differences [SEP]
- puis de convertir l’ensemble d’une séquence de tokens en un embeddings en mappant chaque identifiant sur un vecteur de dimension n.
Entraîner un modèle d’embeddings revient donc à initialiser aléatoirement les vecteurs de dimension n et à les ajuster pour représenter plus précisément la signification d’un token et sa relation avec d’autres tokens dans le vocabulaire.
Utiliser un modèle d’embeddings revient donc à bénéficier de la vectorisation déjà effectuée par le modèle pré-entraîné pour convertir un texte en vecteurs sémantiques.
from sentence_transformers import SentenceTransformer
HF_TOKEN = "your_huggingface_token"
model = "sentence-transformers/all-MiniLM-L6-v2"
sentences = ["Data lakes and data warehouses have several key differences"]
model = SentenceTransformer(model,token=HF_TOKEN)
embeddings = model.encode(sentences)
print(embeddings)
#returns [[ 1.22732595e-01 3.07207525e-01 2.55992144e-01 3.53290439e-01
1.48111090e-01 -1.03387184e-01 -1.32174507e-01 3.95111531e-01
-4.36532721e-02 -2.22454503e-01 1.05569787e-01 -3.69255573e-01
-8.74738023e-02 4.98564512e-01 -6.09418601e-02 2.43832931e-01
8.09529200e-02 1.45877615e-01 3.38038057e-02 5.37560225e-01
8.39937031e-02 1.16095617e-01 -3.60795379e-01 2.33607337e-01
1.75538883e-01 -2.59962201e-01 1.23450808e-01 -2.69558460e-01
-2.03123968e-03 2.00586408e-01 2.03975618e-01 3.49298447e-01
-1.36528537e-01 -3.36508602e-02 2.11110458e-01 -2.04068437e-01
-1.97162330e-01 -5.80357090e-02 -6.63486421e-02 4.82698120e-02
-2.70051748e-01 -2.87034154e-01 1.19949199e-01 1.66405588e-01
-3.15406471e-01 -9.14650857e-02 -8.56704414e-02 1.17806932e-02
-5.61104417e-02 -9.62456539e-02 -8.94528210e-01 3.50617737e-01...]]
Un embeddings est donc un vecteur de haute dimension embarquant, en vertu du principe de l’attention (quand un réseau de neurones Transformer est mobilisé), toutes les relations entre tokens afin de créer un objet numérique porteur de toute la sémantique d'un texte issue de la signification globale des mots selon leur contexte, en tentant de mathématiquement traduire au plus près les relations syntaxiques, structures grammaticales et autres nuances polysémiques caractéristiques du langage naturel.
En conclusion
En réalité, les modèles de langage du fait de l’architecture sur laquelle ils s’appuient sont par nature polyvalents et ajustables selon le type de fonctions qu’ils mobilisent : certains ne comprennent que la partie encodage, d’autres la partie décodage, et d’autres enfin sont des modèles encodeur-décodeur, ce choix dépendant des types de tâches auxquelles ils sont destinés. C’est cette spécialisation technique qui permet d’utiliser conjointement plusieurs LLM dans le cadre de certaines applications d’IA comme le RAG (retrieval-augmented generation) par exemple, et comme illustré par la figure ci-dessous

Pour une explication détaillée du fonctionnement d'une architecture de type Transformer de la création des embeddings à la génération du token suivant le plus probable pour une séquence donnée (avec visualisation à l'appui), on peut se référer à l'application Transfomer Explainer

