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:
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_length
, padding
, truncation
.
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:
Najważniejsze artykuły z ostatnich 30 dni | |||
---|---|---|---|
|
Źródło: https://www.kdnuggets.com/2021/08/train-bert-model-scratch.html
- "
- &
- Wszystkie kategorie
- analityka
- na około
- artykuł
- towary
- samochód
- budować
- Budowanie
- wezwanie
- komentarze
- składnik
- zawartość
- Tworzenie
- twórca
- dane
- nauka danych
- naukowiec danych
- dzień
- głęboka nauka
- Dyrektor
- inżynier
- Inżynierowie
- Angielski
- Cecha
- W końcu
- finansować
- i terminów, a
- format
- wolny zawód
- pełny
- dobry
- GPU
- wspaniały
- głowa
- tutaj
- W jaki sposób
- How To
- HTTPS
- olbrzymi
- obraz
- Internet
- IT
- Włochy
- Klawisz
- język
- Języki
- UCZYĆ SIĘ
- nauka
- Biblioteka
- załadować
- Londyn
- uczenie maszynowe
- Dokonywanie
- Mapy
- maska
- ML
- model
- modelowanie
- ruch
- Język naturalny
- Przetwarzanie języka naturalnego
- nlp
- Online
- koncepcja
- open source
- Inne
- zwykły tekst
- gracz
- Volcano Plenty Vaporizer Storz & Bickel
- projekt
- płomień
- Surowy
- Efekt
- przeglądu
- nauka
- Naukowcy
- zestaw
- Rozmiar
- So
- dzielić
- początek
- sklep
- historie
- test
- Testowanie
- Testy
- czas
- żeton
- Żetony
- Top
- Trening
- transformatorowy
- Uk
- UN
- us
- przypadków użycia
- Wideo
- Oglądaj
- KIM
- okna
- w ciągu
- Praca
- świat
- pisarz
- X
- youtube