Jak wytrenować model BERT od podstaw

Węzeł źródłowy: 1013329

Jak wytrenować model BERT od podstaw

Poznaj włoskiego kuzyna BERT, FiliBERTo.


By Jamesa Briggsa, analityk danych



BERT, ale we Włoszech — zdjęcie autora

 

Wiele moich artykułów skupiało się na BERT – modelu, który pojawił się i zdominował świat przetwarzania języka naturalnego (NLP), wyznaczając nową erę modeli językowych.

Dla tych z Was, którzy być może nie korzystali wcześniej z modeli transformatorów (np. czym jest BERT), proces wygląda mniej więcej tak:

  • pip install transformers
  • Zainicjuj wstępnie wytrenowany model transformatorów — from_pretrained.
  • Przetestuj to na niektórych danych.
  • Może dopracuj model (przetrenuj go jeszcze trochę).

Jest to świetne podejście, ale jeśli tylko to zrobimy, zabraknie nam zrozumienia stojącego za tworzeniem własnych modeli transformatorów.

A jeśli nie możemy stworzyć własnych modeli transformatorów — musimy polegać na wstępnie wytrenowanym modelu, który pasuje do naszego problemu, ale nie zawsze tak jest:



Kilka komentarzy z pytaniem o nieanglojęzyczne modele BERT

 

Dlatego w tym artykule przeanalizujemy kroki, które musimy podjąć, aby zbudować własny model transformatora — w szczególności udoskonaloną wersję BERT, zwaną RoBERTa.

Przegląd

 
 
Ten proces składa się z kilku kroków, więc zanim zagłębimy się w szczegóły, podsumujmy, co musimy zrobić. W sumie istnieją cztery kluczowe części:

  • Pobieranie danych
  • Budowa tokenizera
  • Tworzenie potoku wejściowego
  • Trenowanie modelu

Po przejrzeniu każdej z tych sekcji weźmiemy zbudowany przez nas tokenizer i model — i zapiszemy je oba, abyśmy mogli następnie używać ich w taki sam sposób, jak zwykle from_pretrained.

Uzyskiwanie danych

 
 
Jak w przypadku każdego projektu uczenia maszynowego, potrzebujemy danych. Jeśli chodzi o dane do uczenia modelu transformatora, naprawdę mamy ogromny wybór – możemy wykorzystać niemal dowolne dane tekstowe.



Film instruktażowy dotyczący pobierania zestawu danych OSCAR przy użyciu biblioteki zestawów danych HuggingFace

 

A jeśli jest jedna rzecz, której mamy pod dostatkiem w Internecie – są to nieustrukturyzowane dane tekstowe.

Jednym z największych zbiorów danych w dziedzinie tekstu pobranego z Internetu jest zbiór danych OSCAR.

Zbiór danych OSCAR obejmuje ogromną liczbę różnych języków — a jednym z najbardziej oczywistych przypadków użycia szkolenia od podstaw jest możliwość zastosowania BERT do niektórych rzadziej używanych języków, takich jak telugu czy navajo.

Niestety jedynym językiem, którym potrafię w miarę biegle władać, jest angielski, ale moja dziewczyna jest Włoszką, więc ona – Laura, będzie oceniać wyniki naszego włoskojęzycznego modelu BERT – FiliBERTo.

Tak więc, aby pobrać włoski segment zbioru danych OSCAR, użyjemy HuggingFace datasets biblioteka — z którą możemy zainstalować pip install datasets. Następnie pobieramy OSCAR_IT za pomocą:

Rzućmy okiem na dataset obiekt.

Świetnie, teraz przechowujmy nasze dane w formacie, którego będziemy mogli użyć podczas budowania naszego tokenizera. Musimy utworzyć zestaw plików tekstowych zawierających tylko text funkcję z naszego zbioru danych i podzielimy każdą z nich próba za pomocą nowej linii n.

W naszym data/text/oscar_it katalog, w którym znajdziemy:


Zrzut ekranu przedstawiający okno Eksploratora Windows pełne plików .txt  — przedstawiających dane OSCAR w postaci zwykłego tekstu
Katalog zawierający nasze pliki OSCAR w postaci zwykłego tekstu

 

Budowa tokenizera

 
 
Następny w kolejności jest tokenizer! Używając transformatorów, zazwyczaj ładujemy tokenizer wraz z odpowiednim modelem transformatora — tokenizer jest kluczowym elementem tego procesu.



Film instruktażowy dotyczący tworzenia naszego niestandardowego tokenizera

 

Budując nasz tokenizer, zasilimy go wszystkimi naszymi danymi OSCAR, określimy rozmiar naszego słownictwa (liczba tokenów w tokenizerze) i wszelkie specjalne tokeny.

Teraz specjalne tokeny RoBERTa wyglądają następująco:

Dlatego dbamy o to, aby uwzględnić je w special_tokens parametr naszego tokenizera train wywołanie metody.

Nasz tokenizer jest już gotowy i możemy zapisać jego plik do późniejszego wykorzystania:

Teraz mamy dwa pliki, które definiują nasz nowy FiBERTo tokenizator:

  • łączy.txt — wykonuje wstępne mapowanie tekstu na tokeny
  • vocab.json — mapuje tokeny na identyfikatory tokenów

Dzięki temu możemy przejść do inicjowania naszego tokenizera, abyśmy mogli go używać tak samo, jak każdego innego from_pretrained tokenizator.

Inicjowanie tokenizera

 
 
Najpierw inicjujemy tokenizer, używając dwóch plików, które zbudowaliśmy wcześniej — używając prostego from_pretrained:

Teraz nasz tokenizer jest gotowy, możemy spróbować zakodować za jego pomocą jakiś tekst. Podczas kodowania używamy tych samych dwóch metod, których zwykle używamy, encode i encode_batch.

Z obiektu kodowania tokens będziemy wyodrębniać input_ids i attention_mask tensory do użytku z FiliBERTo.

Tworzenie potoku wejściowego

 
 
Rurociąg wejściowy naszego procesu szkoleniowego jest bardziej złożoną częścią całego procesu. Polega na pobraniu surowych danych szkoleniowych OSCAR, przekształceniu ich i załadowaniu do pliku DataLoader gotowy na trening.



Film instruktażowy dotyczący potoku wejściowego MLM

 

Przygotowanie danych

 
 
Zaczniemy od pojedynczej próbki i omówimy logikę przygotowania.

Najpierw musimy otworzyć nasz plik — te same pliki, które zapisaliśmy txt pliki wcześniej. Podzieliliśmy każdy na podstawie znaków nowej linii n ponieważ wskazuje to na poszczególne próbki.

Następnie kodujemy nasze dane za pomocą tokenizer — pamiętając o uwzględnieniu kluczowych parametrów, takich jak max_lengthpaddingtruncation.

A teraz możemy przejść do tworzenia naszych tensorów — będziemy trenować nasz model poprzez modelowanie języka maskowanego (MLM). Potrzebujemy więc trzech tensorów:

  • identyfikatory_wejściowe - nasz token_ids z ~15% żetonów maskowanych za pomocą żetonu maski <mask>.
  • uwaga_maska — tensor 1si 0s, oznaczanie pozycji „prawdziwych” tokenów/tokenów dopełniających – wykorzystywane w obliczeniach uwagi.
  • Etykiety - nasz token_ids w Nie maskowanie.

Jeśli nie znasz MLM, już to wyjaśniłem tutaj.

Autonomiczne attention_mask i labels tensory są po prostu wyodrębniane z naszego batch,  input_ids tensory wymagają jednak więcej uwagi, dla tego tensora maskujemy ~15% tokenów — przypisując im identyfikator tokena 3.

W końcowym wyniku możemy zobaczyć część zakodowanego pliku input_ids napinacz. Pierwszym identyfikatorem tokena jest 1 - [CLS] znak. Rozsianych wokół tensora mamy kilka 3 identyfikatory tokenów — to nasze nowo dodane [MASK] tokeny.

Budowa modułu DataLoader

 
 
Następnie definiujemy nasze Dataset class — której używamy do inicjowania naszych trzech zakodowanych tensorów jako PyTorch torch.utils.data.Dataset obiekty.

Wreszcie nasz dataset jest ładowany do PyTorch DataLoader obiekt — którego używamy do ładowania danych do naszego modelu podczas treningu.

Trenowanie modelu

 
 
Do treningu potrzebujemy dwóch rzeczy, naszej DataLoader i modelka. The DataLoader mamy — ale nie mamy modelu.



Inicjowanie modelu

 
 
Do treningu potrzebujemy surowego (nie wstępnie przeszkolonego) BERTLMHeadModel. Aby to stworzyć, musimy najpierw utworzyć obiekt konfiguracyjny RoBERTa, który będzie opisywał parametry, którymi chcemy zainicjować FiliBERTo.

Następnie importujemy i inicjujemy nasz model RoBERTa za pomocą głowicy do modelowania języka (LM).

Przygotowanie do szkolenia

 
 
Zanim przejdziemy do naszej pętli treningowej, musimy ustawić kilka rzeczy. Najpierw konfigurujemy użycie GPU/CPU. Następnie aktywujemy tryb uczenia naszego modelu — i na koniec inicjujemy nasz optymalizator.

Trening

 
 
Wreszcie – czas na trening! Trenujemy tak jak zwykle podczas szkolenia za pośrednictwem PyTorch.

Jeśli przejdziemy na Tensorboard, z czasem odkryjemy naszą stratę – wygląda obiecująco.



Strata/czas — na tym wykresie powiązano ze sobą wiele sesji treningowych

 

Prawdziwy test

 
 
Teraz czas na prawdziwy test. Stworzyliśmy rurociąg MLM i poprosiliśmy Laurę o ocenę wyników. Recenzję wideo można obejrzeć o 22:44 tutaj:



Najpierw inicjujemy a pipeline obiekt, używając 'fill-mask' argument. Następnie rozpocznij testowanie naszego modelu w następujący sposób:

"cześć jak tak?” to właściwa odpowiedź! To jest tak zaawansowane, jak tylko mój włoski — więc przekażmy to Laurze.

Zaczynamy od „buongiorno, chodź?” - lub "Dzień dobry, jak się masz?":

Pierwsza odpowiedź: „buongiorno, chi va?” oznacza „dzień dobry, kto tam jest?” — np. bezsensowne. Ale nasza druga odpowiedź jest prawidłowa!

Następnie nieco trudniejsze zdanie, „ciao, dove ci incontriamo oggi pomeriggio?” - lub „Cześć, gdzie się spotkamy dziś po południu?”:

I zwracamy kilka bardziej pozytywnych wyników:

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

Na koniec jeszcze jedno, trudniejsze zdanie, „cosa sarebbe sukceso se avessimo scelto un altro giorno?” — lub „co by się stało, gdybyśmy wybrali inny dzień?”:

Tutaj również zwracamy kilka dobrych, dobrych odpowiedzi:

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

Ogólnie rzecz biorąc, wygląda na to, że nasz model przeszedł testy Laury — i mamy teraz kompetentny model języka włoskiego o nazwie FiliBERTo!

To wszystko w tej instrukcji trenowania modelu BERT od zera!

Zajęliśmy się wieloma zagadnieniami, od pobierania i formatowania danych — aż po wykorzystanie modelowania językowego do szkolenia naszego surowego modelu BERT.

Mam nadzieję, że podobał Ci się ten artykuł! Jeśli masz jakieś pytania, daj mi znać za pośrednictwem Twitter lub w komentarzach poniżej. Jeśli chcesz więcej takich treści, publikuję dalej YouTube też.

Dziękuje za przeczytanie!

 

70% zniżki! Przetwarzanie języka naturalnego: NLP z transformatorami w Pythonie

Modele transformatorowe są de facto standardem we współczesnym NLP. Okazali się najbardziej wyrazistymi…
 

*Wszystkie zdjęcia są autorstwa autora, chyba że zaznaczono inaczej

 
Bio: Jamesa Briggsa jest naukowcem zajmującym się danymi, specjalizującym się w przetwarzaniu języka naturalnego i pracującym w sektorze finansowym, z siedzibą w Londynie w Wielkiej Brytanii. Jest także niezależnym mentorem, pisarzem i twórcą treści. Możesz skontaktować się z autorem za pośrednictwem poczty elektronicznej (jamescalam94@gmail.com).

Oryginalny. Przesłane za zgodą.

Związane z:

Źródło: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html

Znak czasu:

Więcej z Knuggety