BERT -mallin kouluttaminen tyhjästä

Lähdesolmu: 1013329

BERT -mallin kouluttaminen tyhjästä

Tapaa BERTin italialainen serkku FiliBERTo.


By James Briggs, Datatieteilijä



BERT, mutta Italiassa – tekijän kuva

 

Monet artikkeleistani ovat keskittyneet BERTiin – malliin, joka tuli ja hallitsi luonnollisen kielenkäsittelyn (NLP) maailmaa ja merkitsi uutta aikakautta kielimalleille.

Niille teistä, jotka eivät ehkä ole aiemmin käyttäneet muuntajamalleja (esim. mikä BERT on), prosessi näyttää hieman tältä:

  • pip install transformers
  • Alusta esikoulutettu muuntajamalli — from_pretrained.
  • Testaa sitä joillakin tiedoilla.
  • Voi olla hienosäädä mallia (kouluta sitä lisää).

Nyt tämä on loistava lähestymistapa, mutta jos vain teemme tämän, meiltä puuttuu ymmärrys omien muuntajamalliemme luomisesta.

Ja jos emme voi luoda omia muuntajamallejamme – meidän täytyy luottaa siihen, että on olemassa esikoulutettu malli, joka sopii ongelmaamme, näin ei aina ole:



Muutama kommentti ei-englanninkielisistä BERT-malleista

 

Joten tässä artikkelissa tutkimme vaiheita, jotka meidän on toteutettava rakentaaksemme oma muuntajamallimme – erityisesti BERT:n jatkokehitetty versio, nimeltään RoBERTa.

Yleiskatsaus

 
 
Prosessissa on muutama vaihe, joten ennen kuin sukeltaamme, teemme ensin yhteenvedon siitä, mitä meidän on tehtävä. Yhteensä siinä on neljä keskeistä osaa:

  • Tietojen saaminen
  • Tokenisaattorin rakentaminen
  • Syöttöputken luominen
  • Kouluta malli

Kun olemme käsitelleet jokaisen näistä osista, otamme rakentamamme tokenisaattorin ja mallin - ja tallennamme ne molemmat, jotta voimme sitten käyttää niitä samalla tavalla kuin tavallisesti from_pretrained.

Tietojen saaminen

 
 
Kuten kaikissa koneoppimisprojekteissa, tarvitsemme dataa. Mitä tulee dataan muuntajamallin koulutukseen, meillä on todella paljon valinnanvaraa – voimme käyttää melkein mitä tahansa tekstidataa.



Videoopastus OSCAR-tietojoukon lataamiseen HuggingFacen tietojoukkokirjaston avulla

 

Ja jos meillä on yksi asia, jota meillä on paljon Internetissä, se on jäsentämätöntä tekstidataa.

Yksi suurimmista tietojoukoista Internetistä kaavitun tekstin alueella on OSCAR-tietojoukko.

OSCAR-tietojoukossa on valtava määrä eri kieliä – ja yksi selkeimmistä käyttötapauksista koulutukseen tyhjästä on se, että voimme soveltaa BERT:tä joihinkin harvemmin käytettyihin kieliin, kuten telugu tai navajo.

Valitettavasti ainoa kieli, jota voin puhua jollain tasolla, on englanti - mutta tyttöystäväni on italialainen, joten hän - Laura - arvioi italiaa puhuvan BERT-mallimme - FiliBERTo -tuloksia.

Joten OSCAR-tietojoukon italian segmentin lataamiseen käytämme HuggingFacea datasets kirjasto - jonka avulla voimme asentaa pip install datasets. Sitten lataamme OSCAR_IT:n kanssa:

Katsotaanpa tätä dataset esine.

Hienoa, tallennetaan nyt tietomme sellaiseen muotoon, jota voimme käyttää tokenisaattoriamme rakentaessamme. Meidän on luotava joukko selkotekstitiedostoja, jotka sisältävät vain text ominaisuus tietojoukostamme, ja jaamme jokaisen näyte rivinvaihtoa käyttämällä n.

Yli meidän data/text/oscar_it hakemistosta löydämme:


Kuvakaappaus, jossa näkyy Windowsin Resurssienhallinta-ikkuna, joka on täynnä .txt-tiedostoja  – jotka edustavat OSCAR-tietoa.
Hakemisto, joka sisältää selkeän tekstin OSCAR-tiedostomme

 

Tokenisaattorin rakentaminen

 
 
Seuraavaksi vuorossa tokenizer! Käytettäessä muuntajia lataamme tyypillisesti tokenisaattoria vastaavan muuntajamallin rinnalle - tokenisaattori on prosessin avainkomponentti.



Video-opastus mukautetun tokenisaattorimme rakentamiseen

 

Kun rakennamme tokenisaattoriamme, syötämme sille kaikki OSCAR-tietomme, määritämme sanavarastomme koon (merkkien lukumäärä tokenisaattorissa) ja mahdolliset erityiset tunnukset.

Nyt RoBERTa-erikoisrahakkeet näyttävät tältä:

Joten varmistamme, että sisällytämme ne tähän special_tokens tokenisaattorimme parametri train menetelmäkutsu.

Tokenisaattorimme on nyt valmis, ja voimme tallentaa sen tiedoston myöhempää käyttöä varten:

Nyt meillä on kaksi tiedostoa, jotka määrittelevät uuden FiliBERTo tokenizer:

  • merges.txt — Suorittaa tekstin alustavan yhdistämisen tunnuksiin
  • vocab.json — yhdistää tunnukset token ID -tunnuksiin

Ja niiden avulla voimme siirtyä tokenisaattorimme alustamiseen, jotta voimme käyttää sitä samalla tavalla kuin mitä tahansa muuta. from_pretrained tokenisaattori.

Tokenizerin alustaminen

 
 
Alustamme ensin tokenisaattorin käyttämällä kahta aiemmin luomaamme tiedostoa - käyttämällä yksinkertaista from_pretrained:

Nyt tokenisaattorimme on valmis, voimme yrittää koodata tekstiä sillä. Koodauksessa käytämme samoja kahta menetelmää kuin tavallisesti, encode ja encode_batch.

Encodings-objektista tokens aiomme purkaa input_ids ja attention_mask tensorit käytettäväksi FiliBERTon kanssa.

Syöttöputken luominen

 
 
Koulutusprosessimme syöttöputki on koko prosessin monimutkaisempi osa. Se koostuu siitä, että otamme raaka OSCAR-harjoitustietomme, muunnamme ne ja lataamme ne a DataLoader valmiina koulutukseen.



Video esittely MLM-syöttöputkesta

 

Tietojen valmistelu

 
 
Aloitamme yhdestä näytteestä ja käymme läpi valmistelulogiikan.

Ensin meidän on avattava tiedostomme - samat tiedostot, jotka tallensimme . Txt tiedostot aikaisemmin. Jaamme jokaisen rivinvaihdon merkkien perusteella n koska tämä osoittaa yksittäiset näytteet.

Sitten koodaamme tietomme käyttämällä tokenizer - varmista, että sisällytät tärkeimmät parametrit, kuten max_lengthpaddingja truncation.

Ja nyt voimme siirtyä tensoriemme luomiseen – koulutamme malliamme maskatun kielen mallinnuksen (MLM) avulla. Joten tarvitsemme kolme tensoria:

  • input_ids - meidän token_ids noin 15 % tokeneista on maskattu maskitunnuksella <mask>.
  • huomion_naamio - tensori 1s ja 0s, merkitsee "oikeiden" merkkien/täytemerkkien sijainnin - käytetään huomiolaskelmissa.
  • tarrat - meidän token_ids with Nro naamiointi.

Jos et ole perehtynyt MLM:ään, olen selittänyt sen tätä.

Meidän attention_mask ja labels tensorit yksinkertaisesti poimitaan meidän batch.  input_ids tensorit vaativat enemmän huomiota, mutta tälle tensorille peitämme ~15% tokeneista - määritämme niille tunnuksen 3.

Lopullisessa lähdössä voimme nähdä osan koodatusta input_ids tensori. Aivan ensimmäinen token ID on 1 - [CLS] merkki. Tensorin ympärillä pisteytettynä meillä on useita 3 token-tunnukset – nämä ovat äskettäin lisätyt [MASK] kuponkia.

DataLoaderin rakentaminen

 
 
Seuraavaksi määrittelemme omamme Dataset luokka - jota käytämme kolmen koodatun tensorimme alustamiseen PyTorchiksi torch.utils.data.Dataset esineitä.

Lopuksi meidän dataset ladataan PyTorchiin DataLoader objekti - jota käytämme tietojen lataamiseen malliimme harjoituksen aikana.

Mallin kouluttaminen

 
 
Tarvitsemme koulutukseen kaksi asiaa, meidän DataLoader ja malli. The DataLoader meillä on - mutta ei mallia.



Mallin alustus

 
 
Koulutusta varten tarvitsemme raaka (ei esikoulutettu) BERTLMHeadModel. Sen luomiseksi meidän on ensin luotava RoBERTa-konfiguraatioobjekti kuvaamaan parametrit, joilla haluamme alustaa FiliBERTo.

Sitten tuomme ja alustamme RoBERTa-mallimme kielimallinnuspäällä (LM).

Harjoituksen valmistelu

 
 
Ennen kuin siirrymme harjoituslenkkiimme, meidän on määritettävä muutamia asioita. Ensin määritimme GPU/CPU:n käytön. Sitten aktivoimme mallimme harjoitustilan - ja lopuksi alustamme optimoijamme.

koulutus

 
 
Lopuksi - treeniaika! Harjoittelemme aivan kuten tavallisesti PyTorchin kautta treenattaessa.

Jos siirrymme Tensorboardiin, huomaamme tappiomme ajan myötä – se näyttää lupaavalta.



Tappio / aika — useita harjoituksia on yhdistetty tähän kaavioon

 

Todellinen testi

 
 
Nyt on oikean testin aika. Luomme MLM-putken – ja pyydämme Lauraa arvioimaan tulokset. Voit katsoa videoarvostelun klo 22:44 täältä:



Alustamme ensin a pipeline objektia käyttämällä 'fill-mask' Perustelu. Aloita sitten mallimme testaus seuraavasti:

"ciao Tulla vai?" on oikea vastaus! Se on yhtä edistynyt kuin italiani on - joten luovutetaan se Lauralle.

Aloitamme "Bongiorno, tule va?" - tai "hyvää päivää mitä kuuluu?":

Ensimmäinen vastaus: "buongiorno, chi va?" tarkoittaa "hyvää päivää, kuka siellä on?" - esim. järjetöntä. Mutta toinen vastauksemme on oikea!

Seuraavaksi hieman vaikeampi lause, "ciao, dove ci incontriamo oggi pomerggio?" - tai "Hei, missä tapaamme tänä iltapäivänä?":

Ja palaamme lisää positiivisiin tuloksiin:

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

Lopuksi vielä yksi kovempi lause, "cosa sarebbe successo se avessimo scelto un altro giorno?" — tai "mitä olisi tapahtunut, jos olisimme valinneet toisen päivän?":

Palaamme tänne myös muutaman hyvän vastauksen:

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

Kaiken kaikkiaan näyttää siltä, ​​että mallimme läpäisi Lauran testit – ja meillä on nyt pätevä italialainen malli nimeltä FiliBERTo!

Siinä kaikki tähän BERT-mallin koulutuksen alusta loppuun!

Olemme käsitelleet paljon tietojemme hankkimisesta ja muotoilusta – aina kielimallinnuksen käyttämiseen raaka BERT-mallimme kouluttamiseen.

Toivottavasti pidit tästä artikkelista! Jos sinulla on kysyttävää, kerro minulle kautta Twitter tai alla olevissa kommenteissa. Jos haluat lisää tällaista sisältöä, julkaisen sen YouTube liikaa.

Kiitos käsittelyssä!

 

70% alennus! Luonnollisen kielen käsittely: NLP muuntajilla Pythonissa

Muuntajamallit ovat nykyaikaisen NLP:n de facto standardi. He ovat osoittaneet olevansa ilmeisimpiä…
 

*Kaikki kuvat ovat tekijän omia, ellei toisin mainita

 
Bio: James Briggs on luonnontieteiden kielenkäsittelyyn erikoistunut ja finanssialalla työskentelevä datatieteilijä, jonka kotipaikka on Lontoo, Iso-Britannia. Hän on myös freelance-mentori, kirjailija ja sisällöntuottaja. Voit tavoittaa kirjoittajan sähköpostitse (jamescalam94@gmail.com).

Alkuperäinen. Postitettu luvalla.

Related:

Lähde: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Aikaleima:

Lisää aiheesta KDnuggets