Sådan træner du en BERT-model fra bunden

Kildeknude: 1013329

Sådan træner du en BERT-model fra bunden

Mød BERTs italienske fætter, FiliBERTo.


By James Briggs, dataforsker



BERT, men i Italien — billede af forfatter

 

Mange af mine artikler har været fokuseret på BERT - modellen, der kom og dominerede verden af ​​naturlig sprogbehandling (NLP) og markerede en ny tidsalder for sprogmodeller.

For dem af jer, der måske ikke har brugt transformatormodeller (f.eks. hvad BERT er) før, ser processen lidt sådan ud:

  • pip install transformers
  • Initialiser en fortrænet transformatormodel — from_pretrained.
  • Test det på nogle data.
  • Kan være finjuster modellen (træn den noget mere).

Dette er en fantastisk tilgang, men hvis vi kun gør dette, mangler vi forståelsen bag at skabe vores egne transformatormodeller.

Og hvis vi ikke kan skabe vores egne transformermodeller - vi må stole på, at der er en foruddannet model, der passer til vores problem, dette er ikke altid tilfældet:



Et par kommentarer, der spørger om ikke-engelske BERT-modeller

 

Så i denne artikel vil vi undersøge de trin, vi skal tage for at bygge vores egen transformermodel - specifikt en videreudviklet version af BERT, kaldet RoBERTa.

Et overblik

 
 
Der er et par trin i processen, så før vi dykker ind, lad os først opsummere, hvad vi skal gøre. I alt er der fire hoveddele:

  • Henter data
  • Opbygning af en tokenizer
  • Oprettelse af en inputpipeline
  • Træning af modellen

Når vi har gennemgået hver af disse sektioner, vil vi tage den tokenizer og model, vi har bygget - og gemme dem begge, så vi derefter kan bruge dem på samme måde, som vi normalt ville med from_pretrained.

Hentning af data

 
 
Som med ethvert maskinlæringsprojekt har vi brug for data. Med hensyn til data til træning af en transformermodel, er vi virkelig forkælede for valg - vi kan bruge næsten alle tekstdata.



Videogennemgang til download af OSCAR-datasæt ved hjælp af HuggingFaces datasætbibliotek

 

Og hvis der er én ting, vi har masser af på internettet — det er ustrukturerede tekstdata.

Et af de største datasæt i domænet for tekst skrabet fra internettet er OSCAR-datasættet.

OSCAR-datasættet kan prale af et stort antal forskellige sprog - og en af ​​de klareste use-cases til træning fra bunden er, at vi kan anvende BERT på nogle mindre almindeligt anvendte sprog, såsom Telugu eller Navajo.

Desværre er det eneste sprog, jeg kan tale med nogen grad af kompetence, engelsk - men min kæreste er italiensk, og derfor vil hun - Laura, vurdere resultaterne af vores italiensktalende BERT-model - FiliBERTo.

Så for at downloade det italienske segment af OSCAR-datasættet vil vi bruge HuggingFace's datasets bibliotek - som vi kan installere med pip install datasets. Så downloader vi OSCAR_IT med:

Lad os tage et kig på dataset objekt.

Godt, lad os nu gemme vores data i et format, som vi kan bruge, når vi bygger vores tokenizer. Vi skal oprette et sæt almindelige tekstfiler, der kun indeholder text funktion fra vores datasæt, og vi opdeler hver prøve ved hjælp af en ny linje n.

Ovre i vores data/text/oscar_it bibliotek finder vi:


Et skærmbillede, der viser et Windows Explorer-vindue fuld af .txt-filer — repræsenterende OSCAR-data i almindelig tekst
Mappen, der indeholder vores OSCAR-filer i almindelig tekst

 

Opbygning af en Tokenizer

 
 
Næste op er tokenizer! Når vi bruger transformere, indlæser vi typisk en tokenizer sammen med dens respektive transformermodel - tokenizeren er en nøglekomponent i processen.



Videogennemgang til at bygge vores brugerdefinerede tokenizer

 

Når vi bygger vores tokenizer, vil vi fodre den med alle vores OSCAR-data, specificere vores ordforrådsstørrelse (antal tokens i tokenizeren) og eventuelle specielle tokens.

Nu ser RobERTa specielle tokens sådan ud:

Så vi sørger for at inkludere dem i special_tokens parameter for vores tokenizers train metodekald.

Vores tokenizer er nu klar, og vi kan gemme den til senere brug:

Nu har vi to filer, der definerer vores nye FiliBERTo tokenizer:

  • merges.txt — udfører den indledende tilknytning af tekst til tokens
  • vocab.json — kortlægger tokens til token-id'er

Og med dem kan vi gå videre til at initialisere vores tokenizer, så vi kan bruge den, som vi ville bruge enhver anden from_pretrained tokenizer.

Initialisering af Tokenizer

 
 
Vi initialiserer først tokenizeren ved hjælp af de to filer, vi byggede før - ved hjælp af en simpel from_pretrained:

Nu er vores tokenizer klar, vi kan prøve at kode noget tekst med den. Ved kodning bruger vi de samme to metoder, som vi typisk ville bruge, encode , encode_batch.

Fra kodningsobjektet tokens vi vil udvinde input_ids , attention_mask tensorer til brug med FiliBERTo.

Oprettelse af inputpipeline

 
 
Inputpipelinen i vores træningsproces er den mere komplekse del af hele processen. Den består i, at vi tager vores rå OSCAR træningsdata, transformerer dem og indlæser dem til en DataLoader klar til træning.



Videogennemgang af MLM input pipeline

 

Forberedelse af data

 
 
Vi starter med en enkelt prøve og gennemgår forberedelseslogikken.

Først skal vi åbne vores fil - de samme filer, som vi gemte som . Txt filer tidligere. Vi opdeler hver baseret på newline-karakterer n da dette angiver de enkelte prøver.

Derefter koder vi vores data ved hjælp af tokenizer — Sørg for at inkludere nøgleparametre som max_lengthpaddingog truncation.

Og nu kan vi gå videre til at skabe vores tensorer - vi vil træne vores model gennem masked-language modeling (MLM). Så vi har brug for tre tensorer:

  • input_ids - vores token_ids med ~15 % af tokens maskeret ved hjælp af masketokenet <mask>.
  • opmærksomhedsmaske — en tensor af 1s og 0s, der markerer placeringen af ​​'rigtige' tokens/polstrings-tokens — brugt i opmærksomhedsberegninger.
  • etiketter - vores token_ids med ingen maskering.

Hvis du ikke er bekendt med MLM, har jeg forklaret det link..

Vores attention_mask , labels tensorer udvindes simpelthen fra vores batch. Det input_ids Tensorer kræver dog mere opmærksomhed, for denne tensor maskerer vi ~15% af tokens - og tildeler dem token-id'et 3.

I det endelige output kan vi se en del af en kodet input_ids tensor. Det allerførste token-id er 1 - Den [CLS] polet. Stiplet rundt om tensoren har vi flere 3 token-id'er - disse er vores nyligt tilføjede [MASK] poletter.

Opbygning af DataLoader

 
 
Dernæst definerer vi vores Dataset klasse - som vi bruger til at initialisere vores tre kodede tensorer som PyTorch torch.utils.data.Dataset objekter.

Endelig vores dataset er indlæst i en PyTorch DataLoader objekt — som vi bruger til at indlæse vores data i vores model under træning.

Træning af modellen

 
 
Vi har brug for to ting til træning, vores DataLoader og en model. Det DataLoader vi har - men ingen model.



Initialisering af modellen

 
 
Til træning har vi brug for en rå (ikke fortrænet) BERTLMHeadModel. For at oprette det, skal vi først oprette et RoBERTa-konfigurationsobjekt for at beskrive de parametre, vi gerne vil initialisere FiliBERTo med.

Derefter importerer og initialiserer vi vores RobERTa-model med et sprogmodelleringshoved (LM).

Træningsforberedelse

 
 
Inden vi går videre til vores træningsløkke, skal vi sætte et par ting op. Først sætter vi GPU/CPU-brug op. Derefter aktiverer vi træningstilstanden for vores model - og initialiserer til sidst vores optimering.

Kurser

 
 
Endelig - træningstid! Vi træner ligesom vi plejer, når vi træner via PyTorch.

Hvis vi går over til Tensorboard, vil vi finde vores tab over tid - det ser lovende ud.



Tab/tid — flere træningssessioner er blevet trådt sammen i dette skema

 

Den rigtige test

 
 
Nu er det tid til den rigtige test. Vi opretter en MLM-pipeline - og beder Laura om at vurdere resultaterne. Du kan se videoanmeldelsen klokken 22:44 her:



Vi initialiserer først en pipeline objekt ved hjælp af 'fill-mask' argument. Begynd derefter at teste vores model sådan:

"ciao Kom va?” er det rigtige svar! Det er så avanceret, som mit italienske bliver - så lad os aflevere det til Laura.

Vi begynder med "buongiorno, kommer va?" - eller "goddag hvordan har du det?":

Det første svar, "buongiorno, chi va?" betyder "goddag, hvem er der?" — fx useriøst. Men vores andet svar er korrekt!

Dernæst en lidt sværere sætning, "ciao, dove ci incontriamo oggi pomeriggio?" - eller "hej, hvor skal vi mødes i eftermiddag?":

Og vi returnerer nogle mere 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 sidst en hårdere sætning mere, "cosa sarebbe successo se avessimo scelto un altro giorno?" - eller "hvad ville der være sket, hvis vi havde valgt en anden dag?":

Vi returnerer også et par gode flere gode svar her:

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

Samlet set ser det ud til, at vores model bestod Lauras test – og vi har nu en kompetent italiensk sprogmodel kaldet FiliBERTo!

Det var det for denne gennemgang af træning af en BERT-model fra bunden!

Vi har dækket meget, fra at hente og formatere vores data — hele vejen igennem til at bruge sprogmodellering til at træne vores rå BERT-model.

Jeg håber, du nød denne artikel! Hvis du har spørgsmål, så lad mig det vide via Twitter eller i kommentarerne nedenfor. Hvis du gerne vil have mere indhold som dette, skriver jeg videre YouTube også.

Tak for læsning!

 

70% rabat! Naturlig sprogbehandling: NLP med transformere i Python

Transformer-modeller er de-facto-standarden i moderne NLP. De har bevist sig selv som de mest udtryksfulde...
 

*Alle billeder er af forfatteren, medmindre andet er angivet

 
Bio: James Briggs er en dataforsker med speciale i naturlig sprogbehandling og arbejder i finanssektoren med base i London, Storbritannien. Han er også freelance mentor, forfatter og indholdsskaber. Du kan kontakte forfatteren via e-mail (jamescalam94@gmail.com).

Original. Genopslået med tilladelse.

Relateret:

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

Tidsstempel:

Mere fra KDnuggets