Crea un progetto di riepilogo del testo con Hugging Face Transformers: Part 1

Nodo di origine: 1236281

Quando OpenAI ha rilasciato la terza generazione del loro modello di machine learning (ML) specializzato nella generazione di testi a luglio 2020, sapevo che qualcosa era diverso. Questo modello ha colpito un nervo come nessun altro lo ha preceduto. Improvvisamente ho sentito amici e colleghi, che potrebbero essere interessati alla tecnologia ma di solito non si preoccupano molto degli ultimi progressi nello spazio AI/ML, parlarne. Anche il Guardian ha scritto un articolo a proposito. O, per essere precisi, il modello ha scritto l'articolo e il Guardian lo ha curato e pubblicato. Non si poteva negarlo - GPT-3 è stato un punto di svolta.

Dopo che il modello è stato rilasciato, le persone hanno immediatamente iniziato a presentare potenziali applicazioni per esso. In poche settimane sono state create molte demo impressionanti, che possono essere trovate su Sito web GPT-3. Un'applicazione particolare che ha attirato la mia attenzione è stata sintesi del testo – la capacità di un computer di leggere un dato testo e riassumerne il contenuto. È uno dei compiti più difficili per un computer perché combina due campi all'interno del campo dell'elaborazione del linguaggio naturale (PNL): comprensione della lettura e generazione di testo. Ecco perché sono rimasto così colpito dalle demo GPT-3 per il riepilogo del testo.

Puoi provarli con il Abbracciare il sito web di Face Spaces. Il mio preferito al momento è un applicazione che genera riepiloghi di articoli di notizie con solo l'URL dell'articolo come input.

In questa serie in due parti, propongo una guida pratica per le organizzazioni in modo da poter valutare la qualità dei modelli di riepilogo del testo per il tuo dominio.

Panoramica dell'esercitazione

Molte organizzazioni con cui lavoro (enti di beneficenza, aziende, ONG) hanno enormi quantità di testi che devono leggere e riassumere: rapporti finanziari o articoli di notizie, documenti di ricerca scientifica, domande di brevetto, contratti legali e altro ancora. Naturalmente, queste organizzazioni sono interessate ad automatizzare queste attività con la tecnologia NLP. Per dimostrare l'arte del possibile, uso spesso le demo di sintesi del testo, che quasi mai mancano di impressionare.

Ma ora cosa?

La sfida per queste organizzazioni è che vogliono valutare modelli di riepilogo del testo basati su riepiloghi per molti, molti documenti, non uno alla volta. Non vogliono assumere uno stagista il cui unico lavoro è aprire l'applicazione, incollare un documento, premere il Riassumere pulsante, attendere l'output, valutare se il riepilogo è corretto e ripetere l'operazione per migliaia di documenti.

Ho scritto questo tutorial pensando al mio io passato di quattro settimane fa: è il tutorial che vorrei avere allora quando ho iniziato questo viaggio. In questo senso, il pubblico di destinazione di questo tutorial è qualcuno che ha familiarità con l'IA/ML e ha già utilizzato i modelli Transformer in precedenza, ma è all'inizio del suo percorso di sintesi del testo e vuole approfondire l'argomento. Poiché è scritto da un "principiante" e per i principianti, voglio sottolineare il fatto che questo tutorial è a guida pratica – no , il guida pratica. Per favore, trattalo come se Scatola di George EP aveva detto:

In termini di quanta conoscenza tecnica è richiesta in questo tutorial: implica un po' di codifica in Python, ma la maggior parte delle volte usiamo semplicemente il codice per chiamare le API, quindi non è richiesta nemmeno una conoscenza approfondita della codifica. È utile conoscere alcuni concetti di ML, ad esempio cosa significa provare ed schierare un modello, i concetti di formazione, convalidae set di dati di prova, e così via. Anche dopo aver dilettato con il Libreria Transformers prima potrebbe essere utile, perché utilizziamo ampiamente questa libreria durante questo tutorial. Includo anche link utili per ulteriori letture di questi concetti.

Poiché questo tutorial è stato scritto da un principiante, non mi aspetto che esperti di PNL e professionisti avanzati del deep learning ottengano gran parte di questo tutorial. Almeno non dal punto di vista tecnico: potresti comunque goderti la lettura, quindi per favore non andartene ancora! Ma dovrai essere paziente riguardo alle mie semplificazioni: ho cercato di vivere secondo il concetto di rendere tutto in questo tutorial il più semplice possibile, ma non più semplice.

Struttura di questo tutorial

Questa serie si estende su quattro sezioni suddivise in due post, in cui attraversiamo diverse fasi di un progetto di sintesi del testo. Nel primo post (sezione 1), iniziamo introducendo una metrica per le attività di riepilogo del testo, una misura delle prestazioni che ci consente di valutare se un riepilogo è buono o cattivo. Introduciamo anche il set di dati che vogliamo riassumere e creare una linea di base utilizzando un modello no-ML: utilizziamo una semplice euristica per generare un riepilogo da un determinato testo. La creazione di questa linea di base è un passaggio di vitale importanza in qualsiasi progetto ML perché ci consente di quantificare quanti progressi facciamo utilizzando l'IA in futuro. Ci consente di rispondere alla domanda "Vale davvero la pena investire nella tecnologia AI?"

Nel secondo post, utilizziamo un modello che è già stato pre-addestrato per generare riepiloghi (sezione 2). Questo è possibile con un approccio moderno in ML chiamato trasferire l'apprendimento. È un altro passaggio utile perché fondamentalmente prendiamo un modello standard e lo testiamo sul nostro set di dati. Questo ci consente di creare un'altra linea di base, che ci aiuta a vedere cosa succede quando formiamo effettivamente il modello sul nostro set di dati. L'approccio è chiamato sintesi a colpo zero, perché il modello non ha avuto esposizione al nostro set di dati.

Dopodiché, è il momento di utilizzare un modello pre-addestrato e addestrarlo sul nostro set di dati (sezione 3). Questo è anche chiamato ritocchi. Consente al modello di imparare dagli schemi e dalle idiosincrasie dei nostri dati e adattarsi lentamente ad essi. Dopo aver addestrato il modello, lo usiamo per creare riepiloghi (sezione 4).

Per riassumere:

  • Parte 1:
    • Sezione 1: Utilizzare un modello senza ML per stabilire una linea di base
  • Parte 2:
    • Sezione 2: Genera riepiloghi con un modello a scatto zero
    • Sezione 3: Addestrare un modello di riepilogo
    • Sezione 4: valutare il modello addestrato

L'intero codice per questo tutorial è disponibile di seguito Repository GitHub.

Cosa avremo ottenuto alla fine di questo tutorial?

Entro la fine di questo tutorial, noi no disporre di un modello di riepilogo del testo che può essere utilizzato nella produzione. Non avremo nemmeno un buono modello di riepilogo (inserisci qui l'emoji dell'urlo)!

Quello che avremo invece è un punto di partenza per la prossima fase del progetto, che è la fase di sperimentazione. È qui che entra in gioco la "scienza" nella scienza dei dati, perché ora si tratta di sperimentare modelli diversi e impostazioni diverse per capire se un modello di riepilogo sufficientemente buono può essere addestrato con i dati di addestramento disponibili.

E, per essere completamente trasparenti, ci sono buone probabilità che la conclusione sia che la tecnologia non è ancora matura e che il progetto non verrà implementato. E devi preparare i tuoi stakeholder aziendali a questa possibilità. Ma questo è un argomento per un altro post.

Sezione 1: Utilizzare un modello senza ML per stabilire una linea di base

Questa è la prima sezione del nostro tutorial sull'impostazione di un progetto di riepilogo del testo. In questa sezione, stabiliamo una linea di base utilizzando un modello molto semplice, senza effettivamente utilizzare ML. Questo è un passaggio molto importante in qualsiasi progetto ML, perché ci consente di capire quanto valore aggiunge il ML nel tempo del progetto e se vale la pena investire in esso.

Il codice per il tutorial può essere trovato di seguito Repository GitHub.

Dati, dati, dati

Ogni progetto ML inizia con i dati! Se possibile, dovremmo sempre utilizzare i dati relativi a ciò che vogliamo ottenere con un progetto di riepilogo del testo. Ad esempio, se il nostro obiettivo è riassumere le domande di brevetto, dovremmo anche utilizzare le domande di brevetto per addestrare il modello. Un grande avvertimento per un progetto ML è che i dati di addestramento di solito devono essere etichettati. Nel contesto del riassunto del testo, ciò significa che dobbiamo fornire il testo da riepilogare così come il riassunto (l'etichetta). Solo fornendo entrambi il modello può apprendere come appare un buon riassunto.

In questo tutorial utilizziamo un set di dati disponibile pubblicamente, ma i passaggi e il codice rimangono esattamente gli stessi se utilizziamo un set di dati personalizzato o privato. E ancora, se hai in mente un obiettivo per il tuo modello di riepilogo del testo e hai dati corrispondenti, usa i tuoi dati invece per ottenere il massimo da questo.

I dati che utilizziamo sono i set di dati arXiv, che contiene abstract di articoli arXiv e i relativi titoli. Per il nostro scopo, utilizziamo l'abstract come testo che vogliamo riassumere e il titolo come sintesi di riferimento. Di seguito sono disponibili tutte le fasi di download e preelaborazione dei dati taccuino. Abbiamo bisogno di un Gestione dell'identità e dell'accesso di AWS (IAM) ruolo che consente di caricare i dati da e verso Servizio di archiviazione semplice Amazon (Amazon S3) per eseguire correttamente questo notebook. Il set di dati è stato sviluppato come parte del documento Sull'uso di ArXiv come set di dati ed è concesso in licenza ai sensi del Creative Commons CC0 1.0 Dedica di dominio pubblico universale.

I dati sono suddivisi in tre set di dati: dati di addestramento, convalida e test. Se desideri utilizzare i tuoi dati, assicurati che sia così. Il diagramma seguente illustra come utilizziamo i diversi set di dati.

Naturalmente, una domanda comune a questo punto è: di quanti dati abbiamo bisogno? Come probabilmente già avrete intuito, la risposta è: dipende. Dipende da quanto è specializzato il dominio (riassumere le domande di brevetto è molto diverso dal riepilogare articoli di notizie), quanto deve essere accurato il modello per essere utile, quanto dovrebbe costare la formazione del modello e così via. Torneremo su questa domanda in un secondo momento, quando addestreremo effettivamente il modello, ma il fatto è che dobbiamo provare diverse dimensioni del set di dati quando siamo nella fase di sperimentazione del progetto.

Cosa rende un buon modello?

In molti progetti ML, è piuttosto semplice misurare le prestazioni di un modello. Questo perché di solito c'è poca ambiguità sul fatto che il risultato del modello sia corretto. Le etichette nel set di dati sono spesso binarie (Vero/Falso, Sì/No) o categoriali. In ogni caso, in questo scenario è facile confrontare l'output del modello con l'etichetta e contrassegnarlo come corretto o non corretto.

Quando si genera del testo, questo diventa più impegnativo. I riepiloghi (le etichette) che forniamo nel nostro set di dati sono solo un modo per riassumere il testo. Ma ci sono molte possibilità per riassumere un dato testo. Quindi, anche se il modello non corrisponde alla nostra etichetta 1:1, l'output potrebbe comunque essere un riepilogo valido e utile. Quindi, come confrontiamo il riepilogo del modello con quello che forniamo? La metrica utilizzata più spesso nella sintesi del testo per misurare la qualità di un modello è la Punteggio ROUGE. Per comprendere i meccanismi di questa metrica, fare riferimento a La metrica delle prestazioni definitive nella PNL. In sintesi, il punteggio ROUGE misura la sovrapposizione di n-grammi (sequenza contigua di n item) tra il riassunto del modello (riassunto del candidato) e il riassunto di riferimento (l'etichetta che forniamo nel nostro dataset). Ma, ovviamente, questa non è una misura perfetta. Per capire i suoi limiti, controlla ROUGE o non ROUGE?

Quindi, come calcoliamo il punteggio ROUGE? Ci sono un bel po' di pacchetti Python là fuori per calcolare questa metrica. Per garantire la coerenza, dovremmo utilizzare lo stesso metodo in tutto il nostro progetto. Poiché, in un punto successivo di questo tutorial, utilizzeremo uno script di addestramento dalla libreria Transformers invece di scrivere il nostro, possiamo semplicemente sbirciare nel codice sorgente dello script e copia il codice che calcola il punteggio 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

Utilizzando questo metodo per calcolare il punteggio, ci assicuriamo di confrontare sempre le mele con le mele durante tutto il progetto.

Questa funzione calcola diversi punteggi ROUGE: rouge1, rouge2, rougeLe rougeLsum. La "somma" in rougeLsum si riferisce al fatto che questa metrica viene calcolata su un intero riepilogo, mentre rougeL viene calcolata come la media delle singole frasi. Quindi, quale punteggio ROUGE dovremmo usare per il nostro progetto? Ancora una volta, dobbiamo provare diversi approcci nella fase di sperimentazione. Per quel che vale, il carta originale ROUGE afferma che "ROUGE-2 e ROUGE-L hanno funzionato bene nelle attività di riepilogo di documenti singoli" mentre "ROUGE-1 e ROUGE-L hanno prestazioni eccellenti nella valutazione di brevi riepiloghi".

Crea la linea di base

Successivamente, vogliamo creare la linea di base utilizzando un modello semplice, senza ML. Cosa significa? Nel campo della sintesi testuale, molti studi utilizzano un approccio molto semplice: prendono il primo n frasi del testo e dichiararlo riassunto candidato. Quindi confrontano il riepilogo del candidato con il riepilogo di riferimento e calcolano il punteggio ROUGE. Questo è un approccio semplice ma potente che possiamo implementare in poche righe di codice (l'intero codice per questa parte è nel seguente taccuino):

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

Usiamo il set di dati di test per questa valutazione. Questo ha senso perché dopo aver addestrato il modello, utilizziamo anche lo stesso set di dati di test per la valutazione finale. Proviamo anche numeri diversi per n: iniziamo con solo la prima frase come riassunto candidato, poi le prime due frasi e infine le prime tre frasi.

Lo screenshot seguente mostra i risultati per il nostro primo modello.

I punteggi ROUGE sono i più alti, con solo la prima frase come riassunto del candidato. Ciò significa che prendere più di una frase rende il riassunto troppo prolisso e porta a un punteggio più basso. Ciò significa che useremo i punteggi dei riepiloghi di una frase come base.

È importante notare che, per un approccio così semplice, questi numeri sono in realtà abbastanza buoni, specialmente per il rouge1 punto. Per contestualizzare questi numeri, possiamo fare riferimento a Modelli Pegasus, che mostra i punteggi di un modello all'avanguardia per diversi set di dati.

Conclusione e cosa c'è dopo

Nella parte 1 della nostra serie, abbiamo introdotto il set di dati che utilizziamo durante il progetto di riepilogo, nonché una metrica per valutare i riepiloghi. Abbiamo quindi creato la seguente linea di base con un modello semplice, senza ML.

Nel prossimo post, utilizziamo un modello zero-shot, in particolare un modello che è stato specificamente addestrato per la sintesi del testo su articoli di notizie pubbliche. Tuttavia, questo modello non verrà addestrato affatto sul nostro set di dati (da cui il nome "zero-shot").

Lascio a te come compito indovinare come si comporterà questo modello zero-shot rispetto alla nostra semplicissima linea di base. Da un lato, sarà un modello molto più sofisticato (in realtà è una rete neurale). D'altra parte, viene utilizzato solo per riassumere articoli di notizie, quindi potrebbe avere problemi con i modelli inerenti al set di dati arXiv.


L'autore

Heiko Hotz è un Senior Solutions Architect per AI e Machine Learning e guida la community di Natural Language Processing (NLP) all'interno di AWS. Prima di ricoprire questo ruolo, è stato Head of Data Science per il servizio clienti UE di Amazon. Heiko aiuta i nostri clienti ad avere successo nel loro viaggio AI/ML su AWS e ha collaborato con organizzazioni in molti settori, tra cui assicurazioni, servizi finanziari, media e intrattenimento, sanità, servizi pubblici e produzione. Nel tempo libero Heiko viaggia il più possibile.

Timestamp:

Di più da Apprendimento automatico di AWS