Hogyan képezzünk ki egy BERT-modellt a semmiből

Forrás csomópont: 1013329

Hogyan képezzünk ki egy BERT-modellt a semmiből

Ismerje meg BERT olasz unokatestvérét, FiliBERTo-t.


By James Briggs, Data Scientist



BERT, de Olaszországban – a szerző képe

 

Sok cikkem a BERT-re összpontosított – arra a modellre, amely megjelent és uralta a természetes nyelvi feldolgozás (NLP) világát, és a nyelvi modellek új korszakát jelentette.

Azok számára, akik korábban nem használtak transzformátor modelleket (pl. mi az a BERT), a folyamat a következőképpen néz ki:

  • pip install transformers
  • Inicializáljon egy előre betanított transzformátor modellt — from_pretrained.
  • Teszteld néhány adaton.
  • Talán finomhangolja a modellt (tanítsa tovább).

Nos, ez egy nagyszerű megközelítés, de ha csak ezt tesszük, akkor hiányzik a megértés a saját transzformátormodelleink létrehozása mögött.

És ha nem tudjuk létrehozni saját transzformátormodelleinket – támaszkodnunk kell arra, hogy van egy előre kiképzett modell, amely megfelel a problémánknak, ez nem mindig van így:



Néhány megjegyzés a nem angol nyelvű BERT modellekről

 

Tehát ebben a cikkben megvizsgáljuk azokat a lépéseket, amelyeket meg kell tennünk saját transzformátormodellünk elkészítéséhez – konkrétan a BERT továbbfejlesztett változata, a RoBERTa.

Áttekintés

 
 
A folyamatnak van néhány lépése, ezért mielőtt belemerülnénk, először foglaljuk össze, mit kell tennünk. Összesen négy fő részből áll:

  • Az adatok megszerzése
  • Tokenizátor építése
  • Bemeneti folyamat létrehozása
  • A modell betanítása

Miután végigdolgoztuk ezeket a szakaszokat, fogjuk az általunk épített tokenizert és modellt – és mindkettőt elmentjük, hogy aztán ugyanúgy használhassuk őket, mint általában from_pretrained.

Az adatok megszerzése

 
 
Mint minden gépi tanulási projekthez, nekünk is szükségünk van adatokra. Ami a transzformátormodell betanításához szükséges adatokat illeti, valóban el vagyunk kényeztetve – szinte bármilyen szöveges adatot használhatunk.



Videós bemutató az OSCAR-adatkészlet letöltéséhez a HuggingFace adatkészlet-könyvtárával

 

És ha van valami, amiről bőven van az interneten – az a strukturálatlan szöveges adatok.

Az egyik legnagyobb adatkészlet az internetről lekapart szövegek területén az OSCAR adatkészlet.

Az OSCAR-adatkészlet rengeteg különböző nyelvet tartalmaz – és az egyik legegyértelműbb felhasználási eset a nulláról való képzéshez az, hogy a BERT-et néhány kevésbé használt nyelvre is alkalmazhatjuk, például a telugu vagy a navajo nyelvre.

Sajnos az egyetlen nyelv, amelyen bármilyen szintű kompetenciával tudok beszélni, az angol – de a barátnőm olasz, így ő – Laura – fogja értékelni olaszul beszélő BERT modellünk – FiliBERTo – eredményeit.

Tehát az OSCAR-adatkészlet olasz szegmensének letöltéséhez a HuggingFace-t fogjuk használni datasets könyvtár — amellyel telepíthetjük pip install datasets. Ezután letöltjük az OSCAR_IT-t a következővel:

Vessen egy pillantást a dataset tárgy.

Remek, most tároljuk az adatainkat olyan formátumban, amelyet felhasználhatunk a tokenizátorunk elkészítésekor. Létre kell hoznunk egy egyszerű szöveges fájlkészletet, amely csak a text funkciót az adatkészletünkből, és mindegyiket felosztjuk minta újsor használatával n.

A miénkben data/text/oscar_it könyvtárat találjuk:


Képernyőkép, amely egy Windows Intéző ablakot jelenít meg, amely tele van .txt fájlokkal – a sima szöveges OSCAR adatokkal
Az egyszerű szövegű OSCAR fájljainkat tartalmazó könyvtár

 

Tokenizátor építése

 
 
A következő a tokenizátor! Transzformátorok használatakor jellemzően egy tokenizátort töltünk be a megfelelő transzformátormodell mellett – a tokenizátor kulcsfontosságú eleme a folyamatnak.



Videós bemutató az egyéni tokenizátorunk elkészítéséhez

 

A tokenizerünk elkészítésekor az összes OSCAR adatunkat betápláljuk, megadjuk a szókincsünk méretét (a tokenek számát a tokenizerben), és az esetleges speciális tokeneket.

Most a RoBERTa speciális tokenek így néznek ki:

Ezért feltétlenül szerepeltetjük őket a special_tokens tokenizátorunk paramétere train metódushívás.

A tokenizátorunk készen áll, és elmenthetjük a fájlt későbbi használatra:

Most két fájlunk van, amelyek meghatározzák az új FiliBERTo tokenizátor:

  • Merges.txt — elvégzi a szöveg kezdeti leképezését tokenekre
  • vocab.json — leképezi a tokeneket tokenazonosítókra

És ezekkel továbbléphetünk a tokenizátorunk inicializálására, hogy úgy használhassuk, mint bármely mást. from_pretrained tokenizátor.

A Tokenizátor inicializálása

 
 
Először inicializáljuk a tokenizátort a korábban felépített két fájl segítségével – egy egyszerű from_pretrained:

Elkészült a tokenizerünk, megpróbálhatunk vele szöveget kódolni. A kódolás során ugyanazt a két módszert használjuk, mint általában, encode és a encode_batch.

A kódolások objektumból tokens kinyerjük a input_ids és a attention_mask tenzorok a FiliBERTo-val való használatra.

A bemeneti csővezeték létrehozása

 
 
Képzési folyamatunk bemeneti csatornája a teljes folyamat összetettebb része. Ez abból áll, hogy vesszük a nyers OSCAR edzési adatainkat, átalakítjuk és betöltjük a DataLoader edzésre készen.



Videó áttekintése az MLM beviteli folyamatról

 

Az adatok előkészítése

 
 
Egyetlen mintával kezdjük, és végigdolgozzuk az előkészítési logikát.

Először is meg kell nyitnunk a fájlunkat - ugyanazokat a fájlokat, amelyeket mentettünk . Txt fájlokat korábban. Mindegyiket újsor karakterek alapján osztjuk fel n mivel ez jelzi az egyes mintákat.

Ezután az adatainkat kódoljuk a tokenizer — Ügyeljen arra, hogy tartalmazza a kulcsfontosságú paramétereket, mint pl max_lengthpaddingés truncation.

Most pedig rátérhetünk a tenzorok létrehozására – modellünket maszkolt nyelvű modellezéssel (MLM) fogjuk képezni. Tehát három tenzorra van szükségünk:

  • input_ids - a miénk token_ids a tokenek ~15%-a maszkolt a maszk token használatával <mask>.
  • figyelem_maszk — egy tenzor 1s és 0s, a „valódi” tokenek/padding tokenek pozíciójának megjelölése – a figyelemszámításoknál használatos.
  • címkék - a miénk token_ids val vel nem maszkolás.

Ha nem ismeri az MLM-et, elmagyaráztam itt.

termékeink attention_mask és a labels tenzorok egyszerűen kivonhatók a mi batch Az input_ids A tenzorok azonban nagyobb figyelmet igényelnek, ennél a tenzornál a tokenek ~15%-át maszkoljuk – hozzárendelve a token azonosítót 3.

A végső kimenetben egy kódolt részt láthatunk input_ids tenzor. A legelső token azonosító az 1 - a [CLS] jelképes. A tenzor körül pontozottan több is van 3 token azonosítók – ezek az újonnan hozzáadott [MASK] jelzőt.

A DataLoader felépítése

 
 
Ezután meghatározzuk a sajátunkat Dataset osztály – amelyet a három kódolt tenzorunk PyTorch néven történő inicializálására használunk torch.utils.data.Dataset tárgyakat.

Végül a miénk dataset be van töltve egy PyTorch-ba DataLoader objektum — amelyet arra használunk, hogy az edzés során az adatainkat betöltsük a modellünkbe.

A modell képzése

 
 
Két dolog kell az edzéshez, a miénk DataLoader és egy modell. A DataLoader van – de nincs modellünk.



A modell inicializálása

 
 
Az edzéshez nyers (nem előképzett) BERTLMHeadModel. Ennek létrehozásához először létre kell hoznunk egy RoBERTa konfigurációs objektumot, amely leírja azokat a paramétereket, amelyekkel inicializálni szeretnénk a FiliBERTo-t.

Ezután importáljuk és inicializáljuk a RoBERTa modellünket egy nyelvi modellező (LM) fejjel.

Képzés előkészítése

 
 
Mielőtt rátérnénk az edzési körünkre, be kell állítanunk néhány dolgot. Először is beállítjuk a GPU/CPU használatot. Ezután aktiváljuk modellünk képzési módját – és végül inicializáljuk az optimalizálót.

Képzések

 
 
Végre - edzésidő! Ugyanúgy edzünk, mint általában, amikor PyTorch segítségével edzünk.

Ha átmegyünk a Tensorboard felé, idővel rá fogunk jönni a veszteségre – ez ígéretesnek tűnik.



Veszteség/idő – több edzést fűztünk össze ezen a diagramon

 

Az igazi teszt

 
 
Most itt az ideje az igazi tesztnek. Felállítottunk egy MLM-csatornát – és megkérjük Laurát, hogy értékelje az eredményeket. A 22:44-kor készült videókritikát itt tekintheti meg:



Először inicializáljuk a pipeline objektum segítségével a 'fill-mask' érv. Ezután kezdje el a modellünk tesztelését a következőképpen:

"Szia hogyan va?” a helyes válasz! Ez olyan fejlett, amennyire az olasz nyelvtudásom fejlődik – szóval, adjuk át Laurának.

Kezdjük – Buongiorno, ugye? - vagy "Jó napot! Hogy vagy?":

Az első válasz: „buongiorno, chi va?” azt jelenti, hogy "jó napot, ki van ott?" — pl. értelmetlen. De a második válaszunk helyes!

Következő egy kicsit keményebb kifejezés, „ciao, dove ci incontriamo oggi pomerggio?” - vagy "Szia, hol fogunk találkozni ma délután?":

És még néhány pozitív eredményt adunk vissza:

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

Végül még egy, keményebb mondat, „cosa sarebbe successo se avessimo scelto un altro giorno?” — vagy „mi lett volna, ha más napot választunk?”:

Ide is visszaadunk még néhány jó választ:

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

Összességében úgy tűnik, hogy modellünk megfelelt Laura tesztjein – és most már van egy hozzáértő olasz nyelvű modellünk, a FiliBERTo!

Ennyi a BERT-modell elölről történő betanításának végigjátszásához!

Az adatok megszerzésétől és formázásától kezdve – egészen a nyelvi modellezésig a nyers BERT-modellünk betanításáig – rengeteget foglalkoztunk.

Remélem tetszett ez a cikk! Ha bármilyen kérdése van, jelezze felém Twitter vagy az alábbi megjegyzésekben. Ha több ilyen tartalmat szeretnél, akkor közzéteszem Youtube túl.

Köszönöm, hogy elolvasta!

 

70% kedvezmény! Természetes nyelvi feldolgozás: NLP transzformátorokkal Pythonban

A transzformátormodellek a modern NLP de facto szabványai. Bebizonyították, hogy a legkifejezőbbek…
 

*Minden kép a szerző alkotása, kivéve ha másként jelezzük

 
Bio: James Briggs természetes nyelvi feldolgozásra szakosodott adattudós, aki a pénzügyi szektorban dolgozik Londonban, az Egyesült Királyságban. Emellett szabadúszó mentor, író és tartalomkészítő is. A szerzőt e-mailben érheti el (jamescalam94@gmail.com).

eredeti. Engedéllyel újra közzétéve.

Kapcsolódó:

Forrás: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Időbélyeg:

Még több KDnuggets