‘Apprendimento attivo con AutoNLP e Prodigy’

Active learning with AutoNLP and Prodigy

L’apprendimento attivo nel contesto del Machine Learning è un processo in cui si aggiungono iterativamente dati etichettati, si riaddestra un modello e lo si fornisce all’utente finale. È un processo infinito e richiede l’interazione umana per etichettare/creare i dati. In questo articolo, discuteremo come utilizzare AutoNLP e Prodigy per costruire una pipeline di apprendimento attivo.

AutoNLP

AutoNLP è un framework creato da Hugging Face che ti aiuta a costruire i tuoi modelli di deep learning di ultima generazione sul tuo dataset senza quasi alcuna codifica. AutoNLP si basa sulle enormi risorse di Hugging Face come transformers, datasets, inference-api e molti altri strumenti.

Con AutoNLP, puoi addestrare modelli di trasformatori SOTA sul tuo dataset personalizzato, perfezionarli (automaticamente) e fornirli all’utente finale. Tutti i modelli addestrati con AutoNLP sono di ultima generazione e pronti per la produzione.

Al momento della stesura di questo articolo, AutoNLP supporta compiti come classificazione binaria, regressione, classificazione multi-classe, classificazione dei token (come riconoscimento delle entità nominate o parte del discorso), risposta alle domande, riassunto e altro ancora. Puoi trovare un elenco di tutti i compiti supportati qui. AutoNLP supporta lingue come inglese, francese, tedesco, spagnolo, hindi, olandese, svedese e molte altre. È anche possibile supportare modelli personalizzati con tokenizzatori personalizzati (nel caso in cui la tua lingua non sia supportata da AutoNLP).

Prodigy

Prodigy è uno strumento di annotazione sviluppato da Explosion (i creatori di spaCy). È uno strumento basato sul web che consente di annotare i propri dati in tempo reale. Prodigy supporta compiti di NLP come il riconoscimento delle entità nominate (NER) e la classificazione del testo, ma non si limita al solo NLP! Supporta anche compiti di Visione Artificiale e persino la creazione di compiti personalizzati! Puoi provare la demo di Prodigy: qui.

Nota che Prodigy è uno strumento commerciale. Puoi scoprirne di più qui.

Abbiamo scelto Prodigy perché è uno degli strumenti più popolari per l’etichettatura dei dati ed è infinitamente personalizzabile. È anche molto facile da configurare e utilizzare.

Dataset

Ora inizia la parte più interessante di questo articolo. Dopo aver esaminato molti dataset e diversi tipi di problemi, siamo incappati nel dataset BBC News Classification su Kaggle. Questo dataset è stato utilizzato in una competizione in classe ed è accessibile qui.

Diamo un’occhiata a questo dataset:

Come possiamo vedere, si tratta di un dataset di classificazione. C’è una colonna “Text” che contiene il testo dell’articolo di notizie e una colonna “Category” che rappresenta la classe dell’articolo. Nel complesso, ci sono 5 classi diverse: “business”, “entertainment”, “politics”, “sport” e “tech”.

Addestrare un modello di classificazione multi-classe su questo dataset utilizzando AutoNLP è un gioco da ragazzi.

Passo 1: Scaricare il dataset.

Passo 2: Aprire AutoNLP e creare un nuovo progetto.

Passo 3: Caricare il dataset di addestramento e scegliere la suddivisione automatica.

Passo 4: Accettare i prezzi e addestrare i tuoi modelli.

Si noti che nell’esempio sopra, stiamo addestrando 15 diversi modelli di classificazione multi-classe. I prezzi di AutoNLP possono essere anche inferiori a $10 per modello. AutoNLP selezionerà i migliori modelli e effettuerà l’ottimizzazione degli iperparametri per conto tuo. Quindi, ora, tutto ciò che dobbiamo fare è rilassarci e aspettare i risultati.

Dopo circa 15 minuti, tutti i modelli hanno finito l’addestramento e i risultati sono pronti. Sembra che il miglior modello abbia ottenuto un’accuratezza del 98,67%!

Quindi, ora siamo in grado di classificare gli articoli nel dataset con un’accuratezza del 98,67%! Ma aspetta, stavamo parlando di apprendimento attivo e Prodigy. Cosa è successo a quelli? 🤔 Abbiamo effettivamente utilizzato Prodigy come vedremo tra poco. Lo abbiamo usato per etichettare questo dataset per il compito di riconoscimento delle entità nominate. Prima di iniziare la parte di etichettatura, abbiamo pensato che sarebbe stato interessante avere un progetto in cui non solo siamo in grado di rilevare le entità negli articoli di notizie, ma anche di categorizzarle. Ecco perché abbiamo costruito questo modello di classificazione sulle etichette esistenti.

Apprendimento Attivo

Il dataset che abbiamo utilizzato aveva delle categorie ma non aveva etichette per il riconoscimento delle entità. Quindi, abbiamo deciso di utilizzare Prodigy per etichettare il dataset per un’altra attività: il riconoscimento delle entità nominate.

Una volta installato Prodigy, è possibile eseguire semplicemente il seguente comando:

$ prodigy ner.manual bbc blank:en BBC_News_Train.csv --label PERSON,ORG,PRODUCT,LOCATION

Analizziamo i diversi valori:

  • bbc è il dataset che verrà creato da Prodigy.
  • blank:en è il tokenizzatore spaCy utilizzato.
  • BBC_News_Train.csv è il dataset che verrà utilizzato per l’etichettatura.
  • PERSON,ORG,PRODUCT,LOCATION è l’elenco di etichette che verranno utilizzate per l’etichettatura.

Dopo aver eseguito il comando precedente, è possibile accedere all’interfaccia web di Prodigy (di solito su localhost:8080) e iniziare l’etichettatura del dataset. L’interfaccia di Prodigy è molto semplice, intuitiva e facile da usare. L’interfaccia ha l’aspetto seguente:

Tutto ciò che devi fare è selezionare quale entità desideri etichettare (PERSON, ORG, PRODUCT, LOCATION) e quindi selezionare il testo che appartiene all’entità. Una volta completato un documento, è possibile fare clic sul pulsante verde e Prodigy fornirà automaticamente il documento successivo non etichettato.

Utilizzando Prodigy, abbiamo iniziato ad etichettare il dataset. Quando avevamo circa 20 campioni, abbiamo addestrato un modello utilizzando AutoNLP. Prodigy non esporta i dati in formato AutoNLP, quindi abbiamo scritto uno script veloce per convertire i dati in formato AutoNLP:

import json
import spacy

from prodigy.components.db import connect

db = connect()
prodigy_annotations = db.get_dataset("bbc")
examples = ((eg["text"], eg) for eg in prodigy_annotations)
nlp = spacy.blank("en")

dataset = []

for doc, eg in nlp.pipe(examples, as_tuples=True):
    try:
        doc.ents = [doc.char_span(s["start"], s["end"], s["label"]) for s in eg["spans"]]
        iob_tags = [f"{t.ent_iob_}-{t.ent_type_}" if t.ent_iob_ else "O" for t in doc]
        iob_tags = [t.strip("-") for t in iob_tags]
        tokens = [str(t) for t in doc]
        temp_data = {
            "tokens": tokens,
            "tags": iob_tags
        }
        dataset.append(temp_data)
    except:
        pass

with open('data.jsonl', 'w') as outfile:
    for entry in dataset:
        json.dump(entry, outfile)
        outfile.write('\n')

Ciò ci fornirà un file JSONL che può essere utilizzato per addestrare un modello utilizzando AutoNLP. I passaggi saranno gli stessi di prima, tranne che selezioneremo l’attività di Classificazione dei Token durante la creazione del progetto AutoNLP. Utilizzando i dati iniziali che avevamo, abbiamo addestrato un modello utilizzando AutoNLP. Il miglior modello aveva un’accuratezza di circa il 86% con una precisione e una recall pari a 0. Sapevamo che il modello non aveva imparato nulla. È abbastanza ovvio, avevamo solo circa 20 campioni.

Dopo aver etichettato circa 70 campioni, abbiamo iniziato a ottenere alcuni risultati. L’accuratezza è salita al 92%, la precisione era dello 0,52 e la recall era di circa lo 0,42. Ottenevamo alcuni risultati, ma ancora non soddisfacenti. Nell’immagine seguente, possiamo vedere come questo modello si comporta su un campione non visto precedentemente.

Come puoi vedere, il modello sta lottando. Ma è molto meglio di prima! In precedenza, il modello non era nemmeno in grado di prevedere nulla nello stesso testo. Almeno ora, è in grado di capire che Bruce e David sono nomi.

Quindi, abbiamo continuato. Abbiamo etichettato alcuni campioni in più.

Si prega di notare che, ad ogni iterazione, il nostro dataset sta diventando più grande. Tutto ciò che stiamo facendo è caricare il nuovo dataset su AutoNLP e lasciare che faccia il resto.

Dopo aver etichettato circa ~150 campioni, abbiamo iniziato a ottenere dei buoni risultati. L’accuratezza è salita al 95,7%, la precisione era dello 0,64 e il richiamo era di circa lo 0,76.

Diamo un’occhiata a come questo modello si comporta sullo stesso campione non visto.

WOW! Questo è incredibile! Come puoi vedere, il modello ora si comporta estremamente bene! È in grado di rilevare molte entità nello stesso testo. La precisione e il richiamo erano ancora un po’ bassi e quindi abbiamo continuato a etichettare ancora più dati. Dopo aver etichettato circa ~250 campioni, abbiamo ottenuto i migliori risultati in termini di precisione e richiamo. L’accuratezza è salita a circa il 95,9% e la precisione e il richiamo erano rispettivamente dello 0,73 e dello 0,79. A questo punto, abbiamo deciso di smettere di etichettare e concludere il processo di sperimentazione. Il grafico seguente mostra come l’accuratezza del miglior modello sia migliorata man mano che abbiamo aggiunto più campioni al dataset:

Bene, è un fatto ben noto che dati più rilevanti porteranno a modelli migliori e quindi a risultati migliori. Con questa sperimentazione, abbiamo creato con successo un modello che non solo può classificare le entità negli articoli di notizie, ma anche categorizzarle. Utilizzando strumenti come Prodigy e AutoNLP, abbiamo investito il nostro tempo e impegno solo per etichettare il dataset (anche questo è stato reso più semplice dall’interfaccia offerta da Prodigy). AutoNLP ci ha risparmiato molto tempo e sforzo: non abbiamo dovuto capire quali modelli utilizzare, come addestrarli, come valutarli, come ottimizzare i parametri, quale ottimizzatore e scheduler utilizzare, pre-elaborazione, post-elaborazione, ecc. Abbiamo solo dovuto etichettare il dataset e lasciare che AutoNLP facesse tutto il resto.

Crediamo che con strumenti come AutoNLP e Prodigy sia molto facile creare dati e modelli all’avanguardia. E poiché l’intero processo richiede quasi nessuna codifica, anche chi non ha una formazione in programmazione può creare dataset che generalmente non sono disponibili al pubblico, addestrare i propri modelli utilizzando AutoNLP e condividere il modello con tutti gli altri nella comunità (o semplicemente utilizzarli per la propria ricerca/attività).

Abbiamo reso open-source il miglior modello creato con questo processo. Puoi provarlo qui . Il dataset etichettato può essere scaricato anche qui .

I modelli sono all’avanguardia solo grazie ai dati su cui vengono addestrati.