Hvordan trene en BERT -modell fra bunnen av

Kilde node: 1013329

Hvordan trene en BERT -modell fra bunnen av

Møt BERTs italienske fetter, FiliBERTo.


By James Briggs, Dataforsker



BERT, men i Italia — bilde av forfatter

 

Mange av artiklene mine har vært fokusert på BERT – modellen som kom og dominerte verden av naturlig språkbehandling (NLP) og markerte en ny tidsalder for språkmodeller.

For de av dere som kanskje ikke har brukt transformatormodeller (f.eks. hva BERT er) før, ser prosessen litt slik ut:

  • pip install transformers
  • Initialiser en forhåndstrent transformatormodell — from_pretrained.
  • Test det på noen data.
  • Kan være finjuster modellen (tren den litt mer).

Nå er dette en flott tilnærming, men hvis vi bare noen gang gjør dette, mangler vi forståelsen bak å lage våre egne transformatormodeller.

Og hvis vi ikke kan lage våre egne transformatormodeller – må vi stole på at det finnes en forhåndsopplært modell som passer til problemet vårt, dette er ikke alltid tilfelle:



Noen få kommentarer som spør om ikke-engelske BERT-modeller

 

Så i denne artikkelen vil vi utforske trinnene vi må ta for å bygge vår egen transformatormodell – nærmere bestemt en videreutviklet versjon av BERT, kalt RoBERTa.

Et overblikk

 
 
Det er noen få trinn i prosessen, så før vi dykker inn, la oss først oppsummere hva vi må gjøre. Totalt er det fire hoveddeler:

  • Få dataene
  • Bygge en tokenizer
  • Opprette en input-pipeline
  • Opplæring av modellen

Når vi har jobbet gjennom hver av disse seksjonene, vil vi ta tokenizeren og modellen vi har bygget – og lagre dem begge slik at vi deretter kan bruke dem på samme måte som vi vanligvis ville gjort med from_pretrained.

Få dataene

 
 
Som med alle maskinlæringsprosjekter trenger vi data. Når det gjelder data for opplæring av en transformatormodell, er vi virkelig bortskjemte med valg - vi kan bruke nesten alle tekstdata.



Videogjennomgang for nedlasting av OSCAR-datasett ved hjelp av HuggingFaces datasettbibliotek

 

Og hvis det er én ting vi har mye av på internett – det er ustrukturerte tekstdata.

Et av de største datasettene i domenet for tekst som er skrapet fra internett er OSCAR-datasettet.

OSCAR-datasettet kan skryte av et stort antall forskjellige språk – og en av de tydeligste brukssakene for opplæring fra bunnen av er slik at vi kan bruke BERT på noen mindre vanlig brukte språk, som Telugu eller Navajo.

Dessverre er det eneste språket jeg kan snakke med noen grad av kompetanse engelsk - men kjæresten min er italiensk, og derfor vil hun - Laura, vurdere resultatene av vår italiensktalende BERT-modell - FiliBERTo.

Så for å laste ned det italienske segmentet av OSCAR-datasettet vil vi bruke HuggingFace datasets bibliotek - som vi kan installere med pip install datasets. Deretter laster vi ned OSCAR_IT med:

La oss ta en titt på dataset gjenstand.

Flott, la oss nå lagre dataene våre i et format som vi kan bruke når vi bygger tokenizeren vår. Vi må lage et sett med rentekstfiler som bare inneholder text funksjon fra datasettet vårt, og vi deler hver sample ved å bruke en ny linje n.

Over i vår data/text/oscar_it katalog finner vi:


Et skjermbilde som viser et Windows Utforsker-vindu fullt av .txt-filer — representerer OSCAR-dataene i ren tekst
Katalogen som inneholder våre OSCAR-filer i klartekst

 

Bygge en Tokenizer

 
 
Neste opp er tokenizer! Når du bruker transformatorer, laster vi vanligvis en tokenizer, sammen med dens respektive transformatormodell - tokenizeren er en nøkkelkomponent i prosessen.



Videogjennomgang for å bygge vår egendefinerte tokenizer

 

Når vi bygger tokenizeren vår, mater vi den med alle OSCAR-dataene våre, spesifiserer ordforrådets størrelse (antall tokens i tokenizeren), og eventuelle spesielle tokens.

Nå ser RobERTa-spesialtokenene slik ut:

Så vi sørger for å inkludere dem i special_tokens parameteren til våre tokenizers train metodekall.

Tokenizeren vår er nå klar, og vi kan lagre den for senere bruk:

Nå har vi to filer som definerer vår nye FiliBERTo tokenizer:

  • merges.txt — utfører den første kartleggingen av tekst til tokens
  • vocab.json — kartlegger tokens til token-ID-er

Og med disse kan vi gå videre til å initialisere tokenizeren vår slik at vi kan bruke den som vi ville brukt alle andre from_pretrained tokenizer.

Initialiserer Tokenizer

 
 
Vi initialiserer først tokenizeren ved å bruke de to filene vi bygde før - ved å bruke en enkel from_pretrained:

Nå er tokenizeren vår klar, vi kan prøve å kode litt tekst med den. Ved koding bruker vi de samme to metodene som vi vanligvis ville brukt, encode og encode_batch.

Fra kodingsobjektet tokens vi vil trekke ut input_ids og attention_mask tensorer for bruk med FiliBERTo.

Opprette inngangsrørledningen

 
 
Inndatarørledningen til opplæringsprosessen vår er den mer komplekse delen av hele prosessen. Den består av at vi tar våre rå OSCAR-treningsdata, transformerer dem og laster dem inn i en DataLoader klar for trening.



Videogjennomgang av MLM input pipeline

 

Forbereder dataene

 
 
Vi starter med en enkelt prøve og arbeider oss gjennom forberedelseslogikken.

Først må vi åpne filen vår - de samme filene som vi lagret som .txt filer tidligere. Vi deler hver basert på nylinjekarakterer n da dette indikerer de enkelte prøvene.

Deretter koder vi dataene våre ved hjelp av tokenizer — Sørg for å inkludere nøkkelparametere som max_lengthpaddingog truncation.

Og nå kan vi gå videre til å lage tensorene våre - vi vil trene modellen vår gjennom maskert-språkmodellering (MLM). Så vi trenger tre tensorer:

  • input_ids - våre token_ids med ~15 % av tokens maskert med masketokenet <mask>.
  • oppmerksomhetsmaske — en tensor av 1s og 0s, som markerer posisjonen til "ekte" tokens/polstringssymboler - brukt i oppmerksomhetsberegninger.
  • etiketter - våre token_ids med Nei. maskering.

Hvis du ikke er kjent med MLM, har jeg forklart det her..

Vår attention_mask og labels tensorer er ganske enkelt hentet fra vår batch. De input_ids Tensorer krever imidlertid mer oppmerksomhet, for denne tensoren maskerer vi ~15 % av tokenene – og tildeler dem token-IDen 3.

I den endelige utgangen kan vi se en del av en kodet input_ids tensor. Den aller første token-IDen er 1 - Den [CLS] token. Stiplet rundt tensoren har vi flere 3 token-ID-er – disse er våre nylig lagt til [MASK] tokens.

Bygge DataLoader

 
 
Deretter definerer vi vår Dataset klasse - som vi bruker til å initialisere våre tre kodede tensorer som PyTorch torch.utils.data.Dataset objekter.

Til slutt, vår dataset er lastet inn i en PyTorch DataLoader objekt – som vi bruker til å laste inn dataene våre i modellen vår under trening.

Trening av modellen

 
 
Vi trenger to ting til trening, vår DataLoader og en modell. De DataLoader vi har - men ingen modell.



Initialisering av modellen

 
 
For trening trenger vi en rå (ikke forhåndstrent) BERTLMHeadModel. For å lage det, må vi først lage et RoBERTa-konfigurasjonsobjekt for å beskrive parameterne vi ønsker å initialisere FiliBERTo med.

Deretter importerer og initialiserer vi vår RobERTa-modell med et språkmodelleringshode (LM).

Treningsforberedelse

 
 
Før vi går inn på treningssløyfen vår, må vi sette opp et par ting. Først setter vi opp GPU/CPU-bruk. Deretter aktiverer vi treningsmodusen til modellen vår - og til slutt initialiserer vi optimizeren vår.

Kurs

 
 
Endelig - treningstid! Vi trener akkurat som vi pleier å trene via PyTorch.

Hvis vi går over til Tensorboard, vil vi finne tapet vårt over tid - det ser lovende ut.



Tap / tid - flere treningsøkter er satt sammen i dette diagrammet

 

Den virkelige testen

 
 
Nå er det tid for den virkelige testen. Vi setter opp en MLM-pipeline – og ber Laura vurdere resultatene. Du kan se videoanmeldelsen klokken 22:44 her:



Vi initialiserer først en pipeline objekt ved å bruke 'fill-mask' argument. Begynn deretter å teste modellen vår slik:

"ciao Kom va?" er det riktige svaret! Det er så avansert som italiensken min blir - så la oss overlevere den til Laura.

Vi starter med "buongiorno, kommer va?" - eller "god dag hvordan har du det?":

Det første svaret, "buongiorno, chi va?" betyr "god dag, hvem er der?" — f.eks. useriøst. Men vårt andre svar er riktig!

Neste opp, en litt vanskeligere setning, «ciao, dove ci incontriamo oggi pomeriggio?» - eller "hei, hvor skal vi møtes i ettermiddag?":

Og vi gir flere positive resultater:

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

Til slutt, enda en hardere setning, "cosa sarebbe successo se avessimo scelto un altro giorno?" – eller «hva hadde skjedd hvis vi hadde valgt en annen dag?»:

Vi returnerer noen gode flere gode svar her også:

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

Totalt sett ser det ut som om modellen vår bestod Lauras tester – og vi har nå en kompetent italiensk språkmodell kalt FiliBERTo!

Det var alt for denne gjennomgangen av å trene en BERT-modell fra bunnen av!

Vi har dekket mye, fra å hente og formatere dataene våre – hele veien til å bruke språkmodellering for å trene opp vår rå BERT-modell.

Jeg håper du likte denne artikkelen! Hvis du har spørsmål, gi meg beskjed via Twitter eller i kommentarfeltet nedenfor. Hvis du vil ha mer innhold som dette, legger jeg ut YouTube også.

Takk for lesing!

 

70 % rabatt! Naturlig språkbehandling: NLP med transformatorer i Python

Transformatormodeller er de-facto-standarden i moderne NLP. De har vist seg som de mest uttrykksfulle...
 

*Alle bilder er av forfatteren med mindre annet er oppgitt

 
Bio: James Briggs er en datavitenskapsmann som spesialiserer seg i behandling av naturlig språk og jobber i finanssektoren, basert i London, Storbritannia. Han er også frilans mentor, forfatter og innholdsskaper. Du kan nå forfatteren via e-post (jamescalam94@gmail.com).

original. Ompostet med tillatelse.

Relatert:

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

Tidstempel:

Mer fra KDnuggets