Skapa ett textsammanfattningsprojekt med Hugging Face Transformers: Del 1

Källnod: 1236281

När OpenAI släppte den tredje generationen av deras maskininlärningsmodell (ML) som är specialiserad på textgenerering i juli 2020, jag visste att något var annorlunda. Denna modell slog en nerv som ingen som kom före den. Plötsligt hörde jag vänner och kollegor, som kanske är intresserade av teknik men vanligtvis inte bryr sig så mycket om de senaste framstegen inom AI/ML-området, prata om det. Till och med The Guardian skrev en artikel om det. Eller för att vara exakt modell skrev artikeln och Guardian redigerade och publicerade den. Det gick inte att förneka det - GPT-3 var en game changer.

Efter att modellen hade släppts började folk genast komma med potentiella applikationer för den. Inom några veckor skapades många imponerande demos, som kan hittas på GPT-3 webbplats. En speciell applikation som fångade mitt öga var textsammanfattning – en dators förmåga att läsa en given text och sammanfatta dess innehåll. Det är en av de svåraste uppgifterna för en dator eftersom den kombinerar två områden inom området naturlig språkbehandling (NLP): läsförståelse och textgenerering. Det är därför jag blev så imponerad av GPT-3-demos för textsammanfattning.

Du kan ge dem ett försök på Hugging Face Spaces webbplats. Min favorit för tillfället är en ansökan som genererar sammanfattningar av nyhetsartiklar med bara webbadressen till artikeln som input.

I denna tvådelade serie föreslår jag en praktisk guide för organisationer så att du kan bedöma kvaliteten på textsammanfattningsmodeller för din domän.

Handledningsöversikt

Många organisationer jag arbetar med (välgörenhetsorganisationer, företag, icke-statliga organisationer) har enorma mängder texter de behöver läsa och sammanfatta – finansiella rapporter eller nyhetsartiklar, vetenskapliga forskningsartiklar, patentansökningar, juridiska kontrakt och mer. Naturligtvis är dessa organisationer intresserade av att automatisera dessa uppgifter med NLP-teknik. För att demonstrera det möjligas konst använder jag ofta textsammanfattningsdemonerna, som nästan aldrig misslyckas med att imponera.

Men nu vad?

Utmaningen för dessa organisationer är att de vill bedöma textsammanfattningsmodeller baserade på sammanfattningar för många, många dokument – ​​inte ett i taget. De vill inte anställa en praktikant vars enda jobb är att öppna ansökan, klistra in ett dokument, trycka på Sammanfatta knappen, vänta på resultatet, bedöm om sammanfattningen är bra och gör det igen för tusentals dokument.

Jag skrev den här handledningen med mitt tidigare jag från fyra veckor sedan i åtanke – det är handledningen jag önskar att jag hade då när jag började på den här resan. I den meningen är målgruppen för denna handledning någon som är bekant med AI/ML och har använt Transformer-modeller tidigare, men som är i början av sin textsammanfattningsresa och vill dyka djupare in i den. Eftersom det är skrivet av en "nybörjare" och för nybörjare, vill jag betona det faktum att den här handledningen är a praktisk guide – inte d praktisk guide. Vänligen behandla det som om George EP Box har sagt:

När det gäller hur mycket teknisk kunskap som krävs i denna handledning: Det involverar viss kodning i Python, men för det mesta använder vi bara koden för att anropa API:er, så ingen djup kodningskunskap krävs heller. Det är bra att vara bekant med vissa begrepp inom ML, till exempel vad det betyder att tåg och distribuera en modell, begreppen av utbildning, godkännandeoch testdatauppsättningar, och så vidare. Har också pysslat med Transformers bibliotek innan kan vara användbart, eftersom vi använder det här biblioteket flitigt genom hela den här handledningen. Jag inkluderar också användbara länkar för vidare läsning för dessa begrepp.

Eftersom den här handledningen är skriven av en nybörjare, förväntar jag mig inte att NLP-experter och avancerade djupinlärningsutövare ska få mycket av den här handledningen. Åtminstone inte ur ett tekniskt perspektiv – du kanske fortfarande tycker om läsningen, så snälla lämna inte ännu! Men du måste ha tålamod när det gäller mina förenklingar – jag försökte leva efter konceptet att göra allt i denna handledning så enkelt som möjligt, men inte enklare.

Strukturen för denna handledning

Denna serie sträcker sig över fyra avsnitt uppdelade i två inlägg, där vi går igenom olika stadier av ett textsammanfattningsprojekt. I det första inlägget (avsnitt 1) ​​börjar vi med att introducera ett mått för textsammanfattningsuppgifter – ett prestationsmått som gör att vi kan bedöma om en sammanfattning är bra eller dålig. Vi introducerar också den datauppsättning vi vill sammanfatta och skapar en baslinje med en no-ML-modell – vi använder en enkel heuristik för att generera en sammanfattning från en given text. Att skapa denna baslinje är ett mycket viktigt steg i alla ML-projekt eftersom det gör det möjligt för oss att kvantifiera hur stora framsteg vi gör genom att använda AI framöver. Det låter oss svara på frågan "Är det verkligen värt att investera i AI-teknik?"

I det andra inlägget använder vi en modell som redan är förutbildad för att generera sammanfattningar (avsnitt 2). Detta är möjligt med ett modernt tillvägagångssätt i ML som kallas överför lärande. Det är ytterligare ett användbart steg eftersom vi i princip tar en hyllmodell och testar den på vår datauppsättning. Detta gör att vi kan skapa ytterligare en baslinje, som hjälper oss att se vad som händer när vi faktiskt tränar modellen på vår datauppsättning. Tillvägagångssättet kallas nollskottssammanfattning, eftersom modellen har haft noll exponering för vår datauppsättning.

Efter det är det dags att använda en förtränad modell och träna den på vår egen datauppsättning (avsnitt 3). Detta kallas också finjustering. Det gör det möjligt för modellen att lära av mönstren och egenheter i vår data och långsamt anpassa sig till dem. Efter att vi tränat modellen använder vi den för att skapa sammanfattningar (avsnitt 4).

För att sammanfatta:

  • Del 1:
    • Avsnitt 1: Använd en no-ML-modell för att fastställa en baslinje
  • del 2:
    • Avsnitt 2: Generera sammanfattningar med en nollbildsmodell
    • Avsnitt 3: Träna upp en sammanfattningsmodell
    • Avsnitt 4: Utvärdera den tränade modellen

Hela koden för denna handledning finns tillgänglig i följande GitHub repo.

Vad kommer vi att ha uppnått i slutet av denna handledning?

I slutet av denna handledning har vi vana ha en textsammanfattningsmodell som kan användas i produktionen. Vi kommer inte ens ha en god summeringsmodell (infoga skrik-emoji här)!

Det vi istället kommer att ha är en utgångspunkt för nästa fas i projektet, som är experimentfasen. Det är här ”vetenskapen” inom datavetenskap kommer in, för nu handlar det om att experimentera med olika modeller och olika inställningar för att förstå om en tillräckligt bra sammanfattningsmodell kan tränas med tillgänglig träningsdata.

Och, för att vara helt transparent, finns det en god chans att slutsatsen blir att tekniken bara inte är mogen än och att projektet inte kommer att genomföras. Och du måste förbereda dina företagsintressenter för den möjligheten. Men det är ett ämne för ett annat inlägg.

Avsnitt 1: Använd en no-ML-modell för att fastställa en baslinje

Detta är det första avsnittet i vår handledning om hur du skapar ett textsammanfattningsprojekt. I det här avsnittet upprättar vi en baslinje med en mycket enkel modell, utan att faktiskt använda ML. Detta är ett mycket viktigt steg i alla ML-projekt, eftersom det låter oss förstå hur mycket värde ML tillför under projektets tid och om det är värt att investera i det.

Koden för handledningen finns i följande GitHub repo.

Data, data, data

Varje ML-projekt börjar med data! Om möjligt bör vi alltid använda data relaterad till vad vi vill uppnå med ett textsammanfattningsprojekt. Om vårt mål till exempel är att sammanfatta patentansökningar bör vi också använda patentansökningar för att träna modellen. En stor varning för ett ML-projekt är att träningsdata vanligtvis behöver märkas. I samband med textsammanfattning betyder det att vi måste tillhandahålla texten som ska sammanfattas såväl som sammanfattningen (etiketten). Endast genom att tillhandahålla båda kan modellen lära sig hur en bra sammanfattning ser ut.

I den här handledningen använder vi en allmänt tillgänglig datauppsättning, men stegen och koden förblir exakt desamma om vi använder en anpassad eller privat datauppsättning. Och återigen, om du har ett mål i åtanke för din textsammanfattningsmodell och har motsvarande data, använd din data istället för att få ut det mesta av detta.

De uppgifter vi använder är arXiv dataset, som innehåller sammanfattningar av arXiv-artiklar samt deras titlar. I vårt syfte använder vi abstraktet som den text vi vill sammanfatta och titeln som referenssammanfattning. Alla steg för nedladdning och förbearbetning av data är tillgängliga i det följande anteckningsbok. Vi kräver en AWS identitets- och åtkomsthantering (IAM) roll som tillåter laddning av data till och från Amazon enkel lagringstjänst (Amazon S3) för att kunna köra den här anteckningsboken framgångsrikt. Datauppsättningen utvecklades som en del av uppsatsen Om användningen av ArXiv som en datamängd och är licensierad enligt Creative Commons CC0 1.0 Universal Public Domain Dedication.

Datan är uppdelad i tre datauppsättningar: utbildnings-, validerings- och testdata. Om du vill använda dina egna uppgifter, se till att så är fallet också. Följande diagram illustrerar hur vi använder de olika datamängderna.

Naturligtvis är en vanlig fråga vid det här laget: Hur mycket data behöver vi? Som du säkert redan kan gissa är svaret: det beror på. Det beror på hur specialiserad domänen är (att sammanfatta patentansökningar skiljer sig ganska mycket från att sammanfatta nyhetsartiklar), hur noggrann modellen behöver vara för att vara användbar, hur mycket utbildningen av modellen ska kosta, och så vidare. Vi återkommer till denna fråga vid ett senare tillfälle när vi faktiskt tränar modellen, men det korta med det är att vi måste prova olika datauppsättningsstorlekar när vi är i experimentfasen av projektet.

Vad gör en bra modell?

I många ML-projekt är det ganska enkelt att mäta en modells prestanda. Det beror på att det vanligtvis är lite oklarheter kring om modellens resultat är korrekt. Etiketterna i datamängden är ofta binära (Sant/False, Ja/Nej) eller kategoriska. Hur som helst är det enkelt i det här scenariot att jämföra modellens utdata med etiketten och markera den som korrekt eller felaktig.

När du skapar text blir detta mer utmanande. Sammanfattningarna (etiketterna) vi tillhandahåller i vår datauppsättning är bara ett sätt att sammanfatta text. Men det finns många möjligheter att sammanfatta en given text. Så även om modellen inte matchar vår etikett 1:1, kan resultatet fortfarande vara en giltig och användbar sammanfattning. Så hur jämför vi modellens sammanfattning med den vi tillhandahåller? Det mått som används oftast i textsammanfattning för att mäta kvaliteten på en modell är ROUGE-poäng. För att förstå mekaniken i detta mått, se Det ultimata prestationsmåttet i NLP. Sammanfattningsvis mäter ROUGE-poängen överlappningen av n-gram (sammanhängande sekvens av n poster) mellan modellens sammanfattning (kandidatsammanfattning) och referenssammanfattningen (etiketten vi tillhandahåller i vår datauppsättning). Men detta är naturligtvis inte ett perfekt mått. För att förstå dess begränsningar, kolla in Till ROUGE eller inte till ROUGE?

Så, hur beräknar vi ROUGE-poängen? Det finns en hel del Python-paket där ute för att beräkna detta mått. För att säkerställa konsekvens bör vi använda samma metod under hela vårt projekt. Eftersom vi vid en senare tidpunkt i den här handledningen kommer att använda ett träningsskript från Transformers-biblioteket istället för att skriva vårt eget, kan vi bara kika in i källkod av skriptet och kopiera koden som beräknar ROUGE-poängen:

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

Genom att använda den här metoden för att beräkna poängen säkerställer vi att vi alltid jämför äpplen med äpplen under hela projektet.

Denna funktion beräknar flera ROUGE-poäng: rouge1, rouge2, rougeLoch rougeLsum. "Summan" i rougeLsum hänvisar till det faktum att detta mått beräknas över en hel sammanfattning, medan rougeL beräknas som genomsnittet över enskilda meningar. Så, vilket ROUGE-poäng ska vi använda för vårt projekt? Återigen måste vi prova olika tillvägagångssätt i experimentfasen. För vad det är värt original ROUGE papper anger att "ROUGE-2 och ROUGE-L fungerade bra i sammanfattningsuppgifter för enskilda dokument" medan "ROUGE-1 och ROUGE-L presterar utmärkt när det gäller att utvärdera korta sammanfattningar."

Skapa baslinjen

Därefter vill vi skapa baslinjen genom att använda en enkel modell utan ML. Vad betyder det? Inom området textsammanfattning använder många studier ett mycket enkelt tillvägagångssätt: de tar det första n meningar i texten och förklara den som kandidatsammanfattning. De jämför sedan kandidatsammanfattningen med referenssammanfattningen och beräknar ROUGE-poängen. Detta är ett enkelt men kraftfullt tillvägagångssätt som vi kan implementera i några rader kod (hela koden för denna del finns i följande anteckningsbok):

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 använder testdataset för denna utvärdering. Detta är vettigt eftersom efter att vi tränat modellen använder vi också samma testdatauppsättning för den slutliga utvärderingen. Vi provar även olika nummer för n: vi börjar med endast den första meningen som kandidatsammanfattning, sedan de två första meningarna och slutligen de tre första meningarna.

Följande skärmdump visar resultaten för vår första modell.

ROUGE-poängen är högst, med endast den första meningen som kandidatsammanfattning. Det betyder att att ta mer än en mening gör sammanfattningen för utförlig och leder till lägre poäng. Så det betyder att vi kommer att använda poängen för sammanfattningarna med en mening som vår baslinje.

Det är viktigt att notera att för ett så enkelt tillvägagångssätt är dessa siffror faktiskt ganska bra, särskilt för rouge1 Göra. För att sätta dessa siffror i sitt sammanhang kan vi hänvisa till Pegasus-modeller, som visar poängen för en toppmodern modell för olika datamängder.

Slutsats och vad som händer härnäst

I del 1 av vår serie introducerade vi datauppsättningen som vi använder under hela sammanfattningsprojektet samt ett mått för att utvärdera sammanfattningar. Vi skapade sedan följande baslinje med en enkel modell utan ML.

I nästa inlägg, använder vi en nollbildsmodell – närmare bestämt en modell som har utbildats specifikt för textsammanfattning i offentliga nyhetsartiklar. Den här modellen kommer dock inte att tränas alls på vår datauppsättning (därav namnet "zero-shot").

Jag överlåter till dig som läxa att gissa hur den här nollskottsmodellen kommer att prestera jämfört med vår mycket enkla baslinje. Å ena sidan kommer det att vara en mycket mer sofistikerad modell (det är faktiskt ett neuralt nätverk). Å andra sidan används den bara för att sammanfatta nyhetsartiklar, så den kan kämpa med mönstren som är inneboende i arXiv-datauppsättningen.


Om författaren

Heiko Hotz är en senior lösningsarkitekt för AI och maskininlärning och leder NLP-gemenskapen (Natural Language Processing) inom AWS. Innan den här rollen var han chef för datavetenskap för Amazons EU Customer Service. Heiko hjälper våra kunder att bli framgångsrika i sin AI/ML-resa på AWS och har arbetat med organisationer i många branscher, inklusive försäkring, finansiella tjänster, media och underhållning, hälsovård, verktyg och tillverkning. På fritiden reser Heiko så mycket som möjligt.

Tidsstämpel:

Mer från AWS maskininlärning