Trattamento di dati linguistici - Classificazione
Classificazione di Testo
La classificazione di testo consiste nell’assegnare documenti di testo a una o più categorie.
Abbiamo un insieme predefinito di classi e vogliamo assegnare un documento mai visto prima a una di tali classi (etichettarlo).
Se abbiamo 2 classi, si tratta di una classificazione binaria (ad esempio: spam vs no spam).
Potremmo avere più di 2 classi (ad esempio: politica, finanza, sport, …).
Esistono forme specifiche di classificazione di testo:
Analisi del sentimento: le etichette sono {positivo, negativo, neutrale}.
Soluzioni di Classificazione di Testo
Regole codificate a mano
Un esperto crea un insieme di regole basate su combinazioni di parole o altre caratteristiche (features).
Molto costoso e complesso da mantenere.
Apprendimento automatico supervisionato (supervised machine learning):
Addestra un classificatore utilizzando testi che sono già stati correttamente etichettati da esseri umani.
Estrazione di features dal testo.
Apprendimento della relazione tra features e etichette dai testi di addestramento (training data).
Classificazione di Testo Basata sulle Regole
La classificazione di testo basata sulle regole usa un insieme di regole predefinite per assegnare etichette ai testi.
Esempio: se un articolo giornalistico contiene la parola "deficit", assegna l’etichetta "economia".
Vantaggio principale: semplicità di comprensione del processo decisionale.
Svantaggi:
Tipicamente serve una grande quantità di regole per coprire tutti i casi possibili.
Le eccezioni o i casi particolari vanno gestiti con apposite regole.
Può funzionare se i dati di testo sono ben strutturati e non presentano molte eccezioni.
Classificazione di Testo con Modelli Probabilistici
Vantaggio principale: possono permettere l’apprendimento automatico (machine learning).
Svantaggi:
Richiedono una quantità sufficiente di dati di training per funzionare correttamente.
Non sempre è facile interpretare i risultati.
Tipicamente il primo passo è l’estrazione di features (caratteristiche) dal testo.
Estrazione di features per la classificazione di testi
Modello Bag of Words: le parole vengono considerate come unità disgiunte e sconnesse (tokens), senza preoccuparci delle relazioni sintattiche e semantiche che le legano.
Per estrarre features:
Conteggio di token: si può semplicemente contare quante volte ogni parola grafica compare in un documento e dividere per il numero di parole del documento (term frequency, TF).
TF-IDF: (term frequency-inverse document frequency) si prende in considerazione sia quante volte le parole appaiono all’interno del documento, sia quanto compaiono nell’insieme dei documenti da classificare.
Intuizione dietro a IDF: se una parola compare ovunque, non serve a niente, mentre se compare in pochi documenti è utile per discriminare.
Esempio TF-IDF
Un documento contiene 100 parole e "cane" compare 2 volte (), mentre "il" compare 30 volte ().
Abbiamo un corpus di 200 documenti; "cane" compare in 5 documenti (), mentre "il" compare in tutti ().
Quindi "cane" ha un TD-IDF di circa mentre "il" has un TF-IDF di 0.
Siccome compare ovunque, "il" non serve a discriminare tra un documento e l’altro, mentre "cane" un po’ aiuta perché compare in pochi documenti.
Supponiamo adesso che Belinda compaia 10 volte in un solo documento di 100 parole. Quanto è il suo TF-IDF?
TF-IDF ≈ 0.23, relativamente alto!
Modelli Generativi e Discriminativi
Dato un insieme di features x estratte dal testo (ex., quante volte ogni parola compare nel testo) e un set di etichette (labels) di classi o categorie y:
Modelli generativi: caratterizzano la probabilità congiunta di features e labels
Modelli discriminativi: caratterizzano probabilità delle etichette condizionata all’avere osservato le features
I modelli discriminativi apprendono il minimo indispensabile per classificare, mentre i modelli generativi apprendono molto di più (in teoria apprendono abbastanza informazioni da poter generare).
Modelli Generativi e Discriminativi
Stessa logica nella classificazione di immagini
Modelli generativi: sulla base di tante immagini di cani e gatti, apprendono informazioni sui baffi del gatto, la forma degli occhi, orecchi… e stimano la probabilità che una nuova immagine rappresenti un cane o un gatto (ex.: Naïve Bayes).
Modelli discriminativi: cercano solo di distinguere, ad esempio sulla base del collare (ex.: regressione logistica).
Concetti di base per Naïve Bayes
Naïve: si assume che le variabili siano indipendenti
Bayes: basato sul teorema di Bayes
La probabilità che si verifichino due eventi A e B è
ma è uguale a
quindi
che porta al teorema di Bayes:
Probabilità condizionale
= probabilità che si verifichino sia A che B
= probabilità che si verifichi B se si verifica A
Classificatore Naïve Bayes (generativo)
Per un documento d (rappresentato come vettore di features) e una classe c:
Classificatore Maximum A Posteriori (MAP):
Eliminando il denominatore non cambia perché non ha alcun effetto su arg max
Nomenclatura:
è chiamata likelihood o probabilità a posteriori perché è la probabilità di aver osservato la classe c dopo aver esaminato i dati d
è chiamata probabilità a priori perché è la probabilità di aver osservato la classe c prima di esaminare i dati
Classificatore Naïve Bayes: le Features
In pratica, il documento d viene fornito alla macchina sotto forma di features
Classificatore Maximum A Posteriori (MAP) in pratica:
Cosa sono le features?
Nel caso più semplice, dato un vocabolario di V parole, possiamo chiedere se una data parola appare in un documento d, o quante volte appare
Modello Bernoulli: rappresenta d come , dove se la parola i è in d e altrimenti
Modello Multinomiale: rappresenta d come , dove è il numero di volte che una parola i compare in d
Classificatore Naïve Bayes: indipendenza delle features
Dato una classe c, si suppone che le features siano indipendenti
Questo ci dà il Classificatore Naïve Bayes:
Classificatore Naïve Bayes con Bag of Words
Classificatore Naïve Bayes:
È necessario calcolare e .
può essere stimato sulla base della frequenza di ogni classe nei dati di training (maximum likelihood)
dipende da come si rappresentano le features
Modello bag-of-word:
Rappresenta ogni token in d come un vettore di caratteristiche , dove è il numero di volte che il token i appare in d
può essere stimato come
\frac{\text{# di occorrenze del token i in c}}{\text{# totale di token in c}}
può essere pensato come , cioè la probabilità di trovare il token w nella classe c
Classificatore Naïve Bayes in pratica
Classificatore Naïve Bayes:
In pratica:
si stima come frazione di campioni etichettati come class c (se ho 1000 testi di training di cui 200 parlano di sport, la classe sport ha )
si stima come numero di volte che il token i appare nella classe c diviso per il numero di token nella classe c
Complicazioni pratiche
Se una parola w dal vocabolario (che contiene un numero di token pari a V) non compare mai nella classe c nei dati di training, si calcola , il che comporta .
"Zero probabilities cannot be conditioned away, no matter the other evidence!" - Dan Jurafsky
Soluzione tipica: Laplace smoothing
viene stimato come
\frac{\text{# di volte che il token w compare nella classe c + 1}}{\text{# totale dei token nella classe c + V}}
Classificatore Naïve Bayes in pratica
Ci sono due fasi:
Addestramento (training): si fanno le stime di e sulla base dei dati di training (usando i token lì presenti)
Inferenza (test): dato un esempio di test, lo si rappresenta come vettore di features e gli si assegna la classe c per la quale è massimo
Si usano le e le calcolate durante il training
Quindi si ignorano i token che compaiono nei dati di test ma non in quelli di training (se nei dati di training non compare mai la parola "mare", il sistema la ignora se la vede nei dati di test)
Training e test
In tutti i sistemi di machine learning (e non solo nel Naïve Bayes)
Durante il training, il sistema acquisisce informazioni sui patterns presenti nei dati e ne costruisce un modello matematico
Durante il test (al momento dell’utilizzo), il sistema cerca di generalizzare il modello per elaborare nuovi dati che non ha visto durante il training
In pratica servono
Dati di training per trovare i patterns di interesse e costruire un modello
Dati di validazione per calibrare gli iper-parametri del modello
Dati di testing per valutare se il modello funziona
Baseline, cioè un modello (molto semplice) che serve come termine di paragone (il nostro modello deve come minimo battere la baseline)
Valutazione delle prestazioni
Esiste un modo standard per valutare le prestazioni di qualsiasi classificatore.
Accuratezza: frazione dei documenti di test correttamente classificati
Precisione per la classe c: frazione dei documenti di test classificati come c correttamente classificati
Recall per la classe c: frazione dei documenti di test etichettati come c correttamente classificati
F1 score per la classe c: media armonica di precisione e recall
Metriche
L’accuratezza è facile: è quanti campioni hai classificato correttamente su quanti campioni ti sono stati mostrati.
Data una classe c:
Vero positivo (TP): si vede un campione c e lo si classifica correttamente
Falso positivo (FP): si vede un campione non-c e lo si classifica erroneamente come c
Vero negativo (TN): si vede un campione non-c e lo si classifica correttamente
Falso negativo (FN): si vede un campione c e lo si classifica erroneamente come non-c
Esempio
Accuratezza: traccia (somma degli elementi lungo la diagonale principale) diviso la somma totale (somma di tutti gli elementi)
Precisione: data una colonna, l’elemento sulla diagonale principale diviso la somma della colonna
Recall: data una riga, l’elemento sulla diagonale principale diviso la somma della riga
Classificatore a Regressione Logistica (discriminativo)
Ogni testo da classificare viene rappresentato come un vettore di features
Si calcola (in automatico) un vettore di pesi (weights) per capire quali features sono più utili a classificare
Per capire se un articolo di giornale parla di politica, "ministro" sarà più utile di "racchetta"
Per capire se una recensione di un prodotto è positiva o negativa, "funzionale" sarà più utile di "negozio"
In generale, per un vettore di n features, avremo , dove w è un vettore di pesi e b è un termine additivo (bias)
è l’equazione di una retta: modello lineare, il più semplice che esiste!
Parametri da apprendere in automatico
Quindi si moltiplica ciascuna feature per il peso (prodotto scalare tra vettore delle features e vettore dei pesi) e si somma la bias b
Equazione della retta!
Si possono imparare in automatico i valori del vettore dei pesi w e il valore della bias b
Poi però serve una funzione (necessariamente non lineare) per trasformare z in una probabilità
Regressione Logistica binaria
Supponiamo di voler classificare delle recensioni in brutte e buone (sentiment analysis)
Abbiamo solo due classi, brutta (0) e buona (1): facciamo vedere tanti esempi di recensioni brutte e di recensioni buone al classificatore
gli possiamo fare apprendere i valori dei parametri w (vettore di pesi) e b bias in modo che:
quando la review è buona, sia un numero grande
quando la review è brutta, sia un numero piccolo
in pratica torna meglio se trasformiamo z in una probabilità e facciamo apprendere i parametri in modo che:
quando la review è buona, z corrisponda a una probabilità vicina a 1
quando la review è brutta, z corrisponda a una probabilità vicina a 0
Come si fa a trasformare un numero reale in una probabilità, facendolo tendere a 1 se è grande e a 0 se è piccolo?
Funzione sigmoide
(Grafico della funzione sigmoide)
Funzione sigmoide
Detta anche logistic function
Quindi usiamo come output del classificatore e abbiamo finito: otteniamo la probabilità p(y|x) che una review sia buona; se è bassa, allora la classifichiamo come cattiva
Funzione logit
La logit è la funzione inversa della logistic function.
Ponendo ,
Sicuri che funziona?
Calma…
, ma è veramente una probabilità?
Quindi sì, la somma fa 1 e è veramente una probabilità.
Notate anche che
Loss function nel caso binario
Per un’osservazione x, il classificatore fornisce .
Si misura la differenza tra la classificazione e la vera y utilizzando un’apposita funzione detta loss function da minimizzare
Nel caso di classificazione binaria,
Se la vera classe y è 0, se il classificatore fornisce , ma in caso di errore
Se invece la vera classe y è 1, se il classificatore fornisce , ma in caso di errore
Quindi in ogni caso vogliamo massimizzare
A noi però serve una funzione da minimizzare
Si trasforma la moltiplicazione in addizione prendendo il logaritmo a sinistra e a destra:
Si cambia segno!
Si usa , che si chiama binary cross-entropy
Intuizione sulla Binary Cross-Entropy Loss
Intuitivamente, la binary cross-entropy penalizza di più il modello quando sceglie la classe sbagliata con alta probabilità (è sicuro di sé ma si sbaglia), aiutando così ad assegnare alta probabilità alla classe vera e bassa probabilità alla classe falsa.
Esempi:
y = 1, : (predizione corretta, perdita piccola)
y = 0, : (predizione errata, perdita grande)
Regressione Logistica Multinomiale
E se invece abbiamo N > 2 classi?
Ad esempio, se vogliamo classificare un articolo di giornale tra politica, economia e sport (N = 3)?
Ognuna delle 3 classi avrà un suo vettore di pesi e un suo bias
La classe i-esima, avrà un suo vettore di pesi e un suo bias
Al posto del sigmoide, si usa la funzione softmax, che permette di normalizzare le probabilità:
dove
Funzione softmax
La funzione softmax trasforma un vettore di numeri reali in un vettore di probabilità che somma a 1.
Applicando la funzione softmax al vettore x = [100, 1000, 100000], otteniamo:
La softmax ci permette di normalizzare un vettore in maniera che la somma dei suoi elementi sia 1 e che quindi i singoli elementi possano essere interpretati come probabilità.
Nel caso della regressione logistica multinomiale a 3 classi, l’uscita è un vettore di 3 elementi, ciascuno dei quali indica la probabilità che il testo appartenga a una delle 3 classi.
Gradient Descent
La discesa del gradiente (gradient descent) è un algoritmo di ottimizzazione utilizzato per trovare i minimi di una funzione.
Nel machine learning, la funzione a cui si applica è la loss function
Si parte da un punto iniziale e si utilizza il gradiente della funzione per muoversi verso il punto di minimo (o massimo).
Il gradiente è il vettore delle derivate parziali della funzione, che indica la direzione di massimo aumento.
Il passo di discesa viene controllato dal tasso di apprendimento (learning rate), che determina quanto velocemente l’algoritmo convergerà verso il minimo.
In pratica si usa stochastic gradient descent (SGD): per fare prima, si stima il gradiente su un sottoinsieme casuale del training set, che cambia a ogni iterazione
Regressione Logistica
Ricapitolando, occorrono i seguenti elementi:
Una rappresentazione delle features del testo.
Una funzione di classificazione che stima la classe a cui corrisponde il testo (sigmoid nel caso binario e softmax nel caso multinomiale)
Una funzione obiettivo per l’apprendimento che cerca di minimizzare l’errore tra classi predette e classi effettive sulla base dei dati di training (cross-entropy loss function)
Un algoritmo per ottimizzare la funzione obiettivo (stochastic gradient descent - SGD)
Ci sono due fasi:
Addestramento (training): addestriamo il sistema (imparando i parametri w e b della funzione di classificazione) utilizzando SGD e la cross-entropy loss function.
Test: dato un esempio di test x, gli si assegna l’etichetta y che massimizza p(y|x)
Regressione logistica come rete neurale
L’idea di base è avere una combinazione lineare delle features che rappresentano i dati di ingresso e darla in pasto a una funzione non-lineare per prendere una decisione (scegliere la classe)
Jurafsky & Martin, Speech and Language Processing
In pratica, la regressione logistica equivale a una rete neurale con un singolo layer
Nelle reti neurali, il sigmoide può essere sostituito da altre non-linearità, come ReLu o tanh
Funzioni di attivazione
Le non linearità si chiamano activation functions.
La loro caratteristica comune è la facilità di calcolo della derivata, che serve per gestire il processo di apprendimento.
Tangente iperbolica:
Rectified Linear Unit (ReLU):
Se non le usassimo, potremmo modellare soltanto relazioni lineari tra ingresso e uscita (inutile per problemi di classificazione dove l’uscita è la classe scelta)
Regressione logistica come rete neurale
Jurafsky & Martin, Speech and Language Processing
Nel caso multinomiale (più classi), bisogna invece usare la softmax (sigmoide generalizzato)
Reti neurali feedforward
Jurafsky & Martin, Speech and Language Processing
Una rete neurale feedforward con 2 layer permette l’apprendimento di relazioni non-lineari tra le features
Non è detto che aggiungere layer aiuti (dipende dalla complessità del problema)
Reti neurali feedforward
Hidden layer: , con W e b da imparare automaticamente durante il training
Output layer: , con U da imparare automaticamente durante il training
Normalizzazione con una softmax per ottenere una distribuzione di probabilità in uscita (fondamentale per classificare)
D. Jurafsky & J.H. Martin
Estrazione di features
Abbiamo visto semplici tecniche (indicatori binari, TF, TF-IDF)
A seconda del problema, si possono usare features speciali (ad esempio, numero delle parole positive e negative per la sentiment analysis)
In pratica però la cosa migliore è avere un sistema che, partendo dai dati, impari automaticamente le features
Questo si chiama representation learning
Si associa a ogni parola grafica un vettore
Gli elementi del vettore vengono appresi in automatico dal sistema (con reti neurali)
Esempio notevole di questa tecnica: Word2Vec (Google, 2013)
Embeddings come features
Jurafsky & Martin, Speech and Language Processing
Gli embeddings possono essere utilizzati direttamente come features
Si possono usare embeddings pre-appresi, oppure farli apprendere dal nostro sistema
Ipotesi distribuzionale
Parole usate in contesti analoghi tendono ad avere significati simili
Esempio con finestra di lunghezza 2 da ogni lato della parola target
Approcci distribuzionali
Famoso esempio di Eugene Nida (1975): supponete che vi chieda cos’è un tesgüino
"Sulla base del contesto, avrete capito che un tesgüino è una bibita alcolica che si ottiene da qualche cereale (un po’ come la birra)."
Idea di base: parole semanticamente simili hanno contesti simili
Potremmo sostituire tesgüino con beer e quelle frasi avrebbero ancora senso
Word Embeddings
Embedding: rappresentazione di una parola attraverso un vettore denso (di dimensioni contenute) che cattura le relazioni tra parole
In passato si usavano le tecniche viste per la feature extraction e poi si usava l’algebra per proiettare i vettori su uno spazio vettoriale di dimensioni ridotte
Nell’ultimo decennio, hanno preso il sopravvento le tecniche predittive che usano una rete neurale (tipicamente feedforward e con pochi layer) per predire le singole parole sulla base delle parole vicine.
(Grafico di Google Trends per "word embeddings")
Modelli predittivi: Word2Vec
Si effettua il training di un classificatore (rete neurale feedforward) per predire la probabilità che una data parola sia parola di contesto di un’altra parola (ex. studente avrà una maggiore probabilità di essere parola di contesto di esame rispetto a lago)
Si parte con un grande corpus e quindi con un vocabolario di una data lunghezza
Ogni parola nel vocabolario del corpus è rappresentata come vettore (inizialmente random)
Considero le parole del corpus singolarmente. Quando una data parola è il target, ci saranno delle parole di contesto.
Skip-gram: predire le parole di contesto sulla base della parola target.
Continuous bag of words (CBOW): predire la parola target sulla base delle parole di contesto (viste come una bag of words)
Per iterazioni successive, si aggiustano i vettori per massimizzare la suddetta probabilità
Concetto chiave: predire la probabilità serve a far sì che il sistema popoli