Dies ist eine Fortsetzung von BERT mit dem Microsoft Cognitive Toolkit (CNTK).
In Teil 2 lernen wir ALBERT anhand der in Teil 1 erstellten japanischen Wikipedia vor. Es wird davon ausgegangen, dass NVIDIA GPU CUDA installiert ist.
Natürliche Sprache: BERT Teil 1 - Japanischer Wikipedia-Korpus erstellte einen Vorlernkorpus unter Verwendung der japanischen Wikipedia.
In Teil 2 werden wir ein unbeaufsichtigtes Vorlernmodell erstellen und trainieren.
BERT Bidirektionale Encoder-Darstellungen von Transformatoren (BERT) [1] verwenden nur den Encoder-Teil von Transformer [2]. Transformatoren werden in Natürliche Sprache: Maschinelle Übersetzung Teil 2 - Neuronale maschinelle Übersetzungstransformator eingeführt.
Außerdem haben wir dieses Mal das Basismodell von ALBERT [[3]](# reference) implementiert, eine leichtere Version von BERT, und es mit Pre-Layer Normalization Transformer [[4]](# reference) konfiguriert. Die Details der Schichtstruktur sind in der folgenden Abbildung dargestellt.
Die Multi-Head Attention von BERT verwendet Self-Attention, die interaktives Lernen ermöglicht.
Der Anfangswert jedes Parameters wurde auf eine Normalverteilung mit einer Varianz von 0,02 eingestellt.
Die Verlustfunktion verwendet den Kreuzentropiefehler für die Vorhersage maskierter Wörter in Masked LM und die binäre Kreuzentropie zur Identifizierung in der Satzvorhersage.
Adam [5] wurde als Optimierungsalgorithmus verwendet. Adams Hyperparameter $ β_1 $ wird auf 0,9 und $ β_2 $ auf den Standardwert von CNTK gesetzt.
Verwenden Sie für die Lernrate die zyklische Lernrate (CLR) [6]. Die maximale Lernrate beträgt 1e-4, die Basislernrate 1e-8, die Schrittgröße das 10-fache der Anzahl der Epochen und die Strategie ist dreieckig2. Ich habe es eingestellt.
Das Modelltraining führte 3.000.000 Iterationen durch Mini-Batch-Training durch.
・ CPU Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 6000 24 GB
・ Windows 10 Pro 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0.1.33 ・ MeCab 0.996 ・ Numpy 1.17.3 ・ Pandas 0.25.0
Das Schulungsprogramm ist auf [GitHub] verfügbar (https://github.com/sho-watari/NaturalLanguage/tree/master/BERT).
bert_pretraining.py
Ich werde den Hauptinhalt dieser Implementierung ergänzen.
Masked LM and Sentence Prediction Beim BERT-Vorlernen beginnt der Eingabesatz mit dem speziellen Wort [CLS] und besteht aus zwei Sätzen, wie in der folgenden Abbildung gezeigt. Am Ende jedes Satzes wird ein spezielles Wort [SEP] eingefügt. Anschließend werden zwei Arten des Lernens durchgeführt, Masked LM und Satzvorhersage.
Masked LM In Masked LM werden 15% des Eingabesatzes durch das spezielle Wort [MASK] als Eingabesatz ersetzt, und das Wort an derselben Position im ursprünglichen Eingabesatz sind die richtigen Antwortdaten.
Verwenden Sie den folgenden Prozess, um das maskierte Wort vorherzusagen und das richtige Wort vorherzusagen. Zu diesem Zeitpunkt wird nur der Gradient der maskierten Position verwendet, um die Parameter zu aktualisieren.
bert_masked_lm
def bert_masked_lm(encode):
""" Masked Language Model """
h = Dense(num_hidden, activation=Cx.gelu_fast, init=C.normal(0.02))(encode)
h = LayerNormalization()(h)
return Dense(num_word, activation=None, init=C.normal(0.02))(h)
[MASK] ist jedoch ein spezielles Wort, das nur beim BERT-Vorlernen verwendet wird und zur Unnatürlichkeit des Sprachmodells bei der Feinabstimmung beiträgt. Daher verwendet BERT die folgenden Strategien, um die Unnatürlichkeit zu reduzieren.
・ 80% Chance, durch [MASKE] zu ersetzen. ・ 10% Chance, durch ein zufälliges Wort zu ersetzen. ・ Es besteht eine 10% ige Chance, dass es nicht ersetzt wird und so bleibt, wie es ist. Dies hat die Bedeutung, dem tatsächlichen Wortausdruck näher zu kommen.
Next Sentence Prediction Die Vorhersage des nächsten Satzes zielt darauf ab, ein kontextuelles Verständnis zu erlangen, indem das binäre Klassifizierungsproblem gelöst wird, ob zwei im Eingabesatz enthaltene Sätze verbunden sind oder nicht.
Für diese Klassifizierung wird die verborgene Schicht (Pooler) an der Position [CLS] der Eingabeanweisung als Merkmalsgröße extrahiert und die vollständige Verknüpfungs- und Sigmoidfunktion angewendet.
bert_sentence_prediction
def bert_sentence_prediction(pooler):
""" Sentence Prediction """
h = C.sequence.unpack(pooler, padding_value=0, no_mask_output=True)[0, :]
return Dense(1, activation=C.sigmoid, init=C.normal(0.02))(h)
50% der Trainingsdaten sind zwei aufeinanderfolgende Sätze, und die restlichen 50% sind ein diskontinuierliches negatives Beispiel, indem Sätze zufällig verbunden werden.
A Lite BERT Ein Lite BERT (ALBERT) verbessert die Gewichtsreduzierung und das kontextbezogene Verständnis der Probleme von BERT.
Factorized embedding parameterization Die Anzahl der Parameter der eingebetteten Schicht wird durch Faktorzerlegung verringert.
Unter der Annahme, dass die Anzahl der Wörter $ V $ ist, die Dimension der verborgenen Ebene $ H $ ist und die eingebettete Dimension der unteren Dimension $ E $ ist, wird die Anzahl der Parameter von $ V \ mal H $ in $ V \ mal E + E \ geändert. Es kann auf mal H $ reduziert werden.
Wenn die tatsächliche Anzahl der Wörter $ E = 32.000 $ beträgt, beträgt die Dimension der verborgenen Ebene $ H = 768 $ und die untere eingebettete Dimension $ E = 128 $.
V \times H = 24,576,000 \\
V \times E + E \times H = 4,096,000 + 98,304 = 4,194,304
Es ist ersichtlich, dass die Anzahl der Parameter in der eingebetteten Schicht um etwa 83% reduziert werden kann.
Cross-layer parameter sharing ALBERT teilt die positionsbezogenen Feedfoward-Netzwerkparameter mit jedem Transformer Encoder Self-Attention-Kopf in allen 12 Schichten.
Dies kann die Anzahl der Parameter erheblich reduzieren.
Sentence-Order Prediction Da die Vorhersage des nächsten Satzes ein einfaches Problem für das Verständnis des Kontexts ist, wird seine Nützlichkeit von RoBERTa [7] usw. in Frage gestellt.
Daher trainiert ALBERT das Kontextverständnis mit der Vorhersage der Satzreihenfolge anstelle der Vorhersage des nächsten Satzes.
Es ist sehr einfach zu implementieren. Bereiten Sie einfach ein negatives Beispiel für das zufällige Verbinden von Anweisungen vor, aber ein negatives Beispiel für das Austauschen von zwei Anweisungen.
GELU Gaußsche Fehlerlineareinheiten (GELU) [8] wird als Aktivierungsfunktion vorgeschlagen, die Dropout [9], Zoneout [10] und ReLU kombiniert. Daher wird erwartet, dass es den Effekt hat, die Eingabe mit einer teilbaren und glatten Funktion probabilistisch zu regulieren. GELU sieht aus wie in der Abbildung unten.
GELU wird durch die folgende Formel ausgedrückt.
GELU(x) = x \Phi(x)
Hier repräsentiert $ \ Phi $ die kumulative Wahrscheinlichkeitsdichtefunktion der Normalverteilung und unter der Annahme, dass die Eingabe $ x $ näher am Mittelwert 0 und der Varianz 1 liegt, durch Batch-Normalisierung und Layer-Normalisierung, der Standardnormalverteilung Verwenden Sie die kumulative Wahrscheinlichkeitsdichte.
\Phi(x) = \frac{1}{2} \left( 1 + erf \left( \frac{x - \mu}{\sqrt{\sigma^2}} \right) \right) \\
erf(x) = \frac{2}{\sqrt{\pi}} \int^x_0 e^{-u^2} du
Wobei $ erf $ die Fehlerfunktion darstellt. Die Implementierung verwendet die folgende Formel, die eine Annäherung an die obige Formel darstellt.
GELU(x) \approx 0.5x \left( 1 + \tanh \left[ \sqrt{\frac{2}{\pi}}(x + 0.044715x^3) \right] \right)
Die Berechnung der obigen Näherungsformel dauert jedoch lange. Daher haben wir in dieser Implementierung die folgende Formel verwendet, die eine weitere Annäherung an die obige Formel darstellt.
GELU(x) \approx x\sigma(1.702x)
Wobei $ \ sigma $ eine Sigmoidfunktion darstellt.
Training loss Die folgende Abbildung zeigt das Protokoll der Verlustfunktion während des Trainings. Die horizontale Achse repräsentiert die Anzahl der Wiederholungen und die vertikale Achse repräsentiert den Wert der Verlustfunktion.
Ich bat den ausgebildeten ALBERT, das Problem der Satzfüllung zu lösen. Hier ist die Antwort der ursprüngliche Satz, maskiert ist der ursprüngliche Satz, wobei ein Teil des Satzes durch [MASK] ersetzt wird, und Albert sagt das Wort in der Position [MASK] voraus.
answer :Die Menschheit muss sich mit der richtigen Intelligenz entwickeln.
masked :Menschheit[MASK]Muss richtig verwendet werden, um sich zu entwickeln.
albert :Die Menschheit muss sich entwickeln, indem sie Lebewesen richtig einsetzt.
Die folgende Abbildung zeigt eine Visualisierung der Aufmerksamkeitskarte für jeden Kopf der Selbstaufmerksamkeit auf der 11. und 12. Ebene des Encoders. Die Farbkarte wird als heiß angezeigt.
Encoder 11
Encoder 12
BERT fine-tuning Das ursprüngliche Motiv von BERT ist das Transferlernen des Vorlernmodells. Daher wurde unter Verwendung des diesmal im Voraus erlernten Modells das Transferlernen mit der Dokumentklassifizierungsaufgabe des Livedoor NEWS Corpus durchgeführt, die in Natural Language: Doc2Vec Part1 - Livedoor NEWS Corpus verwendet wurde. Ich versuchte es.
Vorverarbeitung und morphologische Analyse von Textdaten Mit den Wörterbüchern MeCab und NEologd haben wir nur Nomenklaturen, Verben und Adjektive extrahiert, das Entfernen von Stoppwörtern durchgeführt und die Wörter dann im SentencePiece-Modell in IDs konvertiert.
Dieses Mal haben wir 5 Epochen zusätzlich zu 9 Klassifikationen trainiert, die vollständig an die Ausgabe von Pooler gekoppelt sind.
Ähnlich wie bei Natürliche Sprache: Doc2Vec Part2 - Dokumentklassifizierung führte die Leistungsbewertung unter Verwendung von Verifizierungsdaten zu den folgenden Ergebnissen. Doc2Vecs 10 Epoch hat eine geringere Leistung als 90%.
Accuracy 75.56%
Aus zeitlichen Gründen konnte das ALBERT-Pre-Training nur 1 Epoche in der Praxis trainieren, und das Modell war zu komplex für das Problem, das die Ursache für den Leistungsabfall sein könnte.
Natural Language : Doc2Vec Part1 - livedoor NEWS Corpus Natural Language : Doc2Vec Part2 - Document Classification Natural Language : BERT Part1 - Japanese Wikipedia Corpus
Recommended Posts