Skonfiguruj projekt podsumowania tekstu za pomocą Hugging Face Transformers: część 1

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

Kiedy OpenAI wydali trzecią generację swojego modelu uczenia maszynowego (ML), który specjalizuje się w generowaniu tekstu w lipcu 2020 r., Wiedziałem, że coś jest inne. Ten model uderzył w nerwy jak nikt, kto był przed nim. Nagle usłyszałem, jak rozmawiają o tym przyjaciele i koledzy, którzy mogą być zainteresowani technologią, ale zwykle nie interesują się najnowszymi osiągnięciami w przestrzeni AI/ML. Nawet Guardian napisał artykuł o tym. Lub, by być precyzyjnym, model napisał artykuł, a Guardian go zredagował i opublikował. Nie można było temu zaprzeczyć – GPT-3 zmienił zasady gry.

Po wypuszczeniu modelu ludzie natychmiast zaczęli wymyślać dla niego potencjalne zastosowania. W ciągu kilku tygodni powstało wiele imponujących dem, które można znaleźć na Witryna GPT-3. Jedna szczególna aplikacja, która przykuła moją uwagę, to podsumowanie tekstu – zdolność komputera do odczytania danego tekstu i podsumowania jego treści. Jest to jedno z najtrudniejszych zadań dla komputera, ponieważ łączy w sobie dwie dziedziny w dziedzinie przetwarzania języka naturalnego (NLP): czytanie ze zrozumieniem i generowanie tekstu. Dlatego byłem pod takim wrażeniem dem GPT-3 do podsumowania tekstu.

Możesz spróbować na Witryna Przytulanie twarzy Spaces. Moim ulubionym w tej chwili jest an aplikacja który generuje streszczenia artykułów z wiadomościami z samym adresem URL artykułu jako danymi wejściowymi.

W tej dwuczęściowej serii proponuję praktyczny przewodnik dla organizacji, dzięki któremu możesz ocenić jakość modeli podsumowania tekstu w swojej domenie.

Przegląd samouczka

Wiele organizacji, z którymi współpracuję (organizacje charytatywne, firmy, organizacje pozarządowe) ma ogromne ilości tekstów, które muszą przeczytać i podsumować – raporty finansowe lub artykuły prasowe, prace naukowe, wnioski patentowe, umowy prawne i wiele innych. Oczywiście organizacje te są zainteresowane automatyzacją tych zadań za pomocą technologii NLP. Aby zademonstrować sztukę tego, co możliwe, często korzystam z dem podsumowujących tekst, które prawie nigdy nie przestają zachwycać.

Ale co teraz?

Wyzwaniem dla tych organizacji jest to, że chcą oceniać modele podsumowań tekstowych na podstawie podsumowań wielu, wielu dokumentów – a nie jednego na raz. Nie chcą zatrudniać stażysty, którego jedynym zadaniem jest otwieranie aplikacji, wklejanie dokumentu, wciskanie Podsumuj przycisk, poczekaj na wynik, oceń, czy podsumowanie jest dobre i zrób to jeszcze raz dla tysięcy dokumentów.

Napisałem ten samouczek z myślą o moim poprzednim wcieleniu sprzed czterech tygodni – jest to samouczek, którego chciałbym mieć wtedy, gdy zaczynałem tę podróż. W tym sensie docelową grupą odbiorców tego samouczka jest ktoś, kto jest zaznajomiony z AI/ML i korzystał już z modeli Transformera, ale jest na początku swojej przygody z podsumowaniem tekstu i chce się w to głębiej zagłębić. Ponieważ jest napisany przez „początkującego” i dla początkujących, chcę podkreślić, że ten samouczek jest a praktyczny przewodnik – nie dotychczasowy praktyczny przewodnik. Potraktuj to tak, jakby Pudełko George'a EP powiedział:

Jeśli chodzi o to, ile wiedzy technicznej jest wymaganej w tym samouczku: wymaga trochę kodowania w Pythonie, ale przez większość czasu używamy kodu tylko do wywoływania interfejsów API, więc nie jest wymagana również głęboka wiedza o kodowaniu. Dobrze jest znać pewne koncepcje uczenia maszynowego, na przykład co to znaczy: pociąg i rozwijać model, koncepcje trening, uprawomocnienie, testowe zbiory danych, i tak dalej. Bawiłem się również Biblioteka transformatorów wcześniej może się przydać, ponieważ intensywnie korzystamy z tej biblioteki w tym samouczku. Zawieram również przydatne linki do dalszej lektury tych pojęć.

Ponieważ ten samouczek został napisany przez początkującego, nie oczekuję, że eksperci NLP i zaawansowani praktycy głębokiego uczenia się zdobędą wiele z tego samouczka. Przynajmniej nie z technicznego punktu widzenia – jednak lektura nadal może ci się spodobać, więc proszę jeszcze nie wychodź! Ale będziesz musiał uzbroić się w cierpliwość, jeśli chodzi o moje uproszczenia – starałem się żyć zgodnie z koncepcją, aby wszystko w tym samouczku było tak proste, jak to tylko możliwe, ale nie prostsze.

Struktura tego samouczka

Ta seria obejmuje cztery sekcje podzielone na dwa posty, w których przechodzimy przez różne etapy projektu streszczenia tekstu. W pierwszym poście (sekcja 1) zaczynamy od wprowadzenia miernika zadań podsumowujących tekst – miernika wydajności, który pozwala nam ocenić, czy podsumowanie jest dobre, czy złe. Wprowadzamy również zbiór danych, który chcemy podsumować i stworzyć linię bazową za pomocą modelu bez ML – używamy prostej heurystyki do wygenerowania podsumowania z danego tekstu. Stworzenie tej linii bazowej jest niezwykle ważnym krokiem w każdym projekcie ML, ponieważ pozwala nam określić ilościowo, jaki postęp robimy, korzystając z AI w przyszłości. Pozwala odpowiedzieć na pytanie „Czy naprawdę warto inwestować w technologię AI?”

W drugim poście wykorzystujemy model, który został już wstępnie przeszkolony do generowania podsumowań (sekcja 2). Jest to możliwe dzięki nowoczesnemu podejściu w ML o nazwie przenieś naukę. To kolejny przydatny krok, ponieważ w zasadzie bierzemy gotowy model i testujemy go na naszym zbiorze danych. To pozwala nam stworzyć kolejną linię bazową, która pomoże nam zobaczyć, co się dzieje, gdy faktycznie trenujemy model na naszym zbiorze danych. Podejście nazywa się podsumowanie zerowe, ponieważ model miał zerową ekspozycję na nasz zbiór danych.

Następnie nadszedł czas, aby użyć wstępnie wytrenowanego modelu i wytrenować go na naszym własnym zbiorze danych (sekcja 3). Nazywa się to również strojenie. Umożliwia modelowi uczenie się na podstawie wzorców i specyfiki naszych danych i powolne dostosowywanie się do nich. Po wytrenowaniu modelu używamy go do tworzenia podsumowań (sekcja 4).

Podsumowując:

  • 1 część:
    • Sekcja 1: Użyj modelu bez ML do ustalenia punktu odniesienia
  • Część 2:
    • Sekcja 2: Generowanie podsumowań za pomocą modelu zerowego
    • Sekcja 3: Trenuj model podsumowujący
    • Sekcja 4: Ocena wytrenowanego modelu

Cały kod tego samouczka jest dostępny poniżej GitHub repo.

Co osiągniemy pod koniec tego samouczka?

Pod koniec tego samouczka nie będzie mieć model podsumowania tekstu, który można wykorzystać w produkcji. Nie będziemy mieli nawet dobry model podsumowania (tu wstaw emoji krzyku)!

Zamiast tego będziemy mieli punkt wyjścia do następnej fazy projektu, czyli fazy eksperymentów. W tym miejscu wkracza „nauka” w nauce o danych, ponieważ teraz chodzi o eksperymentowanie z różnymi modelami i różnymi ustawieniami, aby zrozumieć, czy wystarczająco dobry model podsumowujący można wytrenować przy użyciu dostępnych danych szkoleniowych.

A żeby być całkowicie przejrzystym, istnieje duża szansa, że ​​wniosek będzie taki, że technologia po prostu nie jest jeszcze dojrzała i projekt nie zostanie wdrożony. I musisz przygotować swoich interesariuszy biznesowych na taką możliwość. Ale to już temat na inny post.

Sekcja 1: Użyj modelu bez ML do ustalenia punktu odniesienia

To jest pierwsza część naszego samouczka na temat konfigurowania projektu podsumowania tekstu. W tej sekcji ustalamy punkt odniesienia przy użyciu bardzo prostego modelu, bez faktycznego korzystania z ML. Jest to bardzo ważny krok w każdym projekcie ML, ponieważ pozwala nam zrozumieć, ile wartości ML dodaje w czasie trwania projektu i czy warto w nią inwestować.

Kod do samouczka można znaleźć poniżej GitHub repo.

Dane, dane, dane

Każdy projekt ML zaczyna się od danych! Jeśli to możliwe, zawsze powinniśmy korzystać z danych związanych z tym, co chcemy osiągnąć za pomocą projektu streszczenia tekstu. Na przykład, jeśli naszym celem jest podsumowanie zgłoszeń patentowych, powinniśmy również wykorzystać zgłoszenia patentowe do trenowania modelu. Dużym zastrzeżeniem dla projektu ML jest to, że dane treningowe zwykle muszą być oznaczone. W kontekście streszczenia tekstu oznacza to, że musimy podać tekst do streszczenia, a także streszczenie (etykietę). Dopiero dostarczając oba, model może dowiedzieć się, jak wygląda dobre podsumowanie.

W tym samouczku używamy publicznie dostępnego zestawu danych, ale kroki i kod pozostają dokładnie takie same, jeśli używamy niestandardowego lub prywatnego zestawu danych. I znowu, jeśli masz na myśli cel dla swojego modelu podsumowania tekstu i masz odpowiednie dane, zamiast tego użyj swoich danych, aby jak najlepiej go wykorzystać.

Dane, których używamy, to zbiór danych arXiv, który zawiera streszczenia artykułów arXiv wraz z ich tytułami. Dla naszych celów używamy streszczenia jako tekstu, który chcemy podsumować, a tytułu jako streszczenia referencyjnego. Wszystkie kroki pobierania i wstępnego przetwarzania danych są dostępne poniżej notatnik. Wymagamy AWS Zarządzanie tożsamością i dostępem (IAM) rola umożliwiająca ładowanie danych do iz Usługa Amazon Simple Storage (Amazon S3), aby pomyślnie uruchomić ten notebook. Zbiór danych został opracowany w ramach artykułu O wykorzystaniu ArXiv jako zbioru danych i jest licencjonowany pod Creative Commons CC0 1.0 Uniwersalna dedykacja domeny publicznej.

Dane są podzielone na trzy zestawy danych: dane treningowe, walidacyjne i testowe. Jeśli chcesz korzystać z własnych danych, upewnij się, że tak też jest. Poniższy diagram ilustruje, w jaki sposób korzystamy z różnych zestawów danych.

Oczywiście w tym momencie często zadawane jest pytanie: Ile danych potrzebujemy? Jak zapewne już się domyślasz, odpowiedź brzmi: to zależy. Zależy to od tego, jak wyspecjalizowana jest domena (podsumowywanie zgłoszeń patentowych różni się znacznie od podsumowywania artykułów prasowych), jak dokładny musi być model, aby był użyteczny, ile powinno kosztować szkolenie modelu i tak dalej. Wrócimy do tego pytania w późniejszym momencie, kiedy faktycznie trenujemy model, ale krótko mówiąc, musimy wypróbować różne rozmiary zestawów danych, gdy jesteśmy w fazie eksperymentów projektu.

Co składa się na dobry model?

W wielu projektach ML pomiar wydajności modelu jest dość prosty. Dzieje się tak, ponieważ zwykle nie ma wątpliwości, czy wynik modelu jest poprawny. Etykiety w zestawie danych są często binarne (prawda/fałsz, tak/nie) lub kategoryczne. W każdym razie w tym scenariuszu łatwo jest porównać dane wyjściowe modelu z etykietą i oznaczyć je jako prawidłowe lub nieprawidłowe.

Podczas generowania tekstu staje się to trudniejsze. Podsumowania (etykiety), które udostępniamy w naszym zbiorze danych, to tylko jeden sposób podsumowania tekstu. Istnieje jednak wiele możliwości streszczenia danego tekstu. Tak więc, nawet jeśli model nie pasuje do naszej etykiety 1:1, dane wyjściowe mogą nadal być ważnym i użytecznym podsumowaniem. Jak więc porównać podsumowanie modelu z tym, które udostępniamy? Miarą najczęściej używaną w podsumowaniu tekstu do pomiaru jakości modelu jest Wynik ROUGE. Aby zrozumieć mechanikę tej metryki, zapoznaj się z Najwyższa metryka wydajności w NLP. Podsumowując, wynik ROUGE mierzy nakładanie się n-gramów (ciągła sekwencja n pozycji) między podsumowaniem modelu (podsumowaniem kandydata) a podsumowaniem referencyjnym (etykieta, którą zapewniamy w naszym zbiorze danych). Ale oczywiście nie jest to środek doskonały. Aby zrozumieć jego ograniczenia, sprawdź Do ROUGE czy nie do ROUGE?

Jak więc obliczyć wynik ROUGE? Istnieje wiele pakietów Pythona do obliczania tej metryki. Aby zapewnić spójność, powinniśmy stosować tę samą metodę w całym naszym projekcie. Ponieważ w dalszej części tego samouczka użyjemy skryptu szkoleniowego z biblioteki Transformers zamiast pisać własny, możemy po prostu zajrzeć do Kod źródłowy skryptu i skopiuj kod, który oblicza wynik ROUGE:

from datasets import load_metric
metric = load_metric("rouge") def calc_rouge_scores(candidates, references): result = metric.compute(predictions=candidates, references=references, use_stemmer=True) result = {key: round(value.mid.fmeasure * 100, 1) for key, value in result.items()} return result

Używając tej metody do obliczania wyniku, zapewniamy, że w całym projekcie zawsze porównujemy jabłka z jabłkami.

Ta funkcja oblicza kilka wyników ROUGE: rouge1, rouge2, rougeL, rougeLsum. „Suma” w rougeLsum odnosi się do faktu, że ta metryka jest obliczana na podstawie całego podsumowania, podczas gdy rougeL jest obliczana jako średnia z poszczególnych zdań. Więc jaki wynik ROUGE powinniśmy wykorzystać w naszym projekcie? Ponownie musimy wypróbować różne podejścia w fazie eksperymentów. Za to, co jest warte, oryginalny papier ROUGE stwierdza, że ​​„ROUGE-2 i ROUGE-L działały dobrze w zadaniach podsumowania pojedynczych dokumentów”, podczas gdy „ROUGE-1 i ROUGE-L świetnie sprawdzają się w ocenie krótkich podsumowań”.

Utwórz linię bazową

Następnie chcemy utworzyć linię bazową za pomocą prostego modelu bez ML. Co to znaczy? W dziedzinie streszczenia tekstów w wielu badaniach stosuje się bardzo proste podejście: przyjmują pierwszeństwo n zdania tekstu i ogłosić go streszczeniem kandydata. Następnie porównują podsumowanie kandydata z podsumowaniem referencyjnym i obliczają wynik ROUGE. Jest to proste, ale potężne podejście, które możemy zaimplementować w kilku linijkach kodu (cały kod tej części znajduje się w następującym notatnik):

import re ref_summaries = list(df_test['summary']) for i in range (3): candidate_summaries = list(df_test['text'].apply(lambda x: ' '.join(re.split(r'(?<=[.:;])s', x)[:i+1]))) print(f"First {i+1} senctences: Scores {calc_rouge_scores(candidate_summaries, ref_summaries)}")

Do tej oceny używamy testowego zestawu danych. Ma to sens, ponieważ po wytrenowaniu modelu używamy również tego samego zestawu danych testowych do końcowej oceny. Próbujemy też różnych liczb dla n: zaczynamy od pierwszego zdania jako streszczenia kandydata, następnie od dwóch pierwszych zdań i na końcu od pierwszych trzech zdań.

Poniższy zrzut ekranu przedstawia wyniki dla naszego pierwszego modelu.

Wyniki ROUGE są najwyższe, tylko pierwsze zdanie jest podsumowaniem kandydata. Oznacza to, że wzięcie więcej niż jednego zdania powoduje, że podsumowanie jest zbyt szczegółowe i prowadzi do niższego wyniku. Oznacza to, że użyjemy wyników dla podsumowań jednozdaniowych jako naszej linii bazowej.

Należy zauważyć, że przy tak prostym podejściu liczby te są w rzeczywistości całkiem dobre, zwłaszcza dla rouge1 wynik. Aby umieścić te liczby w kontekście, możemy odwołać się do Modele Pegasus, który pokazuje wyniki najnowocześniejszego modelu dla różnych zestawów danych.

Wniosek i co dalej

W części 1 naszej serii wprowadziliśmy zestaw danych, którego używamy w całym projekcie podsumowania, a także metrykę do oceny podsumowań. Następnie stworzyliśmy następującą linię bazową z prostym modelem bez uczenia maszynowego.

W Następny wpis, używamy modelu zerowego, czyli modelu, który został specjalnie przeszkolony pod kątem podsumowywania tekstu w artykułach z wiadomościami publicznymi. Jednak ten model nie będzie w ogóle wytrenowany na naszym zbiorze danych (stąd nazwa „zero-shot”).

Zgadywanie, jak ten model z zerowym strzałem będzie działał w porównaniu z naszym bardzo prostym punktem odniesienia, zostawiam wam jako pracę domową. Z jednej strony będzie to znacznie bardziej wyrafinowany model (w rzeczywistości jest to sieć neuronowa). Z drugiej strony jest używany tylko do podsumowywania artykułów z wiadomościami, więc może mieć problemy z wzorcami, które są nieodłącznie związane z zestawem danych arXiv.


O autorze

Heiko Hotza jest starszym architektem rozwiązań w zakresie sztucznej inteligencji i uczenia maszynowego oraz kieruje społecznością przetwarzania języka naturalnego (NLP) w ramach AWS. Przed objęciem tego stanowiska był szefem Data Science w dziale obsługi klienta Amazon w UE. Heiko pomaga naszym klientom odnieść sukces w ich podróży AI/ML w AWS i współpracował z organizacjami z wielu branż, w tym ubezpieczeń, usług finansowych, mediów i rozrywki, opieki zdrowotnej, mediów i produkcji. W wolnym czasie Heiko jak najwięcej podróżuje.

Znak czasu:

Więcej z Uczenie maszynowe AWS