Sett opp et tekstoppsummeringsprosjekt med Hugging Face Transformers: Del 1

Kilde node: 1236281

Når OpenAI lanserte tredje generasjon av maskinlæringsmodellen deres (ML) som spesialiserer seg på tekstgenerering i juli 2020, jeg visste at noe var annerledes. Denne modellen traff en nerve som ingen som kom før den. Plutselig hørte jeg venner og kolleger, som kanskje er interessert i teknologi, men vanligvis ikke bryr seg så mye om de siste fremskrittene innen AI/ML-området, snakke om det. Selv The Guardian skrev en artikkel om det. Eller for å være presis modell skrev artikkelen og Guardian redigerte og publiserte den. Det var ikke å nekte for det - GPT-3 var en game changer.

Etter at modellen var utgitt, begynte folk umiddelbart å komme med potensielle søknader for den. I løpet av uker ble det laget mange imponerende demoer, som du kan finne på GPT-3 nettsted. En spesiell applikasjon som fanget meg var tekstoppsummering – datamaskinens evne til å lese en gitt tekst og oppsummere innholdet. Det er en av de vanskeligste oppgavene for en datamaskin fordi den kombinerer to felt innen feltet naturlig språkbehandling (NLP): leseforståelse og tekstgenerering. Det er derfor jeg ble så imponert over GPT-3-demoene for tekstoppsummering.

Du kan prøve dem Hugging Face Spaces nettsted. Min favoritt for øyeblikket er en søknad som genererer sammendrag av nyhetsartikler med bare URL-en til artikkelen som input.

I denne todelte serien foreslår jeg en praktisk veiledning for organisasjoner slik at du kan vurdere kvaliteten på tekstoppsummeringsmodeller for ditt domene.

Opplæringsoversikt

Mange organisasjoner jeg jobber med (veldedige organisasjoner, selskaper, frivillige organisasjoner) har enorme mengder tekster de trenger å lese og oppsummere – økonomiske rapporter eller nyhetsartikler, vitenskapelige forskningsartikler, patentsøknader, juridiske kontrakter og mer. Naturligvis er disse organisasjonene interessert i å automatisere disse oppgavene med NLP-teknologi. For å demonstrere det muliges kunst bruker jeg ofte tekstoppsummeringsdemoene, som nesten aldri mislykkes i å imponere.

Men hva nå?

Utfordringen for disse organisasjonene er at de ønsker å vurdere tekstoppsummeringsmodeller basert på sammendrag for mange, mange dokumenter – ikke ett om gangen. De ønsker ikke å ansette en praktikant hvis eneste jobb er å åpne søknaden, lime inn et dokument, trykke på Oppsummer knappen, vent på resultatet, vurder om sammendraget er bra, og gjør det på nytt for tusenvis av dokumenter.

Jeg skrev denne opplæringen med mitt fortid for fire uker siden i tankene - det er opplæringen jeg skulle ønske jeg hadde da jeg begynte på denne reisen. Sånn sett er målgruppen for denne opplæringen noen som er kjent med AI/ML og har brukt Transformer-modeller før, men som er i begynnelsen av sin tekstoppsummeringsreise og ønsker å dykke dypere ned i den. Fordi det er skrevet av en "nybegynner" og for nybegynnere, vil jeg understreke det faktum at denne opplæringen er a praktisk veiledning – ikke de praktisk veiledning. Vennligst behandle det som om George EP-boks har sagt:

Når det gjelder hvor mye teknisk kunnskap som kreves i denne opplæringen: Det involverer noe koding i Python, men mesteparten av tiden bruker vi bare koden til å kalle APIer, så det kreves ingen dyp kodingskunnskap heller. Det er nyttig å være kjent med visse begreper om ML, for eksempel hva det betyr tog og utplassere en modell, konseptene til trening, valideringog test datasett, og så videre. Har også drevet med Transformers bibliotek før kan være nyttig, fordi vi bruker dette biblioteket mye gjennom denne opplæringen. Jeg inkluderer også nyttige lenker for videre lesing for disse konseptene.

Fordi denne opplæringen er skrevet av en nybegynner, forventer jeg ikke at NLP-eksperter og avanserte dyplæringsutøvere får mye av denne opplæringen. I hvert fall ikke fra et teknisk perspektiv – du kan likevel like lesestoffet, så vær så snill å ikke gå ennå! Men du må være tålmodig med hensyn til mine forenklinger - jeg prøvde å leve etter konseptet med å gjøre alt i denne opplæringen så enkelt som mulig, men ikke enklere.

Strukturen til denne opplæringen

Denne serien strekker seg over fire seksjoner delt inn i to innlegg, der vi går gjennom ulike stadier av et tekstoppsummeringsprosjekt. I det første innlegget (del 1) starter vi med å introdusere en beregning for tekstoppsummeringsoppgaver – et mål på ytelse som lar oss vurdere om et sammendrag er bra eller dårlig. Vi introduserer også datasettet vi ønsker å oppsummere og lager en grunnlinje ved hjelp av en no-ML-modell – vi bruker en enkel heuristikk for å generere et sammendrag fra en gitt tekst. Å lage denne grunnlinjen er et svært viktig skritt i ethvert ML-prosjekt fordi det gjør oss i stand til å kvantifisere hvor mye fremgang vi gjør ved å bruke AI fremover. Det lar oss svare på spørsmålet "Er det virkelig verdt å investere i AI-teknologi?"

I det andre innlegget bruker vi en modell som allerede er forhåndsopplært for å generere sammendrag (del 2). Dette er mulig med en moderne tilnærming i ML kalt overføre læring. Det er nok et nyttig skritt fordi vi i utgangspunktet tar en hyllemodell og tester den på datasettet vårt. Dette lar oss lage en annen grunnlinje, som hjelper oss å se hva som skjer når vi faktisk trener modellen på datasettet vårt. Tilnærmingen kalles nullskuddsoppsummering, fordi modellen har hatt null eksponering for datasettet vårt.

Etter det er det på tide å bruke en forhåndstrent modell og trene den på vårt eget datasett (seksjon 3). Dette kalles også finjustering. Det gjør det mulig for modellen å lære av mønstrene og særegenhetene til dataene våre og sakte tilpasse seg dem. Etter at vi har trent modellen, bruker vi den til å lage sammendrag (avsnitt 4).

For å oppsummere:

  • Del 1:
    • Del 1: Bruk en no-ML-modell for å etablere en baseline
  • Del 2:
    • Del 2: Generer sammendrag med en nullskuddsmodell
    • Del 3: Tren opp en oppsummeringsmodell
    • Del 4: Evaluer den trente modellen

Hele koden for denne opplæringen er tilgjengelig i det følgende GitHub repo.

Hva vil vi ha oppnådd ved slutten av denne opplæringen?

Ved slutten av denne opplæringen har vi ikke vil ha en tekstoppsummeringsmodell som kan brukes i produksjon. Vi vil ikke engang ha en god oppsummeringsmodell (sett inn skrike-emoji her)!

Det vi i stedet skal ha er et utgangspunkt for neste fase av prosjektet, som er eksperimenteringsfasen. Det er her «vitenskapen» innen datavitenskap kommer inn, for nå handler det om å eksperimentere med ulike modeller og ulike innstillinger for å forstå om en god nok oppsummeringsmodell kan trenes med de tilgjengelige treningsdataene.

Og, for å være helt transparent, er det en god sjanse for at konklusjonen blir at teknologien bare ikke er moden ennå og at prosjektet ikke vil bli implementert. Og du må forberede bedriftens interessenter på den muligheten. Men det er et tema for et annet innlegg.

Del 1: Bruk en no-ML-modell for å etablere en baseline

Dette er den første delen av veiledningen vår om å sette opp et tekstoppsummeringsprosjekt. I denne delen etablerer vi en baseline ved å bruke en veldig enkel modell, uten å faktisk bruke ML. Dette er et veldig viktig skritt i ethvert ML-prosjekt, fordi det lar oss forstå hvor mye verdi ML tilfører i løpet av prosjektets tid og om det er verdt å investere i det.

Koden for opplæringen finner du i det følgende GitHub repo.

Data, data, data

Hvert ML-prosjekt starter med data! Om mulig bør vi alltid bruke data relatert til hva vi ønsker å oppnå med et tekstoppsummeringsprosjekt. For eksempel, hvis målet vårt er å oppsummere patentsøknader, bør vi også bruke patentsøknader for å trene modellen. Et stort forbehold for et ML-prosjekt er at treningsdataene vanligvis må merkes. I sammenheng med tekstoppsummering betyr det at vi må gi teksten som skal oppsummeres så vel som sammendraget (etiketten). Bare ved å gi begge deler kan modellen lære hvordan en god oppsummering ser ut.

I denne opplæringen bruker vi et offentlig tilgjengelig datasett, men trinnene og koden forblir nøyaktig den samme hvis vi bruker et tilpasset eller privat datasett. Og igjen, hvis du har et mål i tankene for tekstoppsummeringsmodellen din og har tilsvarende data, vennligst bruk dataene dine i stedet for å få mest mulig ut av dette.

Dataene vi bruker er arXiv datasett, som inneholder sammendrag av arXiv-artikler samt titlene deres. Til vårt formål bruker vi abstraktet som teksten vi ønsker å oppsummere og tittelen som referansesammendraget. Alle trinnene for å laste ned og forhåndsbehandle dataene er tilgjengelige i det følgende bærbare. Vi krever en AWS identitets- og tilgangsadministrasjon (IAM) rolle som tillater lasting av data til og fra Amazon enkel lagringstjeneste (Amazon S3) for å kunne kjøre denne bærbare datamaskinen. Datasettet ble utviklet som en del av papiret Om bruken av ArXiv som et datasett og er lisensiert under Creative Commons CC0 1.0 Universal Public Domain Dedication.

Dataene er delt inn i tre datasett: opplæring, validering og testdata. Hvis du vil bruke dine egne data, sørg for at dette også er tilfelle. Følgende diagram illustrerer hvordan vi bruker de forskjellige datasettene.

Naturligvis er et vanlig spørsmål på dette tidspunktet: Hvor mye data trenger vi? Som du sikkert allerede kan gjette, er svaret: det kommer an på. Det avhenger av hvor spesialisert domenet er (oppsummering av patentsøknader er ganske forskjellig fra å oppsummere nyhetsartikler), hvor nøyaktig modellen må være for å være nyttig, hvor mye opplæringen av modellen skal koste, og så videre. Vi kommer tilbake til dette spørsmålet på et senere tidspunkt når vi faktisk trener modellen, men det korte med det er at vi må prøve ut forskjellige datasettstørrelser når vi er i eksperimenteringsfasen av prosjektet.

Hva gjør en god modell?

I mange ML-prosjekter er det ganske enkelt å måle en modells ytelse. Det er fordi det vanligvis er liten uklarhet rundt om modellens resultat er riktig. Etikettene i datasettet er ofte binære (True/False, Yes/No) eller kategoriske. I alle fall er det enkelt i dette scenariet å sammenligne modellens utdata med etiketten og merke den som riktig eller feil.

Når du genererer tekst, blir dette mer utfordrende. Sammendragene (etikettene) vi gir i datasettet vårt er bare én måte å oppsummere tekst på. Men det er mange muligheter for å oppsummere en gitt tekst. Så selv om modellen ikke samsvarer med etiketten 1:1, kan utdataene fortsatt være et gyldig og nyttig sammendrag. Så hvordan sammenligner vi modellens sammendrag med den vi gir? Den metrikken som brukes oftest i tekstoppsummering for å måle kvaliteten på en modell er ROUGE-poengsum. For å forstå mekanikken til denne metrikken, se The Ultimate Performance Metric i NLP. Oppsummert måler ROUGE-poengsummen overlappingen av n-gram (sammenhengende sekvens av n elementer) mellom modellens sammendrag (kandidatsammendrag) og referansesammendraget (etiketten vi gir i datasettet vårt). Men dette er selvfølgelig ikke et perfekt mål. For å forstå begrensningene, sjekk ut Å ROUGE eller ikke til ROUGE?

Så hvordan beregner vi ROUGE-poengsummen? Det er ganske mange Python-pakker der ute for å beregne denne metrikken. For å sikre konsistens bør vi bruke samme metode gjennom hele prosjektet. Fordi vi på et senere tidspunkt i denne opplæringen vil bruke et treningsskript fra Transformers-biblioteket i stedet for å skrive vårt eget, kan vi bare kikke inn i kildekoden av skriptet og kopier koden som beregner ROUGE-poengsummen:

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 å bruke denne metoden for å beregne poengsummen sikrer vi at vi alltid sammenligner epler med epler gjennom hele prosjektet.

Denne funksjonen beregner flere ROUGE-poengsummer: rouge1, rouge2, rougeLog rougeLsum. "Summen" i rougeLsum refererer til det faktum at denne beregningen er beregnet over et helt sammendrag, mens rougeL beregnes som gjennomsnitt over individuelle setninger. Så hvilken ROUGE-poengsum bør vi bruke for prosjektet vårt? Igjen må vi prøve forskjellige tilnærminger i eksperimenteringsfasen. For hva det er verdt originalt ROUGE papir sier at "ROUGE-2 og ROUGE-L fungerte bra i enkeltdokumentoppsummeringsoppgaver" mens "ROUGE-1 og ROUGE-L presterer utmerket i å evaluere korte sammendrag."

Lag grunnlinjen

Deretter ønsker vi å lage grunnlinjen ved å bruke en enkel modell uten ML. Hva betyr det? Innen tekstoppsummering bruker mange studier en veldig enkel tilnærming: de tar den første n setninger i teksten og erklære den som kandidatsammendraget. De sammenligner deretter kandidatsammendraget med referansesammendraget og beregner ROUGE-poengsummen. Dette er en enkel, men kraftig tilnærming som vi kan implementere i noen få linjer med kode (hele koden for denne delen er i følgende bærbare):

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 bruker testdatasettet til denne evalueringen. Dette er fornuftig fordi etter at vi har trent modellen, bruker vi også det samme testdatasettet for den endelige evalueringen. Vi prøver også forskjellige tall for n: vi starter med kun den første setningen som kandidatsammendrag, deretter de to første setningene, og til slutt de tre første setningene.

Følgende skjermbilde viser resultatene for vår første modell.

ROUGE-skårene er høyest, med bare den første setningen som kandidatsammendrag. Dette betyr at å ta mer enn én setning gjør sammendraget for detaljert og fører til en lavere poengsum. Så det betyr at vi vil bruke poengsummene for sammendragene med én setning som vår baseline.

Det er viktig å merke seg at for en så enkel tilnærming er disse tallene faktisk ganske gode, spesielt for rouge1 score. For å sette disse tallene i sammenheng kan vi henvise til Pegasus modeller, som viser poengsummen til en toppmoderne modell for forskjellige datasett.

Konklusjon og hva som skjer videre

I del 1 av serien vår introduserte vi datasettet som vi bruker gjennom oppsummeringsprosjektet, samt en beregning for å evaluere sammendrag. Vi opprettet deretter følgende grunnlinje med en enkel modell uten ML.

neste post, bruker vi en nullskuddsmodell – spesifikt en modell som er spesifikt opplært for tekstoppsummering på offentlige nyhetsartikler. Denne modellen vil imidlertid ikke bli trent i det hele tatt på datasettet vårt (derav navnet "zero-shot").

Jeg overlater det til deg som lekser å gjette på hvordan denne nullskuddsmodellen vil prestere sammenlignet med vår veldig enkle grunnlinje. På den ene siden vil det være en mye mer sofistikert modell (det er faktisk et nevralt nettverk). På den annen side brukes den bare til å oppsummere nyhetsartikler, så den kan slite med mønstrene som er iboende til arXiv-datasettet.


om forfatteren

Heiko Hotz er en senior løsningsarkitekt for AI og maskinlæring og leder Natural Language Processing-fellesskapet (NLP) innen AWS. Før denne rollen var han sjef for datavitenskap for Amazons EU-kundeservice. Heiko hjelper kundene våre med å lykkes i deres AI/ML-reise på AWS og har jobbet med organisasjoner i mange bransjer, inkludert forsikring, finansielle tjenester, media og underholdning, helsevesen, verktøy og produksjon. På fritiden reiser Heiko så mye som mulig.

Tidstempel:

Mer fra AWS maskinlæring