Cum să antrenezi un model BERT de la zero

Nodul sursă: 1013329

Cum să antrenezi un model BERT de la zero

Faceți cunoștință cu vărul italian al lui BERT, FiliBERTo.


By James Briggs, Data Scientist



BERT, dar în Italia — imaginea autorului

 

Multe dintre articolele mele s-au concentrat pe BERT – modelul care a venit și a dominat lumea procesării limbajului natural (NLP) și a marcat o nouă eră pentru modelele de limbaj.

Pentru cei dintre voi care nu au folosit modele de transformatoare (de exemplu, ce este BERT) înainte, procesul arată cam așa:

  • pip install transformers
  • Inițializați un model de transformatoare pre-antrenate — from_pretrained.
  • Testează-l pe anumite date.
  • Poate reglați fin modelul (antrenați-l mai mult).

Acum, aceasta este o abordare grozavă, dar dacă facem asta doar vreodată, ne lipsește înțelegerea din spatele creării propriilor modele de transformatoare.

Și, dacă nu ne putem crea propriile modele de transformatoare - trebuie să ne bazăm pe existența unui model pre-antrenat care să se potrivească problemei noastre, acesta nu este întotdeauna cazul:



Câteva comentarii care întrebau despre modelele BERT non-engleze

 

Deci, în acest articol, vom explora pașii pe care trebuie să-i facem pentru a ne construi propriul model de transformator - în special o versiune dezvoltată în continuare a BERT, numită RoBERTa.

O imagine de ansamblu

 
 
Există câțiva pași în proces, așa că înainte de a ne arunca, să rezumam mai întâi ceea ce trebuie să facem. În total, există patru părți cheie:

  • Obținerea datelor
  • Construirea unui tokenizer
  • Crearea unei conducte de intrare
  • Instruirea modelului

Odată ce am lucrat prin fiecare dintre aceste secțiuni, vom lua tokenizatorul și modelul pe care le-am construit - și le vom salva pe amândouă, astfel încât să le putem folosi în același mod în care am face-o de obicei cu from_pretrained.

Obținerea Datelor

 
 
Ca și în cazul oricărui proiect de învățare automată, avem nevoie de date. În ceea ce privește datele pentru antrenarea unui model de transformator, avem cu adevărat răsfățați de alegere - putem folosi aproape orice date text.



Video tutorial pentru descărcarea setului de date OSCAR folosind biblioteca de seturi de date HuggingFace

 

Și, dacă există un lucru de care avem destule pe internet - este vorba de datele text nestructurate.

Unul dintre cele mai mari seturi de date din domeniul textului extras de pe internet este setul de date OSCAR.

Setul de date OSCAR se mândrește cu un număr mare de limbi diferite - și unul dintre cele mai clare cazuri de utilizare pentru antrenament de la zero este astfel încât să putem aplica BERT unor limbi mai puțin utilizate, cum ar fi Telugu sau Navajo.

Din păcate, singura limbă pe care o pot vorbi cu orice grad de competență este engleza – dar prietena mea este italiană, așa că ea – Laura, va evalua rezultatele modelului nostru BERT vorbitor de italiană – FiliBERTo.

Deci, pentru a descărca segmentul italian al setului de date OSCAR, vom folosi HuggingFace datasets bibliotecă — cu care putem instala pip install datasets. Apoi descarcăm OSCAR_IT cu:

Să aruncăm o privire la dataset obiect.

Grozav, acum haideți să ne stocăm datele într-un format pe care să-l putem folosi atunci când construim tokenizer-ul nostru. Trebuie să creăm un set de fișiere text simplu care să conțină doar fișierul text caracteristică din setul nostru de date și le vom împărți pe fiecare probă folosind o linie nouă n.

Peste la noi data/text/oscar_it director vom găsi:


O captură de ecran care afișează o fereastră Windows Explorer plină de fișiere .txt - reprezentând datele OSCAR în text simplu
Directorul care conține fișierele noastre OSCAR cu text simplu

 

Construirea unui Tokenizer

 
 
Următorul este tokenizer-ul! Când folosim transformatoare, încărcăm de obicei un tokenizer, alături de modelul său de transformator respectiv - tokenizerul este o componentă cheie a procesului.



Prezentare video pentru construirea tokenizatorului nostru personalizat

 

Când construim tokenizer-ul nostru, vom alimenta toate datele noastre OSCAR, vom specifica dimensiunea vocabularului nostru (numărul de jetoane din tokenizer) și orice jetoane speciale.

Acum, jetoanele speciale Roberta arată astfel:

Deci, ne asigurăm că le includem în special_tokens parametrul tokenizatorului nostru train apel de metodă.

Tokenizatorul nostru este acum gata și îl putem salva fișierul pentru utilizare ulterioară:

Acum avem două fișiere care definesc noul nostru FiliBERTo tokenizer:

  • merge.txt — realizează maparea inițială a textului cu jetoane
  • vocab.json — mapează jetoanele la ID-uri de jetoane

Și cu acestea, putem trece la inițializarea tokenizatorului nostru, astfel încât să-l putem folosi așa cum am folosi orice alt from_pretrained tokenizer.

Inițializarea Tokenizerului

 
 
Inițializam mai întâi tokenizer-ul folosind cele două fișiere pe care le-am construit înainte - folosind un simplu from_pretrained:

Acum tokenizatorul nostru este gata, putem încerca să codificăm ceva text cu el. Când codificăm, folosim aceleași două metode pe care le-am folosi de obicei, encode și encode_batch.

Din obiectul codificări tokens vom extrage input_ids și attention_mask tensori pentru utilizare cu FiliBERTo.

Crearea conductei de intrare

 
 
Conducta de intrare a procesului nostru de formare este partea mai complexă a întregului proces. Constă în faptul că luăm datele noastre brute de antrenament OSCAR, le transformăm și le încărcăm într-un DataLoader gata de antrenament.



Prezentare video a conductei de intrare MLM

 

Pregătirea Datelor

 
 
Vom începe cu o singură mostră și vom lucra prin logica pregătirii.

În primul rând, trebuie să deschidem fișierul nostru - aceleași fișiere pe care le-am salvat .TXT fișiere mai devreme. Am împărțit fiecare în funcție de caractere newline n deoarece aceasta indică probele individuale.

Apoi codificăm datele noastre folosind tokenizer — asigurându-vă că includeți parametri cheie precum max_lengthpadding, și truncation.

Și acum putem trece la crearea tensorilor noștri — ne vom antrena modelul prin modelarea limbajului mascat (MLM). Deci, avem nevoie de trei tensori:

  • input_ids - al nostru token_ids cu ~15% din jetoane mascate folosind jetoanele de mască <mask>.
  • masca_atentie — un tensor al 1e și 0s, marcarea poziției jetoanelor „reale”/jetoanelor de umplutură — utilizate în calculele de atenție.
  • etichete - al nostru token_ids cu Nu. mascarea.

Dacă nu sunteți familiarizat cu MLM, v-am explicat aici.

Our attention_mask și labels tensorii sunt pur și simplu extrași din noastre batch.  input_ids tensorii necesită mai multă atenție totuși, pentru acest tensor maschăm ~ 15% din jetoane - atribuindu-le ID-ul jetonului 3.

În rezultatul final, putem vedea o parte a unui cod codificat input_ids tensor. Primul ID token este 1 - [CLS] jeton. Punctate în jurul tensorului avem mai multe 3 ID-uri de simbol – acestea sunt nou adăugate [MASK] token-uri.

Construirea DataLoader-ului

 
 
În continuare, ne definim Dataset clasa — pe care o folosim pentru a inițializa cei trei tensori codificați ca PyTorch torch.utils.data.Dataset obiecte.

În cele din urmă, al nostru dataset este încărcat într-un PyTorch DataLoader obiect — pe care îl folosim pentru a ne încărca datele în modelul nostru în timpul antrenamentului.

Instruirea modelului

 
 
Avem nevoie de două lucruri pentru antrenament, al nostru DataLoader si un model. The DataLoader avem - dar nici un model.



Inițializarea modelului

 
 
Pentru antrenament, avem nevoie de un raw (nu pre-antrenat) BERTLMHeadModel. Pentru a crea asta, mai întâi trebuie să creăm un obiect de configurare RoBERTa pentru a descrie parametrii cu care dorim să inițializam FiliBERTo.

Apoi, importăm și inițializam modelul nostru RoBERTa cu un cap de modelare a limbajului (LM).

Pregătirea antrenamentului

 
 
Înainte de a trece la ciclul nostru de antrenament, trebuie să stabilim câteva lucruri. În primul rând, am configurat utilizarea GPU/CPU. Apoi activăm modul de antrenament al modelului nostru – și în cele din urmă, inițializam optimizatorul nostru.

Pregătire

 
 
În sfârșit, timpul de antrenament! Ne antrenăm exact așa cum ne-am face de obicei atunci când ne antrenăm prin PyTorch.

Dacă ne îndreptăm spre Tensorboard, ne vom găsi pierderea în timp - pare promițător.



Pierdere / timp — mai multe sesiuni de antrenament au fost reunite în acest grafic

 

Testul Adevărat

 
 
Acum este timpul pentru adevăratul test. Am înființat o conductă MLM - și i-am rugat pe Laura să evalueze rezultatele. Puteți urmări recenzia video la ora 22:44 aici:



Inițializam mai întâi a pipeline obiect, folosind 'fill-mask' argument. Apoi începeți să testați modelul nostru astfel:

„ciao cum va?” este raspunsul corect! Este la fel de avansat pe cât este italianul meu - așa că, hai să-l dăm Laurei.

Începem cu „buongiorno, vii?” - sau "buna ziua, ce mai faci?":

Primul răspuns, „buongiorno, chi va?” înseamnă „ziua bună, cine este acolo?” — de exemplu, fără sens. Dar, al doilea răspuns al nostru este corect!

În continuare, o frază puțin mai grea, „ciao, dove ci incontriamo oggi pomeriggio?” - sau „Bună, unde ne întâlnim în după-amiaza asta?”:

Și returnăm câteva rezultate pozitive:

✅ "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?"

În sfârșit, încă o propoziție, mai grea, „cosa sarebbe succes se avessimo ales un altro giorno?” — sau „ce s-ar fi întâmplat dacă am fi ales o altă zi?”:

Revenim și aici câteva răspunsuri bune și mai bune:

✅ "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?"

În general, se pare că modelul nostru a trecut testele Laurei - și acum avem un model competent în limba italiană numit FiliBERTo!

Asta e tot pentru acest tutorial de antrenare a unui model BERT de la zero!

Am acoperit o mulțime de teren, de la obținerea și formatarea datelor noastre - până la utilizarea modelării lingvistice pentru a antrena modelul nostru brut BERT.

Sper că v-a plăcut acest articol! Dacă aveți întrebări, anunțați-mă prin Twitter sau în comentariile de mai jos. Dacă doriți mai mult conținut ca acesta, postez pe YouTube prea.

Vă mulțumim pentru citirea!

 

70% reducere! Procesarea limbajului natural: NLP cu transformatoare în Python

Modelele de transformatoare sunt standardul de facto în NLP modern. S-au dovedit a fi cei mai expresivi...
 

*Toate imaginile sunt ale autorului, cu excepția cazurilor în care se specifică altfel

 
Bio: James Briggs este un cercetător de date specializat în procesarea limbajului natural și lucrează în sectorul financiar, cu sediul în Londra, Marea Britanie. De asemenea, este un mentor, scriitor și creator de conținut independent. Puteți contacta autorul prin e-mail (jamescalam94@gmail.com).

Original. Repostat cu permisiunea.

Related:

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

Timestamp-ul:

Mai mult de la KDnuggets