Intelligence artificielle

Un guide simple sur l’utilisation de BERT pour la classification de texte.

Un guide simple sur l’utilisation de BERT pour la classification de texte.


Le guide de A à Z expliquant comment utiliser le BERT de Google pour les tâches de classification de texte binaire. Je vais essayer d’expliquer, le plus simplement et le plus simplement possible, comment ajuster un modèle BERT (avec PyTorch) et l’utiliser pour une tâche de classification de texte binaire.

Un guide simple sur l’utilisation de BERT pour la classification de texte - Un guide simple sur l’utilisation de BERT pour la classification de texte.

Parlons de ce que nous allons faire (et ne pas faire).

Tout d’abord, permettez-moi de vous indiquer le github repo contenant tout le code utilisé dans ce guide. Tout ce qui est dans le repo est inclus dans le guide ici, et vice versa. N'hésitez pas à vous y référer à tout moment, ou à cloner le référentiel à suivre avec le guide.

Si vos errements sur Internet vous ont mené ici, je suppose que vous pouvez supposer que vous avez entendu parler de BERT, le nouveau modèle de représentation linguistique puissant, proposé par Google vers la fin de 2018. Si vous ne l'avez pas encore fait, ou comme un recyclage, je recommande de lire leur papier car je n’entrerai pas dans les détails techniques du fonctionnement de BERT. Si vous n'êtes pas familier avec le modèle Transformer (ou si des mots comme «attention», «imbrication» et «encodeur-décodeur» vous paraissent effrayants), consultez cette page. brillant article de Jay Alammar. Vous n'avez pas nécessairement besoin de tout savoir sur BERT (ou Transformers) pour suivre la suite de ce guide, mais les liens ci-dessus devraient vous aider si vous souhaitez en savoir plus sur BERT et Transformers.

Maintenant que nous avons ce que nous avons habitude à faire, creusons dans ce que nous volonté faisons-nous?

  • Obtenir BERT téléchargé et mis en place. Nous utiliserons la version PyTorch fournie par les gens extraordinaires de Hugging Face.
  • Conversion d’un jeu de données dans le fichier.CSV format à la.tsv format que BERT connaît et aime.
  • Chargement du .tsv fichiers dans un cahier et convertir les représentations textuelles en une représentation fonctionnelle (penser numérique) avec laquelle le modèle BERT peut fonctionner.
  • Mise en place d’un modèle BERT pré-entraîné pour un réglage précis.
  • Ajuster un modèle BERT.
  • Évaluation des performances du modèle BERT.

Une dernière chose avant de creuser: j’utiliserai trois ordinateurs portables Jupyter Notebooks pour la préparation, l’entraînement et l’évaluation des données. Ce n’est pas strictement nécessaire, mais il nous a semblé plus propre de séparer ces trois processus.

Il est temps de lancer BERT.

  1. Créez un environnement virtuel avec les packages requis. Vous pouvez utiliser n’importe quel gestionnaire de paquet / environnement, mais j'utiliserai Conda. créer des pandas pytorch python tqdm conda installer -c anaconda scikit-learn (Remarque: si vous rencontrez une erreur de paquet manquant en suivant le guide, installez-les à l’aide de votre gestionnaire de paquets. Une recherche google devrait vous indiquer comment installer un paquet spécifique.)
  2. Installez la version PyTorch de BERT de Hugging Face. pip installer pytorch-pretrained-bert
  3. Pour faire la classification de texte, nous aurons évidemment besoin d’un jeu de données de classification de texte. Pour ce guide, je vais utiliser le jeu de données Yelp Reviews Polarity que vous trouverez ici sur fast.ai. (Lien de téléchargement direct pour les ânes paresseux, je veux dire les gens occupés.)  Décompressez le fichier téléchargé et obtenez le train.csv, et test.csv des dossiers. Pour référence, le chemin de ma train.csv le fichier est /data/train.csv

Avant de pouvoir cuisiner le repas, nous devons préparer les ingrédients! (Ou quelque chose comme ça. )

La plupart des jeux de données que vous trouverez viendront généralement dans CSV format et le jeu de données Yelp Reviews ne fait pas exception. Chargez-le avec des pandas et jetez un coup d’œil.

Comme vous pouvez le voir, les données sont dans les deux CSV des dossiers train.csv et test.csv. Ils ne contiennent aucun en-tête et deux colonnes pour l'étiquette et le texte. Les étiquettes utilisées ici me semblent un peu bizarres, car elles ont utilisé 1 et 2 au lieu des 0 et 1. En général, une étiquette de 1 signifie que la critique est mauvaise et une étiquette de 2 signifie que la critique est bonne. Je vais passer à l’étiquette plus familière 0 et 1, où une étiquette 0 indique une mauvaise évaluation et une étiquette 1, une bonne évaluation.

Bien mieux, ai-je raison?

Le BERT souhaite toutefois que les données se trouvent dans une tsv fichier avec un format spécifique comme indiqué ci-dessous (quatre colonnes et aucune ligne d’en-tête).

  • Colonne 0: un identifiant pour la ligne
  • Colonne 1: Le libellé de la ligne (devrait être un int)
  • Colonne 2: Une colonne de la même lettre pour toutes les lignes. BERT veut cela, alors nous allons le donner, mais nous n’avons aucune utilité.
  • Colonne 3: Le texte de la ligne

Faisons en sorte que les choses soient un peu favorables au BERT.

Pour plus de commodité, j'ai nommé les données de test en tant que données de développement. La commodité découle du fait que BERT est livré avec des classes de chargement de données qui attendent train et dev fichiers dans le format ci-dessus. Nous pouvons utiliser les données de train pour former notre modèle et les données de développement pour évaluer ses performances. Les classes de chargement de données de BERT peuvent également utiliser un tester déposer mais il attend la tester fichier à ne pas étiqueter. Par conséquent, je vais utiliser les fichiers train et dev à la place.

Maintenant que nous avons les données sous la forme correcte, tout ce que nous avons à faire est de sauvegarder le train et dev données comme .tsv des dossiers.

Voilà les œufs battus, le poulet décongelé et les légumes coupés en tranches. Faisons la cuisine!

La dernière étape avant le réglage fin consiste à convertir les données en fonctionnalités utilisées par BERT. La plupart du code restant a été adapté de l'exemple HuggingFace run_classifier.py, trouvé ici.

Maintenant, nous allons voir la raison pour laquelle nous réorganisons les données dans le .tsv format dans la section précédente. Cela nous permet de réutiliser facilement les exemples de classes fournis avec BERT pour notre propre tâche de classification binaire. Voici à quoi ils ressemblent.

La première classe, InputExample, est le format dans lequel un seul exemple de notre jeu de données devrait être. Nous n’utiliserons pas le text_b attribut puisque ce n’est pas nécessaire pour notre tâche de classification binaire. Les autres attributs devraient être assez explicites.

Les deux autres classes, Processeur de données et BinaryClassificationProcessor, sont des classes d'assistance qui peuvent être utilisées pour lire .tsv fichiers et les préparer à être convertis en fonctionnalités qui seront finalement introduits dans le modèle BERT actuel.

le BinaryClassificationProcessor la classe peut lire dans le train.tsv et dev.tsv fichiers et les convertir en listes de InputExample objets.

Jusqu'à présent, nous avons la capacité de lire tsv ensembles de données et les convertir en InputExample objets. BERT, en tant que réseau de neurones, ne peut pas traiter directement le texte comme nous le faisons dans InputExample objets. La prochaine étape consiste à les convertir en InputFeatures.

BERT a une contrainte sur la longueur maximale d'une séquence après la création de jetons. Pour tout modèle BERT, la longueur de séquence maximale après création de jetons est de 512. Nous pouvons toutefois définir une longueur de séquence égale ou inférieure à cette valeur. Pour un entraînement plus rapide, j’utiliserai 128 comme longueur maximale de séquence. Un nombre plus grand peut donner de meilleurs résultats s'il existe des séquences plus longues que cette valeur.

Un InputFeature se compose de données purement numériques (avec les longueurs de séquence appropriées) qui peuvent ensuite être introduites dans le modèle BERT. Ceci est préparé en marquant le texte de chaque exemple et en tronquant la séquence la plus longue tout en ajoutant les séquences les plus courtes à la longueur de séquence maximale donnée (128). J'ai trouvé la conversion de InputExample objets à InputFeature les objets sont assez lents par défaut, alors j’ai modifié le code de conversion pour utiliser le multitraitement bibliothèque de Python pour accélérer considérablement le processus.

Nous verrons comment utiliser ces méthodes dans quelques instants.

(Remarque: je passe au cahier de formation.)

Commençons par importer tous les paquets dont nous aurons besoin, puis redressons nos chemins.

Dans la première cellule, nous importons les packages nécessaires. Dans la cellule suivante, nous définissons des chemins pour l'emplacement où les fichiers doivent être stockés et où certains fichiers peuvent être trouvés. Nous définissons également certaines options de configuration pour le modèle BERT. Enfin, nous créerons les répertoires s’ils n’existent pas déjà.

Ensuite, nous allons utiliser notre BinaryClassificationProcessor pour charger les données et tout préparer pour l’étape de la tokenisation.

Ici, nous créons notre BinaryClassificationProcessor et l'utiliser pour charger dans les exemples de train. Ensuite, nous définissons des variables que nous utiliserons lors de la formation du modèle. Nous chargeons ensuite le tokenizer pré-entraîné par BERT. Dans ce cas, nous utiliserons le bert-base-cased modèle.

le convert_example_to_feature la fonction attend un tuple contenant un exemple, la mappe d'étiquettes, la longueur de séquence maximale, un tokenizer et le mode de sortie. Enfin, nous allons créer une liste d’exemples prête à être traitée (en jetons, tronquée / complétée et transformée en InputFeatures) par le convert_example_to_feature une fonction.

Maintenant, nous pouvons utiliser la qualité multicœur des processeurs modernes pour traiter (relativement) rapidement les exemples. Mon Ryzen 7 2700x a pris environ une heure et demie pour cette partie.

Votre cahier doit montrer l’avancement du traitement plutôt que le «HBox» que j’ai ici. C’est un problème lié au téléchargement du cahier sur Gist.

(Remarque: si vous rencontrez des problèmes pour faire fonctionner le multitraitement, il vous suffit de copier-coller tout le code, y compris le multitraitement, dans un script python et de l'exécuter à partir de la ligne de commande ou d'un IDE. Jupyter Notebooks peut parfois obtenir un peu J'ai inclus un exemple de script sur github nommé convertisseur.py)

Une fois que tous les exemples sont convertis en fonctionnalités, nous pouvons les conserver sur disque pour les conserver (pour ma part, ne pas vouloir exécuter le traitement pendant une heure et demie supplémentaire). La prochaine fois, vous pouvez simplement désélectionner le fichier pour obtenir la liste des fonctionnalités.

Eh bien, c'était un lot de préparation des données. Vous méritez un café, je vous reverrai dans un instant. (Sauf si vous avez déjà pris votre café pendant le traitement. Dans ce cas, bravo à l'efficacité!)

Avait votre café? Impatient d'y aller? Montrons à BERT comment ça se passe! (Fine tune. Montrez comment cela s’est passé. Comprenez-le? Je suis peut-être mauvais en calembour.)

Il ne reste plus grand-chose à présent, espérons pour une navigation en douceur. (Ou en douceur… en cuisine? J'ai oublié mon analogie quelque part en cours. Quoi qu'il en soit, nous avons maintenant tous les ingrédients dans la casserole et tout ce que nous avons à faire, c'est d'allumer le feu et de laisser la thermodynamique fonctionner de manière magique.)

L’implémentation de BERT par HuggingFace est livrée avec une fonction qui télécharge automatiquement le modèle BERT pour nous (ai-je déjà dit que j’adore ces mecs?). J’ai arrêté mon téléchargement depuis que je suis affreux sur Internet, mais cela ne devrait pas tarder. Il ne s’agit que de 400 Mo au total pour les modèles de base. Attendez que le téléchargement soit terminé et vous êtes prêt à partir.

Ne paniquez pas si vous voyez la sortie suivante une fois le modèle téléchargé, je sais que la panique s’annonce, mais c’est le comportement attendu. le non initialisé les choses ne sont pas destinées à être initialisées. Intentionnellement.

INFO: pytorch_pretrained_bert.modeling: Poids de BertForSequenceClassification non initialisés à partir du modèle pré-entraîné: ['classifier.weight', 'classifier.bias']
INFO: pytorch_pretrained_bert.modeling: poids du modèle prétraité non utilisés dans BertForSequenceClassification: ['cls.predictions.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight', 'cls.seq_relationship.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.LayerNorm.bias']

(Astuce: le modèle sera téléchargé dans un dossier temporaire. Recherchez le dossier en suivant le chemin imprimé sur la sortie une fois le téléchargement terminé et copiez le fichier téléchargé dans le dossier. cache / annuaire. Le fichier doit être un fichier compressé dans .tar.gz format. La prochaine fois, vous pourrez simplement utiliser ce fichier téléchargé sans avoir à le télécharger à nouveau. Tout ce que vous avez à faire est de commenter la ligne qui a téléchargé le modèle et de la commenter en dessous.)

Nous avons juste besoin de faire un peu plus de configuration pour la formation. Ici, j’utilise simplement les paramètres par défaut.

Configuration de notre DataLoader pour la formation ..

Temps de formation!

Maintenant que nous avons formé le modèle BERT pour une époque, nous pouvons évaluer les résultats. Bien sûr, plus de formation donnera probablement de meilleurs résultats, mais même une époque devrait suffire à la validation du concept (j'espère!).

Afin de pouvoir charger facilement notre modèle optimisé, nous devons l’enregistrer d’une manière spécifique, c’est-à-dire de la même manière que les modèles BERT par défaut. Voici comment vous pouvez le faire.

  • Aller dans le sorties / jappement répertoire où les modèles ajustés seront sauvegardés. Là, vous devriez trouver 3 fichiers; config.json, pytorch_model.bin, vocab.txt.
  • Archiver les deux fichiers (j'utilise 7zip pour l'archivage) config.json, et pytorch_model.bin dans une .le goudron fichier.
  • Compresser le .le goudron déposer dans gzip format. Maintenant, le fichier devrait être quelque chose comme yelp.tar.gz
  • Copiez le fichier compressé dans le cache / annuaire.

Nous chargerons ce modèle ajusté à l'étape suivante.

Il est temps de voir ce que notre modèle élaboré peut faire. (Nous avons préparé le repas, voyons quel est son goût.)

(Remarque: je passe au cahier d’évaluation)

La plupart du code d’évaluation est très similaire au processus de formation. Je n’entrerai donc pas dans les détails, mais je vais énumérer quelques points importants.

  • Le paramètre BERT_MODEL doit être le nom de votre modèle ajusté. Par exemple, yelp.tar.gz.
  • Le tokenizer doit être chargé à partir du fichier de vocabulaire créé lors de la phase d'apprentissage. Dans mon cas, ce serait sorties / yelp / vocab.txt (ou le chemin peut être défini comme OUTPUT_DIR + vocab.txt )
  • Cette fois, nous utiliserons le BinaryClassificationProcessor charger dans le dev.tsv fichier en appelant le get_dev_examples méthode.
  • Revérifiez pour vous assurer que vous chargez le modèle ajusté et non le modèle BERT d'origine. 😅

Voici mon cahier pour l'évaluation.

Avec une seule époque de formation, notre modèle BERT atteint un coefficient de corrélation de Matthews de 0,914 (bonne mesure pour évaluer des jeux de données non équilibrés. Cliquez ici pour accéder à la doc. Sklearn). Avec plus de formation, et peut-être quelques ajustements d'hyperparamètre, nous pouvons certainement certainement améliorer ce score déjà impressionnant.

BERT est un modèle de représentation linguistique incroyablement puissant, très prometteur dans de nombreuses tâches de la PNL. Ici, j’ai essayé de vous donner un guide de base sur la façon dont vous pourriez l’utiliser pour la classification de texte binaire.

Comme le montrent les résultats, BERT est un outil très efficace pour la classification de texte binaire, sans parler de toutes les autres tâches pour lesquelles il a déjà été utilisé.

Github repo avec tout le code peut être trouvé ici.

Note de bas de page: Ceci est ma première tentative d’élaboration d’un article sur Medium. Tous les commentaires sont grandement appréciés!

Show More

SupportIvy

SupportIvy.com : Un lieu pour partager le savoir et mieux comprendre le monde. Meilleure plate-forme de support gratuit pour vous, Documentation &Tutoriels par les experts.

Related Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Close
Close