Wie man ein BERT-Modell von Grund auf trainiert

Quellknoten: 1013329

Wie man ein BERT-Modell von Grund auf trainiert

Treffen Sie den italienischen Cousin von BERT, FiliBERTo.


By James Briggs, Datenwissenschaftler



BERT, aber in Italien – Bild vom Autor

 

Viele meiner Artikel haben sich auf BERT konzentriert – das Modell, das die Welt der Verarbeitung natürlicher Sprache (NLP) dominierte und ein neues Zeitalter für Sprachmodelle markierte.

Für diejenigen unter Ihnen, die möglicherweise noch nie Transformatormodelle (z. B. BERT) verwendet haben, sieht der Prozess in etwa so aus:

  • pip install transformers
  • Initialisieren Sie ein vorab trainiertes Transformatormodell – from_pretrained.
  • Testen Sie es anhand einiger Daten.
  • Vielleicht Feinabstimmung des Modells (trainieren Sie es noch mehr).

Nun, das ist ein toller Ansatz, aber wenn wir nur das tun, fehlt uns das Verständnis für die Erstellung unserer eigenen Transformatormodelle.

Und wenn wir keine eigenen Transformatormodelle erstellen können, müssen wir uns darauf verlassen, dass es ein vorab trainiertes Modell gibt, das zu unserem Problem passt. Dies ist jedoch nicht immer der Fall:



Ein paar Kommentare zu nicht-englischen BERT-Modellen

 

In diesem Artikel werden wir die Schritte untersuchen, die wir unternehmen müssen, um unser eigenes Transformatormodell zu erstellen – insbesondere eine weiterentwickelte Version von BERT namens RoBERTa.

Ein Überblick

 
 
Der Prozess besteht aus mehreren Schritten. Bevor wir uns also darauf einlassen, wollen wir zunächst zusammenfassen, was wir tun müssen. Insgesamt gibt es vier wesentliche Teile:

  • Daten abrufen
  • Einen Tokenizer bauen
  • Erstellen einer Eingabepipeline
  • Das Modell trainieren

Sobald wir jeden dieser Abschnitte durchgearbeitet haben, nehmen wir den Tokenizer und das Modell, die wir erstellt haben – und speichern sie beide, damit wir sie dann auf die gleiche Weise verwenden können, wie wir es normalerweise tun würden from_pretrained.

Die Daten abrufen

 
 
Wie bei jedem maschinellen Lernprojekt benötigen wir Daten. Was die Daten zum Trainieren eines Transformatormodells angeht, haben wir wirklich die Qual der Wahl – wir können fast alle Textdaten verwenden.



Video-Anleitung zum Herunterladen des OSCAR-Datensatzes mithilfe der Datensatzbibliothek von HuggingFace

 

Und wenn es etwas gibt, von dem wir im Internet reichlich haben, dann sind es unstrukturierte Textdaten.

Einer der größten Datensätze im Bereich Text aus dem Internet ist der OSCAR-Datensatz.

Der OSCAR-Datensatz umfasst eine große Anzahl verschiedener Sprachen – und einer der klarsten Anwendungsfälle für ein Training von Grund auf besteht darin, dass wir BERT auf einige weniger häufig verwendete Sprachen wie Telugu oder Navajo anwenden können.

Leider ist die einzige Sprache, die ich einigermaßen gut sprechen kann, Englisch – aber meine Freundin ist Italienerin, und deshalb wird sie – Laura – die Ergebnisse unseres italienischsprachigen BERT-Modells – FiliBERTo – bewerten.

Um das italienische Segment des OSCAR-Datensatzes herunterzuladen, verwenden wir HuggingFace datasets Bibliothek – mit der wir installieren können pip install datasets. Dann laden wir OSCAR_IT herunter mit:

Werfen wir einen Blick auf die dataset Objekt.

Großartig, jetzt speichern wir unsere Daten in einem Format, das wir beim Erstellen unseres Tokenizers verwenden können. Wir müssen eine Reihe von Klartextdateien erstellen, die genau das enthalten text Feature aus unserem Datensatz, und wir werden jedes aufteilen Sample mit einer neuen Zeile n.

Drüben in unserem data/text/oscar_it Verzeichnis finden wir:


Ein Screenshot, der ein Windows-Explorer-Fenster voller TXT-Dateien zeigt, die die Klartext-OSCAR-Daten darstellen
Das Verzeichnis, das unsere Klartext-OSCAR-Dateien enthält

 

Aufbau eines Tokenizers

 
 
Als nächstes kommt der Tokenizer! Bei der Verwendung von Transformatoren laden wir normalerweise einen Tokenizer zusammen mit dem entsprechenden Transformatormodell – der Tokenizer ist eine Schlüsselkomponente im Prozess.



Video-Anleitung zum Erstellen unseres benutzerdefinierten Tokenizers

 

Beim Erstellen unseres Tokenizers geben wir alle unsere OSCAR-Daten ein, geben unsere Vokabulargröße (Anzahl der Token im Tokenizer) und alle speziellen Token an.

Nun sehen die speziellen RoBERTa-Token so aus:

Deshalb stellen wir sicher, dass wir sie in die Liste aufnehmen special_tokens Parameter unseres Tokenizers train Methodenaufruf.

Unser Tokenizer ist jetzt fertig und wir können die Datei zur späteren Verwendung speichern:

Jetzt haben wir zwei Dateien, die unser neues definieren FiliBERTo Tokenizer:

  • merges.txt – führt die anfängliche Zuordnung von Text zu Token durch
  • vocab.json – ordnet die Token Token-IDs zu

Und damit können wir mit der Initialisierung unseres Tokenizers fortfahren, sodass wir ihn wie jeden anderen verwenden können from_pretrained Tokenisierer.

Initialisieren des Tokenizers

 
 
Wir initialisieren den Tokenizer zunächst mit den beiden zuvor erstellten Dateien – mit einem einfachen from_pretrained:

Jetzt ist unser Tokenizer fertig, wir können versuchen, etwas Text damit zu kodieren. Beim Codieren verwenden wir dieselben zwei Methoden, die wir normalerweise verwenden würden: encode und encode_batch.

Aus dem Encodings-Objekt tokens Wir werden das extrahieren input_ids und attention_mask Tensoren zur Verwendung mit FiliBERTo.

Erstellen der Eingabepipeline

 
 
Die Eingabepipeline unseres Trainingsprozesses ist der komplexere Teil des gesamten Prozesses. Es besteht darin, dass wir unsere rohen OSCAR-Trainingsdaten nehmen, sie umwandeln und in ein laden DataLoader bereit zum Training.



Video-Komplettlösung der MLM-Eingabepipeline

 

Vorbereiten der Daten

 
 
Wir beginnen mit einer einzelnen Probe und arbeiten die Vorbereitungslogik durch.

Zuerst müssen wir unsere Datei öffnen – dieselben Dateien, unter denen wir gespeichert haben .txt Dateien früher. Wir teilen sie jeweils nach Zeilenumbruchzeichen auf n da dies die einzelnen Proben angibt.

Dann verschlüsseln wir unsere Daten mit dem tokenizer – Stellen Sie sicher, dass Sie wichtige Parameter einbeziehen, z max_lengthpadding und truncation.

Und jetzt können wir mit der Erstellung unserer Tensoren fortfahren – wir werden unser Modell durch Masked-Language-Modeling (MLM) trainieren. Wir brauchen also drei Tensoren:

  • input_ids - unser token_ids wobei ca. 15 % der Token mit dem Masken-Token maskiert werden <mask>.
  • Aufmerksamkeit_Maske – ein Tensor von 1s und 0s, markiert die Position von „echten“ Token/Padding-Tokens – wird bei Aufmerksamkeitsberechnungen verwendet.
  • Etiketten - unser token_ids mit nicht maskieren.

Wenn Sie mit MLM nicht vertraut sind, habe ich es erklärt hier.

Unser attention_mask und labels Tensoren werden einfach aus unserem extrahiert batchdem „Vermischten Geschmack“. Seine  input_ids Tensoren erfordern jedoch mehr Aufmerksamkeit. Für diesen Tensor maskieren wir etwa 15 % der Token und weisen ihnen die Token-ID zu 3.

In der endgültigen Ausgabe können wir einen Teil einer codierten Datei sehen input_ids Tensor. Die allererste Token-ID ist 1 - Die [CLS] Zeichen. Rund um den Tensor herum haben wir mehrere 3 Token-IDs – das sind unsere neu hinzugefügten [MASK] Token.

Erstellen des DataLoader

 
 
Als nächstes definieren wir unsere Dataset Klasse – mit der wir unsere drei codierten Tensoren als PyTorch initialisieren torch.utils.data.Dataset Objekte.

Schließlich unser dataset wird in einen PyTorch geladen DataLoader Objekt – das wir verwenden, um unsere Daten während des Trainings in unser Modell zu laden.

Das Modell trainieren

 
 
Wir brauchen zwei Dinge zum Training, unsere DataLoader und ein Modell. Der DataLoader wir haben – aber kein Modell.



Initialisieren des Modells

 
 
Für das Training benötigen wir ein rohes (nicht vorab trainiertes) BERTLMHeadModel. Um dies zu erstellen, müssen wir zunächst ein RoBERTa-Konfigurationsobjekt erstellen, um die Parameter zu beschreiben, mit denen wir FiliBERTo initialisieren möchten.

Anschließend importieren und initialisieren wir unser RoBERTa-Modell mit einem Sprachmodellierungskopf (LM).

Trainingsvorbereitung

 
 
Bevor wir mit unserer Trainingsschleife fortfahren, müssen wir ein paar Dinge einrichten. Zuerst richten wir die GPU/CPU-Nutzung ein. Dann aktivieren wir den Trainingsmodus unseres Modells – und initialisieren schließlich unseren Optimierer.

Ausbildung

 
 
Endlich – Trainingszeit! Wir trainieren genauso, wie wir es normalerweise beim Training über PyTorch tun würden.

Wenn wir zu Tensorboard gehen, werden wir mit der Zeit unseren Verlust feststellen – es sieht vielversprechend aus.



Verlust/Zeit – in dieser Tabelle wurden mehrere Trainingseinheiten zusammengefasst

 

Der wahre Test

 
 
Jetzt ist es Zeit für den echten Test. Wir richten eine MLM-Pipeline ein – und bitten Laura, die Ergebnisse zu bewerten. Den Videorückblick um 22:44 können Sie sich hier ansehen:



Wir initialisieren zunächst a pipeline Objekt, mit dem 'fill-mask' Streit. Dann beginnen Sie mit dem Testen unseres Modells wie folgt:

„ciao wie die va?“ ist die richtige Antwort! Das ist so fortgeschritten, wie mein Italienisch nur sein kann – also übergeben wir es an Laura.

Wir fangen mit an „Buongiorno, komm schon?“ - oder "Guten Tag, wie geht es ihnen?":

Die erste Antwort: „buongiorno, chi va?“ bedeutet „Guten Tag, wer ist da?“ – zB unsinnig. Aber unsere zweite Antwort ist richtig!

Als nächstes ein etwas schwierigerer Satz: „ciao, dove ci incontriamo oggi pomeriggio?“ - oder „Hallo, wo treffen wir uns heute Nachmittag?“:

Und wir kehren zu weiteren positiven Ergebnissen zurück:

✅ "hi, where do we see each other this afternoon?"
✅ "hi, where do we meet this afternoon?"
❌ "hi, where here we are this afternoon?"
✅ "hi, where are we meeting this afternoon?"
✅ "hi, where do we meet this afternoon?"

Zum Schluss noch ein härterer Satz: „Cosa sarebbe successo se avessimo scelto un altro giorno?“ – oder „Was wäre passiert, wenn wir einen anderen Tag gewählt hätten?“:

Auch hier gibt es noch ein paar gute Antworten:

✅ "what would have happened if we had chosen another day?"
✅ "what would have happened if I had chosen another day?"
✅ "what would have happened if they had chosen another day?"
✅ "what would have happened if you had chosen another day?"
❌ "what would have happened if another day was chosen?"

Insgesamt sieht es so aus, als hätte unser Modell Lauras Tests bestanden – und wir haben jetzt ein kompetentes italienisches Sprachmodell namens FiliBERTo!

Das ist alles für diese exemplarische Vorgehensweise zum Trainieren eines BERT-Modells von Grund auf!

Wir haben viele Bereiche abgedeckt, von der Beschaffung und Formatierung unserer Daten bis hin zur Verwendung der Sprachmodellierung zum Trainieren unseres rohen BERT-Modells.

Ich hoffe, Ihnen hat dieser Artikel gefallen! Wenn Sie Fragen haben, lassen Sie es mich wissen über Twitter oder in den Kommentaren unten. Wenn Sie mehr Inhalte wie diesen wünschen, poste ich auf YouTube Auch.

Danke fürs Lesen!

 

70% Rabatt! Verarbeitung natürlicher Sprache: NLP mit Transformern in Python

Transformer-Modelle sind der De-facto-Standard im modernen NLP. Sie haben sich als die ausdrucksstärksten… erwiesen.
 

*Alle Bilder stammen vom Autor, sofern nicht anders angegeben

 
Bio: James Briggs ist ein Datenwissenschaftler, der sich auf die Verarbeitung natürlicher Sprache spezialisiert hat und im Finanzsektor mit Sitz in London, Großbritannien, arbeitet. Er ist außerdem freiberuflicher Mentor, Autor und Ersteller von Inhalten. Sie können den Autor per E-Mail erreichen (jamescalam94@gmail.com).

Original. Mit Genehmigung erneut veröffentlicht.

Related:

Quelle: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Zeitstempel:

Mehr von KDnuggets