Kako usposobiti model BERT iz nič

Izvorno vozlišče: 1013329

Kako usposobiti model BERT iz nič

Spoznajte BERTOVO italijansko sestrično, FiliBERTo.


By James Briggs, Podatkovni znanstvenik



BERT, a v Italiji — slika avtorja

 

Veliko mojih člankov je bilo osredotočenih na BERT – model, ki je prišel in zavladal svetu obdelave naravnega jezika (NLP) ter zaznamoval novo dobo za jezikovne modele.

Za tiste med vami, ki morda še niste uporabljali modelov transformatorjev (npr. kaj je BERT), je postopek videti približno takole:

  • pip install transformers
  • Inicializirajte vnaprej pripravljen model transformatorjev — from_pretrained.
  • Preizkusite na nekaterih podatkih.
  • Mogoče natančno prilagodite model (še malo ga trenirajte).

To je odličen pristop, a če le kdaj to storimo, nam manjka razumevanja za ustvarjanje lastnih modelov transformatorjev.

In če ne moremo ustvariti lastnih modelov transformatorjev — se moramo zanašati na predhodno usposobljen model, ki ustreza našemu problemu, to pa ni vedno tako:



Nekaj ​​komentarjev o neangleških modelih BERT

 

Zato bomo v tem članku raziskali korake, ki jih moramo sprejeti, da zgradimo lasten model transformatorja - natančneje nadalje razvito različico BERT, imenovano RoBERTa.

Pregled

 
 
Postopek je sestavljen iz nekaj korakov, zato preden se poglobimo, najprej povzamemo, kaj moramo storiti. Skupno so štirje ključni deli:

  • Pridobivanje podatkov
  • Gradnja tokenizerja
  • Ustvarjanje vhodnega cevovoda
  • Usposabljanje modela

Ko bomo obdelali vsakega od teh razdelkov, bomo vzeli tokenizer in model, ki smo ga zgradili - in ju shranili, da ju bomo lahko nato uporabili na enak način, kot bi ga običajno z from_pretrained.

Pridobivanje podatkov

 
 
Kot pri vsakem projektu strojnega učenja potrebujemo podatke. Kar zadeva podatke za usposabljanje modela transformatorja, smo res razvajeni - uporabimo lahko skoraj vse besedilne podatke.



Video navodila za prenos nabora podatkov OSCAR z uporabo knjižnice naborov podatkov HuggingFace

 

In če je česa na internetu veliko – so to nestrukturirani besedilni podatki.

Eden največjih naborov podatkov na področju besedila, postrganega iz interneta, je nabor podatkov OSCAR.

Nabor podatkov OSCAR se ponaša z ogromnim številom različnih jezikov — in eden najbolj jasnih primerov uporabe za usposabljanje iz nič je ta, da lahko BERT uporabimo za nekatere manj pogosto uporabljene jezike, kot sta telugu ali navajo.

Na žalost je edini jezik, ki ga lahko govorim s kakršno koli stopnjo kompetence, angleščina — toda moje dekle je Italijanko, zato bo ona — Laura — ocenjevala rezultate našega italijansko govorečega modela BERT — FiliBERTo.

Za prenos italijanskega segmenta nabora podatkov OSCAR bomo torej uporabili HuggingFace datasets knjižnica — s katero lahko namestimo pip install datasets. Nato prenesemo OSCAR_IT z:

Oglejmo si dataset predmet.

Odlično, zdaj pa shranimo naše podatke v obliki, ki jo lahko uporabimo pri izdelavi našega tokenizerja. Ustvariti moramo niz datotek z navadnim besedilom, ki vsebujejo samo text funkcijo iz našega nabora podatkov in vsakega bomo razdelili Vzorec z uporabo nove vrstice n.

V našem data/text/oscar_it imenik bomo našli:


Posnetek zaslona, ​​ki prikazuje okno raziskovalca Windows, polno datotek .txt, ki predstavljajo podatke OSCAR v navadnem besedilu
Imenik, ki vsebuje naše datoteke OSCAR z navadnim besedilom

 

Gradnja tokenizatorja

 
 
Naslednji je tokenizer! Pri uporabi transformatorjev običajno naložimo tokenizer poleg ustreznega modela transformatorja - tokenizer je ključna komponenta v procesu.



Video navodila za izdelavo našega tokenizerja po meri

 

Pri izdelavi našega tokenizerja mu bomo dodali vse naše podatke OSCAR, določili našo velikost besedišča (število žetonov v tokenizerju) in vse posebne žetone.

Zdaj so posebni žetoni RoBERTa videti takole:

Zato poskrbimo, da jih vključimo v special_tokens parameter našega tokenizerja train klic metode.

Naš tokenizer je zdaj pripravljen in ga lahko shranimo za kasnejšo uporabo:

Zdaj imamo dve datoteki, ki definirata našo novo FiliBERTo tokenizer:

  • merges.txt — izvede začetno preslikavo besedila v žetone
  • vocab.json — preslika žetone v ID-je žetonov

In s temi lahko nadaljujemo z inicializacijo našega tokenizerja, da ga bomo lahko uporabljali kot katerega koli drugega from_pretrained tokenizer.

Inicializacija Tokenizerja

 
 
Najprej inicializiramo tokenizer z dvema datotekama, ki smo jih zgradili prej – z uporabo preprostega from_pretrained:

Zdaj je naš tokenizer pripravljen, lahko poskusimo z njim kodirati nekaj besedila. Pri kodiranju uporabljamo isti dve metodi, ki bi ju običajno uporabljali, encode in encode_batch.

Iz predmeta kodiranja tokens bomo ekstrahirali input_ids in attention_mask tenzorji za uporabo s FiliBERTo.

Ustvarjanje vhodnega cevovoda

 
 
Vhodni cevovod našega procesa usposabljanja je kompleksnejši del celotnega procesa. Sestoji iz tega, da vzamemo naše neobdelane podatke o usposabljanju OSCAR, jih preoblikujemo in naložimo v a DataLoader pripravljen na trening.



Video predstavitev vhodnega cevovoda MLM

 

Priprava podatkov

 
 
Začeli bomo z enim vzorcem in nadaljevali z logiko priprave.

Najprej moramo odpreti svojo datoteko - iste datoteke, kot smo jih shranili . TXT datoteke prej. Vsakega razdelimo na podlagi znakov za novo vrstico n saj to označuje posamezne vzorce.

Nato naše podatke kodiramo z uporabo tokenizer — zagotavljanje vključitve ključnih parametrov, kot je max_lengthpaddingin truncation.

In zdaj lahko preidemo na ustvarjanje naših tenzorjev - naš model bomo učili z modeliranjem v maskiranem jeziku (MLM). Torej potrebujemo tri tenzorje:

  • input_ids — naš token_ids s ~15 % žetonov, prikritih z žetonom maske <mask>.
  • pozornost_maska — tenzor od 1e in 0s, ki označujejo položaj 'pravih' žetonov/žetonov za oblazinjenje — ki se uporabljajo pri izračunih pozornosti.
  • nalepke — naš token_ids z št maskiranje.

Če niste seznanjeni z MLM, sem ga razložil tukaj.

naše attention_mask in labels tenzorji so preprosto izvlečeni iz našega batchinput_ids tenzorji zahtevajo več pozornosti, vendar za ta tenzor maskiramo ~15 % žetonov – dodelimo jim ID žetona 3.

V končnem rezultatu lahko vidimo del kodiranega input_ids tenzor. Prvi ID žetona je 1 - [CLS] žeton. S pikami okoli tenzorja jih je več 3 ID-ji žetonov — to so naši na novo dodani [MASK] žetone

Gradnja DataLoaderja

 
 
Nato definiramo našo Dataset razred — ki ga uporabljamo za inicializacijo naših treh kodiranih tenzorjev kot PyTorch torch.utils.data.Dataset predmeti.

Končno naš dataset se naloži v PyTorch DataLoader objekt — ki ga uporabljamo za nalaganje naših podatkov v naš model med usposabljanjem.

Izobraževanje modela

 
 
Za trening potrebujemo dve stvari DataLoader in model. The DataLoader imamo — vendar nobenega modela.



Inicializacija modela

 
 
Za trening potrebujemo surovo (ne vnaprej usposobljeno) BERTLMHeadModel. Da bi to ustvarili, moramo najprej ustvariti konfiguracijski objekt RoBERTa, da opišemo parametre, s katerimi želimo inicializirati FiliBERTo.

Nato uvozimo in inicializiramo naš model RoBERTa z glavo za jezikovno modeliranje (LM).

Priprava na trening

 
 
Preden se premaknemo na našo vadbeno zanko, moramo nastaviti nekaj stvari. Najprej smo nastavili uporabo GPE/CPE. Nato aktiviramo način usposabljanja našega modela — in končno inicializiramo naš optimizator.

usposabljanje

 
 
Končno — čas za trening! Treniramo tako kot običajno, ko treniramo prek PyTorcha.

Če se obrnemo na Tensorboard, bomo sčasoma ugotovili, da smo izgubili – videti je obetavno.



Izguba/čas – v tej tabeli je bilo združenih več treningov

 

Pravi test

 
 
Zdaj je čas za pravi preizkus. Vzpostavimo cevovod MLM — in prosimo Lauro, da oceni rezultate. Video pregled ob 22:44 si lahko ogledate tukaj:



Najprej inicializiramo a pipeline predmet, z uporabo 'fill-mask' prepir. Nato začnite testirati naš model takole:

“čao kako va?" je pravi odgovor! To je tako napredno, kot je moja italijanščina — zato ga predajmo Lauri.

Začnemo s "buongiorno, come va?" - ali "dober dan, kako si?":

Prvi odgovor, "buongiorno, chi va?" pomeni "dober dan, kdo je tam?" — npr. nesmiselno. Toda naš drugi odgovor je pravilen!

Sledi malo težji stavek, "ciao, dove ci incontriamo oggi pomeriggio?" - ali "živjo, kje se dobimo popoldne?":

In vračamo še nekaj pozitivnih rezultatov:

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

Za konec še en, težji stavek, »cosa sarebbe successo se avessimo scelto un altro giorno?« — ali "kaj bi se zgodilo, če bi izbrali drug dan?":

Tudi tukaj vrnemo nekaj bolj dobrih odgovorov:

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

Na splošno je videti, da je naš model opravil Laurine teste — in zdaj imamo kompetenten model za italijanski jezik, imenovan FiliBERTo!

To je to za ta potek usposabljanja modela BERT iz nič!

Pokrili smo veliko področij, od pridobivanja in oblikovanja naših podatkov — vse do uporabe jezikovnega modeliranja za usposabljanje našega surovega modela BERT.

Upam, da ste uživali v tem članku! Če imate kakršna koli vprašanja, mi sporočite prek Twitter ali v komentarjih spodaj. Če želite več takšnih vsebin, jih objavim YouTube preveč.

Hvala za branje!

 

70 % popust! Obdelava naravnega jezika: NLP s transformatorji v Pythonu

Modeli transformatorjev so de facto standard v sodobnem NLP. Izkazali so se kot najizrazitejši…
 

*Vse slike so avtorske, razen kjer je navedeno drugače

 
Bio: James Briggs je podatkovni znanstvenik, specializiran za obdelavo naravnih jezikov in dela v finančnem sektorju s sedežem v Londonu v Veliki Britaniji. Je tudi samostojni mentor, pisatelj in ustvarjalec vsebin. Do avtorja lahko pridete po e-pošti (jamescalam94@gmail.com).

prvotni. Poročeno z dovoljenjem.

Povezano:

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

Časovni žig:

Več od KDnuggets