Technologiczne, Gadżety, Telefony Komórkowe, Pobieranie Aplikacji!

Przewodnik w języku Python po HuggingFace DistilBERT – mniejszy, szybszy i tańszy destylowany BERT

Uwaga: Poniższy artykuł pomoże Ci w: Przewodnik w języku Python po HuggingFace DistilBERT – mniejszy, szybszy i tańszy destylowany BERT

Metody Transfer Learning są obecnie odpowiedzialne przede wszystkim za przełom w przetwarzaniu naturalnego uczenia się (NLP). Może zapewnić najnowocześniejsze rozwiązania, używając wstępnie wyszkolonych modeli, aby uchronić nas przed wysokimi obliczeniami wymaganymi do trenowania dużych modeli. Ten post zawiera krótkie omówienie DistilBERT, wyjątkowej wydajności pokazanej przez TL w zadaniach języka naturalnego, przy użyciu wstępnie wytrenowanego modelu z destylacją wiedzy.

Opracowany przez Victor SANH, Lysandre DEBUT, Julien CHAUMOND, Thomas WOLF, z HuggingFace, DistilBERT, destylowana wersja BERT: mniejsza, szybsza, tańsza i lżejsza. Ze względu na duże rozmiary BERT-a trudno jest mu wprowadzić go do produkcji. Załóżmy, że chcemy używać tych modeli w telefonach komórkowych, więc potrzebujemy lżejszego, ale wydajnego modelu, wtedy w grę wchodzi Distil-BERT. Distil-BERT ma 97% wydajności BERT, będąc wyszkolonym na połowie parametrów BERT. BERT-base ma 110 parametrów, a BERT-large ma 340 parametrów, z którymi trudno sobie poradzić. Aby rozwiązać ten problem, stosuje się technikę destylacji w celu zmniejszenia rozmiaru tych dużych modeli.

Destylacja wiedzy

Jest uważany za model transferu wiedzy od ucznia do nauczyciela. W tej technice trenowany jest większy model/zestaw modeli i tworzony jest mniejszy model, aby naśladować ten duży. Destylacja odnosi się do kopiowania ciemnej wiedzy, na przykład krzesło biurowe można pomylić z fotelem, ale nie należy go mylić z grzybem. Z drugiej strony jego koncepcja jest podobna do wygładzania etykiet, zapobiega zbytniej pewności modelu co do jego przewidywania.

Architektura DistilBERT

Architektura studenta/Architektura DistilBERT: ogólna architektura jest taka sama jak BERT, z wyjątkiem usunięcia osadzania typu token i puli przy jednoczesnym zmniejszeniu liczby warstw o ​​współczynnik 2co w dużym stopniu wpływa na wydajność obliczeń.

Inicjalizacja ucznia: Ważne jest, aby znaleźć odpowiedni czas na inicjalizację podsieci w celu jej konwergencji podczas szkolenia modelu. Dlatego zainicjuj ucznia od nauczyciela, biorąc jedną warstwę z dwóch.

Destylacja: Model został poddany destylacji na bardzo dużych partiach przy użyciu dynamicznego maskowania i przewidywania następnego zdania (NSP). Tutaj maskowanie i NSP odnosiły się do procesu, w którym słowo do przewidzenia jest konwertowane [“MASK”] w modelu Masked Language, a cała sekwencja jest szkolona w przewidywaniu tego konkretnego słowa.

Dane i moc obliczeniowa: model przeszkolony na połączonym zbiorze danych angielskiej Wikipedii i Toronto Book Corpus[Zhu et al., 2015] NA 8 16 GB procesorów graficznych V100 przez około 90 godzin.

Wyniki eksperymentu

Ogólne zrozumienie języka: DistilBERT zachowuje 97% wydajności BERT przy 40% mniejszej liczbie parametrów. Ta wydajność jest sprawdzana w teście porównawczym General Language Understanding Evaluation (GLUE), który zawiera 9 zestawów danych do oceny systemów rozumienia języka naturalnego.

Benchmark zadań downstream: DistilBERT daje niezwykłe wyniki w niektórych zadaniach downstream, takich jak zadanie klasyfikacji nastrojów IMDB. Osiągnęło 0.6% mniejsza dokładność niż BERT, podczas gdy model jest o 40% mniejszy.

Rozmiar i szybkość wnioskowania: DistilBERT ma o 40% mniej parametrów niż BERT, a mimo to jest od niego o 60% szybszy.

Obliczenia na urządzeniu: średni czas wnioskowania modelu odpowiedzi na pytania DistilBERT na iPhonie 7 Plus jest o 71% szybszy niż model BERT-base z odpowiedziami na pytania.

Instalacja

Zainstaluj framework HuggingFace Transformers przez PyPI.

!pip instaluje transformatory

Demo HuggingFace DistilBERT

Możesz zaimportować model DistilBERT z transformatorów, jak pokazano poniżej:

z transformatorów zaimportuj DistilBertModel

A. Sprawdzenie konfiguracji

from transformers import DistilBertModel, DistilBertConfig # Inicjalizacja konfiguracji DistilBERT konfiguracja = DistilBertConfig() # Inicjalizacja modelu z konfiguracji model = DistilBertModel(configuration) # Dostęp do konfiguracji modelu configuration = model.config

B. Tokenizer DistilBERT

Podobnie jak BERT Tokenizer, zapewnia kompleksową tokenizację znaków interpunkcyjnych i słów z transformatorów. return_tensor=”pt”) dane wejściowe

Dane wyjściowe tokenizera będą następujące:

{‘input_ids’: tensor([[  101,  7592,  1010,  2026,  3899,  2003, 10140,   102]]), ‘maska_uwagi’: tensor([[1, 1, 1, 1, 1, 1, 1, 1]])}

gdzie input_ids to liczbowa reprezentacja sekwencji, której użyje model DistilBERT.

Attention_mask reprezentuje tokeny, na które należy zwrócić uwagę, a które nie.

Możesz też sprawdzić DistilBERTTokenizerFast.

C. Model DistilBERT

from transformers import DistilBertTokenizer, DistilBertModel import latarki tokenizer = DistilBertTokenizer.from_pretrained(‘distilbert-base-uncased’) model = DistilBertModel.from_pretrained(‘distilbert-base-uncased’) inputs = tokenizer(“Cześć, mój pies jest słodki”, return_tensors =”pt”) wyjścia = model (** dane wejściowe) ostatnie_ukryte_stany = wyjścia.ostatni_ukryty_stan

Sekwencja stanów ukrytych na wyjściu ostatniej warstwy modelu.

Możesz też sprawdzić DistilBERTMaskedLM.

D. Modelowanie języka maskowanego DistilBERT

z transformatorów import DistilBertTokenizer, DistilBertForMaskedLM import latarki tokenizer = DistilBertTokenizer.from_pretrained(‘distilbert-base-uncased’) model = DistilBertForMaskedLM.from_pretrained(‘distilbert-base-uncased’) inputs = tokenizer(“Stolicą Francji jest [MASK].”, return_tensor=”pt”) labels = tokenizer(“Stolicą Francji jest Paryż.”, return_tensor=”pt”)[“input_ids”]
wyjścia = model(**wejścia, etykiety=etykiety) strata = wyjścia.straty logity = wyjścia.logity

gdzie strata jest utratą modelowania języka maskowanego.

logits to wyniki przewidywania głowy modelowania języka.

E. DistilBERT do klasyfikacji sekwencji

Ten model zawiera warstwę puli na wierzchu połączonych danych wyjściowych, której można użyć do rozwiązywania problemów związanych z regresją lub klasyfikacją.

from transformers import DistilBertTokenizer, DistilBertForSequenceClassification import latarka tokenizer = DistilBertTokenizer.from_pretrained(‘distilbert-base-uncased’) model = DistilBertForSequenceClassification.from_pretrained(‘distilbert-base-uncased’) inputs = tokenizer(“Cześć, mój pies jest słodki”, return_tensors =”pt”) etykiety = latarka.tensor([1]).odcisnąć(0) # Rozmiar partii 1
wyjścia = model(**wejścia, etykiety=etykiety) strata = wyjścia.straty logity = wyjścia.logity

gdzie strata jest stratą klasyfikacyjną.

logity to wynik klasyfikacji przed Softmax.

F. DistilBERT do wielokrotnego wyboru

from transformers import DistilBertTokenizer, DistilBertForMultipleChoice import latarka tokenizer = DistilBertTokenizer.from_pretrained(‘distilbert-base-case’) model = DistilBertForMultipleChoice.from_pretrained(‘distilbert-base-cased’) prompt = “We Włoszech pizza serwowana w formalnych oprawach, np. w restauracji jest prezentowany w kawałkach”. choice0 = “Je się widelcem i nożem.” choice1 = “Jest spożywany, gdy trzyma się go w dłoni.” etykiety = latarka.tensor(0).odciśnij(0) # choice0 jest poprawne (według Wikipedii ;)), wielkość partii 1
kodowanie = tokenizer([[prompt, choice0], [prompt, choice1]], return_tensors=”pt”, padding=True) outputs = model(**{k: v.unsqueeze(0) dla k,v w encoding.items()}, labels=labels) # rozmiar partii to 1
# klasyfikator liniowy nadal wymaga nauczenia loss = outputs.loss logits = outputs.logits

G. DistilBERT do klasyfikacji tokenów

from transformers import DistilBertTokenizer, DistilBertForTokenClassification import latarka tokenizer = DistilBertTokenizer.from_pretrained(‘distilbert-base-uncased’) model = DistilBertForTokenClassification.from_pretrained(‘distilbert-base-uncased’) inputs = tokenizer(“Cześć, mój pies jest słodki”, return_tensors =”pt”) etykiety = latarka.tensor([1] * wejścia[“input_ids”].rozmiar(1)).odciśnij(0) # Rozmiar partii 1
wyjścia = model(**wejścia, etykiety=etykiety) strata = wyjścia.straty logity = wyjścia.logity

H. DistilBERT Odpowiadanie na pytania

from transformers import DistilBertTokenizer, DistilBertForQuestionAnswering import latarka tokenizer = DistilBertTokenizer.from_pretrained(‘distilbert-base-uncased’) model = DistilBertForQuestionAnswering.from_pretrained(‘distilbert-base-uncased’) question, text = “Kim był Jim Henson?”, “Jim Henson był fajną marionetką” inputs = tokenizer(question, text, return_tensors=”pt”) pozycje_początkowe = latarka.tensor([1]) pozycje_końcowe = latarka.tensor([3]) wyjścia = model(**wejściowe, pozycje_początkowe=pozycje_początkowe, pozycje_końcowe=pozycje_końcowe) strata = wyjścia.strata wyniki_początkowe = wyjścia.logiki_początkowe wyniki_końcowe = wyjścia.logiki_końcowe

Bibliografia