title | description | prev | next | type | id |
---|---|---|---|---|---|
Chapitre 4 : Entraînement d'un modèle de réseau de neurones |
Dans ce chapitre, tu vas apprendre comment actualiser les modèles statistiques de spaCy afin de les personnaliser pour tes cas d'utilisation - par exemple, pour prédire un nouveau type d'entité pour des commentaires en ligne. Tu vas entraîner ton propre modèle en partant de zéro, et comprendre les bases de l'apprentissage, ainsi que des trucs et astuces pour mieux réussir tes projets de NLP sur mesure. |
/chapter3 |
chapter |
4 |
Pour entraîner un modèle, tu as généralement besoin de données d'entraînement et de données pour l'évaluation. A quoi servent les données d'évaluation ?
Pendant l'entraînement, le modèle est actualisé uniquement à partir des données d'entraînement. Les données de développement sont utilisées pour évaluer le modèle en comparant ses prédictions sur des exemples qu'il n'a pas rencontrés avec les bonnes annotations. C'est ce que reflète le score de précision.
Les données de développement sont utilisées pour évaluer le modèle en comparant ses prédictions sur des exemples qu'il n'a pas rencontrés avec les bonnes annotations. C'est ce que reflète le score de précision.
Les données de développement sont utilisées pour évaluer le modèle en comparant ses prédictions sur des exemples qu'il n'a pas rencontrés avec les bonnes annotations. C'est ce que reflète le score de précision.
Le Matcher
basé sur les règles de spaCy est un excellent moyen pour créer
rapidement des données d'entraînement pour les modèles d'entités nommées. Une
liste de phrases est accessible via la variable TEXTS
. Tu peux l'imprimer pour
l'inspecter. Nous voulons trouver toutes les mentions de différents modèles
d'iPhone, donc nous allons créer des données d'entraînement pour apprendre à
notre modèle à les reconnaître en tant que "GADGET"
.
- Écris un motif pour deux tokens dont la forme en minuscules correspond à
"iphone"
et"x"
. - Écris un motif pour deux tokens : un token dont la forme en minuscules
correspond à
"iphone"
et un nombre.
- Pour trouver les formes minuscules d'un token, tu peux utiliser l'attribut
"LOWER"
. Par exemple :{"LOWER": "apple"}
. - Pour trouver un token numérique, tu peux utiliser le marqueur
"IS_DIGIT"
. Par exemple :{"IS_DIGIT": True}
.
Après avoir créé les données pour notre corpus, nous devons les sauvegarder
dans un fichier .spacy
. Le code de l'exemple précédent est déjà fourni.
- Instancie le
DocBin
avec la liste desdocs
. - Sauve le
DocBin
dans un fichier appelétrain.spacy
.
- Tu peux initialiser le
DocBin
avec une liste de documents en les passant via l'argument nommédocs
. - La méthode
to_disk
deDocBin
prend un argument : le chemin du fichier dans lequel sauver les données binaires. N'oublie pas d'utiliser l'extension de fichier.spacy
.
Le fichier config.cfg
est la "source unique de vérité" pour entraîner un
pipeline avec spaCy. Laquelle des affirmations suivantes n'est pas vraie à
propos du fichier de configuration ?
Le fichier de configuration comprend tous les paramètres pour le processus d'entraînement, y compris les hyperparamètres.
Parce que le fichier de configuration comprend tous les paramètres et aucune valeur par défaut cachée, il peut contribuer à rendre tes expérimentations d'entraînement plus reproductibles, et d'autres pourront re-jouer tes expérimentations avec exactement les mêmes paramètres.
Le fichier de configuration comprend tous les paramètres liés à l'entraînement
et à l'établissement du pipeline, mais il n'empaquette pas ton pipeline. Pour
créer un package Python installable, tu dois utiliser la commande
spacy package
.
Le bloc [components]
du fichier de configuration comprend tous les composants
de pipeline et leurs paramètres, y compris les implémentations de modèles
utilisées.
La commande init config
auto-génère
un fichier de configuration avec les paramètres par défaut. Nous voulons
entraîner un reconnaisseur d'entités nommées, donc nous allons générer un
fichier de configuration pour un composant de pipeline, ner
. Comme nous
exécutons la commande dans un environnement Jupyter pour ce cours, nous
utilisons le préfixe !
. Si tu exécutes la commande dans ton terminal local,
tu n'as pas besoin d'inclure ce préfixe.
- Utilise la commande
init config
de spaCy pour auto-générer une configuration pour un pipeline français. - Sauve la configuration dans un fichier
config.cfg
. - Utilise l'argument
--pipeline
pour spécifier un composant de pipeline,ner
- L'argument
--lang
définit la classe de langue, par ex.fr
pour le français
Jetons un oeil à la configuration spaCy générée à l'instant ! Tu peux lancer la commande ci-dessous pour faire afficher la configuration dans le terminal et l'inspecter.
Utilisons le fichier de configuration généré dans l'exercice précédent et le corpus d'entraînement que nous avons créé pour entraîner un reconnaisseur d'entités nommées !
La commande train
te permet d'entraîner un
modèle à partir d'un fichier de configuration. Un fichier config_gadget.cfg
est déjà présent dans le répertoire exercises/fr
, ainsi qu'un fichier
train_gadget.spacy
contenant les exemples d'entraînement et un fichier
dev_gadget.spacy
contenant les exemples d'évaluation. Parce que nous
exécutons la commande dans un environnement Jupyter pour ce cours, nous
utilisons le préfixe !
. Si tu exécutes la commande dans ton terminal local,
tu n'as pas besoin d'inclure ce préfixe.
- Exécute la commande
train
avec le fichierexercises/fr/config_gadget.cfg
- Sauve le pipeline dans un répertoire
output
- Spécifie les chemins
exercises/fr/train_gadget.spacy
etexercises/fr/dev_gadget.spacy
- Le premier argument de la commande
spacy train
est le chemin vers le fichier de configuration.
Voyons comment le modèle se comporte sur des données inconnues ! Pour accélérer
un peu les choses, nous avons déjà fait tourner un modèle entraîné pour le label
"GADGET"
sur du texte. Voici certains des résultats :
Text | Entities |
---|---|
Apple ralentit l'iPhone 8 et l'iPhone X - comment arrêter ça | (iPhone 8, iPhone X) |
J'ai enfin compris à quoi servait l'encoche sur l'iPhone X | (iPhone X,) |
Tout ce que vous devez savoir à propos du Samsung Galaxy S9 | (Samsung Galaxy,) |
Vous voulez comparer les modèles d'iPad ? Voici comment se présente la gamme 2020 | (iPad,) |
L'iPhone 8 et l'iPhone 8 Plus sont des smartphones conçus, développés et vendus by Apple | (iPhone 8, iPhone 8) |
quel est l'ipad le moins cher, parmi les ipad pro ??? | (ipad, ipad) |
Les Samsung Galaxy sont une série d'appareils informatiques mobiles conçus, fabriqués et vendus par Samsung Electronics | (Samsung Galaxy,) |
Parmi toutes les entités présentes dans les textes, combien le modèle en a-t-il identifiées correctement ? Rappelle-toi que que les spans d'entités incomplets comptent aussi comme des erreurs ! Astuce : Compte le nombre d'entités que le modèle aurait dû prédire. Ensuite compte le nombre d'entités qu'il a effectivement prédites correctement et divise-le par le nombre total d'entités correctes.
Essaie de compter le nombre d'entités correctement prédites et divise-le par le nombre total d'entités correctes que le modèle aurait dû prédire.
Essaie de compter le nombre d'entités correctement prédites et divise-le par le nombre total d'entités correctes que le modèle aurait dû prédire.
Sur nos données de test, le modèle a atteint une précision de 70 %.
Essaie de compter le nombre d'entités correctement prédites et divise-le par le nombre total d'entités correctes que le modèle aurait dû prédire.
Voici un extrait d'un jeu d'entraînement qui labellise le type d'entité
DESTINATION_TOURISTIQUE
dans des évaluations de voyageurs.
doc1 = nlp("je suis allé à amsterdem l'an dernier et les canaux étaient magnifiques")
doc1.ents = [Span(doc1, 4, 5, label="DESTINATION_TOURISTIQUE")]
doc2 = nlp("Tu devrais visiter Paris au moins une fois dans ta vie, "
"mais la Tour Eiffel ce n'est pas terrible")
doc2.ents = [Span(doc2, 3, 4, label="DESTINATION_TOURISTIQUE")]
doc3 = nlp("Il y a aussi un Paris dans l'Arkansas, lol")
doc3.ents = []
doc4 = nlp("Berlin est la destination parfaite pour les vacances d'été : "
"beaucoup de parcs, une vie nocturne trépidante et de la bière pas chère !")
doc4.ents = [Span(doc4, 0, 1, label="DESTINATION_TOURISTIQUE")]
Pourquoi ces données et ce schéma d'étiquetage sont-ils problématiques ?
Il serait bien plus judicieux de labelliser uniquement avec le label "GPE"
(entité géopolitique) ou "LOCATION"
(lieu) et ensuite d'utiliser un système à
base de règles pour déterminer si l'entité est ou non une destination
touristique dans ce contexte. Par exemple, tu pourrais recouper les types
d'entités avec une base de connaissances ou les chercher dans un wiki de voyage.
Même s'il est possible que Paris, AK soit aussi une attraction touristique, cela ne fait que souligner à quel point le schéma de labellisation est subjectif et à quel point il sera difficile de décider si le label s'applique ou non. De ce fait, cette distinction sera très difficile à apprendre pour l'entity recognizer.
Même des mots très peu communs ou des mots mal orthographiés peuvent être labellisés comme entités. En fait, la capacité à prédire des catégories sur des textes mal orthographiés en se basant sur le contexte est l'un des principaux avantages des reconnaissances statistiques d'entités nommées.
- Réécris le
doc.ents
pour utiliser uniquement des spans avec le label"GPE"
(villes, états, pays) au lieu de"DESTINATION_TOURISTIQUE"
. - N'oublie pas d'ajouter les spans pour les entités
"GPE"
qui n'avaient pas été labellisées dans les anciennes données.
- Pour les spans qui sont déjà labellisés, tu as juste à changer le nom du label
de
"DESTINATION_TOURISTIQUE"
en"GPE"
. - Un texte comporte une ville et un état qui ne sont pas encore labellisés. Pour
ajouter les spans des entités, compte les tokens pour trouver où commence
et où finit le span. N'oublie pas que le dernier token est exclu. Ensuite
ajoute un nouveau
Span
àdoc.ents
. - Garde un oeil sur la tokenisation ! Affiche les tokens du
Doc
si tu n'es pas sûr.
Voici un petit échantillon d'un jeu de données créé pour entraîner un nouveau
type d'entité "SITE_WEB"
. Le jeu de données original contient quelques milliers
de phrases. Dans cet exercice, tu vas effectuer la labellisation à la main. En
situation réelle, tu l'automatiserais probablement en utilisant un outil
d'annotations - par exemple, Brat, une solution
open-source populaire, ou Prodigy, notre propre outil
d'annotations qui s'intègre avec spaCy.
- Complète les positions des tokens pour les entités
"SITE_WEB"
dans les données.
- Rappelle-toi que la position du token de fin d'un span est exclue. Donc une
entité qui commence au token 2 et qui s'arrête au token 3 aura un début à
2
et une fin à4
.
Un modèle a été entraîné avec les données que tu viens d'étiqueter, plus
quelques milliers d'autres exemples. Après l'entraînement, il fait de
l'excellent travail sur "SITE_WEB"
, mais ne reconnaît plus "PER"
. À quoi
cela pourrait-il être dû ?
Il est parfaitement possible pour un modèle d'apprendre des catégories très différentes. Par exemple, le modèle anglais pré-entraîné de spaCy est capable de reconnaître des personnes, mais aussi des organisations ou des pourcentages.
Si des entités "PER"
sont présentes dans les données d'entraînement mais
ne sont pas labellisées, le modèle va apprendre qu'elles ne doivent pas être
prédites. De même, si un type d'entité existante n'est pas présent dans les
données d'entraînement, le modèle peut les "oublier" et arrêter de les
prédire.
Si les hyperparamètres peuvent influer sur la précision d'un modèle, ils ne sont probablement pas le problème ici.
- Actualise les données d'entraînement pour inclure des annotations pour les
entités
"PER"
"PewDiePie" et "Alexis Ohanian".
- Pour ajouter d'autres entités, ajoute un autre
Span
àdoc.ents
. - Garde à l'esprit que le token de fin d'un span est exclu. Donc une entité qui
commence au token 2 et qui s'arrête au token 3 aura un début à
2
et une fin à4
.