Configurați un proiect de rezumare a textului cu Hugging Face Transformers: Partea 1

Nodul sursă: 1236281

Cand OpenAI au lansat cea de-a treia generație a modelului lor de învățare automată (ML) care este specializat în generarea de text în iulie 2020, știam că ceva este diferit. Acest model a lovit un nerv ca nimeni dinaintea lui. Dintr-o dată i-am auzit pe prieteni și colegi, care ar putea fi interesați de tehnologie, dar de obicei nu le pasă prea mult de cele mai recente progrese în spațiul AI/ML, vorbind despre asta. Chiar și Guardian a scris un articol despre. Sau, mai precis, cel model a scris articolul, iar The Guardian l-a editat și publicat. Nu se putea nega - GPT-3 a fost un schimbător de joc.

După ce modelul a fost lansat, oamenii au început imediat să vină cu potențiale aplicații pentru el. În câteva săptămâni, au fost create multe demonstrații impresionante, care pot fi găsite pe Site-ul web GPT-3. O aplicație specială care mi-a atras atenția a fost rezumat text - capacitatea unui computer de a citi un anumit text și de a rezuma conținutul acestuia. Este una dintre cele mai grele sarcini pentru un computer, deoarece combină două domenii în domeniul procesării limbajului natural (NLP): înțelegerea lecturii și generarea de text. De aceea am fost atât de impresionat de demonstrațiile GPT-3 pentru rezumatul textului.

Puteți să le încercați pe Site-ul Hugging Face Spaces. Cel mai preferat în acest moment este an cerere care generează rezumate ale articolelor de știri cu doar adresa URL a articolului ca intrare.

În această serie din două părți, vă propun un ghid practic pentru organizații, astfel încât să puteți evalua calitatea modelelor de rezumare a textului pentru domeniul dvs.

Prezentare generală a tutorialului

Multe organizații cu care lucrez (organizații caritabile, companii, ONG-uri) au cantități uriașe de texte pe care trebuie să le citească și să le rezumă – rapoarte financiare sau articole de știri, lucrări de cercetare științifică, cereri de brevet, contracte legale și multe altele. Desigur, aceste organizații sunt interesate în automatizarea acestor sarcini cu tehnologia NLP. Pentru a demonstra arta posibilului, folosesc adesea demonstrațiile de rezumare a textului, care aproape niciodată nu reușesc să impresioneze.

Dar acum ce?

Provocarea pentru aceste organizații este că doresc să evalueze modele de rezumare a textului bazate pe rezumate pentru multe, multe documente – nu unul câte unul. Nu vor să angajeze un stagiar al cărui singur loc de muncă este să deschidă aplicația, să insereze un document, să apese Rezuma butonul, așteptați rezultatul, evaluați dacă rezumatul este bun și faceți asta din nou pentru mii de documente.

Am scris acest tutorial având în vedere trecutul meu de acum patru săptămâni – este tutorialul pe care mi-aș fi dorit să îl am atunci când am început această călătorie. În acest sens, publicul țintă al acestui tutorial este cineva care este familiarizat cu AI/ML și a folosit modele Transformer înainte, dar se află la începutul călătoriei lor de rezumare a textului și dorește să se afunde mai adânc în el. Pentru că este scris de un „începător” și pentru începători, vreau să subliniez faptul că acest tutorial este a ghid practic – nu il ghid practic. Vă rog să o tratați ca și cum George EP Box a spus:

În ceea ce privește cât de multe cunoștințe tehnice sunt necesare în acest tutorial: implică ceva codare în Python, dar de cele mai multe ori folosim codul doar pentru a apela API-uri, deci nu sunt necesare cunoștințe aprofundate de codare. Este util să fii familiarizat cu anumite concepte de ML, cum ar fi ceea ce înseamnă tren și implementa un model, conceptele de pregătire, validare, și seturi de date de testare, și așa mai departe. De asemenea, după ce m-am plimbat cu Biblioteca Transformers înainte ar putea fi util, deoarece folosim această bibliotecă pe scară largă pe parcursul acestui tutorial. De asemenea, includ link-uri utile pentru citiri suplimentare pentru aceste concepte.

Deoarece acest tutorial este scris de un începător, nu mă aștept ca experții NLP și practicienii avansați în învățarea profundă să obțină o mare parte din acest tutorial. Cel puțin nu din perspectivă tehnică – s-ar putea totuși să vă bucure de lectură, așa că vă rugăm să nu plecați încă! Dar va trebui să aveți răbdare în ceea ce privește simplificările mele – am încercat să trăiesc după conceptul de a face totul din acest tutorial cât mai simplu posibil, dar nu mai simplu.

Structura acestui tutorial

Această serie se întinde pe patru secțiuni împărțite în două postări, în care parcurgem diferite etape ale unui proiect de rezumare a textului. În prima postare (secțiunea 1), începem prin a introduce o metrică pentru sarcinile de rezumare a textului – o măsură a performanței care ne permite să evaluăm dacă un rezumat este bun sau rău. Introducem, de asemenea, setul de date pe care dorim să-l rezumam și creăm o linie de bază folosind un model no-ML - folosim o euristică simplă pentru a genera un rezumat dintr-un text dat. Crearea acestei linii de bază este un pas de importanță vitală în orice proiect ML, deoarece ne permite să cuantificăm cât de mult progresăm pe viitor utilizând AI. Ne permite să răspundem la întrebarea „Merită cu adevărat să investim în tehnologia AI?”

În al doilea post, folosim un model care a fost deja pregătit în prealabil pentru a genera rezumate (secțiunea 2). Acest lucru este posibil cu o abordare modernă în ML numită transfer de învățare. Este un alt pas util pentru că, practic, luăm un model de la raft și îl testăm pe setul nostru de date. Acest lucru ne permite să creăm o altă linie de bază, care ne ajută să vedem ce se întâmplă atunci când antrenăm de fapt modelul pe setul nostru de date. Abordarea se numește rezumat zero-shot, deoarece modelul a avut expunere zero la setul nostru de date.

După aceea, este timpul să folosim un model pre-antrenat și să-l antrenăm pe propriul nostru set de date (secțiunea 3). Acest lucru se mai numește reglaj fin. Permite modelului să învețe din tiparele și idiosincraziile datelor noastre și să se adapteze încet la acestea. După ce antrenăm modelul, îl folosim pentru a crea rezumate (secțiunea 4).

Pentru a rezuma:

  • Partea 1:
    • Secțiunea 1: Utilizați un model fără ML pentru a stabili o linie de bază
  • Partea 2:
    • Secțiunea 2: Generați rezumate cu un model zero-shot
    • Secțiunea 3: Antrenează un model de rezumat
    • Secțiunea 4: Evaluați modelul antrenat

Întregul cod pentru acest tutorial este disponibil în cele ce urmează GitHub repo.

Ce vom fi realizat până la sfârșitul acestui tutorial?

Până la sfârșitul acestui tutorial, noi nu va au un model de rezumat text care poate fi utilizat în producție. Nici măcar nu vom avea bine model de rezumat (inserați emoji-ul strigăt aici)!

Ceea ce vom avea în schimb este un punct de plecare pentru următoarea fază a proiectului, care este faza de experimentare. Aici intervine „știința” în știința datelor, deoarece acum este vorba despre experimentarea cu diferite modele și setări diferite pentru a înțelege dacă un model de rezumat suficient de bun poate fi antrenat cu datele de antrenament disponibile.

Și, pentru a fi complet transparent, există șanse mari ca concluzia să fie că tehnologia nu este încă coaptă și că proiectul nu va fi implementat. Și trebuie să vă pregătiți părțile interesate de afaceri pentru această posibilitate. Dar acesta este un subiect pentru o altă postare.

Secțiunea 1: Utilizați un model fără ML pentru a stabili o linie de bază

Aceasta este prima secțiune a tutorialului nostru despre configurarea unui proiect de rezumare a textului. În această secțiune, stabilim o linie de bază folosind un model foarte simplu, fără a folosi efectiv ML. Acesta este un pas foarte important în orice proiect ML, deoarece ne permite să înțelegem cât de multă valoare adaugă ML pe parcursul proiectului și dacă merită să investim în el.

Codul tutorialului poate fi găsit în cele ce urmează GitHub repo.

Date, date, date

Fiecare proiect ML începe cu date! Dacă este posibil, ar trebui să folosim întotdeauna date legate de ceea ce dorim să realizăm cu un proiect de rezumat text. De exemplu, dacă scopul nostru este de a rezuma cererile de brevet, ar trebui să folosim și cererile de brevet pentru a instrui modelul. O mare avertizare pentru un proiect ML este că datele de antrenament trebuie de obicei etichetate. În contextul rezumarii textului, asta înseamnă că trebuie să furnizăm textul care trebuie rezumat, precum și rezumatul (eticheta). Numai furnizând ambele, modelul poate afla cum arată un rezumat bun.

În acest tutorial, folosim un set de date disponibil public, dar pașii și codul rămân exact aceleași dacă folosim un set de date personalizat sau privat. Și din nou, dacă aveți un obiectiv în minte pentru modelul dvs. de rezumare a textului și aveți date corespunzătoare, vă rugăm să utilizați datele dvs. pentru a profita la maximum de acest lucru.

Datele pe care le folosim sunt setul de date arXiv, care conține rezumate ale lucrărilor arXiv, precum și titlurile acestora. În scopul nostru, folosim rezumatul ca text pe care vrem să-l rezumam și titlul ca rezumat de referință. Toți pașii de descărcare și preprocesare a datelor sunt disponibili în cele ce urmează caiet. Avem nevoie de un Gestionarea identității și accesului AWS (IAM) care permite încărcarea datelor către și de la Serviciul Amazon de stocare simplă (Amazon S3) pentru a rula acest notebook cu succes. Setul de date a fost dezvoltat ca parte a lucrării Despre utilizarea ArXiv ca set de date și este licențiat sub Creative Commons CC0 1.0 Universal Public Domain Dedication.

Datele sunt împărțite în trei seturi de date: date de instruire, validare și testare. Dacă doriți să utilizați propriile date, asigurați-vă că acesta este și cazul. Următoarea diagramă ilustrează modul în care folosim diferitele seturi de date.

Desigur, o întrebare frecventă în acest moment este: de câte date avem nevoie? După cum probabil puteți deja ghici, răspunsul este: depinde. Depinde de cât de specializat este domeniul (rezumarea cererilor de brevet este destul de diferită de rezumarea articolelor de știri), cât de precis trebuie să fie modelul pentru a fi util, cât de mult ar trebui să coste pregătirea modelului și așa mai departe. Revenim la această întrebare la un moment ulterior, când antrenăm de fapt modelul, dar scurtul este că trebuie să încercăm diferite dimensiuni de seturi de date atunci când suntem în faza de experimentare a proiectului.

Ce face un model bun?

În multe proiecte ML, este destul de simplu să măsurați performanța unui model. Asta pentru că, de obicei, există puțină ambiguitate în ceea ce privește dacă rezultatul modelului este corect. Etichetele din setul de date sunt adesea binare (adevărat/fals, da/nu) sau categorice. În orice caz, în acest scenariu este ușor să compari rezultatul modelului cu eticheta și să o marchezi ca corectă sau incorectă.

Când se generează text, acest lucru devine mai dificil. Rezumatele (etichetele) pe care le oferim în setul nostru de date sunt doar o modalitate de a rezuma textul. Dar există multe posibilități de a rezuma un anumit text. Deci, chiar dacă modelul nu se potrivește cu eticheta noastră 1:1, rezultatul poate fi totuși un rezumat valid și util. Deci, cum comparăm rezumatul modelului cu cel oferit de noi? Valoarea care este folosită cel mai des în rezumarea textului pentru a măsura calitatea unui model este scor ROUGE. Pentru a înțelege mecanica acestei metrici, consultați Ultima măsură de performanță în NLP. Pe scurt, scorul ROUGE măsoară suprapunerea n-grame (secvența contiguă a n itemi) între rezumatul modelului (rezumatul candidatului) și rezumatul de referință (eticheta pe care o oferim în setul nostru de date). Dar, desigur, aceasta nu este o măsură perfectă. Pentru a înțelege limitele sale, verificați A ROUGE sau nu a ROUGE?

Deci, cum calculăm scorul ROUGE? Există destul de multe pachete Python pentru a calcula această metrică. Pentru a asigura coerența, ar trebui să folosim aceeași metodă pe tot parcursul proiectului nostru. Deoarece, la un moment ulterior al acestui tutorial, vom folosi un script de antrenament din biblioteca Transformers în loc să-l scriem pe al nostru, putem doar să aruncăm o privire în cod sursă din script și copiați codul care calculează scorul 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

Folosind această metodă pentru a calcula scorul, ne asigurăm că comparăm întotdeauna mere cu mere pe tot parcursul proiectului.

Această funcție calculează mai multe scoruri ROUGE: rouge1, rouge2, rougeL, și rougeLsum. „Suma” în rougeLsum se referă la faptul că această măsurătoare este calculată pe un întreg rezumat, în timp ce rougeL se calculează ca medie pe propoziții individuale. Deci, ce scor ROUGE ar trebui să folosim pentru proiectul nostru? Din nou, trebuie să încercăm abordări diferite în faza de experimentare. Pentru cât valorează, hârtie originală ROUGE afirmă că „ROUGE-2 și ROUGE-L au funcționat bine în sarcinile de rezumare a unui singur document”, în timp ce „ROUGE-1 și ROUGE-L au rezultate excelente în evaluarea rezumatelor scurte”.

Creați linia de bază

În continuare, dorim să creăm linia de bază utilizând un model simplu, fără ML. Ce înseamnă asta? În domeniul rezumarii textului, multe studii folosesc o abordare foarte simplă: o iau pe prima n propoziții ale textului și declară-l rezumatul candidatului. Apoi compară rezumatul candidatului cu rezumatul de referință și calculează scorul ROUGE. Aceasta este o abordare simplă, dar puternică, pe care o putem implementa în câteva linii de cod (întregul cod pentru această parte este în următoarele caiet):

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

Folosim setul de date de testare pentru această evaluare. Acest lucru are sens deoarece după ce antrenăm modelul, folosim și același set de date de testare pentru evaluarea finală. Încercăm și numere diferite pentru n: începem doar cu prima propoziție ca rezumat al candidatului, apoi primele două propoziții și, în final, primele trei propoziții.

Următoarea captură de ecran arată rezultatele pentru primul nostru model.

Scorurile ROUGE sunt cele mai mari, cu doar prima propoziție ca rezumat al candidatului. Aceasta înseamnă că a lua mai mult de o propoziție face rezumatul prea verbos și duce la un scor mai mic. Deci, asta înseamnă că vom folosi scorurile pentru rezumatele cu o singură propoziție ca punct de referință.

Este important de reținut că, pentru o abordare atât de simplă, aceste numere sunt de fapt destul de bune, mai ales pentru rouge1 Scor. Pentru a pune aceste numere în context, ne putem referi la Modele Pegasus, care arată scorurile unui model de ultimă generație pentru diferite seturi de date.

Concluzie și ce urmează

În partea 1 a seriei noastre, am introdus setul de date pe care îl folosim pe parcursul proiectului de rezumat, precum și o măsurătoare pentru a evalua rezumatele. Apoi am creat următoarea linie de bază cu un model simplu, fără ML.

În următorul post, folosim un model zero-shot – în mod specific, un model care a fost instruit special pentru rezumarea textului în articolele de știri publice. Cu toate acestea, acest model nu va fi antrenat deloc pe setul nostru de date (de unde și numele „zero-shot”).

Vă las ca temă să ghiciți cum va funcționa acest model zero-shot în comparație cu linia noastră de bază foarte simplă. Pe de o parte, va fi un model mult mai sofisticat (de fapt este o rețea neuronală). Pe de altă parte, este folosit doar pentru a rezuma articole de știri, așa că s-ar putea lupta cu modelele care sunt inerente setului de date arXiv.


Despre autor

Heiko Hotz este arhitect senior de soluții pentru AI și învățare automată și conduce comunitatea de procesare a limbajului natural (NLP) din cadrul AWS. Înainte de acest rol, a fost șeful departamentului de știință a datelor pentru Serviciul Clienți al Amazon UE. Heiko îi ajută pe clienții noștri să aibă succes în călătoria lor AI/ML pe AWS și a lucrat cu organizații din multe industrii, inclusiv asigurări, servicii financiare, media și divertisment, asistență medicală, utilități și producție. În timpul liber, Heiko călătorește cât mai mult posibil.

Timestamp-ul:

Mai mult de la Învățare automată AWS