[PYTHON] 10 Methoden zur Verbesserung der Genauigkeit von BERT

Einführung

Es ist üblich geworden, BERT bei der Verarbeitung natürlicher Sprache zu optimieren und zu verwenden. Es wird davon ausgegangen, dass es immer mehr Szenen geben wird, in denen wir die Genauigkeit bei Wettbewerben wie Kaggle oder Projekten mit strengen Genauigkeitsanforderungen so weit wie möglich verbessern möchten. Daher werden wir die Methoden zur Verbesserung der Genauigkeit zusammenfassen. Eine Klassifizierungsaufgabe wird als Aufgabe angenommen.

Einstellung der Zeichennummer

Sie können bis zu 512 Wörter in das gelernte BERT eingeben. Daher sind besondere Maßnahmen erforderlich, wenn Text mit 512 Wörtern oder mehr verwendet wird. Probieren Sie es aus, da Änderungen in der Verarbeitungsmethode hier häufig zur Verbesserung der Genauigkeit beitragen.

Betrachten Sie als Beispiel 6 Wörter aus dem folgenden Text (mit 1 Wort als Satzzeichen). `Ich / ist / Katze / und / ist /. / Es gibt noch keinen Namen /. ``

  1. Head-Tail I / is / cat / und / is /. / Name / ist / `noch nicht / nicht /. ``

Von [So optimieren Sie BERT für die Textklassifizierung] how_to_bert. Holen Sie sich Wörter von Anfang bis Ende. Die obige Abbildung zeigt, wie die ersten 3 Wörter und die letzten 3 Wörter verwendet werden. Es ist eine Methode, die einfach zu implementieren ist, eine hohe Leistung aufweist und häufig in Kaggle verwendet wird. Wie viele Wörter vorher und nachher genommen werden sollten, ist von Fall zu Fall.

  1. Random Ich / ist / Katze / und / ist /. / Name / ist / noch nicht /. Ich / ist / Katze / und / ist /. / Name / ist / noch nicht / nicht /.

Holen Sie sich Wörter nacheinander von überall. Wenn Sie den Erfassungsort für jede Epoche ändern, können Sie einen Effekt wie Augmentation erwarten. Es scheint jedoch nicht so genau zu sein wie die Head-Tail-Methode. Wie wäre es mit einer Kombination mit TTA (Test Time Augmentation)?

  1. Sliding Window Ich / ist / Katze / und / ist /. / Name / ist / noch nicht / nicht /. Ich / ist / Katze / de / ist /. / Name / ist / noch nicht / nicht /. Ich / ist / Katze / und / ist /. `/ name / ist / noch nicht / nicht /. ``

Dies ist eine Technik, die häufig in Googles Datensatz für natürliche Fragen verwendet wird, z. B. Eine BERT-Basis für die natürlichen Fragen. Die obige Abbildung zeigt den Fall, in dem die Wörter um 3 Wörter verschoben sind. Seine Stärke ist, dass es die Daten vollständig abdecken kann. Der Nachteil ist, dass die Trainingsdaten zu groß sind, wenn die Daten eine große Anzahl von Wörtern enthalten. Es wird verwendet, wenn es wichtig ist, alle Wörter in QS-Aufgaben usw. zu verwenden, kann aber auch zur Verbesserung der Genauigkeit von Klassifizierungsaufgaben beitragen.

Zusätzliche Metainformationen

Geben Sie eine Frage, eine Antwort und einen Titel ein, z.

Titel: Über Präsident Trump Frage: Woher kommt Präsident Trump? Antwort: New York.

4. Trennzeichen hinzufügen

[CLS] Über Präsident Trump [NEW_SEP] Woher kommt Präsident Trump? [SEP] New York. [SEP]

Aus Google QUEST Q & A Labeling 19. Lösung. Wenn BERT zwei Sätze enthält, ist es in Ordnung, sie mit dem Tag [SEP] zu trennen, es werden jedoch keine weiteren Sätze unterstützt. Indem Sie ein Token mit einem geeigneten Namen definieren und als Trennzeichen verwenden, z. B. "[NEW_SEP]", können Sie Satzumbrüche ausdrücken. Solche Token können mit "tokenizer.add_special_tokens" hinzugefügt werden. Im Fall der englischen Version von BERT gibt es auch nicht verwendete Token von "[unused0] bis [unused993]", sodass Sie diese auch verwenden können.

5. Fügen Sie Kategoriedaten hinzu

[CLS] [CATEGORY_0] Wo ist Präsident Trumps Geburtsort? [SEP] New York. [SEP]

Jigsaw Unintended Bias in der Toxizitätsklassifizierung 1. PLATZLÖSUNG usw. Angenommen, Sie lösen die Aufgabe, festzustellen, ob der obige Satz ein geeignetes Frage-Antwort-Paar ist. Frage- und Antwortprotokolle werden häufig kategorisiert, sodass Sie sie möglicherweise zur Funktionsmenge hinzufügen möchten. In diesem Fall können Sie die Genauigkeit verbessern, indem Sie neue Token "[CATEGORY_0] bis [CATEGORY_n]" definieren (n ist die Anzahl der Kategorien) und diese wie oben beschrieben in den Text integrieren.

Es ist auch effektiv, eine Kategorisierung als Unteraufgabe unter Verwendung des Vektors "[CATEGORY_0]" als Merkmalsgröße durchzuführen.

Modellbau

6. Verwenden Sie 4 Schichten aus der letzten Schicht

last_4_layers.png Von [So optimieren Sie BERT für die Textklassifizierung] how_to_bert. Wir wollen die Genauigkeit der Feinabstimmungsaufgabe verbessern, indem wir die vier "[CLS]" - Vektoren vom Boden der 12 Schichten kombinieren. Der Vektor wird schließlich unter Verwendung von durchschnittlichem Pooling, maximalem Pooling, Concat usw. in einen 768-dimensionalen Vektor (Tensor erster Ordnung) umgewandelt.

  1. Learnable Weighted Sum weighted_sum.png Aus Google QUEST Q & A Labeling 1. Platz Lösung. Stellen Sie die trainierbaren Gewichte im Modell ein und berechnen Sie die gewichtete Summe der [CLS] -Vektoren aller BERT-Ebenen. Das einfache Mitteln aller Schichten ist eine leistungsstarke Technik, die jedoch weiterentwickelt wird.

8. Fügen Sie die CNN-Ebene hinzu

bert_with_cnn.png Identifizierung russischer Trolle auf Reddit mit Deep Learning und BERT Word Embeddings. Die Eingabe des Vektors aller Wörter in das CNN, nicht nur des Vektors von "[CLS]", ist eine der leistungsstarken Methoden. Berechnen Sie die eindimensionale Faltung für bis zu 512 Sequenzlängen wie gezeigt. Nach der Berechnung der Faltung können durch maximales Pooling oder durchschnittliches Pooling die Features mit der Anzahl der Dimensionen und der Anzahl der Filter extrahiert werden. Geben Sie sie daher in Dense ein. Im Vergleich zu Attention kann CNN die Eigenschaften der umgebenden Wörter aggregieren, sodass Sie die Genauigkeit verbessern können, indem Sie sie kombinieren. Es ist auch effektiv, mit LSTM sowie CNN zu kombinieren.

Lernen

9. BERT-Gewicht fixieren

model_params = list(model.named_parameters())

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

#Lösen Sie die Gewichtsfixierung von BERT
params = [p for n, p in model_params if "bert" in n]
optimizer.add_param_group({'params': params })

Aus Google QUEST Q & A Labeling 19. Lösung. Ähnlich wie bei bildbasierten trainierten Modellen kann BERT die Genauigkeit verbessern, indem Gewichte festgelegt und nur aufgabenabhängige Ebenen trainiert werden. In der 19. Lösung ist nur die erste Epoche festgelegt und alle Schichten werden später gelernt. Oben haben wir den Code beschrieben, der das BERT-Gewicht festlegt und mit dem Lernen beginnt, sowie den Code, mit dem die Korrektur von der Mitte gelöst und das Lernen neu gestartet werden kann.

10. Ändern Sie die Lernrate von BERT und anderen Ebenen

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}
]

Aus Google QUEST Q & A Labeling 1. Platz Lösung. Die Übernahme unterschiedlicher Lernraten ist genauso effektiv wie das trainierte Modell des Bildsystems. Bei der Lösung für den ersten Platz werden aufgabenspezifische Ebenen mit einer Lernrate gelernt, die 500-mal höher ist als üblich. Der Code zu diesem Zeitpunkt ist oben gezeigt.

abschließend

Wir haben Techniken eingeführt, die die Genauigkeit bei BERT-Klassifizierungsaufgaben verbessern können. Ich konnte jedoch nicht zeigen, um wie viel sich die Genauigkeit verbessern würde, daher möchte ich sie mit einem geeigneten Datensatz vergleichen. Zusätzlich zu den oben aufgeführten Methoden gibt es noch weitere Methoden zur Verbesserung der Genauigkeit, daher werden wir weiter untersuchen.

Recommended Posts

10 Methoden zur Verbesserung der Genauigkeit von BERT
Versuchen Sie, die Genauigkeit der Twitter-ähnlichen Zahlenschätzung zu verbessern
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Ergänzung zur Erklärung von vscode
Verbesserung der Wiederverwendbarkeit und Wartbarkeit von mit Luigi erstellten Workflows
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Die Geschichte des Versuchs, den Client wieder zu verbinden
Skript zum Ändern der Beschreibung von Fasta
So überprüfen Sie die Version von Django
Die Geschichte, MeCab in Ubuntu 16.04 zu setzen
Die Geschichte von pep8 wechselt zu pycodestyle
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
Ich habe 6 Methoden gemessen, um den Index des Maximalwerts (Minimalwerts) der Liste zu erhalten
Ich habe versucht, die Genauigkeit der japanischen BERT- und der japanischen Distil-BERT-Satzklassifizierung mit PyTorch & Einführung der BERT-Technik zur Verbesserung der Genauigkeit zu vergleichen
So berechnen Sie die Volatilität einer Marke
So finden Sie den Bereich des Boronoi-Diagramms
Informationen zur Genauigkeit der Berechnungsmethode für das Umfangsverhältnis von Archimedes
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Die Ungenauigkeit von Tensorflow war auf log (0) zurückzuführen.
Organisieren Sie die Bedeutung von Methoden, Klassen und Objekten
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ändern Sie den Dezimalpunkt der Protokollierung von, nach.
Erwägen Sie, die Genauigkeit der Erkennung von VAE-Anomalien zu verbessern
Ich möchte das Erscheinungsbild von zabbix anpassen
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
Versuchen Sie, die Bewegung des Sonnensystems zu simulieren
Die Geschichte vom Umzug von Pipenv zur Poesie
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Fügen Sie unter Beibehaltung der Modellstruktur der Bildklassifizierung (mnist) einen Autoencoder hinzu, um die Genauigkeit von Ende zu Ende zu verbessern. [Tensorflow, Keras, Mnist, Autoencder]
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Teil 1 Polynomregression
[Erklärung zur Implementierung] Verwendung der japanischen Version von BERT in Google Colaboratory (PyTorch)
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
So ermitteln Sie die Anzahl der Stellen in Python
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Ich möchte das Ausführungsergebnis von strace erfassen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Fügen Sie mit Matplotlib Informationen am unteren Rand der Abbildung hinzu
Versuchen Sie, die Probleme des "Matrix-Programmierers" zu lösen (Kapitel 1).
Die Entscheidung von scikit-learn Wie man ein Holzmodell visualisiert
Option [Python] zum Deaktivieren der Ausgabe von click.progressbar
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Verbinden Sie die Maus mit dem Kreisel des Nintendo Switch Procon
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Schritte zur Berechnung der Wahrscheinlichkeit einer Normalverteilung
[Blender] So legen Sie die Auswahlelemente von EnumProperty dynamisch fest
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Setzen Sie die angegebene Spalte von QTableWidget auf ReadOnly StyledItemDelegate
Ich habe versucht, den negativen Teil von Meros zu löschen
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
Wie man das Dokument der magischen Funktion (Linienmagie) trifft
So greifen Sie auf die globale Variable des importierten Moduls zu
14 Tests, um den überraschend verwirrenden Umfang von Python zu verstehen