[PYTHON] 10 méthodes pour améliorer la précision de BERT

introduction

Il est devenu courant de peaufiner et d'utiliser BERT dans les tâches de traitement du langage naturel. On pense qu'il y aura un nombre croissant de scènes dans lesquelles nous voulons améliorer autant que possible la précision lors de la réalisation de compétitions telles que Kaggle ou de projets avec des exigences de précision strictes. Par conséquent, nous résumerons les méthodes d'amélioration de la précision. Une tâche de classification est considérée comme une tâche.

Réglage du numéro de caractère

Vous pouvez saisir jusqu'à 512 mots dans le BERT appris. Par conséquent, des mesures spéciales sont nécessaires lors de l'utilisation de texte de 512 mots ou plus. Vérifiez-le car les changements dans la méthode de traitement contribuent souvent à améliorer la précision.

À titre d'exemple, pensez à obtenir 6 mots du texte suivant (avec 1 mot comme signe de ponctuation) ʻI / est / cat / et / est /. / il n'y a pas encore de nom /. ''

  1. Head-Tail ʻI / est / cat/ et / est /. / Nom / est /pas encore / pas /. ''

De [Comment affiner BERT pour la classification de texte] how_to_bert. Obtenez des mots du début et de la fin. La figure ci-dessus montre comment utiliser les 3 premiers mots et les 3 derniers mots. C'est une méthode facile à mettre en œuvre, très performante et souvent utilisée dans Kaggle. Le nombre de mots à prendre avant et après est au cas par cas.

  1. Random Je / est / chat / et / est /. / Nom / est / pas encore /. I / is / cat / et / ʻis /. / Nom / est / pas encore / pas `/.

Obtenez des mots en succession de n'importe où. Vous pouvez vous attendre à un effet comme Augmentation en changeant l'emplacement d'acquisition pour chaque Epoque. Cependant, elle ne semble pas aussi précise que la méthode Head-Tail. Que diriez-vous de le combiner avec TTA (Test Time Augmentation)?

  1. Sliding Window ʻI / est / cat / et / est /. / Nom / est / pas encore / pas /. Je / est / cat / de / est /. / Nom / est / Pas encore / Pas /. Je / est / cat / et / est /. / nom / est / pas encore / pas /. ''

Il s'agit d'une technique souvent utilisée dans l'ensemble de données de questions naturelles de Google, comme A BERT Baseline for the Natural Questions. La figure ci-dessus montre le cas où les mots sont décalés de 3 mots. Sa force est de pouvoir couvrir complètement les données. L'inconvénient est que si les données contiennent un grand nombre de mots, les données d'apprentissage seront trop volumineuses. Il est utilisé lorsqu'il est important d'utiliser tous les mots dans les tâches d'assurance qualité, etc., mais il peut également contribuer à améliorer la précision des tâches de classification.

Méta-informations supplémentaires

Pensez à saisir une question et une réponse et un titre tel que:

Titre: À propos du président Trump Question: D'où vient le président Trump? Réponse: New York.

4. Ajouter un séparateur

«[CLS] À propos du président Trump [NEW_SEP] D'où vient le président Trump? [SEP] New York. [SEP.] `

De Google QUEST Q & A Labelling 19th solution. S'il y a deux phrases dans BERT, vous pouvez les séparer avec la balise [SEP], mais elle ne supporte pas plus de phrases. Par conséquent, en définissant un jeton avec un nom approprié et en l'utilisant comme séparateur, tel que [NEW_SEP], vous pouvez exprimer des sauts de phrase. De tels jetons peuvent être ajoutés en utilisant tokenizer.add_special_tokens. De plus, dans le cas de la version anglaise de BERT, il y a des jetons inutilisés de [non utilisé0] à [non utilisé993], donc vous pouvez également l'utiliser.

5. Ajouter des informations sur la catégorie

«[CLS] [CATEGORY_0] Où est le lieu de naissance du président Trump? [SEP] New York. [SEP.] `

Jigsaw Unintended Bias in Toxicity Classification 1ST PLACE SOLUTION etc. Disons que vous résolvez la tâche de déterminer si la phrase ci-dessus est une bonne paire question-réponse. Les journaux de questions et réponses sont souvent catégorisés, vous pouvez donc les ajouter à la quantité de fonctionnalités. Dans ce cas, vous pouvez améliorer la précision en définissant de nouveaux jetons «[CATEGORY_0] à [CATEGORY_n]» (n est le nombre de catégories) et en les incorporant dans le texte comme décrit ci-dessus.

Il est également efficace d'effectuer la catégorisation en tant que sous-tâche en utilisant le vecteur [CATEGORY_0] comme quantité de caractéristiques.

Construction de modèles

Le modèle régulier de BERT se compose de 12 couches de sous-modules. Lors du réglage fin de BERT, l'implémentation par défaut est de présenter le vecteur au début [CLS] de la sortie de la dernière couche. C'est souvent suffisant pour la précision, mais vous pouvez vous attendre à une légère amélioration de la précision en utilisant d'autres quantités de caractéristiques.

6. Utilisez 4 couches de la dernière couche

last_4_layers.png De [Comment affiner BERT pour la classification de texte] how_to_bert. Nous visons à améliorer la précision de la tâche de réglage fin en combinant les quatre vecteurs «[CLS]» du bas des 12 couches. Le vecteur est finalement transformé en un vecteur de 768 dimensions (tenseur du premier ordre) en utilisant le pooling moyen, le pooling max, le concat, etc.

  1. Learnable Weighted Sum weighted_sum.png À partir de Google QUEST Q & A Labelling 1st place solution. Définissez les poids entraînables dans le modèle et calculez la somme pondérée des vecteurs «[CLS]» de toutes les couches BERT. Le simple fait de faire la moyenne de toutes les couches est une technique puissante, mais c'est un développement ultérieur de celle-ci.

8. Ajouter une couche CNN

bert_with_cnn.png Identifier les trolls russes sur Reddit avec Deep Learning et BERT Word Embeddings. Entrer le vecteur de tous les mots dans le CNN, pas seulement le vecteur de [CLS], est l'une des méthodes les plus puissantes. Calculez la convolution unidimensionnelle pour jusqu'à 512 longueurs de séquence, comme indiqué. Après avoir calculé la convolution, le pooling max ou le pooling moyen peuvent extraire les entités avec le nombre de dimensions et le nombre de filtres, alors entrez-les dans Dense. Comparé à Attention, CNN peut regrouper les caractéristiques des mots environnants, vous pouvez donc améliorer la précision en les combinant. Il est également efficace de se combiner avec LSTM ainsi qu'avec CNN.

Apprentissage

9. Correction du poids du BERT

model_params = list(model.named_parameters())

#Correction du poids du BERT
params = [p for n, p in model_params if not "bert" in n]
optimizer = AdamW(params , lr=2e-5)

#Relâchez la fixation du poids de BERT
params = [p for n, p in model_params if "bert" in n]
optimizer.add_param_group({'params': params })

De Google QUEST Q & A Labelling 19th solution. Semblable aux modèles formés basés sur des images, BERT peut améliorer la précision en fixant les poids et en entraînant uniquement les couches dépendant des tâches. Dans la 19e solution, seule la première époque est fixée et toutes les couches sont apprises plus tard. Ci-dessus, nous avons décrit le code qui corrige le poids BERT et commence l'apprentissage, et le code qui peut être utilisé pour libérer la correction du milieu et redémarrer l'apprentissage.

10. Changer le taux d'apprentissage de BERT et d'autres couches

model_params = list(model.named_parameters())

bert_params = [p for n, p in model_params if "bert" in n]
other_params = [p for n, p in model_params if not "bert" in n]

params = [
    {'params': bert_params, 'lr': params.lr},
    {'params': other_params, 'lr': params.lr * 500}
]

À partir de Google QUEST Q & A Labelling 1st place solution. L'adoption de différents taux d'apprentissage est aussi efficace que le modèle entraîné du système d'image. Dans la première solution, les couches spécifiques aux tâches sont apprises à un taux d'apprentissage 500 fois plus élevé que d'habitude. Le code à ce moment-là est indiqué ci-dessus.

en conclusion

Nous avons introduit des techniques qui peuvent améliorer la précision des tâches de classification BERT. Cependant, je ne pouvais pas montrer à quel point la précision s'améliorerait, alors j'aimerais la comparer avec un ensemble de données approprié. En plus des méthodes énumérées ci-dessus, il existe encore d'autres méthodes pour améliorer la précision, nous allons donc continuer à enquêter.

Recommended Posts

10 méthodes pour améliorer la précision de BERT
Essayez d'améliorer la précision de l'estimation du nombre de Twitter
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
Supplément à l'explication de vscode
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
L'histoire d'essayer de reconnecter le client
Script pour changer la description de fasta
Comment vérifier la version de Django
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
L'histoire du changement de pep8 en pycodestyle
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Introduction
J'ai mesuré 6 méthodes pour obtenir l'indice de la valeur maximale (valeur minimale) de la liste
J'ai essayé de comparer la précision de la classification des phrases BERT japonaises et japonaises Distil BERT avec PyTorch et introduction de la technique d'amélioration de la précision BERT
Comment calculer la volatilité d'une marque
Comment trouver la zone du diagramme de Boronoi
À propos de la précision de la méthode de calcul du rapport de circonférence d'Archimède
Paramètre pour afficher le journal de l'exécution de cron
L'inexactitude de Tensorflow était due à log (0)
Organiser la signification des méthodes, des classes et des objets
J'ai essayé de corriger la forme trapézoïdale de l'image
Modifiez le point décimal de la journalisation de, à.
Envisagez d'améliorer la précision de la détection des anomalies VAE
Je souhaite personnaliser l'apparence de zabbix
De l'introduction de pyethapp à l'exécution du contrat
Essayez de simuler le mouvement du système solaire
Histoire de passer de Pipenv à la poésie
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
Tout en conservant la structure du modèle de classification d'image (mnist), attachez un auto-encodeur pour améliorer la précision de bout en bout. [tensorflow, keras, mnist, autoencder]
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Partie 1 Régression polynomiale
[Explication de la mise en œuvre] Comment utiliser la version japonaise de BERT dans Google Colaboratory (PyTorch)
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Modèle de script python pour lire le contenu du fichier
Comment obtenir le nombre de chiffres en Python
Un mémo pour comprendre visuellement l'axe des pandas.
Je veux grep le résultat de l'exécution de strace
J'ai essayé de résumer la forme de base de GPLVM
Ajoutez des informations au bas de la figure avec Matplotlib
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (Chapitre 1)
La décision de scikit-learn Comment visualiser un modèle en bois
[python] option pour désactiver la sortie de click.progressbar
Essayez d'estimer le nombre de likes sur Twitter
Je veux bien comprendre les bases de Bokeh
Reliez la souris au gyroscope du Nintendo Switch Procon
Essayez d'obtenir le contenu de Word avec Golang
Étapes pour calculer la probabilité d'une distribution normale
[Blender] Comment définir dynamiquement les sélections EnumProperty
J'ai essayé de visualiser les informations spacha de VTuber
Définissez la colonne spécifiée de QTableWidget sur ReadOnly StyledItemDelegate
J'ai essayé d'effacer la partie négative de Meros
[Python] Résumé de la façon de spécifier la couleur de la figure
Comment frapper le document de Magic Function (Line Magic)
Comment accéder à la variable globale du module importé
14 quiz pour comprendre la portée étonnamment compliquée de Python