Opret et tekstresuméprojekt med Hugging Face Transformers: Del 1

Kildeknude: 1236281

Hvornår OpenAI udgav tredje generation af deres machine learning (ML) model, der er specialiseret i tekstgenerering i juli 2020, jeg vidste, at noget var anderledes. Denne model ramte en nerve som ingen, der kom før den. Pludselig hørte jeg venner og kolleger, som kunne være interesserede i teknologi, men som normalt ikke bekymrer sig meget om de seneste fremskridt inden for AI/ML-området, tale om det. Selv The Guardian skrev en artikel om det. Eller for at være præcis model skrev artiklen, og Guardian redigerede og udgav den. Det kunne man ikke benægte – GPT-3 var en game changer.

Efter at modellen var blevet frigivet, begyndte folk straks at komme med potentielle applikationer til den. Inden for få uger blev der lavet mange imponerende demoer, som kan findes på GPT-3 hjemmeside. En særlig applikation, der fangede mit øje, var tekst opsummering - en computers evne til at læse en given tekst og opsummere dens indhold. Det er en af ​​de sværeste opgaver for en computer, fordi den kombinerer to felter inden for feltet naturlig sprogbehandling (NLP): læseforståelse og tekstgenerering. Derfor var jeg så imponeret over GPT-3-demoerne til tekstresumé.

Du kan give dem en chance Hugging Face Spaces hjemmeside. Min favorit i øjeblikket er en ansøgning der genererer sammendrag af nyhedsartikler med kun artiklens URL som input.

I denne todelte serie foreslår jeg en praktisk guide til organisationer, så du kan vurdere kvaliteten af ​​tekstresumémodeller for dit domæne.

Tutorial oversigt

Mange organisationer, jeg arbejder med (velgørende organisationer, virksomheder, ngo'er) har enorme mængder af tekster, de skal læse og opsummere – økonomiske rapporter eller nyhedsartikler, videnskabelige forskningsartikler, patentansøgninger, juridiske kontrakter og meget mere. Disse organisationer er naturligvis interesserede i at automatisere disse opgaver med NLP-teknologi. For at demonstrere det muliges kunst, bruger jeg ofte tekstopsummeringsdemoerne, som næsten aldrig undlader at imponere.

Men hvad nu?

Udfordringen for disse organisationer er, at de ønsker at vurdere tekstresumémodeller baseret på resuméer for mange, mange dokumenter – ikke ét ad gangen. De ønsker ikke at ansætte en praktikant, hvis eneste job er at åbne ansøgningen, indsætte et dokument, trykke på Opsummer knap, vent på outputtet, vurder om resuméet er godt, og gør det igen for tusindvis af dokumenter.

Jeg skrev denne tutorial med mit tidligere jeg fra fire uger siden i tankerne – det er den tutorial, jeg ville ønske, jeg havde dengang, da jeg startede på denne rejse. I den forstand er målgruppen for denne tutorial en person, der er fortrolig med AI/ML og har brugt Transformer-modeller før, men som er i begyndelsen af ​​deres tekstresumérejse og gerne vil dykke dybere ned i det. Fordi det er skrevet af en "begynder" og for begyndere, vil jeg gerne understrege, at denne tutorial er a praktisk vejledning – ikke og praktisk guide. Behandl det som om George EP Box havde sagt:

Med hensyn til hvor meget teknisk viden der kræves i denne tutorial: Det involverer noget kodning i Python, men det meste af tiden bruger vi bare koden til at kalde API'er, så der kræves heller ingen dyb kodningsviden. Det er nyttigt at være bekendt med visse begreber inden for ML, såsom hvad det betyder tog , indsætte en model, begreberne af uddannelse, valideringog testdatasæt, og så videre. Har også dyttet med Transformers bibliotek før kan være nyttigt, fordi vi bruger dette bibliotek flittigt gennem hele denne øvelse. Jeg inkluderer også nyttige links til yderligere læsning for disse begreber.

Fordi denne tutorial er skrevet af en nybegynder, forventer jeg ikke, at NLP-eksperter og avancerede deep learning-praktikere får meget af denne tutorial. I det mindste ikke fra et teknisk perspektiv – du kan dog stadig nyde læsningen, så lad være med at tage afsted endnu! Men du bliver nødt til at være tålmodig med hensyn til mine forenklinger - jeg prøvede at leve efter konceptet med at gøre alt i denne tutorial så enkelt som muligt, men ikke enklere.

Strukturen af ​​denne tutorial

Denne serie strækker sig over fire afsnit opdelt i to indlæg, hvor vi gennemgår forskellige stadier af et tekstresuméprojekt. I det første indlæg (afsnit 1) starter vi med at introducere en metrik for tekstresuméopgaver – et mål for ydeevne, der giver os mulighed for at vurdere, om et resumé er godt eller dårligt. Vi introducerer også det datasæt, vi ønsker at opsummere, og opretter en baseline ved hjælp af en no-ML-model – vi bruger en simpel heuristik til at generere et resumé ud fra en given tekst. At skabe denne baseline er et meget vigtigt skridt i ethvert ML-projekt, fordi det gør os i stand til at kvantificere, hvor store fremskridt vi gør ved at bruge AI fremover. Det giver os mulighed for at besvare spørgsmålet "Er det virkelig værd at investere i AI-teknologi?"

I det andet indlæg bruger vi en model, der allerede er blevet fortrænet til at generere resuméer (afsnit 2). Dette er muligt med en moderne tilgang i ML kaldet overføre læring. Det er endnu et nyttigt skridt, fordi vi grundlæggende tager en hyldemodel og tester den på vores datasæt. Dette giver os mulighed for at skabe endnu en baseline, som hjælper os med at se, hvad der sker, når vi rent faktisk træner modellen på vores datasæt. Tilgangen kaldes nul-shot opsummering, fordi modellen har haft nul eksponering for vores datasæt.

Derefter er det tid til at bruge en præ-trænet model og træne den på vores eget datasæt (afsnit 3). Dette kaldes også finjustering. Det gør det muligt for modellen at lære af vores datas mønstre og særheder og langsomt tilpasse sig dem. Efter at vi har trænet modellen, bruger vi den til at lave resuméer (afsnit 4).

At opsummere:

  • Del 1:
    • Afsnit 1: Brug en no-ML-model til at etablere en baseline
  • del 2:
    • Afsnit 2: Generer oversigter med en nul-skudsmodel
    • Afsnit 3: Træn en opsummeringsmodel
    • Afsnit 4: Evaluer den trænede model

Hele koden til denne øvelse er tilgængelig i det følgende GitHub repo.

Hvad vil vi have opnået ved udgangen af ​​denne vejledning?

Ved slutningen af ​​denne tutorial har vi vil ikke have en tekstopsummeringsmodel, der kan bruges i produktionen. Vi vil ikke engang have en godt opsummeringsmodel (indsæt skrigemoji her)!

Det, vi i stedet vil have, er et udgangspunkt for næste fase af projektet, som er eksperimenteringsfasen. Det er her “videnskaben” inden for datavidenskab kommer ind, for nu handler det om at eksperimentere med forskellige modeller og forskellige indstillinger for at forstå, om en god nok opsummeringsmodel kan trænes med de tilgængelige træningsdata.

Og for at være fuldstændig gennemsigtig er der en god chance for, at konklusionen bliver, at teknologien bare ikke er moden endnu, og at projektet ikke bliver implementeret. Og du skal forberede din virksomheds interessenter på den mulighed. Men det er et emne for et andet indlæg.

Afsnit 1: Brug en no-ML-model til at etablere en baseline

Dette er det første afsnit af vores selvstudie om opsætning af et tekstresuméprojekt. I dette afsnit etablerer vi en baseline ved hjælp af en meget simpel model, uden egentlig at bruge ML. Dette er et meget vigtigt skridt i ethvert ML-projekt, fordi det giver os mulighed for at forstå, hvor meget værdi ML tilføjer i løbet af projektets tid, og om det er værd at investere i det.

Koden til selvstudiet kan findes i det følgende GitHub repo.

Data, data, data

Ethvert ML-projekt starter med data! Hvis det er muligt, bør vi altid bruge data relateret til, hvad vi ønsker at opnå med et tekstresuméprojekt. Hvis vores mål for eksempel er at opsummere patentansøgninger, bør vi også bruge patentansøgninger til at træne modellen. En stor advarsel for et ML-projekt er, at træningsdata normalt skal mærkes. I forbindelse med tekstresumé betyder det, at vi skal levere den tekst, der skal opsummeres, såvel som resuméet (etiketten). Kun ved at give begge dele kan modellen lære, hvordan et godt resumé ser ud.

I denne vejledning bruger vi et offentligt tilgængeligt datasæt, men trinene og koden forbliver nøjagtig de samme, hvis vi bruger et brugerdefineret eller privat datasæt. Og igen, hvis du har en målsætning for din tekstresumémodel og har tilsvarende data, så brug venligst dine data i stedet for at få mest muligt ud af dette.

De data, vi bruger, er arXiv datasæt, som indeholder abstracts af arXiv-artikler samt deres titler. Til vores formål bruger vi abstraktet som den tekst vi ønsker at opsummere og titlen som referenceresumé. Alle trinene til at downloade og forbehandle dataene er tilgængelige i det følgende notesbog. Vi kræver en AWS identitets- og adgangsstyring (IAM) rolle, der tillader indlæsning af data til og fra Amazon Simple Storage Service (Amazon S3) for at kunne køre denne notesbog med succes. Datasættet er udviklet som en del af papiret Om brugen af ​​ArXiv som et datasæt og er licenseret under Creative Commons CC0 1.0 Universal Public Domain Dedication.

Dataene er opdelt i tre datasæt: trænings-, validerings- og testdata. Hvis du vil bruge dine egne data, skal du sørge for, at dette også er tilfældet. Følgende diagram illustrerer, hvordan vi bruger de forskellige datasæt.

Naturligvis er et almindeligt spørgsmål på dette tidspunkt: Hvor meget data har vi brug for? Som du sikkert allerede kan gætte, er svaret: det afhænger. Det afhænger af, hvor specialiseret domænet er (at opsummere patentansøgninger er ret anderledes end at opsummere nyhedsartikler), hvor præcis modellen skal være for at være brugbar, hvor meget uddannelsen af ​​modellen skal koste, og så videre. Vi vender tilbage til dette spørgsmål på et senere tidspunkt, når vi rent faktisk træner modellen, men det korte af det er, at vi skal afprøve forskellige datasætstørrelser, når vi er i eksperimenteringsfasen af ​​projektet.

Hvad gør en god model?

I mange ML-projekter er det ret ligetil at måle en models ydeevne. Det skyldes, at der normalt er lidt uklarhed omkring, om modellens resultat er korrekt. Etiketterne i datasættet er ofte binære (Sand/False, Ja/Nej) eller kategoriske. Under alle omstændigheder er det nemt i dette scenarie at sammenligne modellens output med etiketten og markere det som korrekt eller forkert.

Når du genererer tekst, bliver dette mere udfordrende. Resuméerne (etiketterne), vi leverer i vores datasæt, er kun én måde at opsummere tekst på. Men der er mange muligheder for at opsummere en given tekst. Så selvom modellen ikke matcher vores etiket 1:1, kan outputtet stadig være et gyldigt og nyttigt resumé. Så hvordan sammenligner vi modellens oversigt med den, vi leverer? Den metrik, der oftest bruges i tekstresumé til at måle kvaliteten af ​​en model, er ROUGE score. For at forstå mekanikken i denne metrik, se The Ultimate Performance Metric i NLP. Sammenfattende måler ROUGE-score overlapningen af n-gram (sammenhængende sekvens af n elementer) mellem modellens resumé (kandidatresumé) og referenceresuméet (den etiket, vi giver i vores datasæt). Men dette er selvfølgelig ikke en perfekt foranstaltning. For at forstå dens begrænsninger, tjek ud Til ROUGE eller ej til ROUGE?

Så hvordan beregner vi ROUGE-scoren? Der er en hel del Python-pakker derude til at beregne denne metrik. For at sikre sammenhæng bør vi bruge den samme metode gennem hele vores projekt. Fordi vi på et senere tidspunkt i denne tutorial vil bruge et træningsscript fra Transformers-biblioteket i stedet for at skrive vores eget, kan vi bare kigge ind i kildekode af scriptet og kopier koden, der beregner ROUGE-score:

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

Ved at bruge denne metode til at beregne scoren sikrer vi, at vi altid sammenligner æbler med æbler gennem hele projektet.

Denne funktion beregner flere ROUGE-score: rouge1, rouge2, rougeLog rougeLsum. "Summen" i rougeLsum henviser til, at denne metrik er beregnet over en hel oversigt, hvorimod rougeL beregnes som gennemsnittet over individuelle sætninger. Så hvilken ROUGE score skal vi bruge til vores projekt? Igen skal vi prøve forskellige tilgange i eksperimenteringsfasen. For hvad det er værd originalt ROUGE papir anfører, at "ROUGE-2 og ROUGE-L fungerede godt i opgaver med opsummering af enkeltdokumenter", mens "ROUGE-1 og ROUGE-L er fremragende til at evaluere korte resuméer."

Opret basislinjen

Dernæst ønsker vi at skabe basislinjen ved at bruge en simpel model uden ML. Hvad betyder det? Inden for tekstresumé bruger mange undersøgelser en meget enkel tilgang: de tager den første n sætninger i teksten og erklære den som kandidatresumé. De sammenligner derefter kandidatresuméet med referenceresuméet og beregner ROUGE-score. Dette er en enkel, men kraftfuld tilgang, som vi kan implementere i nogle få linjer kode (hele koden for denne del er i det følgende notesbog):

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)}")

Vi bruger testdatasættet til denne evaluering. Dette giver mening, fordi efter at vi har trænet modellen, bruger vi også det samme testdatasæt til den endelige evaluering. Vi prøver også forskellige tal for n: vi starter kun med den første sætning som kandidatresumé, derefter de første to sætninger og til sidst de første tre sætninger.

Følgende skærmbillede viser resultaterne for vores første model.

ROUGE-scorerne er højest, med kun den første sætning som kandidatresumé. Det betyder, at det at tage mere end én sætning gør resuméet for omfattende og fører til en lavere score. Så det betyder, at vi vil bruge resultaterne for oversigterne med én sætning som vores baseline.

Det er vigtigt at bemærke, at for sådan en simpel tilgang er disse tal faktisk ret gode, især for rouge1 score. For at sætte disse tal i sammenhæng, kan vi henvise til Pegasus modeller, som viser scorerne for en state-of-the-art model for forskellige datasæt.

Konklusion og hvad er det næste

I del 1 af vores serie introducerede vi det datasæt, som vi bruger gennem opsummeringsprojektet, samt en metrik til at evaluere opsummeringer. Vi oprettede derefter følgende baseline med en enkel, no-ML model.

I næste indlæg, bruger vi en nulskudsmodel – specifikt en model, der er blevet specifikt trænet til tekstresumé på offentlige nyhedsartikler. Denne model vil dog slet ikke blive trænet på vores datasæt (deraf navnet "zero-shot").

Jeg overlader det til dig som hjemmearbejde at gætte på, hvordan denne zero-shot model vil præstere i forhold til vores meget simple baseline. På den ene side vil det være en meget mere sofistikeret model (det er faktisk et neuralt netværk). På den anden side bruges den kun til at opsummere nyhedsartikler, så den kan måske kæmpe med de mønstre, der er iboende i arXiv-datasættet.


Om forfatteren

Heiko Hotz er en Senior Solutions Architect for AI & Machine Learning og leder Natural Language Processing (NLP)-fællesskabet inden for AWS. Før denne rolle var han chef for datavidenskab for Amazons EU-kundeservice. Heiko hjælper vores kunder med at få succes i deres AI/ML-rejse på AWS og har arbejdet med organisationer i mange brancher, herunder forsikring, finansielle tjenester, medier og underholdning, sundhedspleje, forsyningsselskaber og fremstilling. I sin fritid rejser Heiko så meget som muligt.

Tidsstempel:

Mere fra AWS maskinindlæring