Faire le réglage fin d'un petit transformeur
- Étude de cas 3
- 120 min
- Facultative · 1 étude de cas requise pour le certificat
Étude de cas 3 sur 4 · L'apprentissage profond et les transformeurs expliquésFaire le réglage fin d'un petit transformeur
1. Ce qu'est un réseau de neurones
2. Les tenseurs et PyTorch
3. Comment les réseaux de neurones apprennent
4. Diagnostiquer les problèmes d'entraînement
5. Représenter les séquences et le sens
6. Assembler un transformeur
7. Utiliser des modèles préentraînés
8. Sous le capot : les mathématiquesFacultatif
Ce que vous saurez faire
Découvrez ce qu’apporte un modèle préentraîné, avec des chiffres réels. Vous faites le réglage fin d’un petit transformeur préentraîné pour acheminer de vrais messages de soutien. Vous le comparez aux fréquences des mots et à un transformeur entraîné à partir de zéro. Vous mesurez l’écart avec 100, 500 et plusieurs milliers de messages étiquetés, ainsi que le coût de chaque modèle d’acheminement.
Le carnet (notebook) Jupyter exécute les étapes de cette page sur les petits échantillons, avec le même code. Il contient aussi deux tâches avec des vérifications. Ses cellules de préparation téléchargent les données (environ 1 Mo), le code du cours et DistilBERT (environ 270 Mo). Pour terminer en moins de 10 minutes sur un processeur gratuit, il utilise 500 messages pendant 8 époques. Cela prend environ 2 minutes sur l’ordinateur du cours. Il ne fait donc pas le réglage fin sur tous les messages. Les chiffres portant sur tous les messages proviennent d’une exécution plus longue du cours; la page précise où.
Avant de commencerCe qu’il faut savoir et avoir sous la main
Ce que vous devez savoir
Cette étude de cas utilise l’ensemble du cours. Voici les leçons les plus importantes :
- La boucle d’entraînement et le mode d’évaluation, dans Lots, époques et validation, et l’arrêt anticipé, dans Limiter le surapprentissage.
- Les limites des fréquences des mots, dans Pourquoi l’ordre des mots et le contexte comptent.
- Le bloc du transformeur et le tout petit transformeur, dans Les blocs du transformeur. La prédiction de jetons masqués, dans Les objectifs d’entraînement.
- Le préentraînement, l’adaptation, l’inférence et le chargement d’un modèle avec
from_pretrained(), dans Entraînement et inférence. La mémoire et la vitesse, dans Les coûts de l’inférence. - TF-IDF avec la régression logistique, et les données de test utilisées une seule fois, dans Apprentissage automatique : du problème à un modèle fiable.
Ce qu’il vous faut sur votre ordinateur (seulement pour l’exécution locale; le carnet n’en a pas besoin)
- L’environnement virtuel d’Installer PyTorch, avec
pip install "transformers>=5,<6" scikit-learn. DistilBERT télécharge environ 270 Mo à la première utilisation. Le réglage fin nécessite environ 2 Go de mémoire libre.
Testé avec Python 3.12, PyTorch 2.14.1, transformers 5.19.0 et scikit-learn 1.9.1 sur le processeur d’un Mac mini. L’exécution dans Jupyter partait d’une session neuve. Nous n’avons pas exécuté le carnet dans Colab ou Kaggle.
La situation
Section intitulée « La situation »Nadia dirige l’équipe de soutien d’une banque en ligne. Les clients écrivent de courts messages dans le clavardage de l’application : « Ma carte n’est toujours pas arrivée », « Pourquoi mon ajout de fonds a-t-il échoué? ». Chaque message doit parvenir au bon service. La banque a 77 intentions, une par type de demande, chacune avec sa propre procédure de réponse. Aujourd’hui, une personne lit chaque message et choisit l’intention. Un mauvais choix fait perdre du temps. Le client reçoit la mauvaise réponse, écrit de nouveau, et un agent règle le problème à la main.
La banque lancera bientôt un nouveau produit, avec de nouvelles intentions. Pendant les premières semaines, seuls quelques centaines de messages auront une étiquette. Kofi, l’ingénieur en apprentissage automatique de la banque, a lu des articles sur les modèles préentraînés. Nadia lui pose deux questions : « Est-ce qu’un modèle préentraîné fait mieux que ce qu’on peut construire nous-mêmes? Et avec seulement quelques étiquettes, est-ce qu’il vaut son coût supplémentaire? »
C’est aussi la question qui reste ouverte dans ce cours. Sur les billets de soutien de Larkfield, le tout petit transformeur a perdu contre les fréquences des mots. Il obtenait 94,2 % contre 98,8 % sur les billets de validation. Entraînement et inférence en donnait la raison. Les 4 696 courts billets contiennent beaucoup trop peu de texte pour apprendre une langue à partir de zéro. Un modèle préentraîné a déjà lu beaucoup de texte. Est-ce que cela change le résultat?
Ce que vous allez construire
Section intitulée « Ce que vous allez construire »Vous entraînerez quatre modèles d’acheminement sur les mêmes messages et les comparerez avec un seul découpage et une seule mesure. Vous répéterez la comparaison avec 100, 500, 2 000 et l’ensemble des 9 003 messages d’entraînement. Cette comparaison répétée forme une courbe d’apprentissage : l’exactitude en fonction du nombre d’exemples étiquetés. Ensuite, vous testerez le meilleur modèle une seule fois, examinerez ses erreurs et mesurerez ses coûts. Vous vérifierez ce que le modèle préentraîné apporte avec lui et appliquerez la même méthode aux billets de Larkfield.
Les données
Section intitulée « Les données »Les données sont celles de BANKING77, publié par PolyAI avec un article de recherche en 2020. Le jeu contient 13 083 courts messages au soutien en ligne d’une banque, chacun associé à l’une des 77 intentions. L’article les appelle « demandes au service à la clientèle »; il ne dit pas qui les a écrites. Traitez-les comme des messages réalistes, pas comme un échantillon des clients d’une banque précise.
Pourquoi ce jeu de données? Sa tâche ressemble à celle de Larkfield, mais avec plus d’équipes. Ses étiquettes détaillées rendent le test plus difficile pour les fréquences des mots. Ses courts messages permettent le réglage fin sur un processeur ordinaire, et sa licence est claire. Les conditions d’utilisation de nombreux jeux de données d’avis populaires sont peu claires. La fiche du jeu de données, dans le dossier du carnet, liste les autres candidats et les raisons de leur rejet.
Kofi charge les deux fichiers, puis regarde leur taille, les intentions et trois d’entre elles :
from collections import Counterprint(len(raw_train), "train |", len(raw_test), "test | columns:", list(raw_train[0].keys()))counts = Counter(r["category"] for r in raw_train)print("intents:", len(counts), "| messages per intent in train: min", min(counts.values()), "max", max(counts.values()))print("test, per intent:", sorted(set(Counter(r["category"] for r in raw_test).values())))for intent in ("top_up_failed", "top_up_reverted", "pending_top_up"): print(f"{intent:16}", [r["text"] for r in raw_train if r["category"] == intent][:2])La sortie :
10003 train | 3080 test | columns: ['text', 'category']intents: 77 | messages per intent in train: min 35 max 187test, per intent: [40]top_up_failed ['I think my top-up has failed.', 'Top-up is not working']top_up_reverted ['My top up did not show up as shown and my money has disappeared, can you help me fix this glitch problem?', 'Has my top-up been cancelled?']pending_top_up ['How long does a top-up take to go through?', 'I am under the impression that my top up is still pending']Ce que cela nous apprend. Chaque ligne contient un message et son intention; il n’y a rien d’autre. Le fichier d’entraînement est déséquilibré : contactless_not_working compte 35 messages, et card_payment_fee_charged, 187. Le fichier de test contient exactement 40 messages par intention. Les trois intentions d’ajout de fonds partagent les mots clés « top-up », « money » et « not ». Seul le reste du message indique si l’ajout a échoué, a été retourné ou est encore en attente. C’est le type de message où les fréquences des mots échouent.
Premières vérifications
Section intitulée « Premières vérifications »Le script de calcul vérifie le reste. Il n’y a aucun message vide. Dans le fichier d’entraînement, 6 messages en répètent un autre. Aussi, 10 messages de test apparaissent dans le fichier d’entraînement, avec les mêmes mots. Ces deux nombres sont trop faibles pour changer un résultat. Kofi conserve donc les fichiers tels quels et le note. Les messages sont courts : la médiane est de 10 mots, et le plus long en compte 79.
Définir le problème
Section intitulée « Définir le problème »- L’unité : un message, tel que le client l’envoie.
- La cible : l’intention, parmi les 77.
- Le moment de la prédiction : à l’arrivée du message, avant que quelqu’un le lise. L’entrée contient seulement le texte.
- La mesure : l’exactitude, soit la proportion de messages acheminés vers la bonne intention. Chaque mauvaise intention coûte à peu près la même chose ici : un message supplémentaire d’un client mécontent. Avec 77 intentions, toujours choisir la plus fréquente donne raison seulement 1,9 % du temps.
- Le contenu sensible : aucune colonne ne décrit les personnes, mais un message peut contenir un nom ou d’autres renseignements personnels. Le modèle d’acheminement ne doit pas en dépendre. La section « Utilisation responsable » le vérifie.
Découpage
Section intitulée « Découpage »Le fichier de test officiel reste fermé jusqu’à la fin. Kofi réserve 1 000 messages du fichier d’entraînement comme données de validation, avec la même proportion de chaque intention. Tous les modèles sont comparés sur ces mêmes 1 000 messages. Il reste 9 003 messages pour l’entraînement. Pour la courbe d’apprentissage, subset() tire un échantillon d’entraînement de 100, 500 ou 2 000 messages. La proportion de chaque intention reste la même :
from sklearn.model_selection import train_test_split
train, valid = train_test_split(raw_train, test_size=1000, stratify=[r["category"] for r in raw_train], random_state=0)
def subset(rows, n, seed=0): """n rows with the same share of each intent; all rows when n >= len(rows).""" if n >= len(rows): return list(rows) return train_test_split(rows, train_size=n, stratify=[r["category"] for r in rows], random_state=seed)[0]Dans un échantillon de 100 messages, la plupart des intentions ont un message, quelques-unes en ont deux, et 2 n’en ont aucun. Cela imite les premières semaines du nouveau produit. Avec si peu de messages, le résultat dépend des messages tirés. Pour 100 et 500 messages, Kofi entraîne donc chaque modèle sur trois échantillons différents (seed 0, 1 et 2). La page présente la médiane et l’étendue des résultats.
La nouvelle idée : préentraînement, puis réglage fin
Section intitulée « La nouvelle idée : préentraînement, puis réglage fin »Deux nouveaux collègues
Section intitulée « Deux nouveaux collègues »Nadia embauche deux nouveaux agents pour le clavardage. La première a des années d’expérience au soutien d’une autre banque. Elle lit les 77 intentions et quelques exemples de chacune. À midi, elle achemine déjà bien les messages. Le second, dans cette histoire, n’a jamais appris l’anglais. Il doit apprendre la langue à partir des exemples seulement, et quelques centaines d’exemples ne suffisent pas.
La première collègue est un modèle préentraîné. Le second est un modèle entraîné à partir de zéro.
Le problème : peu d’étiquettes, trop peu de mots
Section intitulée « Le problème : peu d’étiquettes, trop peu de mots »Un modèle qui apprend seulement à partir de messages étiquetés connaît seulement les mots qu’ils contiennent. Avec 100 messages d’entraînement, le vocabulaire compte 364 mots. De plus, 12,7 % des mots des messages de validation n’apparaissent jamais dans l’entraînement. « arrived » peut y être, mais pas « come ». Pour TF-IDF et le tout petit transformeur, un mot jamais vu ne compte pour rien. Avec les 9 003 messages, seulement 0,7 % des mots de validation sont inconnus. Un modèle qui a beaucoup lu en anglais sait que « my card hasn’t come » signifie « my card hasn’t arrived ». Il le sait même si aucun message étiqueté ne le dit.
L’idée et son nom
Section intitulée « L’idée et son nom »Le préentraînement est le long entraînement initial sur beaucoup de texte non étiqueté, comme l’explique Les objectifs d’entraînement. Le réglage fin prend le réseau préentraîné et ajoute une nouvelle couche de sortie pour votre tâche. Il entraîne ensuite tout le réseau un peu plus sur vos exemples étiquetés, avec un petit taux d’apprentissage. Le nom décrit son rôle : le réseau est déjà bon en général, et cet entraînement supplémentaire l’ajuste pour une tâche précise. La nouvelle couche de sortie s’appelle la tête, parce qu’elle se trouve au sommet du réseau.
Cette étude de cas utilise DistilBERT, un petit encodeur préentraîné. Un encodeur est un transformeur qui lit tout le message dans les deux sens. Le tout petit transformeur du module 6 fait la même chose; le décodeur SmolLM2 du module 7, non. Ses créateurs l’ont préentraîné sur des livres et Wikipédia en anglais avec la prédiction de jetons (tokens) masqués. Ils masquent 15 % des mots pour qu’il les prédise. Il possède 6 blocs, 12 têtes d’attention et 768 nombres par jeton. Cela donne 66 362 880 paramètres, environ 320 fois plus que le tout petit transformeur. Son nom signifie « distillé » : il a été entraîné à copier BERT, un modèle plus grand, et il est 40 % plus petit. Il est ouvert, sous licence Apache-2.0.
Il y a deux façons de l’utiliser, et l’étude de cas mesure les deux :
Description textuelle du diagramme
Trois lignes, chacune allant d’un message à une intention.
- À partir de zéro : le message entre dans le tout petit transformeur du cours, avec des poids aléatoires. Il doit apprendre l’anglais et les intentions à partir des messages étiquetés seulement. Une nouvelle tête donne 77 scores, un par intention.
- Figé : le message entre dans DistilBERT, préentraîné sur des livres et Wikipédia. Ses poids ne changent pas. Il donne 768 nombres par message. La régression logistique, seule partie entraînée, les transforme en intention.
- Avec réglage fin : le message entre dans DistilBERT, qui part des poids préentraînés. Tous ses poids changent un peu pendant l’entraînement, avec un petit taux d’apprentissage. Une nouvelle tête donne 77 scores.
Quand l’utiliser, et à quel coût : le réglage fin est utile quand vos données étiquetées sont insuffisantes pour apprendre la langue. Le texte doit aussi ressembler à celui du préentraînement. Le prix à payer : un modèle d’acheminement environ 380 fois plus grand et beaucoup plus lent que celui utilisant les fréquences des mots. Sa licence et ses données d’entraînement viennent de quelqu’un d’autre. Chaque nouvel entraînement prend aussi le temps d’un réglage fin. La suite de cette page mesure chacun de ces aspects.
Quatre modèles d’acheminement
Section intitulée « Quatre modèles d’acheminement »Chaque modèle reçoit les mêmes échantillons d’entraînement et est évalué sur les mêmes 1 000 messages de validation. Chacun reçoit aussi un petit nombre égal d’essais de réglage sur les données de validation. Ainsi, aucun modèle ne perd seulement à cause d’un mauvais réglage.
1. Sac de mots : TF-IDF et régression logistique
Section intitulée « 1. Sac de mots : TF-IDF et régression logistique »La référence de base est le modèle d’acheminement du cours d’apprentissage automatique, qui achemine aussi le mieux les billets de Larkfield. Il utilise les poids des mots TF-IDF et la régression logistique, avec les jetons de mots du cours (tokenize dans ticketnet.py).
def fit_tfidf(texts_, y, min_df=1, C=100): return make_pipeline(TfidfVectorizer(token_pattern=None, tokenizer=tokenize, lowercase=False, min_df=min_df), LogisticRegression(max_iter=3000, C=C)).fit(texts_, y)Kofi a essayé six réglages, chacun sur des échantillons de 100, de 500 et de tous les messages. min_df valait 1 ou 2 : conserver les mots vus au moins une ou deux fois. C valait 1, 10 ou 100 : la régularisation diminue quand C augmente. min_df=1, C=100 donnait la meilleure exactitude moyenne en validation (30,5 %, 60,8 % et 88,0 %). Le réglage du cours pour Larkfield, min_df=2, C=1, était le pire (16,4 %, 52,9 % et 86,1 %). Avec peu de messages par intention, le modèle a besoin de chaque mot et de peu de régularisation.
2. À partir de zéro : le tout petit transformeur du cours
Section intitulée « 2. À partir de zéro : le tout petit transformeur du cours »Le TinyTransformer du cours vient de ticketnet.py. Seule sa dernière couche change : 77 sorties au lieu des 5 de Larkfield. L’entraînement utilise la boucle du cours avec Adam à 0,001 et des lots de 32. Il conserve l’époque ayant la plus faible perte de validation (arrêt anticipé). Les petits échantillons ont plus d’époques : 150 pour 100 messages, et 20 pour tous les messages. Ainsi, chaque exécution a assez d’étapes.
def tiny_transformer(vocab_size, n_classes, seed=0): torch.manual_seed(seed) model = TinyTransformer(vocab_size) model.out = nn.Linear(64, n_classes) # 77 intents instead of 5 teams return modelLe vocabulaire est construit à partir de chaque échantillon d’entraînement, comme dans le cours. Avec les 9 003 messages, il compte 1 450 mots vus au moins deux fois, et le réseau compte 205 581 paramètres.
3. Figé : DistilBERT comme producteur de caractéristiques
Section intitulée « 3. Figé : DistilBERT comme producteur de caractéristiques »La façon la moins coûteuse d’utiliser DistilBERT consiste à y faire passer chaque message une fois, sans entraînement. La dernière couche donne 768 nombres par jeton; leur moyenne forme une ligne par message. Ensuite, la régression logistique apprend les intentions à partir de ces lignes.
def features(texts_, batch_size=64): """The frozen encoder: the average of the last layer's token vectors (padding excluded), 768 per message.""" out = [] with torch.no_grad(): for i in range(0, len(texts_), batch_size): b = encode(texts_[i:i + batch_size]) h = encoder(**b).last_hidden_state # (batch, tokens, 768) m = b["attention_mask"].unsqueeze(-1).float() # (batch, tokens, 1): 0 for padding out.append((h * m).sum(1) / m.sum(1)) # (batch, 768) return torch.cat(out).numpy()encode() appelle le segmenteur en jetons de DistilBERT. Celui-ci découpe chaque message en morceaux de mots et ajoute du remplissage jusqu’au plus long message du lot. attention_mask vaut 1 pour un vrai jeton et 0 pour le remplissage; la moyenne ignore donc le remplissage. Les formes dans les commentaires suivent l’habitude du cours. La régression logistique au-dessus standardise les 768 nombres; C=1 a remporté la comparaison de trois réglages.
4. DistilBERT avec réglage fin
Section intitulée « 4. DistilBERT avec réglage fin »AutoModelForSequenceClassification construit DistilBERT avec une nouvelle tête de 77 scores. Les poids préentraînés sont chargés; seule la tête commence avec des poids aléatoires. La boucle d’entraînement suit les cinq étapes du cours, avec des lots de 16. labels= fait calculer la perte d’entropie croisée par le modèle lui-même :
def fine_tune(model, texts_, y, epochs, batch_size=16, lr=5e-05, seed=0): torch.manual_seed(seed) opt = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=0.01) y = torch.as_tensor(y) for epoch in range(1, epochs + 1): model.train() # training mode: dropout on order = torch.randperm(len(texts_)).tolist() for i in range(0, len(order), batch_size): idx = order[i:i + batch_size] opt.zero_grad() # 1 out = model(**encode([texts_[j] for j in idx]), labels=y[idx]) # 2 and 3 out.loss.backward() # 4 opt.step() # 5 print(f"epoch {epoch}: last batch loss {out.loss.item():.3f}") return model
torch.manual_seed(0)classifier = AutoModelForSequenceClassification.from_pretrained(MODEL, revision=REVISION, num_labels=len(INTENTS))print("parameters with the new head:", count_parameters(classifier))La sortie :
parameters with the new head: 67012685La tête ajoute 649 805 paramètres : une couche de 768 × 768 et la couche de sortie de 768 × 77, avec leurs biais. AdamW est Adam avec une décroissance des poids appliquée directement aux poids, le choix habituel pour le réglage fin. Le taux d’apprentissage est le réglage clé. Il doit être petit, sinon les premières étapes détruisent ce que le préentraînement a appris. Kofi a essayé trois taux pendant 10 époques sur 500 messages. Le taux 0,00005 a atteint 70,3 %, et 0,0001 a atteint 69,7 %. Le taux 0,0002 a complètement échoué (voir le cas d’échec plus bas). Il a conservé 0,00005. Les exécutions de cette page entraînent ensuite plus longtemps, jusqu’à 80 époques pour 100 messages et 4 pour tous les messages. Elles conservent la meilleure époque. Chaque exécution conserve l’époque ayant la plus faible perte de validation, comme pour le tout petit transformeur.
La courbe d’apprentissage : une partition, une mesure
Section intitulée « La courbe d’apprentissage : une partition, une mesure »Chaque routeur, à chaque taille, est évalué sur les mêmes 1 000 messages de validation :
- TF-IDF + régression logistique
- Tout petit transformeur, entraîné à partir de zéro
- DistilBERT figé (pointillés)
- DistilBERT avec réglage fin
Description textuelle du graphique
Un graphique à quatre courbes. L’axe horizontal présente quatre tailles : 100, 500, 2 000 et 9 003 messages d’entraînement. L’axe vertical représente l’exactitude de validation, de 0 % à 100 %. TF-IDF : 30,5 %, 60,8 %, 79,3 %, 88,0 %. Le tout petit transformeur entraîné à partir de zéro : 4,6 %, 34,3 %, 58,9 %, 79,6 %. DistilBERT figé avec régression logistique, en pointillés : 29,5 %, 60,6 %, 77,5 %, 87,0 %, presque superposé à TF-IDF. DistilBERT avec réglage fin : 32,2 %, 72,2 %, 85,5 %, 91,6 %. À 100 messages, les trois courbes autres que celle du tout petit transformeur se regroupent près de 30 %. À 500, le réglage fin dépasse les autres de 11 points.
| Messages d’entraînement | 100 | 500 | 2 000 | 9 003 |
|---|---|---|---|---|
| Messages par intention, environ | 1,3 | 6,5 | 26 | 117 |
| TF-IDF + régression logistique | 30,5 % (30,3–32,2) | 60,8 % (59,9–61,5) | 79,3 % | 88,0 % |
| Tout petit transformeur, entraîné à partir de zéro | 4,6 % (4,5–7,0) | 34,3 % (32,7–35,0) | 58,9 % | 79,6 % |
| DistilBERT figé + régression logistique | 29,5 % (26,5–30,5) | 60,6 % (58,9–62,0) | 77,5 % | 87,0 % |
| DistilBERT avec réglage fin | 32,2 % (26,9–32,4) | 72,2 % (70,5–72,3) | 85,5 % | 91,6 % |
| Réglage fin moins TF-IDF | +1,7 | +11,4 | +6,2 | +3,6 |
Ce que cela nous apprend. Quatre constats, dans l’ordre du graphique :
- Le tout petit transformeur entraîné à partir de zéro arrive dernier à chaque taille, comme sur les billets de Larkfield. Avec 100 messages, il dépasse à peine le hasard (4,6 %, contre 1,9 % pour l’intention la plus fréquente). Même avec les 9 003 messages, il reste 8 points derrière les comptes de mots.
- Le réglage fin mène dès 500 messages, mais son avance varie. Avec environ 1 message par intention, rien ne fonctionne. Trois modèles se situent près de 30 %, et leurs plages se chevauchent. Avec 6 ou 7 messages par intention (500 messages), le réglage fin mène de 11 points. C’est là que le préentraînement aide le plus. Avec davantage de messages, les comptes de mots rattrapent leur retard, et l’écart descend à 3,6 points.
- Les caractéristiques figées n’aident pas. L’encodeur figé avec régression logistique ne dépasse jamais TF-IDF. Les 768 nombres ont été conçus pour prédire des mots masqués. Leur moyenne brouille ce qui distingue
top_up_failed(rechargement échoué) detop_up_reverted(rechargement annulé). Ici, le préentraînement porte ses fruits seulement si les poids de l’encodeur peuvent changer. - L’écart entre les échantillons est réel. À 100 messages, un échantillon donne 26,9 % au modèle avec réglage fin, et un autre, 32,4 %. Avec peu d’étiquettes, le choix des messages à étiqueter compte autant que le modèle.
Le résumé honnête n’est donc pas « le préentraînement aide toujours davantage avec peu de données ». Il aide surtout entre les deux extrêmes : assez d’exemples pour montrer chaque intention quelques fois, trop peu pour apprendre ses mots uniquement à partir de ceux-ci.
La courbe du réglage fin
Section intitulée « La courbe du réglage fin »Avec tous les messages, une seule époque de réglage fin atteint déjà 87,0 % sur les données de validation. C’est autant que le meilleur résultat des caractéristiques figées. La perte de validation atteint son minimum après l’époque 3 (91,6 %). L’époque 4 est un peu moins bonne, donc l’arrêt anticipé conserve l’époque 3. Avec 500 messages, la meilleure époque se situe entre 22 et 24. Avec 100 messages, la perte de validation baissait encore lentement après 80 époques, à environ 33 % d’exactitude. Peu d’exemples donnent peu d’étapes, et la nouvelle tête apprend lentement.
Le coût de chaque routeur
Section intitulée « Le coût de chaque routeur »L’exactitude représente la moitié de la question de Nadia. L’autre moitié concerne le coût d’entraînement et d’exécution de chaque routeur. Le script de mesure l’a mesuré sur l’ordinateur du cours, un Mac mini avec 2 fils d’exécution du processeur. D’autres personnes l’utilisaient en même temps. Considérez les durées comme des ordres de grandeur, pas des valeurs exactes.
| TF-IDF + régression logistique | Tout petit transformeur | DistilBERT avec réglage fin | |
|---|---|---|---|
| Paramètres | 174 559 | 205 581 | 67 012 685 |
| Taille sur disque | 1,4 Mo | 0,8 Mo | 268 Mo |
| Entraînement, les 9 003 messages | environ 1 seconde | environ 2,5 minutes (20 époques) | environ 8 minutes (4 époques) |
| Mémoire maximale du processus, entraînement | environ 400 Mo | environ 650 Mo | environ 2 300 Mo |
| Acheminement de 1 000 messages | 0,004 seconde | 0,1 seconde | 3,6 secondes |
| Acheminement d’un message | 0,2 milliseconde | 0,2 milliseconde | 7 millisecondes |
Les durées d’entraînement comprennent une passe de validation après chaque époque, comme dans les boucles du cours. Le script a mesuré la mémoire maximale dans un nouveau processus Python pour chaque routeur. Il a effectué un entraînement complet pour TF-IDF, une époque pour le tout petit transformeur et 30 étapes de réglage fin pour DistilBERT. Acheminer 1 000 messages avec DistilBERT a demandé environ 1 160 Mo. L’encodeur figé coûte autant à exécuter que celui avec réglage fin. Il utilise les mêmes 66 millions de paramètres pour chaque message.
Ce que cela nous apprend. Le routeur avec réglage fin est environ 380 fois plus volumineux que celui basé sur les comptes de mots. Il est aussi environ 900 fois plus lent par lot. En valeur absolue, 7 millisecondes par message reste rapide pour une conversation, et 268 Mo tient sur n’importe quel serveur. Mais chaque copie nécessite environ un gigaoctet de mémoire, et un processeur bon marché sera lent si le trafic est élevé. Chaque réentraînement prend des minutes, pas des secondes. L’entraînement nécessite environ deux fois plus de mémoire que l’acheminement : poids, gradients et deux moyennes mobiles d’AdamW. La leçon Les coûts de l’inférence l’expliquait. Tout a fonctionné sur un ordinateur ordinaire, parce que le modèle est petit. Un modèle 100 fois plus gros ne le pourrait pas.
Le modèle final, et le test, une seule fois
Section intitulée « Le modèle final, et le test, une seule fois »Tous les choix sont faits : les quatre routeurs sont entraînés sur les 9 003 messages, avec les réglages ci-dessus. Kofi ouvre le fichier de test officiel une seule fois : 3 080 messages qu’aucune étape n’a utilisés, soit 40 par intention.
| Routeur, les 9 003 messages | Validation | Test, une seule fois |
|---|---|---|
| TF-IDF + régression logistique | 88,0 % | 89,0 % |
| Tout petit transformeur, entraîné à partir de zéro | 79,6 % | 80,1 % |
| DistilBERT figé + régression logistique | 87,0 % | 87,8 % |
| DistilBERT avec réglage fin | 91,6 % | 91,8 % |
Ce que cela nous apprend. L’ordre reste le même que sur les données de validation. Le modèle avec réglage fin achemine correctement 2 826 des 3 080 messages de test, contre 2 740 pour TF-IDF. Cela fait 86 messages de plus, soit 2,8 points. Son F1 macro, la moyenne des scores F1 des 77 intentions, est de 0,918 contre 0,890. Le gain ne se limite donc pas à quelques intentions fréquentes. Pour chaque routeur, l’écart entre le test et les données de validation ne dépasse pas 1,2 point. Le réglage limité ne nous a donc pas trompés.
Nouveaux messages, de bout en bout
Section intitulée « Nouveaux messages, de bout en bout »Ces six messages sont inventés pour cette étude de cas; aucun client ne les a écrits. Les deux messages de transfert et de rechargement utilisent les mêmes mots dans un ordre différent. Ils ressemblent aux billets sur les lampes de Pourquoi l’ordre des mots et le contexte comptent. Le code vient du carnet (notebook) Jupyter. La sortie vient du modèle avec réglage fin sur les 9 003 messages.
p_new = predict_proba(classifier, NEW)for text, p in zip(NEW, p_new): top = torch.topk(p, 2) print(text) print(" ", ", ".join(f"{INTENTS[int(i)]} {v:.3f}" for v, i in zip(top.values, top.indices)))La sortie :
I topped up my account this morning but the money still isn't there. top_up_reverted 0.547, pending_top_up 0.227My new card still hasn't arrived and I ordered it two weeks ago. card_arrival 0.992, lost_or_stolen_card 0.001I was charged twice for the same coffee. transaction_charged_twice 0.992, extra_charge_on_statement 0.001The transfer went through, but the top-up failed. top_up_failed 0.951, top_up_reverted 0.015The top-up went through, but the transfer failed. top_up_failed 0.911, top_up_reverted 0.033Can I get my money back for something I bought online? The seller never sent it. request_refund 0.878, reverted_card_payment? 0.071Ce que cela nous apprend. Les messages clairs obtiennent des réponses claires, avec 0,99. Le premier message est vraiment ambigu : « l’argent n’est toujours pas là » correspond à un rechargement annulé ou en attente. Le modèle répartit sa probabilité, 0,55 et 0,23. TF-IDF l’envoie vers balance_not_updated_after_cheque_or_cash_deposit (solde non mis à jour après un dépôt par chèque ou en espèces), ce qui est incorrect. Il achemine aussi la question sur le remboursement vers reverted_card_payment? (paiement par carte annulé). C’est l’étiquette du jeu de données, avec son point d’interrogation. Le modèle avec réglage fin répond correctement aux deux.
La paire utilisant les mêmes mots est la véritable surprise. TF-IDF donne exactement les mêmes probabilités aux deux messages, comme il doit le faire : mêmes mots, même entrée. Le modèle avec réglage fin peut les distinguer, et ses probabilités diffèrent effectivement (0,951 et 0,911). Mais il envoie les deux vers top_up_failed; failed_transfer (transfert échoué) n’obtient que 0,025 pour le second. Il lit l’ordre, mais dans cette paire, le mot « rechargement » l’emporte encore. Lire l’ordre est une capacité, pas une garantie.
Là où il se trompe
Section intitulée « Là où il se trompe »Le modèle avec réglage fin achemine incorrectement 84 des 1 000 messages de validation, et TF-IDF, 120. Ils ne se trompent pas sur les mêmes messages :
| TF-IDF correct | TF-IDF incorrect | |
|---|---|---|
| Réglage fin correct | 848 | 68 |
| Réglage fin incorrect | 32 | 52 |
Le réglage fin corrige donc 68 erreurs de TF-IDF et ajoute 32 erreurs propres au modèle. Ses confusions les plus fréquentes concernent des intentions qu’une personne pourrait aussi confondre. Il prend card_delivery_estimate (estimation de livraison de la carte) pour card_arrival (arrivée de la carte) 3 fois. Il prend pending_transfer (transfert en attente) pour transfer_timing (délai de transfert) 3 fois. Il prend aussi supported_cards_and_currencies (cartes et devises acceptées) pour fiat_currency_support (devises fiduciaires acceptées) 3 fois. Son intention la plus faible est card_delivery_estimate : 7 réponses correctes sur 11, contre 9 pour TF-IDF. « Pouvez-vous me dire quand ma carte arrivera? » porte l’étiquette card_delivery_estimate; le modèle répond card_arrival. Plusieurs étiquettes se trouvent sur une frontière que le jeu de données ne définit pas.
Deux des 68 corrections montrent ce que le préentraînement ajoute. « Vous avez refusé mon paiement. » correspond à declined_card_payment (paiement par carte refusé); TF-IDF répond declined_transfer (transfert refusé). « Proposez-vous le change en euros? » correspond à fiat_currency_support; TF-IDF répond exchange_via_app (change dans l’application), à cause du mot « change ». Le modèle avec réglage fin lit la question entière.
À quel point est-il sûr? Sur les données de validation, la probabilité médiane de son intention principale est de 0,986 quand il a raison. Elle est de 0,721 quand il se trompe. Cela permet une solution de repli : envoyer le message à une personne quand la probabilité principale est sous un seuil. À 0,5, 2,8 % des messages vont à une personne, et le routeur répond correctement à 93,1 % des autres. Ce n’est pas un remède : 22 réponses incorrectes ont encore une probabilité supérieure à 0,9.
Erreur courante
Un taux d'apprentissage qui efface le préentraînement
Symptôme : Tomás veut accélérer l’entraînement et fait le réglage fin avec un taux d’apprentissage de 0,0002 plutôt que 0,00005. Sur 500 messages, la meilleure des 10 époques atteint 1,8 % d’exactitude de validation. C’est pire que de toujours répondre avec l’intention la plus fréquente. Avec 0,00005 et 0,0001, les mêmes essais atteignent 70,3 % et 69,7 %.
Cause : le réglage fin part de poids qui fonctionnent déjà. Dans les premiers lots, la nouvelle tête est encore aléatoire. De grands pas éloignent ces poids de l’état obtenu par le préentraînement. Le réseau perd ce qu’il savait, et les quelques étiquettes ne peuvent pas le lui réapprendre.
Solution : utilisez de petits taux d’apprentissage pour le réglage fin, généralement entre 0,00001 et 0,0001. Essayez-en deux ou trois sur les données de validation, comme Kofi. Surveillez les premières époques : si la perte de validation ne baisse pas, arrêtez et réduisez le taux.
Ce que cela signifie pour un vrai service d’IA : un réglage fin peut échouer silencieusement, sans message d’erreur. Comparez toujours le modèle avec réglage fin à une référence de base simple sur les mêmes données de validation avant de l’utiliser.
Retour à Larkfield
Section intitulée « Retour à Larkfield »Priya applique la même méthode aux billets de soutien de Larkfield, avec la partition du cours. Elle utilise 4 696 billets d’entraînement, 600 de validation et 600 de test. Les billets sont plus longs que les messages de la banque. DistilBERT lit donc les 128 premiers jetons (tokens) de chacun. Parmi les billets d’entraînement, 226 sont plus longs et perdent leur fin; les réseaux du cours coupent à 120 jetons de mots. TF-IDF utilise les réglages du cours, ce qui donne le résultat du cours de 98,8 % sur tous les billets. Pour tous les billets, le résultat du tout petit transformeur vient de l’exécution du cours dans le module 6. Le script de mesure l’entraîne sur les échantillons de 100 et 500.
- TF-IDF + régression logistique
- Tout petit transformeur, entraîné à partir de zéro
- DistilBERT figé (pointillés)
- DistilBERT avec réglage fin
Description textuelle du graphique
Un graphique à quatre courbes pour trois tailles : 100, 500 et l’ensemble des 4 696 billets d’entraînement. L’axe vertical représente l’exactitude de validation, de 40 % à 100 %. TF-IDF : 71,8 %, 95,3 %, 98,8 %. Le tout petit transformeur entraîné à partir de zéro : 44,8 %, 75,5 % et 94,2 % (l’exécution du cours). DistilBERT figé, en pointillés : 74,2 %, 87,7 %, 94,3 %. DistilBERT avec réglage fin : 85,2 %, 97,2 %, 98,7 %. Avec 100 billets, le réglage fin dépasse TF-IDF de 13 points; avec 500, l’écart est de 2 points. Avec tous les billets, les deux courbes se rejoignent.
| Billets d’entraînement | 100 | 500 | 4 696 |
|---|---|---|---|
| Billets par équipe, environ | 20 | 100 | 939 |
| TF-IDF + régression logistique | 71,8 % (69,3–72,0) | 95,3 % (94,8–95,5) | 98,8 % |
| Tout petit transformeur, entraîné à partir de zéro | 44,8 % (42,5–46,8) | 75,5 % (72,8–75,8) | 94,2 % |
| DistilBERT figé + régression logistique | 74,2 % (70,0–79,5) | 87,7 % (87,2–89,7) | 94,3 % |
| DistilBERT avec réglage fin | 85,2 % (82,8–92,8) | 97,2 % (96,5–97,5) | 98,7 % |
Ce que cela nous apprend. Le profil des données bancaires revient, décalé vers la gauche. Avec 100 billets, environ 20 par équipe, le réglage fin dépasse les comptes de mots de 13 points. Cinq équipes aux mots distincts nécessitent bien moins d’exemples que 77 intentions proches. Les comptes de mots rattrapent donc leur retard rapidement. Avec 500 billets, l’écart est de 2 points. Avec tous les billets, le modèle avec réglage fin est derrière d’un billet, soit 98,7 % contre 98,8 %.
Examinez les billets où l’ordre compte. Sur les données de validation, le modèle avec réglage fin achemine correctement les 52 billets à deux sujets. TF-IDF en achemine correctement 88,5 %, et le tout petit transformeur, 84,6 %. Si l’on mélange les mots de chaque billet de validation, le modèle avec réglage fin passe de 98,7 % à 86,7 %. Le tout petit transformeur ne perdait que 1 point, à 93,3 %, et le sac de mots ne peut rien remarquer. L’encodeur avec réglage fin lit donc vraiment l’ordre. Ses 8 billets de validation incorrects concernent surtout une frontière entre les règles. Il envoie aux retours 5 billets de paiement portant sur un remboursement.
Puis le test, une seule fois : DistilBERT avec réglage fin 97,2 %, TF-IDF 99,2 %, le tout petit transformeur 91,2 % (l’exécution du cours). Sur de nouveaux billets, le modèle préentraîné fait moins bien que les comptes de mots de 2 points. Cela représente 12 billets sur 600.
La question ouverte du cours a donc sa réponse. Le préentraînement corrige ce qui manquait au tout petit transformeur. Avec tous les billets, l’écart de 4,6 points avec les comptes de mots disparaît. Avec 100 billets, le modèle préentraîné est loin devant. Mais sur les billets de Larkfield, les mots déterminent l’équipe. Il ne dépasse donc pas le modèle linéaire du cours Apprentissage automatique : du problème à un modèle fiable. Son exécution coûte aussi des centaines de fois plus cher. Larkfield conserve TF-IDF et la régression logistique. Essayez de nouveau le modèle avec réglage fin si Larkfield ajoute une équipe avec seulement quelques dizaines de billets étiquetés. Faites de même si les billets à deux sujets deviennent fréquents.
Recommandations
Section intitulée « Recommandations »Kofi écrit à Nadia dans ses mots :
- Utilisez le modèle avec réglage fin pour la conversation. Sur 3 080 messages de test, il choisit la bonne intention dans 91,8 % des cas. Le routeur basé sur les comptes de mots atteint 89,0 %. Cela fait environ 3 réponses incorrectes de moins par 100 messages.
- Pour le nouveau produit, étiquetez quelques exemples de chaque intention avant de le mettre en service. Avec un ou deux messages par intention, aucun modèle ne fonctionne. Avec six ou sept, le modèle préentraîné dépasse les comptes de mots de 11 points. Sur ces données, ces étiquettes ont changé le résultat plus que n’importe quel choix de modèle.
- Envoyez les messages incertains à une personne. Avec un seuil de 0,5, environ 3 messages sur 100 vont à un agent. Le routeur répond correctement à 93 % des autres. Choisissez le seuil selon le coût du temps d’un agent et d’une réponse incorrecte.
- Prévoyez le budget. Une copie du routeur nécessite environ 1,2 Go de mémoire et environ 7 millisecondes par message sur un processeur. Le réentraînement prend des minutes. Les comptes de mots n’en demandent qu’une fraction.
Et pour quoi ne pas l’utiliser :
- Pas pour des décisions concernant un client, comme la détection de fraude, le crédit ou la fermeture d’un compte. Il a été conçu pour choisir un parcours de réponse, où une erreur coûte un second message.
- Pas pour d’autres banques, langues ou canaux sans un nouveau test sur leurs messages.
Limites et prochaines étapes
Section intitulée « Limites et prochaines étapes »- Auteurs inconnus. Le jeu de données ne précise pas qui a écrit les messages. Les vrais clients écrivent des messages plus longs, mélangent deux demandes et font plus de fautes de frappe. Testez le modèle sur les messages de la banque avant le lancement.
- Étiquettes discutables. Plusieurs intentions se chevauchent, comme
card_arrival(arrivée de la carte) etcard_delivery_estimate(estimation de livraison de la carte). Une partie de l’erreur restante vient des étiquettes, pas du modèle. - Un seul essai pour les grands volumes. Seuls les volumes de 100 et 500 messages ont trois échantillons. Pour 2 000 et 9 003 messages, une autre graine aléatoire pourrait déplacer le résultat d’un point.
- Un petit budget d’ajustement. Chaque routeur a reçu une grille de trois à six réglages. Une recherche plus large pourrait réduire ou élargir les écarts. Ces écarts sont donc des estimations.
- Temps mesurés sur un ordinateur partagé. Les coûts donnent des ordres de grandeur. Mesurez-les sur le vrai serveur.
- Ensuite : gelez les blocs inférieurs et faites le réglage fin des blocs supérieurs seulement pour réduire le temps d’entraînement. Essayez un encodeur préentraîné plus petit. Vérifiez le seuil de transfert avec de vrais agents.
Utilisation responsable
Section intitulée « Utilisation responsable »Un modèle préentraîné apporte plus que ses compétences. Ses créateurs ont choisi ses textes d’entraînement. Il conserve ce qu’il a appris de ces textes.
Ce que le modèle préentraîné a appris. DistilBERT a été préentraîné sur BookCorpus, une collection de livres non publiés, et sur Wikipédia en anglais. Sa fiche de modèle contient une section « Limitations and bias » (limites et biais) avec un test. Le modèle complète le mot masqué dans « The white man worked as a [MASK] » (L’homme blanc travaillait comme [MASK]) et « The Black woman worked as a [MASK] » (La femme noire travaillait comme [MASK]). Le script de calcul a répété ce test avec la version exacte utilisée ici. Pour l’homme blanc, les premiers mots sont forgeron, charpentier, agriculteur, mineur et boucher. Pour la femme noire, ce sont serveuse, infirmière, domestique, un stéréotype sexuel et aide ménagère. La fiche indique : « Ce biais touchera aussi toutes les versions de ce modèle ayant subi un réglage fin. » Lisez la fiche de chaque modèle que vous utilisez.
Le biais atteint-il le routeur? Un biais dans les poids préentraînés compte seulement si la tâche permet de l’exprimer. Kofi teste directement le routeur avec 8 messages qui mentionnent une personne. Par exemple : « J’ai envoyé de l’argent à James hier, mais il n’est pas arrivé. » Chaque message reçoit 10 prénoms de différentes origines, comme Emily, Mohammed, Aisha, Wei et Olga. Dans les 8 messages, chaque prénom donne la même intention. C’est un résultat rassurant pour cette tâche et ces formulations, pas une preuve pour tous les messages. Répétez ces vérifications avec les messages de la banque et d’autres renseignements personnels, comme un handicap ou un pays.
Données et licences. Les messages de clavardage peuvent contenir des renseignements personnels. Les journaux (logs) du routeur doivent donc avoir la même protection que le clavardage. Toute copie de BANKING77 (CC BY 4.0) doit mentionner PolyAI comme source. DistilBERT (Apache-2.0) permet l’utilisation commerciale; consignez son nom et sa révision exacte avec le routeur.
Une intervention humaine. Le routeur choisit un parcours de réponse; il ne prend aucune décision concernant le client. Gardez cette limite et permettez aux clients de joindre une personne quand la réponse ne convient pas.
Faites-en un projet pour votre portfolio
Section intitulée « Faites-en un projet pour votre portfolio »Une étude de cas comme celle-ci montre à un employeur que vous savez utiliser un modèle préentraîné avec jugement. Vous l’avez comparé à des références de base simples, avec plusieurs volumes de données, en mesurant ses coûts. Personnalisez le projet avec un changement. Par exemple, essayez un autre petit encodeur, un transfert vers une personne ou un autre jeu de données textuelles sous licence ouverte. Puis rendez-le public et facile à lire en cinq minutes.
Quoi mettre dans le dépôt :
README.md, la page que les gens lisent en premier (modèle ci-dessous).- Le carnet (notebook) Jupyter, exécuté du début à la fin, avec ses sorties.
MODEL_CARD.md. Utilisation prévue : acheminer les messages de clavardage vers une intention, avec une personne pour les messages incertains. Utilisation exclue : prendre des décisions concernant les clients. Ensuite, les données, le modèle préentraîné et sa révision, l’évaluation, les limites et les biais décrits dans sa propre fiche.EXPERIMENT.md, comme dans Enregistrer et examiner les résultats. Consignez le nom et la révision du modèle, le commit (version enregistrée) des données, les sommes de contrôle et les graines aléatoires. Ajoutez les versions des bibliothèques, l’ordinateur et les temps d’entraînement.- La source et la licence des données, avec le texte d’attribution de l’encadré ci-dessus. N’enregistrez pas les poids ajustés dans un commit (environ 270 Mo); le lecteur peut les recréer à partir du carnet.
Un modèle de README :
# Does pretraining pay off for routing support messages?
## ProblemRoute short bank-support messages to one of 77 intents. For a new product,only a few hundred messages have labels at first.
## Data and licenceBANKING77 (PolyAI, 2020), 13,083 messages, 77 intents, CC BY 4.0,github.com/PolyAI-LDN/task-specific-datasets (commit 57ec275).1,000 train messages held out for validation; official test used once.
## ApproachFour routers, one split, one metric (accuracy): TF-IDF + logistic regression,a tiny transformer from scratch, frozen DistilBERT + logistic regression,fine-tuned DistilBERT (distilbert-base-uncased, Apache-2.0). Learning curvewith 100 / 500 / 2,000 / 9,003 training messages, 3 samples for the small sizes.
## ResultsValidation accuracy (1,000 messages), median of 3 samples for 100 and 500: 100 500 2,000 9,003TF-IDF + LR 30.5% 60.8% 79.3% 88.0%Tiny transformer 4.6% 34.3% 58.9% 79.6%Frozen DistilBERT 29.5% 60.6% 77.5% 87.0%Fine-tuned 32.2% 72.2% 85.5% 91.6%Test (3,080 messages, once): fine-tuned 91.8%, TF-IDF 89.0%.
## CostsFine-tuned: 67.0 M parameters, 268 MB, about 7 ms per message on a CPU,about 8 minutes to train on all messages. TF-IDF: 175 k parameters, 1.4 MB,0.2 ms per message, about 1 second to train.
## LimitsWho wrote the messages is not documented; one kind of bank, English only;the pretrained model inherits biases from its books and Wikipedia text.Comment le décrire en entrevue, en deux phrases : « J’ai fait le réglage fin de DistilBERT pour acheminer des messages de soutien bancaire vers 77 intentions, puis je l’ai comparé au comptage de mots et à un transformeur entraîné de zéro, avec 100 à 9 000 étiquettes. Le préentraînement a surtout aidé avec quelques exemples par intention (11 points avec 500 messages, 2,8 au test final), alors j’ai documenté quand le modèle de comptage de mots, 380 fois plus petit, est le meilleur choix. »
Pour aller plus loin :
- Tracez l’exactitude du routeur selon la proportion de messages transférés à une personne, pour des seuils de 0,3 à 0,9.
- Gelez tous les blocs sauf les deux derniers. Ajustez seulement ceux-ci et la tête, puis comparez l’exactitude, le temps et la mémoire.
- Faites trois essais avec des graines aléatoires différentes pour 2 000 messages et pour tous les messages. Montrez la dispersion.
Vérification des connaissances
Section intitulée « Vérification des connaissances »Vérifiez votre compréhension
Les caractéristiques gelées de DistilBERT avec une régression logistique n'ont jamais dépassé TF-IDF. Mais DistilBERT avec réglage fin l'a dépassé dès 500 messages. Les deux utilisent les mêmes poids préentraînés. Expliquez la différence.
Afficher la réponse
L’approche gelée garde tous les poids préentraînés fixes et calcule la moyenne des vecteurs de la dernière couche. Ces vecteurs ont été façonnés pour prédire des mots masqués. Leur moyenne brouille les détails qui séparent des intentions proches, comme un rechargement échoué et un rechargement annulé. La régression logistique ajoutée ne peut que tracer des lignes droites dans les données qu’elle reçoit. Le réglage fin permet à chaque poids de s’ajuster un peu à la tâche d’acheminement. L’encodeur apprend donc quels détails comptent pour les 77 intentions, tout en gardant ses connaissances de l’anglais.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Avec 100 messages bancaires étiquetés, trois modèles approchaient 30 %. Avec 100 billets de soutien Larkfield, le réglage fin atteignait 85 % et TF-IDF, 72 %. Les deux ont 100 exemples. Pourquoi les résultats diffèrent-ils?
Afficher la réponse
Ce qui compte, c’est le nombre d’exemples par classe, pas le total. Pour 100 messages bancaires répartis entre 77 intentions, chaque intention reçoit un ou deux exemples. C’est trop peu pour qu’un modèle apprenne ce qui les distingue. Pour 100 billets Larkfield répartis entre 5 équipes, chaque équipe reçoit 20 exemples. Avec quelques exemples par classe, un modèle préentraîné peut utiliser ce qu’il sait déjà des mots. C’est là qu’il aide le plus. Avec assez d’exemples par classe, le comptage de mots le rattrape.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Tomás dit : « Le modèle ajusté est meilleur, alors Larkfield devrait l'adopter aussi. » Répondez-lui avec les chiffres de l'étude de cas.
Afficher la réponse
Sur les billets de Larkfield, le modèle ajusté égale TF-IDF en validation (98,7 % contre 98,8 %). Il fait moins bien sur les données de test (97,2 % contre 99,2 %). Il achemine mieux les billets qui abordent deux sujets. Mais il est des centaines de fois plus gros et plus lent. Il faut aussi plusieurs minutes pour le réentraîner. Sur les données bancaires, il gagne parce que les 77 intentions ont des différences fines et partagent des mots. Chez Larkfield, les mots suffisent généralement à choisir parmi les cinq équipes. Larkfield devrait donc garder TF-IDF et la régression logistique. L’entreprise peut réessayer le réglage fin si une nouvelle équipe commence avec peu de billets étiquetés.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Récapitulatif
- Le réglage fin part de poids préentraînés, ajoute une nouvelle tête et entraîne le tout un peu plus. Le taux d’apprentissage doit être faible : 0,00005 ici, alors que 0,0002 effaçait le préentraînement.
- Sur BANKING77, avec une seule répartition et une seule mesure, DistilBERT ajusté dépassait le comptage de mots dès 500 messages. Il avait une avance de 11,4 points avec 500 messages et de 3,6 points avec tous les messages. Sur les données de test, utilisées une seule fois : 91,8 % contre 89,0 %.
- Le préentraînement aidait surtout avec quelques exemples par intention. Avec environ un exemple par intention, rien ne fonctionnait. Les caractéristiques gelées seules n’ont jamais dépassé TF-IDF. Le tout petit transformeur entraîné de zéro arrivait dernier à chaque volume.
- Le prix : 67 millions de paramètres, 268 Mo, 7 millisecondes par message et plusieurs minutes pour le réentraînement. Le comptage de mots demande 175 000 paramètres et une fraction de milliseconde.
- Sur les billets de Larkfield, le réglage fin a comblé l’écart du tout petit transformeur, sans dépasser le comptage de mots. Larkfield garde son modèle linéaire.
- Un modèle préentraîné apporte les données d’entraînement et les biais de ses créateurs. Lisez sa fiche, cherchez ces biais dans la tâche et gardez une personne pour les messages incertains.
Ensuite, la dernière étude de cas prend la direction inverse. Elle entraîne un petit décodeur de zéro pour écrire du texte. Elle montre aussi à quel point il reste loin d’un vrai modèle de langage.
Leçon suivante : Entraîner un tout petit modèle de langage