Trovare frammenti di dati in dati non strutturati

Ricerca di frammenti di dati in dati non strutturati

Una breve introduzione ai metodi di slicing dei dati inclusi esempi pratici sul dataset CIFAR-100.

Slicing dei dati su CIFAR100. Fonte: creato dall'autore.

tl;dr:

I slicing dei dati sono sottoinsiemi semanticamente significativi dei dati, in cui il modello si comporta in modo anomalo. Nella gestione di un problema di dati non strutturati (ad es. immagini, testo), trovare questi slicing è una parte importante del lavoro di ogni data scientist. Nella pratica, questa attività richiede molta esperienza individuale e lavoro manuale. In questo articolo, presentiamo alcuni metodi e strumenti per rendere la ricerca di slicing dei dati più sistematica ed efficiente. Discutiamo le sfide attuali e dimostriamo alcuni flussi di lavoro pratici basati su strumenti open-source.

È disponibile una demo interattiva basata sul dataset CIFAR100.

Introduzione

Debugging, testing e monitoraggio dei sistemi di intelligenza artificiale (AI) è difficile. La maggior parte degli sforzi nel processo di sviluppo del software 2.0 viene dedicata alla cura di dataset di alta qualità.

Una strategia importante per sviluppare algoritmi di machine learning (ML) robusti è identificare i cosiddetti slicing dei dati. I slicing dei dati sono sottoinsiemi semanticamente significativi in cui il modello si comporta in modo anomalo. Identificare e tracciare questi segmenti di dati è il cuore di ogni processo di sviluppo di AI orientato ai dati. È anche un aspetto fondamentale per implementare soluzioni AI sicure in settori come la sanità e i sistemi di assistenza alla guida automatici.

Tradizionalmente, trovare i slicing dei dati è sempre stato parte integrante del lavoro di un data scientist. Nella pratica, trovare i slicing dei dati si basa fortemente sull’esperienza individuale e sulla conoscenza del dominio del data scientist. Con il movimento verso l’AI orientata ai dati, ci sono molti lavori e strumenti attuali che cercano di rendere questo processo più sistematico.

In questo articolo, forniamo una panoramica dello stato attuale della ricerca di slicing dei dati su dati non strutturati. Dimostriamo specificamente alcuni flussi di lavoro pratici basati su strumenti open-source.

Cos’è la ricerca di slicing?

I data scientist utilizzano spesso semplici tecniche di ricerca di slicing manuali. L’esempio più famoso è probabilmente la matrice di confusione, un metodo di debugging per problemi di classificazione. Nella pratica, il processo di ricerca di slicing si basa su una combinazione di euristiche pre-calcolate, sull’esperienza individuale del data scientist e su molte esplorazioni interattive dei dati.

Un classico slicing di dati può essere descritto da una congiunzione di predicati su caratteristiche tabulari o metadati. In un dataset di persone, potrebbe essere rappresentato da persone in un certo intervallo di età che sono maschi e alti oltre 1,85 m. In un dataset di monitoraggio delle condizioni del motore, un slicing di dati potrebbe consistere in punti dati in un certo range di RPM, ore di funzionamento e coppia.

Nel caso dei dati non strutturati, la definizione semantica del slicing dei dati può essere più implicita: può essere una descrizione comprensibile dall’essere umano come “scenari di guida sotto una leggera pioggia su una strada tortuosa con traffico intenso in montagna”.

L’individuazione del slicing dei dati su un dataset non strutturato può essere fatta in due modi diversi:

  1. I metadati possono essere estratti dai dati non strutturati utilizzando algoritmi di elaborazione del segnale classici (ad es. immagini scure, audio a basso SNR) o reti neurali profonde pre-allenate per l’autotagging. La ricerca di slicing può quindi essere fatta su questi metadati.
  2. Le rappresentazioni latenti nello spazio di incorporamento possono essere utilizzate per raggruppare cluster di dati. Questi cluster possono quindi essere ispezionati per identificare i slicing dei dati rilevanti direttamente.
Flusso di lavoro per identificare slicing dei dati su dati non strutturati. Fonte: creato dall'autore.

Le tecniche di ricerca automatica di slicing cercano sempre di bilanciare il supporto del slicing (dovrebbe essere ampio) con la gravità dell’anomalia delle prestazioni del modello (dovrebbe essere anche ampia).

I metodi di ricerca di slicing su dati tabulari condividono molte somiglianze con gli alberi decisionali: nel contesto dell’analisi del modello di ML, entrambe le tecniche possono essere utilizzate per formulare regole che descrivono dove esistono errori del modello. Tuttavia, c’è una differenza importante: il problema della ricerca di slicing consente slicing sovrapposti. Ciò rende il problema computazionalmente complesso perché è più difficile ridurre lo spazio di ricerca.

Perché è importante trovare fette di dati?

In particolare nell’ultimo decennio, la comunità di apprendimento automatico ha tratto enormi benefici dai dataset di riferimento: a partire da ImageNet, tali dataset e competizioni sono stati un fattore di successo per gli algoritmi di deep learning su problemi di dati non strutturati. In questo contesto, la qualità di un nuovo algoritmo è tipicamente valutata in base a poche metriche quantitative come il punteggio F1 o la precisione media.

Con sempre più modelli di apprendimento automatico che vengono implementati in produzione, è diventato evidente che i dataset reali sono molto diversi dai loro omologhi di riferimento: i dati reali sono tipicamente molto rumorosi e sbilanciati, ma ricchi di informazioni sui metadati. Per alcuni casi d’uso, la pulizia e l’annotazione di questi dataset possono essere proibitivamente costose.

Molte squadre hanno scoperto che iterare il dataset di addestramento e monitorare la deriva in produzione è necessario per costruire e mantenere sistemi AI sicuri.

Trovare fette di dati è una parte fondamentale di questo processo di iterazione. Solo conoscendo dove il modello fallisce, diventa possibile migliorare le prestazioni del sistema: raccogliendo più dati, correggendo etichette errate, selezionando le migliori caratteristiche o semplicemente limitando il dominio operativo del sistema.

Perché è così difficile trovare fette di dati?

Un aspetto critico della ricerca delle fette è la sua complessità computazionale. Possiamo illustrarlo con un piccolo esempio: consideriamo n caratteristiche binarie con codifica one-hot (che possono essere ottenute tramite binning o ricodifica, ad esempio). Lo spazio di ricerca di tutte le possibili combinazioni di caratteristiche è O(2^n). Questa natura esponenziale significa che di solito vengono utilizzate euristiche per il pruning. Di conseguenza, la ricerca automatizzata delle fette non solo richiede molto tempo (a seconda del numero di caratteristiche), ma l’output non sarà una soluzione stabile ottimale, ma alcune euristiche.

Nel processo di sviluppo dell’IA, le scarse prestazioni del modello spesso derivano da diverse cause. Date la natura stocastica intrinseca dei modelli di apprendimento automatico, ciò può facilmente portare a conclusioni spurie che devono essere ispezionate e verificate manualmente. Pertanto, anche se una tecnica di ricerca delle fette può produrre un risultato teoricamente ottimale, i suoi risultati devono essere ispezionati e verificati manualmente. La creazione di strumenti che consentano a team cross-funzionali di farlo in modo efficiente è un collo di bottiglia per molti team di apprendimento automatico.

Abbiamo già affermato che di solito è auspicabile trovare fette con un supporto ampio, ma anche una differenza netta nelle prestazioni del modello rispetto alla baseline del dataset. Spesso, le relazioni tra diverse fette di dati sono di natura gerarchica. Gestire queste gerarchie sia durante il processo di ricerca delle fette automatizzate che durante la fase di revisione interattiva è molto sfidante.

I metodi di ricerca automatizzata delle fette sono più efficaci su problemi ricchi di metadati. Questo è spesso il caso per i problemi del mondo reale. Al contrario, i dataset di riferimento sono sempre piuttosto scarsi di metadati. Due motivi principali per questo sono le esigenze di protezione dei dati e di anonimizzazione. Con la mancanza di dataset di esempio adatti, è molto difficile sia sviluppare che dimostrare flussi di lavoro efficaci per la ricerca delle fette.

Dobbiamo (purtroppo) affrontare questa sfida nella sezione di esempio seguente.

Pratica: Trovare fette di dati su CIFAR-100

Il dataset CIFAR-100 è un benchmark consolidato per la computer vision. Lo usiamo per questo tutorial perché le sue dimensioni ridotte lo rendono facile da gestire e mantengono bassi i requisiti computazionali. I risultati sono anche facili da comprendere in quanto non richiedono conoscenze specifiche di dominio.

Purtroppo, CIFAR-100 è già perfettamente bilanciato, altamente curato e privo di metadati significativi. I risultati dei flussi di lavoro per la ricerca delle fette che produciamo in questa sezione non sono quindi significativi come in un contesto del mondo reale. Tuttavia, i flussi di lavoro presentati dovrebbero essere sufficienti per capire come utilizzarli rapidamente sui tuoi dati del mondo reale.

In una fase di preparazione, calcoliamo i metadati delle immagini con la libreria Cleanvision. Ulteriori informazioni su questo arricchimento possono essere trovate nel nostro playbook sull’IA centrata sui dati.

Definiamo anche alcune variabili importanti per la nostra analisi delle fette di dati: le caratteristiche da analizzare, nonché i nomi delle colonne di etichetta e previsione:

La maggior parte delle tecniche di suddivisione funziona solo su caratteristiche binarie. Poiché le librerie SliceLine e WisePizza non forniscono funzionalità di suddivisione, eseguiamo questa operazione come passaggio di pre-elaborazione:

SliceLine

L’algoritmo SliceLine è stato proposto da Sagadeeva et al- nel 2021. È destinato a funzionare con grandi dataset tabulari che contengono molte caratteristiche. Sfrutta una nuova tecnica di potatura basata su tecniche di algebra lineare sparsa e consente di trovare rapidamente fette di dati anche su una singola macchina.

In questo tutorial, utilizziamo l’implementazione di SliceLine del team DataDome. Funziona in modo molto stabile, ma attualmente supporta solo le versioni di Python <=3.9.

Maggior parte dei parametri dell’algoritmo SliceLine sono molto semplici da comprendere: il supporto minimo della slice (min_sup), il numero massimo di predicati per definire una slice (max_l) e il numero massimo di slice da restituire (k). Il parametro alpha assegna un peso all’importanza dell’errore della slice e controlla il compromesso tra la dimensione e la diminuzione dell’errore della slice.

Chiamiamo la libreria SliceLine per ottenere le 20 slice più interessanti:

Per esplorare interattivamente le slice, arricchiamo la descrizione di ciascuna slice di dati:

Avviamo Spotlight per esplorare interattivamente le slice di dati. Puoi sperimentare direttamente i risultati nello spazio di Huggingface.

Fig. 3: Esplorazione interattiva delle slice di dati generate da SliceLine. Una demo interattiva è disponibile su Huggingface. Fonte: creata dall'autore.

Vediamo che l’algoritmo SliceLine ha trovato alcune slice di dati significative nel dataset CIFAR-100. Le classi albero di acero, albero di salice e quercia sembrano essere problematiche. Troviamo anche che i punti dati in queste classi che hanno un punteggio di scurità elevato sono particolarmente sfidanti. Un’ispezione più approfondita ci fa capire che ciò avviene perché gli alberi con uno sfondo luminoso sono difficili per il modello.

Wise Pizza

WisePizza è un recente sviluppo del team di Wise. È dedicato alla ricerca e visualizzazione di interessanti slice di dati in dati tabulari. L’idea principale è utilizzare la regressione di Lasso per trovare coefficienti di importanza per ciascuna slice. Ulteriori informazioni su come funziona Wise Pizza possono essere trovate nel post del blog.

È importante notare che WisePizza non è stato sviluppato come strumento di debug dell’apprendimento automatico. Invece, è principalmente finalizzato a supportare l’analisi dei segmenti durante l’EDA. Ecco perché è possibile definire manualmente i candidati dei segmenti e assegnare loro un peso. Nei nostri esperimenti, abbiamo eseguito WisePizza direttamente sul dataset e abbiamo impostato il peso per ciascun punto dati a 1:

Per esplorare i problemi nel nostro set di dati non strutturati, estraiamo i problemi nello stesso modo dell’esempio di Sliceline.

Fig. 4: WisePizza identifica anche la classe albero di salice con grandi punteggi scuri come problematica. Tuttavia, le slice non sono così granulari come i risultati di SliceLine. Fonte: creata dall'autore.

Dalla Fig. 4 vediamo che nel semplice dataset di benchmark CIFAR-100, WisePizza trova segmenti rilevanti: elenca anche la classe albero di salice con un alto punteggio scuro come la slice principale. Tuttavia, i risultati successivi sono limitati a diverse categorie di classi e non sono così granulari come l’output di SliceLine. Una delle ragioni è che l’algoritmo di WisePizza non fornisce direttamente un meccanismo di ponderazione tra il supporto della slice e la diminuzione dell’accuratezza.

Sliceguard

La libreria Sliceguard utilizza il clustering gerarchico per determinare possibili slice di dati. Successivamente, vengono utilizzati metodi di fair learning per classificare questi cluster e vengono estratti predicati attraverso tecniche di AI spiegabile. Ulteriori informazioni su Sliceguard possono essere trovate in questo post del blog.

Il motivo principale per cui abbiamo sviluppato Sliceguard è il fatto che funziona non solo su dati tabulari, ma anche direttamente su embedding. La libreria offre molte funzionalità integrate per il pre-processing (ad esempio, il binning) e il post-processing.

Possiamo eseguire Sliceguard su CIFAR-100 con poche righe di codice:

Sliceguard utilizza Spotlight per fornire una visualizzazione interattiva delle slice di dati identificate:

issue_df, issues = sg.report(spotlight_dtype={"image": Image})

Sliceguard può scoprire slice di dati granulari nel dataset CIFAR-100 (Fig. 5). Oltre alle slice di dati precedentemente scoperte nelle categorie degli alberi, identifichiamo anche altri problemi (ad esempio, nella classe del mouse).

Fig. 5: Sliceguard scopre fette di dati a grana fine. Una demo interattiva è disponibile su Huggingface. Fonte: creata dall'autore.

Conclusioni

Abbiamo presentato tre strumenti open source per l’estrazione di fette di dati. Anche sul semplice benchmark CIFAR-100, possono essere utilizzati per scoprire rapidamente segmenti critici di dati. L’identificazione di queste fette di dati è un passo importante per comprendere le modalità di fallimento del modello e migliorare l’insieme di dati di addestramento.

Lo strumento SliceLine funziona su dati tabulari e identifica fette di dati descritte da una combinazione di predicati. Sliceguard non restituisce una combinazione ottimale di predicati garantita matematicamente, ma può funzionare direttamente con embedding. Inoltre, può essere eseguito su set di dati non strutturati con poche righe di codice.

Nella pratica, sia SliceLine che Sliceguard sono molto utili per identificare fette di dati. Tuttavia, entrambi gli strumenti non possono essere utilizzati per un’analisi completamente automatizzata delle fette. Invece, forniscono euristiche potenti che possono essere combinate con l’esplorazione interattiva. Se fatto correttamente, questo approccio è uno strumento importante per i team interdisciplinari di dati per costruire sistemi ML affidabili.

Hai esperienza con gli strumenti di slicing dei dati presentati o puoi consigliare altre librerie open source? Sarei felice di sentirti nei commenti.