NLP FullCourse It
NLP FullCourse It
[Link]
19 sett. 2022
Introduzione
Il libro di Tamburini Modelli neurali per l'elaborazione automatica dell'italiano sarà il principale
riferimento/supporto per questo corso, ma non è sufficiente e ci saranno altri libri. Consultate le diapositive e il
sito
letture nella tabella realizzata specificamente per ogni lezione (ma sappiate che avete più di un riferimento per
ogni argomento: non dovete necessariamente leggere tutto, ma solo quello che vi serve per capire
l'argomento). Lo stesso vale per i sei libri della bibliografia.
❗ Gli studenti possono scegliere come dare l'esame: può essere un progetto (+ alcune domande generali sugli
argomenti del corso) o un colloquio orale (tre domande generali o specifiche) → la data dell'esame deve essere
Il progetto deve essere inviato 7 giorni prima dell'appuntamento, su appuntamento, con circa 2 o 3 settimane di
anticipo (verrà aperto un "appello" su AlmaEsami).
La Linguistica Computazionale o PNL è un campo intrinsecamente interdisciplinare. Ci sono almeno due grandi
argomenti, entrambi necessari: la linguistica, che dovrebbe fornire i modelli linguistici teorici per gestire i fenomeni che ci
interessano, e l'informatica per ideare algoritmi e soluzioni computazionali per risolvere i problemi... ma in mezzo ci sono
molte altre materie: la psicologia ( → il nostro cervello è lo strumento migliore per elaborare i linguaggi: neurolinguistica,
neuropsicologia...), la teoria dell'informazione (teoria ingegneristica teorica che può fornire un quadro teorico dal punto di vista
computazionale per la comunicazione), la matematica e la statistica.
Qual è il modello concettuale alla base dello sviluppo di qualsiasi applicazione computazionale?
Da un lato abbiamo l'oggetto del nostro studio (la BN), dall'altro un computer che cerca di risolvere un compito sulla BN. I
passaggi dal problema alla soluzione sono più o meno gli stessi: per prima cosa dobbiamo ideare un modello formale che
elenchi i passaggi per la soluzione del nostro problema (formalizzare
la soluzione), poi bisogna ideare un algoritmo
che prenda il modello formale e fornisca una
procedura algoritmica per risolvere il problema in
pratica.
Il passo più problematico è la
formalizzazione del problema, poiché la
linguistica non ha fornito una teoria uniforme
per l'interpretazione dei fenomeni linguistici. La
mancanza di tale teoria è molto problematica: ogni
fenomeno che vorremmo studiare necessita di una
formalizzazione!
Questa relazione implica l'equazione 𝑦 = 1/𝑥 → un'iperbole (ascissa: il grado, ascissa: la frequenza).
Questa legge è una proprietà di qualsiasi BN, e per mitigare questa distribuzione (problema dei dati scarsi) dobbiamo
raccogliere un'enorme quantità di dati: la distribuzione sarà la stessa, ma la funzione si sposterà un po' più in alto, pur
mantenendo la stessa forma (otteniamo più dati sul fenomeno che ci interessa) → questo è il motivo per cui abbiamo corpora
di almeno 100 milioni di parole per le lingue nazionali... e questa è la dimensione di base: ci sono corpora di 10 miliardi di
parole.
● Al giorno d'oggi non contiamo più le parole per quantificare i nostri corpora, ma usiamo i TeraByte → questo significa
che abbiamo bisogno di una grande potenza di calcolo per gestire questi dati!
20 sett. 2022
Calcolo delle probabilità
Il calcolo delle probabilità, in passato, era la spina dorsale di ogni soluzione NLP. Ancora oggi, il concetto di probabilità e
tutti gli altri argomenti che tratteremo oggi sono alla base delle reti neurali profonde, e avere una conoscenza ampia e generale
è fondamentale per noi.
Lavoriamo su una base empirica, e quindi estraiamo informazioni quantitative dai testi per ricavare modelli
linguistici (modello = significato generico, qualsiasi tipo di modello che abbia a che fare con il linguaggio). La frequenza è la
base stessa dell'informazione che possiamo estrarre dal testo e la co-occorrenza dei fenomeni linguistici può essere misurata
con l'uso della frequenza, che però non è sufficiente per costruire modelli in grado di supportare la creazione di soluzioni
computazionali: dobbiamo introdurre la nozione di probabilità (o modelli stocastici).
● L'idea generale è quella di utilizzare i dati contenuti in un corpus per raccogliere qualsiasi tipo di prova a
sostegno dei nostri modelli e progettare, utilizzando tali prove, un modello probabilistico o stocastico.
● Stocastico = si riferisce alla proprietà di essere ben descritto da una distribuzione di probabilità casuale [Wikipedia].
Probabilità
Se un evento generale, nella nostra vita, può verificarsi in modo non prevedibile, lo chiamiamo "evento casuale". Ci sono
molte situazioni nella nostra vita che producono eventi casuali (ad esempio, il lancio di una moneta, il lancio di un dado, il
tentativo di capire qual è la probabilità di trovare la parola "il" all'inizio di una frase...).
● Un processo/sistema casuale è un processo o un sistema che produce eventi casuali come effetto del suo
comportamento La probabilità è uno strumento quantitativo che ci permette di ragionare in una situazione di
incertezza, facendo previsioni sulla
il verificarsi di un evento. La probabilità di un evento casuale può essere definita come la misura del grado di incertezza
del verificarsi dell'evento.
● È una funzione che può andare da 0 (evento impossibile) a 1 (evento certo).
L'insieme di tutti gli eventi che possono essere definiti da uno spazio di campionamento Ω è chiamato spazio degli eventi su Ω.
● La definizione formale di probabilità è che si tratta di una funzione che assegna un numero reale (tra 0 e 1) per ogni
evento definito su Ω e misura il grado di incertezza del verificarsi dell'evento.
Se consideriamo la probabilità di tutti gli eventi su Ω, definiamo una distribuzione di probabilità sullo spazio degli eventi su Ω.
La definizione classica di probabilità può essere introdotta se e solo se tutti gli eventi semplici su Ω sono
equiprobabili: se siamo sicuri che tutti i possibili risultati semplici del mio esperimento sono ugualmente probabili, allora
possiamo introdurre la definizione classica di probabilità:
𝑝(𝐴) = |𝐴|
|Ω|
● | | → è la cardinalità (numero di elementi dell'insieme)
Eventi congiunti
Molto spesso avremo bisogno di misurare la probabilità di eventi che si verificano nello stesso momento (ad esempio,
lanciamo due dadi, qual è la probabilità di ottenere 2 "3"?). Possiamo usare la stessa formula di prima, ma questa volta
l'output sarà una coppia di valori.
Esempio: Qual è la probabilità di ottenere due 3 di fila (lanciando due dadi insieme)?
Dobbiamo calcolare due probabilità: "ottenere un 3 al primo lancio" e "ottenere un 3 al secondo lancio".
Lo spazio di campionamento Ω, questa volta, è definito come l'insieme di tutte le coppie (e1 ,e2 ) di risultati possibili: 6 ∗ 6 = 36
Se i due dadi non sono distorti, la probabilità associata al verificarsi di una specifica coppia (ad esempio (3,3)), sarà
𝑝({(3, 3)}) =1 =1 =1 = ∗ 11
Ω 36 (6∗6) 6 6
Se due eventi sono statisticamente indipendenti (= un evento non può influenzare l'altro e viceversa, è il caso dei due
dadi), possiamo calcolare la probabilità dell'evento congiunto con questa formula: 𝑝(𝐴, 𝐵) = 𝑝(𝐴) ∗ 𝑝(𝐵) .
Probabilità condizionata
Si tratta di un concetto cruciale per il calcolo delle probabilità. Una delle principali proprietà strutturali della BN è la
linearità: in qualsiasi produzione linguistica possiamo identificare un flusso lineare di eventi (ad esempio, quando parliamo, il
tempo è l'ordine lineare). Il punto di vista corretto quando si gestiscono i fenomeni linguistici è quello di concepirli come
una sequenza di eventi.
Le parole non si combinano tra loro con la stessa probabilità, indipendentemente dal contesto (una sequenza di parole in
un testo non è il risultato di una serie di scelte casuali). Ciò significa che la presenza di un'unità linguistica influenza in qualche
modo le altre unità: la scelta di una parola modifica lo spazio di probabilità della scelta lessicale successiva.
● Non possiamo supporre che ogni unità sia concatenata a caso senza alcun legame tra di loro! Questa è una
proprietà linguistica
In linea di principio, la probabilità di ottenere la sequenza "il cane" non può essere la moltiplicazione delle due diverse
probabilità, perché non sono affatto indipendenti! Per calcolare la probabilità di ottenere la parola "cane", dobbiamo tenere
conto del fatto che la parola precedente è "il"! Il concetto di probabilità condizionata ci permette di esprimere esattamente
questo punto:
𝑝(𝐴|𝐵) = 𝑝(𝐴,𝐵 )
𝑝(𝐵)
● Questa formula ci permette di calcolare la probabilità dell'evento A, sapendo che l'evento B è avvenuto prima
● 𝑝(𝐴) è la probabilità a priori (la probabilità di avere l'evento A senza avere l'evento B)
● 𝑝(𝐴|𝐵) è la probabilità a posteriori (la probabilità di avere l'evento A dopo aver avuto l'evento B)
Esempio:
● A = {"divisibile per 2" }B = {"divisibile per 3" }C = {"divisibile per 4"}
○ A e B sono indipendenti
○ A e C sono dipendenti: se il risultato è un numero divisibile per 4 (evento C), allora è certamente anche
divisibile per 2 (evento A).
Nei casi in cui non possiamo calcolare una probabilità condizionata, forse possiamo calcolare l'inverso e quindi utilizzare
l'inversione bayesiana per costruire il nostro modello. Si tratta di una relazione molto utile che utilizzeremo due o tre volte
durante il corso.
L'inversione bayesiana ci permette di invertire il condizionamento tra due eventi. Permette di collegare 𝑝(𝐴|𝐵) con la
probabilità 𝑝(𝐵|𝐴) ed è molto utile se non possiamo stimare 𝑝(𝐴|𝐵) ma è molto più semplice stimare 𝑝(𝐵|𝐴).
Utilizziamo la frequenza relativa: data 𝑓(𝐴) la frequenza di un evento A, la sua frequenza 𝑓(𝐴 )
relativa è 𝑓 (𝐴) =
𝑟 𝑁
● 𝑓(𝐴) → frequenza di un evento
A
● 𝑁 → numero di esperimenti
Si tratta di una frequenza rapportata al numero di esperimenti: dopo aver eseguito gli esperimenti possiamo misurare
quante volte abbiamo ottenuto l'evento A e quindi possiamo misurare la frequenza relativa.
La definizione frequentista di probabilità ci dice che possiamo approssimare la probabilità di un evento con la
frequenza relativa del suo verificarsi in un gran numero di esperimenti (N deve essere abbastanza grande!).
La probabilità di un determinato evento può essere stimata come il valore a cui tende la frequenza relativa di A,
aumentando il numero di volte che abbiamo eseguito l'esperimento (è uguale alla frequenza relativa quando N tende a infinito).
𝑝(𝐴) = 𝑙𝑖𝑚
𝑁→∞ 𝑓(𝐴
)
𝑁
● Nella vita reale non abbiamo mai la possibilità di porre N all'infinito, quindi in ogni stima reale della probabilità
possiamo solo porre N il più grande possibile, sperando nel meglio → l'accuratezza della stima empirica della
probabilità di A data dalla frequenza relativa dipende dal numero di osservazioni/esperimenti che abbiamo fatto
○ Il fre
Da un lato abbiamo la probabilità, un concetto teorico. Possiamo costruire un meraviglioso modello stocastico che collega
migliaia di probabilità in modo molto complesso e intelligente, ma rimane un dispositivo matematico, un esercizio matematico
per nulla utile se non siamo in grado di dare un numero a ogni probabilità coinvolta nel nostro modello. Dobbiamo essere in
grado di stimare, di inserire valori in tutte le probabilità coinvolte: senza la capacità di fare queste operazioni, non abbiamo la
possibilità di costruire una soluzione computazionale funzionante. Per farlo, dobbiamo assegnare dei numeri (tra 0 e 1) a tutte le
probabilità coinvolte). E per farlo, non potendo usare la definizione classica, dobbiamo usare la frequenza relativa: possiamo
fare molti esperimenti, raccogliere tutte le frequenze relative e poi stimare tutte le probabilità approssimandole con le loro
frequenze relative...
● La definizione frequentista di probabilità è centrale in tutti i tipi di indagini scientifiche, in quanto collega la
nozione di probabilità di un evento alla frequenza con cui si verifica in una serie di esperimenti.
○ Fornisce anche una stima della probabilità nei casi in cui non è possibile assumere che la distribuzione di
probabilità sia uniforme (ad esempio, nelle lingue ci sono parole/costruzioni più frequenti di altre, quindi la
distribuzione di probabilità non è uniforme).
uniforme
Attenzione: molto spesso si ottiene una probabilità pari a 0 e bisogna essere molto sospettosi: nel nostro modello non
possiamo accettare nessuno 0, dobbiamo applicare una correzione. È molto meglio ammettere e calcolare tutto piuttosto che
avere uno zero! Quasi tutti
I modelli di probabilità sono modelli moltiplicativi e la presenza di un solo 0 azzera la situazione: il sistema non funzionerà su nessun ingresso.
Esempio: vogliamo misurare la distribuzione dell'altezza degli studenti universitari e misuriamo il campione di studenti
presenti nella stanza. Poi generalizzeremo i nostri risultati all'intera popolazione, dati i dati del campione! Si tratta di una stima
non parametrica, poiché la probabilità 𝑝({1, 53}) è un insieme vuoto e questo non è plausibile!
Possiamo seguire un approccio diverso, imponendo una distribuzione gaussiana e stimando i due parametri (media e
deviazione standard). Alla fine avremo una distribuzione gaussiana. In questo caso possiamo stimare la probabilità di avere
qualsiasi altezza nell'intervallo senza avere probabilità pari a 0. Per i fenomeni linguistici la stima parametrica della
probabilità è raramente utilizzata.
Costruire un modello linguistico significa creare un modello tecnico in grado di calcolare la probabilità dell'evento
successivo data una sequenza di eventi precedenti.
Un modello linguistico classico della linguistica computazionale si basa sulle parole: data una sequenza di parole (token),
qual è la probabilità di avere tale sequenza? Come possiamo calcolare la probabilità di una sequenza di parole?
Sarebbe il prodotto della probabilità della prima parola per la probabilità della seconda parola condizionata dalla prima
parola, per la probabilità della terza parola condizionata dalle due precedenti ecc. ecc. Questa è una regola della catena e
possiamo ricavarla matematicamente applicando l'analisi del calcolo delle probabilità. È una soluzione esatta al problema.
𝑛
𝑝(𝑤) = ∏ 𝑝(𝑤 |𝑤 , ..., 𝑤 )
𝑖 1 𝑖-1
𝑖=1
Misurando la frequenza dell'intera sequenza divisa per la frequenza dell'intera sequenza meno l'ultima parola, possiamo
stimare perfettamente un elemento del prodotto iterato. Facendo questo per tutti gli elementi della sequenza, possiamo stimare
una frase generale in inglese. Per misurare questa frequenza raccogliamo grandi corpora, misuriamo la frequenza di ogni
elemento della frase, calcoliamo il rapporto e lo stimiamo. Poi possiamo moltiplicarlo per tutti gli altri pezzi e abbiamo la
probabilità dell'intera frase.
Ma funziona davvero? No, a causa della legge di Zipf: stiamo combinando parole rare e la probabilità di ottenere la
combinazione dell'intera sequenza in un corpus enorme è quasi impossibile. È molto probabile che tutte le stime restituiscano
0!
In una situazione molto approssimativa in cui abbiamo solo 20 mila forme-parola, le diverse combinazioni di queste forme
(ammettendo che tutte siano possibili, cosa non vera nelle lingue reali) sono 400 milioni. Per essere sicuri di ottenere, in media,
una per ogni combinazione, dovremmo raccogliere 400 milioni di corpora, ma questo è ridicolo, poiché non siamo interessati a
coppie di parole, ma a molte di più!
Come possiamo approssimare una soluzione? Per ogni modello stocastico, il primo passo è ottenere il modello ideale.
Riconosciamo immediatamente che non possiamo stimare le probabilità utilizzando il modello generale, e quindi
semplifichiamo il modello introducendo ipotesi di indipendenza, in una certa misura.
● Ogni parola è indipendente l'una dall'altra → Unigramma
○ Si tratta di un modello inadeguato, in quanto presuppone la totale indipendenza degli elementi di una
catena linguistica, cosa che sappiamo non essere il caso.
● Ogni parola è indipendente da tutte le altre, tranne la precedente → Bigramma
● Ogni parola è indipendente da tutte le altre, tranne le due precedenti → Trigramma
● ...ecc. ecc.
● L'intero Google Books, per essere affidabile, potrebbe fornirci solo 5 grammi!
Naturalmente, se limitiamo la lunghezza della sequenza che esaminiamo nel corpus, allora le possibilità di recuperare
numeri diversi da 0 migliorano notevolmente, e forse un modello di trigramma utilizzando un corpus di 100 milioni può essere
costruito abbastanza bene! Possiamo anche spingere l'orizzonte [-2,+2]. Ma da un punto di vista linguistico, questo non è
ancora un modello molto buono: sì, le implicazioni linguistiche sono principalmente locali (la maggior parte delle dipendenze
tra le parole sono locali), ma abbiamo anche dipendenze a lungo raggio che sono molto importanti e che vengono
completamente ignorate da questo modello! Il modello standard, per le persone normali, è ancora quello dei trigrammi.
Con i modelli a N-grammi, possiamo costruire un modello linguistico basato su n-grammi. Abbiamo la possibilità di
calcolare quale sia la parola successiva più probabile, data una sequenza di parole o qualsiasi unità linguistica:
𝑤𝑛
= 𝑎𝑟𝑔𝑚𝑎𝑥𝑤𝑛 𝑝(𝑤𝑛| 𝑤1, ..., 𝑤𝑛-1)
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
21 sett. 2022
Modelli di Markov
Abbiamo già capito che i fenomeni linguistici cambiano con il passare del tempo e la struttura più appropriata per
analizzare questi fenomeni è la sequenza di eventi (= ogni fase dell'evento corrispondente dipende dagli eventi
precedenti della sequenza).
Abbiamo la sequenza di eventi 𝑋 = (𝑋 , 𝑋 , ..., 𝑋 ) che assume i valori in 𝑆 = {𝑠 , 𝑠 , ..., 𝑠 }
1 2 𝑇1 2 𝑁
La sequenza è una catena di Markov se possiede le due proprietà di Markov:
1. Ogni evento dipende solo dal precedente (modello di ordine 1)
○ 𝑃(𝑋 = 𝑠 | 𝑋 , ..., 𝑋 ) = 𝑃(𝑋 =𝑠|𝑋)
𝑡+1 𝑘 1 𝑡 𝑡+1 𝑘 𝑡
2. La stessa probabilità non cambia nel tempo
○ 𝑃(𝑋 = 𝑠 | 𝑋 , ..., 𝑋 ) = 𝑃(𝑋 = 𝑠 | 𝑋 )
𝑡+1 𝑘 1 𝑡 2 𝑘 1
La combinazione delle due probabilità è che la probabilità di avere un valore in un certo punto dipende solo dal
valore precedente e non cambia nel tempo! Se una sequenza rispetta queste due proprietà, è una catena di Markov.
Possiamo descrivere in modo compatto una catena di Markov utilizzando la sua matrice di transizione: un generico
elemento di questa matrice contiene la probabilità di passare da un valore a quello successivo
con il vincolo che, a partire da un determinato valore, la
somma degli altri valori deve essere uno.
● π = 𝑃(𝑋 = 𝑠 ) Σπ=1
𝑖 1 𝑖 𝑖 𝑖
È molto più semplice vedere la catena di Markov come
una piccola macchina che collega gli stati con i bordi. Ogni
valore possibile è uno stato (cerchio) e i bordi da uno stato
all'altro mostrano la probabilità di passare dallo stato iniziale a
quello finale.
-Se non si ha un bordo, significa che la
probabilità è 0 (zero).
Dobbiamo introdurre una nuova struttura dati per
descrivere la distribuzione di probabilità di trovarsi in uno stato
specifico al tempo 1: si tratta del vettore P, che esprime il fatto
che al tempo 1 ci troviamo in uno stato specifico.
Data la matrice di transizione e il vettore di probabilità
iniziale, posso usare questa piccola macchina per calcolare la
probabilità di una data sequenza di valori-stati.
Potete saltare le diapositive che spiegano tutte queste procedure per risolvere i tre problemi di base.
Apprendimento automatico
Si tratta di una classe di algoritmi in grado di impostare il modello formale per la soluzione di un problema specifico
osservando i dati in qualche modo. L'idea è quella di un apprendimento incrementale su una lunga sequenza di dati.
Maggiore è la quantità di dati di addestramento, migliore sarà il modello finale. Anche la qualità dei dati fa parte del gioco!
● Mitchell (1997) sulla definizione di "apprendimento": "[Si dice che un agente] impara dall'esperienza E rispetto a
una certa classe di compiti T e a una misura di prestazione P, se la sua prestazione nei compiti di T, misurata da
P, migliora con E".
○ Più dati si forniscono al sistema di ML, migliori sono le sue prestazioni in un determinato compito.
Dobbiamo introdurre subito una suddivisione molto ampia tra i metodi ML (discuteremo i due più importanti):
1. Sistemi di ML supervisionati
○ Tutti richiedono che i nostri dati forniscano la soluzione corretta del problema per imparare a
risolverlo → si cercherà di imparare il modello copiando i dati: una volta che il sistema è in grado di
riprodurre l'esempio, allora è pronto a vedere nuovi dati e ad annotare allo stesso modo, si spera in modo
corretto
○ Noi siamo l'insegnante, forniamo esempi di soluzione corretta del compito e il sistema impara
automaticamente dalle nostre indicazioni.
○ Nei sistemi di ML supervisionati possiamo fornire alcuni punti della funzione (che approssimiamo) e
lasciare che il sistema li interpoli, imparando a generalizzare per i dati non visti → il sistema cerca di
apprendere la funzione migliore attraverso un processo iterativo che aumenta la precisione della funzione
■ Possiamo vedere il processo di addestramento come un'approssimazione di funzioni:
l'obiettivo dell'algoritmo è quello di indurre un'approssimazione f^ di una funzione target f
○ Tutta l'impresa funziona partendo dal presupposto dell'apprendimento induttivo: se il mio algoritmo di
ML funziona bene sui dati annotati, dopo molte fasi di apprendimento, alla fine è in grado di funzionare
bene sui dati addestrati, allora l'idea è che sarà in grado di funzionare bene anche sui nuovi dati... ma
non è sempre vero.
2. Sistemi ML non supervisionati
○ Stanno diventando l'approccio dominante per la soluzione di alcuni tipi di problemi.
○ Questi sistemi di ML sono in grado di esaminare i dati in forma grezza, senza alcun tipo di annotazione,
e sono comunque in grado di eseguire un qualche tipo di apprendimento e di risolvere un qualche tipo di
problema.
○ I sistemi più sofisticati utilizzati al giorno d'oggi sono le reti neurali profonde, ma le addestriamo in
modo non supervisionato utilizzando alcuni trucchi.
○ In generale, questi sistemi sono algoritmi di clustering, in grado di osservare i dati e di classificare
elementi simili e dissimili, creando gruppi di elementi omogenei.
Esempio:
Xx il libro è sul tavolo. xx
Prima istanza: (il, x, libro, x, è) - a mano, annotiamo questa istanza come → questa è classe ARTICOLO
DEFINITIVO Seconda istanza: (il, libro, il, è, x, su) → questa è classe NOMINALE
Terza istanza (è, libro, su, il, tavolo) → questo è un VERBO di classe
Questo è il nostro set di allenamento. Il sistema deve imparare a mappare questi vettori nella classe più appropriata. Tutti i
sistemi ML supervisionati sono in grado di imparare da questo tipo di annotazioni.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
L'input è un vettore (𝑥 , ..., 𝑥 ) e ogni istanza deve essere associata a una classe specifica (supponiamo di avere solo due classi).
1 𝑛
classi: 0 e 1).
𝑑1 (𝑥 , ..., 𝑥 ) → {0, 1}
1 𝑛
Questa è la magia che sta alla base di ogni sistema di Machine Learning: ogni sistema di ML deve determinare in modo iterativo, mediante
per tentativi ed errori, il miglior separatore, nello spazio n-dimensionale, che divide le diverse n classi dell'insieme di addestramento, viste
come punti in un piano.
● Il numero di dimensioni influisce sulla velocità del processo di apprendimento.
● I sistemi ML possono essere classificati in base alla loro forza: alcuni di essi sono in grado di proiettare solo
separatori lineari (vedi: algoritmo di Naive Bayes)
Per i sistemi ML supervisionati, qual è la procedura corretta per addestrare un sistema ML nuovo?
Ho un grande corpus di dati annotati (annotazioni che mostrano la soluzione corretta a ogni istanza del mio problema).
Dobbiamo dividere questo grande insieme di dati in tre parti: un insieme di formazione, un insieme di validazione e un
insieme di test. Per far sì che il sistema impari, dobbiamo eseguire una procedura di prova ed errore.
Le proporzioni della divisione sono TR 80%, le altre due 10% ciascuna (il set di allenamento deve essere molto più grande degli altri).
1. Iniziamo l'addestramento del sistema sul set di addestramento e lasciamo che il sistema impari a risolvere i
problemi adattando il separatore nel modo migliore.
2. Quindi, testiamo il sistema sull'insieme di validazione per stimare le prestazioni su dati non visti.
3. Se non siamo soddisfatti, dobbiamo modificare leggermente alcuni parametri del nostro algoritmo di ML
per vedere se una configurazione diversa è migliore o meno (iperparametri = parametri dell'intero algoritmo
di ML).
a. Quindi, addestriamo il sistema, lo convalidiamo e forse vorremmo cambiare alcuni iperparametri per
vedere se le prestazioni migliorano sul set di convalida (questo è un ciclo che va avanti e indietro
continuamente).
4. Una volta soddisfatti delle prestazioni del sistema sul nostro set di validazione, dobbiamo stimare le capacità di
generalizzazione del mio sistema su nuovi dati: utilizziamo il set di test alla fine per testare il nostro sistema e
ottenere una misura di valutazione delle sue prestazioni.
a. Se non si è soddisfatti a questo punto, non si può rientrare nel ciclo, il set di test non fa parte
dell'addestramento.
b. Il risultato finale fornisce una stima della bontà del sistema su dati nuovi e non visti.
27 sett. 2022
Apprendimento automatico
Esistono due tipi principali di metodi proposti per indurre l'approssimazione f^ della funzione target f (= per far apprendere
il sistema di ML dai dati annotati, che viene visto come un processo di approssimazione della funzione):
1. Metodo numerico - Classificatori Naive-Bayes
○ 𝑐' = 𝑎𝑟𝑔𝑚𝑎𝑥 𝑃(𝑐|𝑑𝑗) = 𝑎𝑟𝑔𝑚𝑎𝑥 𝑃(𝑑𝑗|𝑐) ∗ 𝑃(𝑐)
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
○ Possiamo stimare le due probabilità dopo 𝑎𝑟𝑔𝑚𝑎𝑥 dai dati per costruire
un vero classificatore
■ In questo esempio, se volessimo essere molto semplici,
potremmo introdurre l'ipotesi di dipendenza (ogni
caratteristica dipende dalle altre caratteristiche)
○ Questo tipo di classificatore è molto semplice e poco potente, ma è
molto chiaro.
○ Il confine decisionale proiettato da questo classificatore è lineare (la
generalizzazione dimensionale superiore di una linea retta)
○ ❗ Attenzione, ci sono molti problemi che non richiedono strettamente
un separatore non lineare: se il problema ha classi ben suddivise,
anche un separatore lineare potrebbe funzionare per ottenere buoni risultati
Una cosa che riguarda quasi tutti i sistemi ML è che quasi tutti i sistemi ML sono in grado di apprendere il modello
formale dai dati, ma il modello formale non è affatto leggibile. Questo vale anche per le Reti Neurali Profonde: sono
meravigliose in
L'apprendimento di un nuovo modello che collettivamente funziona abbastanza bene, ma non è possibile ispezionare il
modello per rivelare le regolarità nei dati.
Esempio: Sistemi di ML per la soluzione del problema dei tag PoS
Sappiamo che non esistono modelli o teorie linguistiche affidabili che ci permettano di adottare un sistema basato su
regole, quindi di solito lasciamo che il sistema di ML analizzi i dati e deduca un modello formale che possiamo poi
esaminare... beh, questo non è possibile. I modelli formali derivati dai sistemi di ML non sono affatto interpretabili: sono
rappresentati da 1 miliardo di numeri che, organizzati in una specifica architettura, sono in grado di presentare uno specifico
comportamento... ma non si può interpretare questo miliardo di dati per ricavarne una qualche regola generale: non si può
chiedere "perché hai risposto così?".
- Questo è importante per noi: Le DNN sono così competenti che le usiamo in quasi tutte le discipline e applicazioni
reali (ad esempio i veicoli autonomi) → non stanno elaborando simboli che si possono interpretare, stanno
elaborando numeri e sono tutti metodi numerici (che non possono essere tipicamente interpretati)
- Questo è un grosso problema: tra due o tre anni un nuovo argomento dell'IA sarà l'IA spiegabile → un nuovo
metodo che ci permette di interpretare il modello e di capire perché, qual è il percorso, quale decisione è stata
presa e magari di fare delle correzioni!
2. Metodo simbolico
Ci sono alcuni sistemi di ML, molto pochi, che sono in grado di creare un modello interpretabile: uno di questi riguarda
gli alberi decisionali. Il modello è un albero di decisioni, e in ogni nodo dell'albero si ha una decisione, con S/N si prende una
strada o l'altra.
A seconda dei vettori riga delle istanze (con classe: sì o no), esiste un possibile albero derivato da sistemi automatici di
ML. Dato il tipo di prospettiva, se c'è il sole e l'umidità non è così alta, possiamo giocare a tennis... e così via.
Questo funziona bene con esempi giocattolo, ma con dati reali e migliaia di esempi e magari decine di caratteristiche che
definiscono un'istanza del problema, l'albero diventerebbe immediatamente un pasticcio. Sì, sarebbe ancora un albero
decisionale, ma molto più complicato. In linea di principio il modello è leggibile e ispezionabile, ma in pratica non è molto utile.
● SVM sono in grado di trovare il classificatore lineare ottimale tra due classi → trovare il classificatore ottimale che mantenga
la distanza maggiore tra le due classi (il confine massimo)
○ Il fatto che sia lineare, però, lo fa sembrare poco utile, ma c'è un trucco: utilizzando un kernel
specializzato, si può proiettare questo spazio in uno spazio a dimensioni più elevate
■ Nel caso in cui si abbia bisogno di un separatore non lineare, questo metodo proietta i dati in
uno spazio più elevato in cui le due classi sono separate linearmente.
L'idea è quella di avere istanze dei dati (di nuovo formalizzate, come prima, come vettori di caratteristiche (linguistiche)).
L'unica differenza è che in questo caso non abbiamo annotazioni e l'unica cosa che possiamo fare è confrontare i vettori di
istanze diverse, quantificare la loro somiglianza e mettere insieme istanze simili e istanze dissimili in gruppi diversi.
Dobbiamo definire e introdurre una misura di distanza tra vettori (qualsiasi distanza matematica che funzioni nello
spazio n-esimo dimensionale in cui si trovano le nostre istanze): dobbiamo definire una misura di similarità tra le nostre
istanze ed esamineremo brevemente due tipi di metodi di clustering:
1. Clustering gerarchico
2. Clustering partizionale
1. Clustering gerarchico
L'algoritmo procede in questo modo: dato un insieme di istanze, inizia a raggruppare
le due istanze più simili. Poi le altre due, e così via. Ogni volta che unisce due istanze del
mio problema, forma un nodo in un albero: i nodi formano i cluster (gruppi di istanze) e ci
sono diversi modi di calcolare il centroide (il punto centrale di ogni gruppo) per confrontare
ogni gruppo con gli altri.
Il processo consiste nel costruire un albero e alla fine si ottiene un dendrogramma ad
albero: l'altezza di ogni ramo è proporzionale alla misura di similarità.
L'algoritmo è molto semplice: può essere bottom-up (raggruppamenti) ma anche top-
down (suddivisione in gruppi... è più complesso da implementare e comprendere). Il punto
è che alla fine otterremo un albero completo... ma qual è il punto giusto per tagliare
l'albero?
Se sappiamo in anticipo quanti gruppi abbiamo nei nostri dati, è facile, ma in
pratica non lo sappiamo quasi mai e molto spesso questo è un risultato molto
importante che vorremmo ottenere ed è la prima domanda che mi pongo (quanti
gruppi ci sono nei miei dati?), quindi partire da un numero specifico di gruppi in
anticipo non è l'ideale.
Possiamo osservare l'albero e una volta che iniziamo a unire gruppi molto
dissimili, è il momento di interrompere la procedura: quando si riscontra un grande
salto nelle distanze, è il momento di fermarsi.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
● Questo modo di procedere presuppone che si possa dare un'occhiata all'albero (con pochissime istanze), ma
nelle situazioni reali ci sono miliardi di dati e non è possibile ispezionare l'albero.
○ Per risolvere questo problema, esistono alcune misure (come la misura della silhouette) che
ispezionano l'albero in modo automatico.
2. Clustering partizionale
In questo caso, dobbiamo fornire all'algoritmo di clustering il numero di cluster k che desideriamo: è uno dei
parametri che dobbiamo impostare, non possiamo evitarlo. Come esseri umani, siamo molto bravi a trovare i gruppi, a patto
che possiamo visualizzare lo spazio (e non è sempre così!).
L'algoritmo inizia quindi a selezionare casualmente n centroidi che rappresentano il punto centrale nello spazio di ogni
classe (in totale n) che dobbiamo creare. Ma, essendo casuali, devono muoversi e adattarsi ai dati realmente rispettati. Poi
Ricompilare il centroide facendo la media di tutte le istanze di ciascun gruppo e riassegnare le istanze a ciascun
centroide. Continuiamo in questa fase e alla fine l'algoritmo è più o meno in grado di trovare il clustering corretto nello spazio.
Cosa succede se inseriamo il numero sbagliato di classi? Le classi potrebbero essere divise o fuse insieme (se il numero è
superiore o inferiore al numero corretto di classi/cluster).
Il punto importante è che i sistemi di ML non supervisionati sono solo in grado di creare gruppi nei dati.
Esistono metodi di clustering molto più sofisticati di questi due (HDBSCAN, metodi spettrali, ... → consultate il pacchetto
scikit-learn per il ML classico in python).
Le reti neurali non sono una novità. Al contrario, sono il più vecchio sistema di ML mai proposto: sono sul mercato dagli
anni '50! Le idee di base delle NN sono state sviluppate più o meno tutte negli anni '80, con Rumelhart, Hinton e Williams.
L'idea di partenza era quella di emulare il sistema nervoso
animale. Perciò, si cercò innanzitutto di creare un modello di neurone
biologico (composto da una cellula che riceve molte connessioni
chiamate dendriti, nonché alcuni input, modulati da sinapsi, da parte di
altri neuroni - se il corpo cellulare del soma riceve un segnale sufficiente
accumulando tutti i segnali in ingresso, allora si dice che il neurone si
accende: invia il segnale sull'assone che, alla fine, è collegato, attraverso
i terminali dell'assone, ai dendriti di altri neuroni).
Come possiamo emulare il comportamento di un neurone
biologico introducendo la struttura di uno artificiale?
Un neurone biologico è in grado di raccogliere gli input di altri neuroni
che sono modulati dalla sinapsi. Possiamo modulare questi input
ponderandoli. Tutti questi dati vengono accumulati: sommiamo tutti
questi contributi ponderati per formare l'input della rete per un dato
neurone.
Poi il neurone deve prendere una decisione: se questa attivazione
è superiore a una determinata soglia, allora il neurone sta
sparando, si attiva (se è inferiore alla soglia non si attiva e non
produce alcun output).
La funzione di attivazione generale dovrebbe essere una
● Funzione binaria a gradini: θj è la soglia e se
l'ingresso è inferiore, l'uscita è 0, altrimenti è 1
○ ❗ Questa funzione non è continua
né derivabile in 0, e ciò non è positivo
per la nostra
algoritmo di apprendimento: sarebbe molto
meglio approssimare il passo con altre funzioni
simili con comportamento continuo (e quindi
derivabili in ogni punto)
● Funzioni logistiche
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Dato che un singolo neurone può risolvere qualsiasi problema reale, e dato che l'idea è che i problemi
reali possano essere risolti da una rete di neuroni (come accade nel nostro cervello), la domanda è: come
combinare i neuroni artificiali per ottenere modelli in grado di risolvere i problemi del mondo reale?
In passato sono stati proposti milioni di architetture, ma possiamo descrivere più o meno tre tipi
principali di architetture, che costituiscono la spina dorsale di qualsiasi altra rete neurale profonda più
complessa:
1. Percettori multistrato
2. Reti neurali convoluzionali
3. Reti neurali ricorrenti
E il processo/algoritmo di apprendimento?
Definire l'architettura non significa definire il comportamento della rete quando una singola istanza viene presentata in ingresso,
perché dobbiamo definire tutti i pesi e la soglia di tutti i neuroni che formano la mia MLP → questi sono i parametri del mio
modello, sono i valori che dobbiamo impostare in modo appropriato durante il processo di addestramento (durante il quale la
rete neurale adatta il suo comportamento per essere conforme all'output corretto).
L'idea è di inizializzare la rete in modo casuale, come qualsiasi altro sistema ML: i pesi sono inizializzati in modo
casuale. Poi ho un set di addestramento di istanze classificate correttamente (le NN sono sistemi di ML supervisionati,
abbiamo bisogno di un corpus di addestramento). Poi confrontiamo l'output con quello corretto e l'algoritmo di
backpropagation è in grado di retropropagare l'errore (all'inizio la mia rete fornirà risultati sbagliati), adattando ogni peso in
modo da minimizzare l'errore. Poi presenteremo un'altra istanza, propagheremo il segnale in avanti, lo confronteremo con
l'uscita corretta, retropropagheremo l'errore e così via.
L'addestramento procede in avanti e all'indietro per milioni di volte: passo dopo passo, il peso verrà adattato in modo da
minimizzare l'errore.
Si tratta di una rete neurale profonda perché oggi è possibile inserire un numero elevato di strati nascosti (prima i
computer non potevano farlo perché non disponevano di GPU).
È necessario avere un neurone per ogni classe: per ognuno di essi si ha 0 o 1 (o i valori intermedi). L'idea è di calcolare
l'uscita per ogni neurone con l'uscita corretta.
Abbiamo un corpus annotato (= per ogni istanza abbiamo la classe corretta corrispondente, un numero di output corretto
compreso tra 0 e 1), confrontiamo quello corretto con l'altro, sommiamo tutti gli errori e possiamo calcolare l'errore per una
data istanza p.
Data questa misura, l'algoritmo di retropropagazione è in grado di dividere il contributo di ogni peso nell'esecuzione di
tale errore e di adattare ogni peso della rete in modo da minimizzare il contributo di questo peso sull'errore totale.
𝑝 = (𝑥 + 𝑦) ∗ 𝑧
28 sett. 2022
Reti neurali profonde
Un percettore multistrato è una rete strutturata in strati: uno strato di ingresso e uno di uscita e 0/+ o più strati
nascosti. Abbiamo parlato dell'addestramento di una MLP come esempio del metodo di apprendimento per qualsiasi
tipo di rete neurale: l'architettura cambierà, ma la parte generale per l'addestramento della rete (impostazione di tutti i
pesi per connettere il neurone agli altri e delle soglie) consiste nell'utilizzare un corpus/set di addestramento (poiché
tutte le DNN sono sistemi di ML supervisionati), che viene utilizzato per ottenere istanze su un problema, far fluire i dati
nella rete, ottenere l'output, confrontarlo con quello corretto, calcolare l'errore e retropropagarlo in modo da poter
calcolare il contributo di ogni peso all'errore. I pesi vengono quindi modificati leggermente per ridurre il contributo errato
all'errore finale per un determinato modello. E poi si ripete il ciclo più volte.
Al giorno d'oggi ogni struttura computazionale per lavorare con le DNN è in grado di applicare l'algoritmo di
backpropagation su grafi computazionali.
Esempio: data un'immagine, possiamo applicare diversi filtri ottenendo un insieme di mappe di caratteristiche, una per ogni filtro/kernel.
Poi possiamo sotto-campionare questa mappa di caratteristiche per ridurre le dimensioni di queste mappe di
caratteristiche (applicando, ad esempio, il max pooling, che prende un gruppo di celle e lo sostituisce con la media). Infine,
possiamo applicare un'altra serie di convoluzioni che definiscono un'altra serie di filtri.
La CNN applica ripetutamente, in alternanza, una serie di convoluzioni (date da un certo insieme di filtri), seguite da un
altro sottocampionamento. E ancora e ancora. Il numero di cicli dipende dal compito, dalla complessità della rete che si
vuole costruire. Alla fine di tutte queste convoluzioni, l'insieme finale di mappe di caratteristiche sottocampionate viene preso
come caratteristiche per, ad esempio, una MLP completamente connessa per classificare, per prendere la decisione finale.
● Le CNN non sono in grado di prendere alcun tipo di decisione: sono semplicemente una sorta di
trasformazione delle informazioni ricevute in ingresso in altri insiemi di informazioni.
una sull'altra, si è creata una matrice, un'immagine, e si può applicare la stessa struttura (magari con i
kernel che si muovono solo in verticale, il che è più utile) e applicare la CNN anche ai testi.
Torniamo alla MLP, la prima architettura di cui abbiamo parlato. Come abbiamo detto, il numero di neuroni in ingresso è
esattamente uguale al numero di caratteristiche che definiscono l'istanza del mio problema. E come sappiamo, questo numero
di istanze è, in una certa misura, definito dall'utente. Abbiamo già discusso il fatto che il linguaggio ha la proprietà di essere
lineare e, in linea di principio, ogni evento di una catena lineare è collegato a tutti gli altri eventi che lo precedono o lo seguono.
Se vogliamo elaborare una sequenza di eventi (ad esempio una sequenza di parole) utilizzando una MLP, dobbiamo fissare il
nostro orizzonte decidendo, ad esempio, di considerare la parola per la quale dobbiamo prendere una decisione e le parole
precedenti (-1) e successive (+1) e fermarci lì. Se vogliamo aggiungere altro contesto, possiamo farlo, ma in questo caso
l'orizzonte è fisso, così come è fisso il numero di neuroni in ingresso. L'architettura MLP non può adattarsi dinamicamente a
una sequenza di eventi che, per definizione, può cambiare la sua lunghezza.
È esattamente la stessa cosa per la CNN: anche in questo caso la matrice di input è fissa e non possiamo modificarne le
dimensioni (= fissare a priori la lunghezza massima della nostra frase e usare il padding (= riempire tutti gli slot non necessari
con 0, vettori falsi che rappresentano parole false)).
Abbiamo bisogno di un'architettura specifica, nata per gestire realmente le sequenze di eventi: l'architettura delle reti neurali ricorrenti.
I primi tipi di RNN erano molto semplici: lo strato nascosto era quasi
identico allo strato nascosto di MLP, semplicemente le loro uscite diventavano
un input aggiuntivo. Ma questo non era ottimale, in quanto la retropropagazione
del gradiente
svanisce quasi subito quando la sequenza è molto lunga, rendendo impossibile l'ottimizzazione del peso per i primi elementi
della sequenza.
Tutti i moderni strati nascosti di RNN si basano su due tipi di unità:
- Memoria a breve termine (LSTM)
- Unità ricorrenti recintate (GRU)
Il punto importante è che, aggiungendo alcuni gate e memoria all'interno dello strato nascosto, sono in grado di
ricordare le informazioni passate e la retropropagazione funziona in modo più efficiente durante l'intera sequenza.
Propagando lo strato nascosto lungo l'intera sequenza, possiamo immaginare che a un certo punto, quando dobbiamo
prendere una decisione al tempo t, tale decisione potrebbe essere influenzata da qualsiasi input e decisione precedente
(poiché stiamo spostando l'informazione dalla prima decisione (strato nascosto) lungo l'intera catena). Quindi, in linea di
principio, le RNN sono molto forti, in quanto non hanno un orizzonte fisso, ma sono in grado di tenere conto, nel prendere
una specifica decisione, di tutte le informazioni fino a quel momento. Nessuno sa quanto siano in grado di conservare
realmente le informazioni, poiché la capacità di memorizzazione dello strato nascosto è limitata.
Ma "in linea di principio" non è sufficiente: forse per prendere una decisione corretta al tempo t, devo guardare al
futuro, all'altro lato dell'informazione che la rete non ha ancora visto!
● Un buon esempio è il Part of Speech tagging: nel mezzo di una frase dobbiamo
assegnare un tag per quella specifica parola, e lo facciamo guardando anche alle
parole future → ma questo non è possibile con questa architettura, che è in grado di
guardare solo al passato
Se combiniamo i due output (uno ottenuto guardando il passato e l'altro guardando il futuro), allora abbiamo tutte le
informazioni per l'intero dominio significative per il problema che dobbiamo risolvere. L'ultimo classificatore potrebbe
prendere i due output concatenati e prendere realmente una decisione avendo tutte le informazioni sia dal passato che dal
futuro.
Le RNN bidirezionali sono in grado di elaborare intere sequenze di dati, prendendo decisioni in base a tutte le informazioni
presenti nell'intera sequenza. Siamo nella situazione ideale: ogni decisione può beneficiare di tutti i dati che è ragionevole
considerare per il problema.
● Ogni DNN può essere combinata insieme (potremmo avere pile di RNN)
● Qualsiasi framework DNN, quando si definisce una RNN bidirezionale e si fornisce l'input, lo utilizza
automaticamente in un ordine per la prima RNN e lo inverte per l'altra RNN.
Come possiamo utilizzare le RNN per risolvere i diversi problemi di sequenza-sequenza che potremmo affrontare nella
nostra vita di linguisti computazionali? Dipende dal tipo di problema che dobbiamo gestire → vedi: diapositiva 12
A) Non è una RNN: l'input del mio problema è un singolo valore, non una sequenza, e l'output è un singolo
valore, non una sequenza (non abbiamo bisogno di alcuna ricorrenza, possiamo usare una MLP).
B) Problemi in cui abbiamo un input e una sequenza come output (ad esempio, la didascalia di un'immagine: si dà
un'immagine come input e si desidera ricevere una didascalia, una sequenza di parole) → questo non è davvero
essenziale per noi
C) Problemi in cui abbiamo una sequenza di dati di input e una di output
○ Questo è molto interessante: qualsiasi compito di classificazione del testo può essere gestito da questo
tipo di architettura: abbiamo una sequenza di parole in input che rappresenta il mio testo e chiediamo alla
rete di classificare l'intero testo in un insieme di classi specifiche (rilevamento della polarità, positivo-
negativo-neutro, identificazione dell'hate speech, classificazione degli argomenti, rilevamento dello spam,
classificazione dei ticket dei clienti rispetto ai diversi tipi di reclamo...).
D) Problemi con una sequenza di dati di input e una sequenza di dati di output (le due sequenze hanno la
stessa lunghezza)
○ Part of Speech tagging: da una sequenza di parole produciamo un numero di tag (che è esattamente
uguale al numero di parole) → possiamo definire il tag migliore solo osservando la sequenza
○ Riconoscimento di entità denominate, disambiguazione del senso delle parole
E) Problemi con una sequenza di dati di input e una sequenza di dati di output (ma le due sequenze potrebbero avere una
lunghezza diversa)
○ In questo caso dobbiamo combinare due RNN diverse, non possiamo usare la stessa.
○ La prima (l'encoder) prende le sequenze di ingresso, elabora ad ogni passo un elemento della
sequenza di ingresso e alla fine fornisce una rappresentazione dell'ingresso che viene utilizzata dalla
seconda RNN (il decoder) per generare in modo ricorrente la sequenza di uscita
■ Il codificatore deve svolgere il compito di distillare una rappresentazione astratta di tutta la
sequenza in ingresso in un unico vettore → in linea di principio, codifica tutte le informazioni in
un unico vettore
■ Il decodificatore ha il compito di prendere questa informazione compressa e di utilizzarla per
generare l'uscita corretta → decodifica l'informazione, fornendo l'uscita corretta
○ Traduzione automatica, riassunto del testo
○ Le due reti vengono addestrate congiuntamente e il processo di addestramento è sempre lo stesso.
■ Per la traduzione automatica abbiamo bisogno di corpora paralleli: testi in cui le due lingue sono allineate.
Il problema del collo di bottiglia è dirompente dal punto di vista delle prestazioni. Quando si deve tradurre un testo e si
hanno lunghe sequenze di parole, di diverse combinazioni di parole, come si può codificare tutta la complessità dell'input
utilizzando un solo vettore? Molte informazioni andranno perse e quindi il decodificatore, avendo una visione solo parziale
delle informazioni in ingresso, produrrà molti errori.
● Il decodificatore non ha visibilità su tutti gli strati nascosti del codificatore.
Che ne dite di lasciare che il decodificatore veda tutti gli stati nascosti del codificatore? Sarebbe in grado di vedere tutte le
informazioni, ed è proprio questa l'idea: il codificatore passa solo un'informazione contestuale al decodificatore e l'idea
dell'attenzione nelle RNN è proprio quella di esporre tutti gli strati nascosti del codificatore per essere visti o almeno
considerati dal decodificatore.
● Senza attenzione, il decodificatore deve prendere una decisione considerando solo un fattore di contesto.
● Con l'attenzione il decodificatore può vedere più fattori di contesto
Dobbiamo escogitare un modo per combinare tutti i fattori di contesto del codificatore in modo che possano essere
elaborati dal decodificatore. Questa è esattamente la prima proposta (2014/2015) di Bahdanau, che per primo ha proposto di
introdurre l'attenzione.
Il concetto di attenzione
Che cos'è l'attenzione?
La struttura è ancora una volta la RNN con architettura Encoder-Decoder. L'attività esaminata da Bahdanau era la
traduzione automatica.
Quando un decodificatore deve prendere una decisione per generare l'uscita, può utilizzare le informazioni in ingresso, ma
ha anche la possibilità di vedere tutti gli stati nascosti del codificatore. Ma devono essere combinati insieme. Nella sua
proposta, Bahdanau prende ogni stato del codificatore sk , lo stato del decodificatore al passo ht e li combina tutti utilizzando
una funzione specifica con un punteggio che è in grado di calcolare quanto sia rilevante ogni stato nascosto del
codificatore per lo stato del decodificatore che stiamo esaminando. Lo facciamo attraverso una funzione di punteggio
che ci dice quanto i due stati sono simili, in qualche modo, quanto sono connessi.
akt → vettore attenzione
Il punto è dare agli stati nascosti del codificatore che sono più simili allo stato del decodificatore un peso
maggiore nella combinazione ponderata. Questi pesi sono pesi di attenzione: osservano la frase di ingresso e sono in
grado di determinare quale parte della sequenza di ingresso è più rilevante per prendere una decisione in un certo punto della
sequenza di uscita.
DNN - Autoattenzione
Si tratta di una variante dell'attenzione calcolata a partire da una sola serie di dati, ma questo non è molto rilevante.
Questo è il macchinario principale e il vero trucco dei trasformatori, ma non ci soffermeremo su questi dettagli.
All'esame dovete sapere che l'autoattenzione è il macchinario principale
dell'architettura dei trasformatori.
Supponiamo di avere una sequenza di vettori di input, una sequenza di vettori di
caratteristiche (è la stessa cosa di prima: ogni elemento della sequenza è un vettore di
caratteristiche). Supponiamo di avere un macchinario per ricavare da ogni elemento
della sequenza, chiave di interrogazione e valori. L'autoattenzione si chiama così
perché è possibile ricavare questi valori osservando gli altri elementi della sequenza. Si
tratta di un macchinario che permette a ogni elemento della sequenza di
osservare l'affinità e la correlazione di questa parola con tutte le altre.
L'attenzione viene quindi calcolata esattamente come prima. La differenza è
che viene calcolata non avendo a disposizione la sequenza di stati nascosti del
codificatore rispetto agli stati nascosti del decodificatore, ma solo un insieme di stati
nascosti che viene confrontato con tutti gli altri appartenenti alla stessa sequenza.
4. Trasformatori
I trasformatori sono la più importante DNN mai introdotta. Il mondo del
ML/NLP/Processing si basa oggi sui trasformatori, introdotti da un team di Google.
Dato che le RNN sono lente da addestrare e hanno problemi di propagazione del
gradiente (non ricordano bene il passato se la sequenza è molto lunga), nel 2017
Vaswani et al hanno proposto una nuova architettura che hanno chiamato
trasformatori.
Questa architettura è ancora organizzata come architettura Encoder-Decoder,
ma non utilizza più le RNN. Dicono semplicemente: fissiamo il numero massimo di
elementi a un numero molto elevato (con le GPU possiamo avere input di grandi
dimensioni).
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
dimensioni), allora il codificatore è una pila di blocchi molto semplici formati da due elementi (un'attenzione multitesta e
una semplice rete feed-forward, MLP).
Perché?
L'autoattenzione viene calcolata mediante moltiplicazione matriciale (l'operazione più veloce su GPU) sull'intera sequenza.
Quindi vengono calcolati diversi tipi di attenzione sull'intera sequenza in parallelo (attenzioni che prestano attenzione a cose
diverse...). Abbiamo molte attenzioni multi-testa (ad esempio 24 → molto potenti), che sono in grado di elaborare la sequenza
di input in parallelo.
Poi abbiamo una rete feed-forward che prende tutte le uscite di queste attenzioni e le unisce a una rappresentazione fissa.
Questo è il blocco encoder, ogni blocco trasforma la rappresentazione in ingresso in un'altra rappresentazione (per
questo si chiamano trasformatori!). Alla fine, l'ultimo stato nascosto del codificatore e tutti gli altri stati nascosti vengono
passati al decodificatore, che è strutturato più o meno nello stesso modo: un'attenzione multitesta mascherata (il
decodificatore può vedere solo la sequenza passata, poiché sta generando la sequenza a ogni passo, ha una visione parziale
e l'attenzione è calcolata solo sul passato) sull'ingresso e su tutti gli stati del codificatore (come prima). Il trasformatore è
in grado di prendere una sequenza in ingresso e produrre una sequenza in uscita senza coinvolgere alcuna RRN, ma ha il
limite di fissare la dimensione dell'ingresso. Questo, però, non ha importanza: essere un NN feed-forward non ha importanza
se si deve ignorare una parte del gioco: tutte le attenzioni diventano 0 e sono matematicamente escluse dalla moltiplicazione.
Se si utilizza una MLP, la rete non ha idea della posizione della parola nella sequenza (la nozione di ordine nella
sequenza è distrutta, poiché la MLP è simmetrica e gli strati possono essere mescolati senza cambiare il comportamento della
rete). Quindi hanno dovuto introdurre una sorta di trucco per aggiungere all'input la posizione della parola nella
sequenza! Generano un vettore di posizione e sommano il vettore di posizione alle caratteristiche di una data parola,
introducendo informazioni sulla sua posizione nella sequenza.
03 ott. 2022
Valutazione dei "prodotti" NLP
Ogni volta che produciamo un nuovo sistema per risolvere qualsiasi compito NLP possibile e immaginabile, dobbiamo
impostare una valutazione appropriata del sistema proposto: dobbiamo valutare le prestazioni del nostro sistema in modo
standardizzato.
In generale, se prendiamo la prospettiva di un'impresa mondiale, sia dal punto di vista del ricercatore sia da quello delle
industrie e dei consumatori, vorremmo sapere molte cose: quali sono i prossimi obiettivi in un compito specifico, quanto
velocemente sta progredendo il campo, quanto è buona la tecnologia... e quanto è utile una tecnologia specifica per produrre
un determinato prodotto! Sono tutte domande a cui dobbiamo rispondere, in una certa misura, per capire realmente lo stato
dell'arte per un determinato compito e per i progetti di ricerca → in questo modo possiamo avere un'idea chiara di quali sono le
tecnologie chiave.
La valutazione di tali sistemi è stata fondamentale per la pubblicazione di articoli e la produzione di qualsiasi tipo di
sistema: bisogna dimostrare che il proprio sistema è davvero migliore basandosi su una valutazione standardizzata!
Che tipo di situazione potrebbe verificarsi per ciò che ci interessa? Abbiamo tre tipi di quadri/problemi a seconda del
compito che stiamo affrontando:
1. Sistemi di analisi → sono sistemi che ricevono un input linguistico (un input in forma linguistica: un frammento di
NL), dove il compito riguarda la produzione di una rappresentazione astratta dell'input linguistico (ad es.
PoS, analisi sintattica...).
○ Questo è il più semplice da trattare: abbiamo quasi sempre la possibilità di confrontare la
rappresentazione astratta fornita automaticamente dal sistema con quella corretta (assegnata
manualmente da qualche esperto/linguista) → possiamo introdurre molte misure in grado di confrontare
l'output automatico con quello corretto e misurare matematicamente, in forma quantitativa, qualsiasi tipo di
prestazione
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
○ Potremmo preparare una scheda, confrontare diversi sistemi sugli stessi dati e calcolare misure
ragionevoli delle prestazioni, per poi scoprire quale sia il sistema migliore!
2. Sistemi che producono output linguistici → sistemi che ricevono un input linguistico e producono un output
linguistico (un frammento di testo che deve essere scritto nel modo corretto in una determinata lingua, ad esempio
traduzione automatica, riassunto di testi, generazione di linguaggi di qualsiasi tipo...)
○ Questa è la più complessa non solo in termini di sistema che affronta il compito, ma anche in termini di
valutazione: la traduzione automatica è una delle sfide principali di questo campo, ma la valutazione
dell'output di un tale sistema non è così facile in quanto ci sono diverse traduzioni corrette per una data
frase/testo che potrebbero essere fornite da traduttori umani.
■ Quale traduzione corretta dobbiamo usare per il confronto?
■ Che tipo di misura possiamo utilizzare per confrontare due testi? In CS una misura quantitativa
molto comune per confrontare le stringhe è la distanza di Levenshtein, una distanza che misura
semplicemente quanti caratteri di inserimento/cancellazione/sostituzione sono necessari per
trasformare la stringa1 nella stringa2.
● Ma la distanza di Levenshtein non è molto utile per noi, perché la nostra unità di base
non sono i caratteri, ma le parole... ma è davvero così? Nella traduzione a volte
abbiamo bisogno di tradurre due parole in una parola, poiché le lingue sono molto
diverse tra loro → dobbiamo tenere conto di molti fenomeni
○ Finora, le metriche utilizzate per valutare i sistemi di traduzione automatica e di riassunto dei testi non
sono assolutamente buone, in quanto si basano sul confronto tra n-grammi (= sequenze di 2 o 3
parole).
3. Sistemi interattivi → questi sistemi devono comprendere l'input linguistico, produrre l'output linguistico e mantenere una
dialogo con l'utente (ad es. chatbot)
○ Qui non abbiamo altra possibilità che utilizzare gli esseri umani: quando si interagisce con una macchina
non si vuole semplicemente valutare se la macchina è in grado di dare la risposta corretta, ma si vuole
verificare se il dialogo è gestito correttamente, se la macchina è in grado di far fronte a richieste strane o
qual è la sua reazione quando viene insultata → tutti gli aspetti pragmatici del funzionamento della
macchina sono presi in considerazione
Per valutare le prestazioni del nostro sistema in modo corretto e standardizzato, dobbiamo innanzitutto utilizzare dati
standardizzati: dobbiamo utilizzare un corpus prodotto dalle istituzioni e attualmente utilizzato per valutare questo tipo
di sistemi per quel compito.
Inoltre, è necessario utilizzare metriche standardizzate in termini di misure di performance: non è utile utilizzare gli stessi
dati se misuriamo quantità diverse, i risultati non sono comparabili. Ancora peggio se cerchiamo di confrontare due sistemi su
dati diversi: come possiamo affermare che un sistema è migliore di un altro se abbiamo usato dati diversi, abbiamo testato i
sistemi in circostanze diverse e con misure diverse? Si tratterebbe semplicemente di esperimenti incompatibili.
● La misura di performance deve essere condivisa
● Se state cercando di produrre un sistema per risolvere un determinato compito, la prima ricerca su Google che
dovete fare riguarda i set di dati che dovete utilizzare e le misure di performance che la comunità sta più o meno
utilizzando per valutare un sistema per quel compito.
Metriche tipiche
Per il momento, limitiamo il nostro problema alla classificazione attraverso due sole classi (stiamo semplificando!).
● ❗ Attenzione: quando confrontiamo i risultati dei sistemi, dobbiamo farlo con quelli corretti, con annotazioni
controllate dall'uomo. Confronto dei risultati di un sistema
all'output di un altro sistema non ha senso:
come possiamo capire dov'è l'errore? La
classificazione "corretta" è quella
controllata dall'uomo
Date queste misure, ovviamente, se eseguiamo un esperimento con 10 mila classificazioni, all'interno della tabella
abbiamo il numero di volte per le varie combinazioni: il vero negativo è il numero di volte in cui il sistema classifica
correttamente 0 e così via.
1. Precisione
○ Questa è la prima metrica tipica utilizzata in molte attività
○ ❗ Usarlo come termine tecnico: quando si parla di valutazione, evitare di usare "accuratezza" come retorica.
○ È il numero di istanze rilevate correttamente sul numero totale di istanze.
■ (𝑇𝑁 + 𝑇𝑃) / (𝑇𝑁 + 𝐹𝑃 + 𝐹𝑁 + 𝑇𝑃)
○ Questa metrica, che di solito lavora in coppia con il tasso di errore (in realtà sono la stessa misura),
ha un problema: è molto scarsa sulle classi skewed.
■ Se abbiamo un problema molto sbilanciato in cui ogni dieci istanze abbiamo in media solo un
1 (e le altre sono 0) → l'1 è molto più raro dello 0 → un sistema molto stupido che risponde
sempre "0" senza prendere alcuna decisione né esaminare l'input, otterrà un'accuratezza del
90% (e questo è un problema)
2. Tasso di errore
○ È la stessa misura dell'accuratezza, poiché il tasso di errore è: 1 - 𝑎𝑐𝑐𝑢𝑟𝑎𝑐𝑦
○ È il numero di inserzioni + delezioni (+sostituzioni), diviso per il numero totale di istanze vere.
■ (𝐹𝑃 + 𝐹𝑁) / (𝑇𝑁 + 𝐹𝑃 + 𝐹𝑁 + 𝑇𝑃)
Due misure molto utilizzate in NLP sono la precisione e il richiamo, che combinano i risultati in modo molto più sofisticato
e misurano cose diverse:
3. Precisione
○ Calcola il numero di istanze rilevate correttamente sul numero totale di istanze rilevate:
■ 𝑇𝑃 / (𝐹𝑃 + 𝑇𝑃)
■ Misura semplicemente ogni volta che il sistema propone 1 e calcola quante volte è stato
corretto.
4. Richiamo
○ Questo è esattamente il contrario della precisione
○ Calcola il numero di istanze rilevate correttamente rispetto a quelle che avrebbero dovuto essere rilevate.
rilevato:
■ 𝑇𝑃 / (𝐹𝑁 + 𝑇𝑃)
■ Misura il numero di volte in cui il sistema propone 1 rispetto al numero totale di volte corrette in
cui avrebbe dovuto dire 1.
Modificando gli iperparametri del sistema di ML (ad esempio, il numero di neuroni/strati, le diverse configurazioni nella
progettazione dell'NN), si può spingere il sistema ad aumentare la precisione o il richiamo (o entrambi!), ma poiché misurano
due cose diverse, a un certo punto si deve scegliere quale si preferisce (precisione/richiamo/entrambi) e mettere a punto il
sistema di conseguenza (a seconda di come si desidera risolvere il compito).
● In generale, l'impostazione predefinita è quella di mantenere la precisione e il richiamo vicini, ma...
○ Esempio: si sta cercando di costruire un sistema che, esaminando la produzione vocale di persone
anziane, sia in grado di scoprire se la persona presenta alcuni segni di demenza (si è scoperto che i primi
sintomi di demenza possono essere ricondotti a sottili cambiamenti del linguaggio) → dato questo quadro,
preferiremmo avere un recall più alto della precisione: non vogliamo perdere nessun paziente a quel
punto, ma va bene identificare una potenziale malattia in un soggetto anche se non è vera → meglio
prevenire che curare
Dobbiamo combinare precisione e richiamo per ottenere un'unica misura che li includa entrambi, e questo è l'f-score!
5. Punteggio F
○ È la media armonica tra precisione e richiamo.
○ Calcolando l'f-score possiamo ottenere un singolo valore che esprime sia la precisione che il richiamo
Queste sono le metriche di base utilizzate in NLP, ma ogni attività ha le proprie metriche e può modificare leggermente le definizioni:
● Esempio: se vogliamo misurare le prestazioni di un parser sintattico con la soluzione corretta e confrontiamo
direttamente i due alberi corrispondenti, potremmo ottenere 0, quindi è meglio calcolare precisione e richiamo sui
nodi dell'albero → modifichiamo leggermente il modo in cui calcoliamo precisione e richiamo, ma l'idea di fondo è la
stessa
Che ne dite di misurare la metrica su ogni classe e poi fare una media dei risultati per ogni classe? Questo funziona per
precisione, richiamo e F-score, ma non per l'accuratezza, poiché è la media di ogni classe. Quindi, sì, è possibile farlo e
questo è sulla stessa linea
del caso in cui si hanno più classi: si deve decidere come calcolare questa metrica per le multiclassi
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
● Nel caso in cui si cerchi di utilizzare l'accuratezza, è sufficiente fare la media dei risultati per ogni classe, ma se le
classi sono distorte si ottiene lo stesso problema.
● In caso di multiclasse, il problema dell'asimmetria è meno frequente e meno problematico.
● Nel caso della precisione, del richiamo e di conseguenza del punteggio F, si hanno due possibilità:
○ Macro-media dei nostri valori → ad esempio, si può semplicemente fare la media della precisione per
ogni classe; si può anche calcolare la macro-media ponderata della precisione (considerando il numero di
osservazioni appartenenti a una determinata classe per ponderare i contributi in modo più corretto, ma in
un certo senso si sta semplicemente considerando la diagonale rispetto alle due colonne)
○ Micro-media dei nostri valori → ad esempio, con la precisione, si ricalcola la precisione usando
direttamente i valori appropriati insieme; poi si può calcolare l'F-score calcolando semplicemente la media
armonica delle due misure o si può esplorare la formula e calcolare l'F-score direttamente
Qual è il modo giusto di effettuare una valutazione internazionale? Qual è il modo standard in cui si svolgono quasi tutte le
valutazioni internazionali?
Innanzitutto, esiste un'organizzazione che si è fatta carico di organizzare una sfida condivisa su un determinato compito.
Questa organizzazione deve...:
- Sviluppare linee guida di annotazione per spiegare i tipi di classi utilizzate nel compito, come queste classi sono
definite e vengono utilizzate e così via...
- Sviluppare il corpus gold-standard, un set di dati di riferimento/annotati che può essere utilizzato per valutare in
modo standardizzato le prestazioni di un ampio insieme di sistemi che partecipano alla sfida.
- Nel gold-standard l'organizzazione deve rendere noto l'accordo tra gli annotatori.
- Il gold-standard dovrebbe essere un diritto al 100%, in linea di principio
- Sviluppare e distribuire ai partecipanti lo strumento di valutazione ufficiale.
- Come sappiamo, anche calcolando la stessa metrica nell'implementazione algoritmica, potrebbero
esserci delle differenze → per evitare qualsiasi problema nel calcolo della metrica, l'organizzazione deve
consegnare lo strumento di punteggio ufficiale (che tutti dovrebbero utilizzare per valutare le prestazioni
dei propri sistemi) prima dell'inizio della sfida.
L'organizzazione prende il corpus e lo divide in due parti: il corpus di prova e il corpus di sviluppo, che viene poi distribuito
a tutti i partecipanti per impostare i loro sistemi su un compito e una classe specifici. Tutti i partecipanti in genere prendono il
corpus di sviluppo e lo dividono nuovamente in due parti: l'insieme di formazione reale e l'insieme di sviluppo (a volte la
divisione è fornita dall'organizzazione stessa, in modo che tutti lavorino sulle stesse parti). L'insieme di test è tenuto segreto
dall'organizzazione!
Ogni partecipante ha poi un lungo periodo di tempo per mettere a punto il proprio sistema, addestrarlo e valutarne le
prestazioni... alla fine l'organizzazione distribuisce il set di test, ma lo tiene in cieco (senza annotazioni) e concede un tempo
molto breve per restituire i risultati (ogni partecipante prende la parte testuale del set di test, esegue il proprio sistema
producendo i risultati e invia i risultati all'organizzazione senza confrontarli con nulla).
L'organizzazione raccoglie quindi tutti gli output dei partecipanti, li confronta con quelli corretti utilizzando lo strumento di
punteggio e produce una classifica. In genere si tiene un workshop e si annuncia il vincitore!
● L'organizzazione sta producendo un benchmark, una procedura, una metrica e uno strumento di punteggio standardizzati.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Dopo questa grande valutazione internazionale, in genere l'insieme dei dati rimane a disposizione di tutti, in modo che se
qualche tempo dopo si produce un buon sistema e si desidera testarlo rispetto allo stato dell'arte, lo si può fare utilizzando gli
stessi parametri e vedere se il proprio sistema è migliore/allo stesso livello/peggiore.
● Quando preparate un sistema per risolvere un determinato compito, cercate di trovare un benchmark condiviso nella
comunità con dati, metriche e possibilmente risultati → potete quindi confrontare le prestazioni del vostro sistema
con questo stato dell'arte: inserite i vostri risultati nella classifica e confrontateli con quelli degli altri.
Corpora
Abbiamo già capito che i corpora elettronici sono la fonte principale dei nostri dati, quindi è bene discutere un po', dal
punto di vista della linguistica e della linguistica computazionale, cosa sono e alcuni concetti fondamentali.
1. Rappresentatività e bilanciamento
Un corpus dovrebbe essere un buon campione della varietà linguistica che sta cercando di rappresentare: se si
vuole costruire un sistema per l'elaborazione dell'inglese contemporaneo (ad esempio, il PoS tagging o l'analisi sintattica) e si
addestra il sistema su un corpus composto da articoli di giornale, il corpus utilizzato non è rappresentativo della varietà
linguistica che si vuole elaborare.
Essere rappresentativo significa essere un buon campione in termini statistici. Vorremmo fare una media del contributo
di autori, generi e stili diversi, poiché siamo interessati a esaminare la lingua di quella varietà (ad esempio, quando si studia il
linguaggio medico, è necessario addestrare il sistema su un corpus medico).
● Una volta stabilita la varietà linguistica che si desidera trattare, si è immediatamente individuata una grande
quantità di documenti che, in linea di principio, potrebbero far parte del corpus → il 99% delle volte si deve
effettuare una selezione dei documenti raccolti, e il modo in cui si effettua tale selezione è fondamentale → è
possibile effettuare tutti i passaggi necessari (prendere un corpus, estrarre i dati, trovare la generalizzazione e
applicarla all'intera varietà) se e solo se il corpus è un buon corpus!
2. Dimensione finita
Dal punto di vista quantitativo, il corpus deve contenere non solo tutti i tipi di testo della varietà linguistica, ma anche gli
stessi tipi di testo nella giusta proporzione.
● Esempio: se vogliamo rappresentare l'italiano contemporaneo, quanta stampa/prosa accademica/articoli
scientifici?
Dobbiamo cercare di progettare il corpus come un buon campione statistico e come un corpus rappresentativo. Dobbiamo
stabilire un equilibrio tra i diversi tipi di testo e anche la dimensione: per la legge di Zipf, un corpus linguistico nazionale
deve contenere almeno 100 milioni di token per essere rappresentativo.
Per quanto riguarda le dimensioni del testo, l'idea è di inserire i testi nella loro forma completa, senza tagliarli.
● Un corpus monitorato è un corpus aggiornato periodicamente per mantenere il lessico al passo con i tempi: non
si tratta solo di neologismi, ma anche di rapporti di frequenza tra le diverse aree semantiche del corpus (magari
alcune parole sono ancora presenti, ma l'uso di diverse parole può cambiare a causa di fatti esterni).
3. Oggi i corpora sono in formato leggibile dalla macchina (vantaggi: manipolazione e interrogazione automatica, annotazioni).
4. Riferimento standard
Una volta costruito un corpus, esso diventa un riferimento per tutti gli studiosi, soprattutto se viene annotato a mano in
modo corretto: diventa un riferimento per organizzare le sfide sui compiti e per confrontare l'istruzione dei fenomeni automatici.
Qual è allora la definizione più completa di corpora?
Un corpus è un insieme finito di testi leggibili dalla macchina, campionati in modo da essere massimamente
rappresentativi della varietà linguistica in esame [McEnery, Wilson].
Se si abbraccia una visione empirista, i dati raccolti con corpora ben rappresentativi e bilanciati per una determinata
varietà linguistica rappresentano una fonte di dati non discutibile: se siamo d'accordo che il corpus è rappresentativo e ben
bilanciato per una determinata varietà linguistica, allora non possiamo rimuovere i dati che estraiamo (ogni dato è autentico e
non possiamo rimuoverlo). Dall'altra parte abbiamo le annotazioni che abbiamo aggiunto dopo aver costruito il corpus... Le
annotazioni hanno lo stesso status del testo grezzo? No, perché ogni annotazione proietta rigorosamente un punto di
vista da una prospettiva teorica, un punto di vista tratto da una teoria linguistica specifica.
● Per lo stesso corpus possiamo avere annotazioni PoS diverse e così via...
Mentre il testo non può essere messo in discussione, l'annotazione può sempre essere messa in discussione non
solo dai linguisti, ma anche dagli esperti di informatica. Attenzione a non fidarsi troppo di una specifica annotazione.
➢ Inoltre, se utilizziamo un corpus annotato per addestrare un sistema di ML per la risoluzione di quel compito, stiamo creando un sistema
computazionale che non è stato in grado di risolvere il problema.
seguace di quella teoria: il sistema di ML imparerà ad usare quella categoria e in quel modo, niente di più e niente di meno: si
diventa un "seguace" di questa teoria e annoterà nuovi testi utilizzando la stessa teoria
Qualsiasi tipo di annotazione linguistica implica un processo di interpretazione dei dati autentici alla luce di un
preciso riferimento teorico o metodologico.
❗ Attenzione a non confondere la scelta della teoria e delle classi (come usare ogni singola classe per annotare
fenomeni specifici) con il fatto tecnico di inserire le etichette nel corpus: possiamo usare XML e inserire informazioni
categoriali.
(tag), informazioni strutturali (strutture sintattiche con costituenti) o relazionali (strutture sintattiche di dipendenza...).
Tipi di annotazione
Ogni tipo di annotazione ha un compito computazionale corrispondente.
A) Part of Speech tagging: assegnare a ciascun token una classe grammaticale specifica (nome, verbo, punteggiatura...)
B) Lemmatizzazione: ricondurre qualsiasi token alla forma di citazione standard del dizionario (per l'inglese non è un
compito difficile, ma può esserlo per le lingue romanze).
C) Parsing completo: si prende una frase e si associa un tipo di struttura sintattica (albero o grafo) che
rappresenta una rappresentazione sintattica astratta di quella frase.
D) Annotazioni semantiche/pragmatiche: annotazione dei sensi delle parole polisemiche, delle relazioni tra gli
elementi del testo.
E) Annotazioni fonetiche/prosodiche (corpora di lingua parlata): trascrizione ortografica o fonetica (magari
allineata temporalmente), qualche tipo di profilo di intonazione (utilizzando diacritici o teorie fonologiche),
mappatura di prominenze, pause, disfluenze...
05 ott. 2022
Corpora
Avendo rappresentato il segnale su intervalli specifici di tempo (ad esempio con 16 bit), significa che ad ogni intervallo
abbiamo un campione (= semplicemente un numero intero di 16 bit, che va da -32700 a +32700).
● Un file WAW PCM standard (il file più comune su Windows) è costituito semplicemente da un'intestazione di
44# seguita da un array di interi, ognuno dei quali rappresenta un campione
○ Ogni libreria sonora in grado di leggere un file legge semplicemente i primi 44 byte per ottenere la
frequenza di campionamento, il numero di bit e il numero di canali e poi fornisce un array di numeri interi
che rappresentano il suono.
Questa è la struttura dati di base per iniziare qualsiasi tipo di elaborazione del parlato dal punto di vista computazionale.
Questo ci suggerisce una prima distinzione nei suoni prodotti dagli esseri umani:
1. Suoni vocali → prodotti dalla vibrazione delle corde vocali (provare a produrre una
vocale e a toccarsi la gola)
○ Tutte le vocali sono suoni vocali, ma ci sono consonanti che sono vocali e
consonanti che non sono vocali.
2. Suoni non pronunciati → prodotti senza l'uso delle corde vocali (provare a
produrre una "s")
Per questo motivo gli studiosi hanno iniziato a lavorare nel dominio della frequenza:
● Sull'asse delle ascisse abbiamo ancora il tempo
● Sull'asse delle ordinate abbiamo la frequenza
Dobbiamo pensare a questi grafici come se fossero tridimensionali, con l'intensità del segnale in un punto specifico del
tempo e a una frequenza specifica nel dominio della frequenza.
Se tagliamo il diagramma in un punto specifico del tempo, è esattamente il diagramma che possiamo vedere nello
stereo di barre in movimento! Questo è lo spettrogramma e si muove come noi ci muoviamo nel tempo.
comunque dagli ascoltatori e non lo producono nemmeno, lo saltano (e infatti nello spettrogramma non
c'è alcuna evidenza acustica per quel suono che viene, di fatto, saltato)
○ Per i computer la mancanza di un determinato suono in uno spazio specifico è dirompente: una
parola diventa simile a un'altra, e il computer non ha tipicamente nessuna conoscenza di base,
nessuna informazione sul contesto per capire le differenze tra le parole!
3. Coarticolazione
○ Nel nostro modello abbiamo una situazione in cui abbiamo suoni stabili nel tempo e transizioni rapide tra
i suoni → l'idea immaginata è di essere sempre in stati stabili con transizioni rapide
○ Ma il nostro sistema biomeccanico cerca sempre di ottenere la giusta configurazione e raramente la
raggiunge → la realtà è esattamente l'opposto: non siamo quasi mai in uno stato stabile, e siamo
quasi sempre in coarticolazione, in transizione tra due suoni
○ Avere 50 modelli per modellare 50 suoni è inutile, perché questa configurazione ipotetica non è
riscontrabile nei suoni reali → gli studiosi hanno immediatamente smesso di modellare suoni singoli e
hanno iniziato a modellare coppie di suoni: bifoni, trifoni... sequenze di suoni per inserire nel modello
informazioni sulla coarticolazione
Nel riconoscimento vocale l'introduzione delle reti neurali e delle reti neurali profonde ha cambiato il paradigma e ci
ha permesso di avere strumenti di riconoscimento vocale abbastanza affidabili nei nostri dispositivi mobili!
Esaminando lo spettrogramma a banda stretta si può trovare un'altra sottostruttura, che si basa sulla prima riga: la
frequenza di vibrazione delle corde vocali, uno dei principali parametri del parlato (ha un legame con l'intonazione del
discorso, molto importante in linguistica!)
● Si tratta di un parametro molto importante che può essere estratto automaticamente dall'algoritmo di pitch-
tracking a partire dallo spettrogramma a banda stretta.
Partendo dallo spettrogramma possiamo misurare in modo automatico molti parametri acustici fondamentali del parlato:
- La distribuzione dell'energia attraverso la frequenza, tempo per tempo
- L'intensità complessiva del segnale in un punto specifico
- Il profilo del passo, calcolando automaticamente il passo attraverso il tempo
❗ Se avete dei dubbi su quale sia nello specifico il campione M (se la parte sovrapposta o la parte assente), ricordate che il
campione M è il frame shift e quindi deve essere chiaramente indicato durante lo sviluppo dell'algoritmo.
[Domanda posta il 24/10].
10 ott. 2022
Ripresa dell'ultima lezione
Abbiamo introdotto una forma digitalizzata per il segnale vocale, che viene digitalizzato sull'asse del tempo a specifici
intervalli di tempo (collegati alla frequenza), ma poi, quando dobbiamo elaborare il nostro segnale audio, dobbiamo prima
dividerlo in fotogrammi (facendo un frame-splitting): dividiamo l'intervallo in fotogrammi sovrapposti di una determinata
lunghezza (N, frame size) misurata nel numero di campioni contenuti in ogni fotogramma, e spostati di una specifica quantità
di campioni (M, frame shift).
● Non c'è una regola per fissare N e M, dipende dal tipo di applicazione che si vuole realizzare.
Il frame shift M, che è la parte non sovrapposta del fotogramma, e la sezione sovrapposta devono essere almeno ½ e al
massimo ⅕ del frameshift.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Dato che l'enunciato è stato suddiviso in fotogrammi, il fotogramma è il dominio in cui calcoliamo quasi tutti i
parametri acustici che ci interessano per il nostro calcolo.
In ogni fotogramma possiamo immaginare di calcolare un gran numero di parametri acustici che possono essere
ampiamente riassunti e suddivisi in 4 famiglie:
1) Parametri e misure legati alla frequenza fondamentale - F0
○ La frequenza fondamentale è la frequenza di vibrazione delle corde vocali: è il parametro
acustico che dà l'intonazione all'enunciato.
■ Per le lingue tonali (ad esempio il cinese mandarino), si tratta del parametro che regola i toni
○ Dato un parametro acustico, possiamo applicare un ampio gruppo di misure statistiche: i valori minimi e
massimi, l'intervallo, il valore medio... E qualsiasi altro tipo di statistica
■ Per la frequenza fondamentale è possibile calcolare la velocità di variazione, i profili
intonazionali e le configurazioni...
2) La seconda famiglia riguarda la distribuzione dell'energia spettrale: come l'energia si distribuisce, all'interno
dell'inquadratura, su tutto lo spettro, la gamma di frequenze
○ Si tratta di un frammento di spettrogramma (vedi: ultima lezione).
○ Ci sono le impronte digitali spettrali (tutti quei parametri che hanno a che fare con la distribuzione
dell'energia: MFCC, il Coefficiente di Cepstrum di Mel-Frequenza, i parametri acustici di base utilizzati nel
riconoscimento vocale, le posizioni delle formanti, il comportamento dinamico delle formanti (come si
muovono nel tempo) e qualsiasi altro tipo di statistica che abbia un qualche significato riferito alle formanti).
3) Abbiamo quindi un ampio insieme di misure di durata
○ Sull'asse del tempo si può immaginare di misurare la durata di qualsiasi tipo di unità linguistica
rilevante per il progetto: durata del telefono, durata delle parole, durata delle pause, durata delle
disfluenze... velocità del discorso (per normalizzare il discorso rispetto alla durata: a seconda
dell'applicazione, il sistema computazionale potrebbe essere confuso se una persona parla più
lentamente di un'altra persona)
4) Misure energetiche
○ La semplice intensità all'interno del fotogramma (una misura molto tipica è l'RMS), o loudness (intensità ≠),
enfasi spettrale
■ In linguistica, il loudness contiene tipicamente un profilo energetico omogeneo utilizzando
modelli percettivi → il calcolo dell'energia totale è modulato dalle diverse risposte in frequenza
L'aspetto importante è che, da un punto di vista acustico, possiamo ricavare migliaia di parametri acustici. In linea
di principio, possiamo ricavare automaticamente qualsiasi parametro acustico: qualsiasi sistema computazionale di
elaborazione del parlato è formato da una fase di pre-elaborazione, in cui tutti i parametri acustici rilevanti vengono estratti
dall'enunciato/forma d'onda e trasformati in vettori di dati/numeri, per poi passare al sistema computazionale vero e
proprio che risolve il compito.
● Esempio: se devo costruire un riconoscitore vocale, non sono interessato alla frequenza fondamentale, ma solo ad
alcune impronte digitali e a come variano nel tempo → per un determinato compito, solo un piccolo
sottoinsieme dei parametri acustici/fonetici è rilevante
Qual era l'approccio standard al riconoscimento vocale (=Speech-to-Text) prima dell'avvento del Deep Learning?
L'approccio standard consisteva nel dividere un riconoscitore vocale automatico in due moduli:
1) Il modello acustico
○ Ha la responsabilità di ottenere la forma d'onda e di proporre possibili sequenze di segni/foni.
○ L'approccio tradizionale per l'implementazione di questo tipo di modello per il riconoscimento vocale è stato quello di utilizzare
l'HMM.
(Modelli di Markov nascosti, un sistema di ML → ricordare i loro problemi)
■ Abbiamo una fase di
addestramento in cui
forniamo un corpus
trascritto (un corpus di
enunciati vocali con le
trascrizioni corrette fatte
a mano); lasciamo poi
che il sistema trovi i
parametri corretti per
l'HMM e costruisca il
modelli trifonici (vedere:
Problema di Baum/Welch)
■ Dopo la fase di
addestramento,
possiamo fornire un
nuovo enunciato privo
di
il sistema è in grado di produrre possibili sequenze di telefoni che rappresentano le sequenze di
suoni che potrebbero essere associate a quell'enunciato.
2) Il modello linguistico
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
○ Un software in grado di prevedere la parola successiva più probabile data una sequenza di parole.
○ Il modello standard utilizzato tradizionalmente era l'N-gramma, un altro modello stocastico
■ Per impostare la probabilità degli N-grammi dovremmo usare un corpus parlato, ma data la
legge di Zipf dovremmo fare affidamento su corpora parlati molto grandi e questo non è
tipicamente il caso nemmeno per le lingue comuni → anche la visione tradizionale ricorreva a
un corpus scritto per impostare il modello linguistico
○ Dato un corpus scritto di grandi dimensioni,
dopo una sorta di fase di addestramento
abbiamo il modello linguistico e, data la
sequenza di telefoni fornita dal primo
modello e dal modello linguistico, il modello
potrebbe abbinare, durante la fase di
riconoscimento, i suoni alle parole e alle
trascrizioni corrispondenti, scegliendo
quella più probabile.
Queste erano le idee che hanno guidato il riconoscimento
vocale dagli anni '60 al 2010... e non hanno funzionato
molto bene.
Il riconoscimento delle emozioni è sicuramente una delle direzioni di ricerca che dovremo esplorare maggiormente, ma
ci sono ancora molti problemi da affrontare:
1. Come possiamo scegliere il sottoinsieme di parametri da utilizzare?
a. Se non ci sono studi, non abbiamo alcuna indicazione.
b. Molto spesso, l'approccio a questo problema è quello della forza bruta: invece di selezionare un
sottoinsieme di parametri, si fornisce l'intero set di parametri (1000-2000) e si lascia che il sistema di
apprendimento automatico organizzi e identifichi quelli più affidabili.
i. È molto probabile che un piccolo sottoinsieme di questi parametri sia rilevante, e che la
maggior parte delle informazioni fornite alla macchina sia quindi inutile → le prestazioni
di questi sistemi sono molto basse, soprattutto per il parlato
2. Problemi teorici, quali: la rigida categorizzazione delle emozioni (che scorrono in un continuum)
Esempio: EmoItaly → questo progetto riguarda le diverse emozioni degli italiani durante il primo anno della pandemia di
Covid-19 sulla base dei tweet postati in quel periodo di tempo.
● Si tratta di un algoritmo molto "stupido": ha utilizzato un lessico emozionale (dove le parole sono state classificate
rispetto alle otto emozioni) semplicemente tradotto con GoogleTranslate (= potrebbe contenere molti errori) e con
l'aggiunta di emoji e ha contato le parole per ogni giorno!
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Si possono fare gli stessi tipi di calcoli anche sul parlato: una volta trascritto un enunciato si possono contare le parole,
categorizzarle... ma sul parlato si hanno molte più informazioni, per cui sarebbe molto meglio analizzare il testo.
pov acustico (vedi: prosodia).
La fonetica è un punto molto interessante che richiede esperti di applicazioni fonetiche per identificare il tono della voce
e tutto ciò che può essere necessario per analizzare le decodifiche ambientali e così via.
L'idea è quella di rispondere alla domanda: Qual è la frase più probabile tra tutte le frasi della lingua L, dato un input
acustico O?
● Se abbiamo come input una sequenza di osservazioni, si tratta di una sequenza di parametri, uno per ogni fotogramma:
𝑂 = 𝑜 , 𝑜 , 𝑜 , ..., 𝑜
123 𝑡
● Dato questo input 𝑂, si vorrebbe ottenere una frase (vista come una sequenza di parole):
𝑊 = 𝑤 , 𝑤 , 𝑤 , ..., 𝑤
123 𝑛
● Per formalizzare il punto di partenza, si vuole ottenere la sequenza di parole che abbia la
massima probabilità rispetto all'input
○ Una possibile formalizzazione potrebbe essere: 𝑊 = 𝑎𝑟𝑔𝑚𝑎𝑥𝑃(𝑊|𝑂) →
𝑊∈𝐿
Si deve quindi utilizzare il teorema di Bayes per invertire il condizionamento tra la parola e l'osservazione (= l'input)
→ si ottiene così questa equazione: 𝑃(𝑂|𝑊)𝑃(𝑊) , dove:
𝑃(𝑂)
● 𝑃(𝑊)→ la probabilità preventiva
○ La probabilità di una data sequenza di parole
(utilizzando un modello linguistico)
● 𝑃(𝑂|𝑊) → la probabilità dell'osservazione
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
○ La probabilità di avere una specifica osservazione successiva, data una sequenza di parole
● 𝑃(𝑂) → la probabilità di un certo input acustico senza avere alcuna conoscenza preliminare (→ è indipendente da
𝑊, che è la nostra conoscenza precedente)
Il teorema di Bayes ci permette di calcolare la distribuzione di probabilità a-posteriori, cioè la probabilità che una
certa sequenza di parole abbia generato la sequenza di input acustici percepiti.
L'argmax è un'operazione che trova l'argomento che dà il valore massimo da una funzione di destinazione → un
l'operazione che massimizza l'argomento della funzione, in questo caso 𝑊 (perché conosciamo già 𝑂, che è fisso)
● Quando massimizziamo una funzione e la moltiplichiamo per una costante (positiva), l'argmax non cambia
○ Nel nostro caso, la costante è 1
𝑃(𝑂)
Per questo motivo, in una visione tradizionale, qualsiasi sistema ASR è logicamente diviso in modello acustico (che
calcola la probabilità di osservazione 𝑃(𝑂|𝑊)) e modello linguistico (che calcola la probabilità a priori 𝑃(𝑊)).
11 ott. 2022
Riconoscimento automatico del parlato - ASR
In questo caso si tratta di confrontare due pezzi di lingua: la trascrizione corretta con quella prodotta automaticamente dal
sistema, e la comunità ha adottato fin dall'inizio la distanza di Levenshtein → il WER è il numero minimo di sostituzioni (S),
delezioni (D) e inserimenti (I) per modificare la predizione rispetto alla verità a terra con lunghezza di sequenza N.
Con questa formula si ottiene la percentuale del Word Error Rate, che calcola il minor numero di operazioni
necessarie per trasformare l'output del sistema nella trascrizione corretta.
Esistono alcune varianti del Word Error Rate (l'algoritmo è lo stesso, ciò che cambia sono le unità di misura utilizzate, ad
esempio parola, telefono, carattere...):
● Se si desidera misurare solo le prestazioni del modello acustico (solo la prima parte), è possibile misurare il parametro
Tasso di errore telefonico
● Per i sistemi DNN si può misurare il tasso di errore di carattere
L'approccio tradizionale al riconoscimento vocale che abbiamo descritto fino a questo punto ha funzionato male: i risultati
non sono stati soddisfacenti. Ciò significa che il Word Error Rate per l'ASR di grandi vocaboli era molto alto e le prestazioni
erano molto scarse (oltre il 25% di WRE, decisamente troppo).
● Perché i prodotti ASR sono sul mercato dal 1995/2000? Perché questi prodotti pretendevano di essere personalizzati
sulla voce dell'utente: prima di utilizzarli con un ragionevole livello di soddisfazione, bisognava completare
l'addestramento leggendo una lunga serie di enunciati in modo tale che il sistema potesse completare
l'addestramento sulla voce dell'utente → escludendo qualsiasi tipo di variazione ed essendo personalizzati
specificamente sulla voce dell'utente, le prestazioni aumentavano molto e questi tipi di sistemi erano effettivamente
utili per dettare lettere e note
○ Avevano un piccolo mercato per il business (ad esempio, lavori di segretaria), ma la loro formazione
era completata per voci specifiche e altri utenti potevano utilizzarla con prestazioni molto ridotte.
Fin dall'inizio (2007/2010/2012), gli studiosi hanno cercato di introdurre le reti neurali nel riconoscimento vocale.
Prima di quell'epoca, nelle conferenze c'erano molti lavori che presentavano approcci matematici molto complessi per ottenere
una piccola percentuale di WER: eravamo bloccati a un livello di non miglioramento, c'era bisogno di un cambiamento di
paradigma.
Il primo passo verso il completo cambiamento del paradigma è stato quello di sostituire il modello acustico con una
DNN in grado di esaminare piccoli pezzi di parlato, fornendo una probabilità
distribuzione sui possibili telefoni. Queste distribuzioni di
probabilità sono state di volta in volta misurate da un HMM
standard, fondendo anche il modello linguistico standard,
magari calcolato da N-grammi.
● Quindi, il primo tentativo di iniettare le tecnologie DNN
nel riconoscimento vocale è stato quello di sostituire il
modello acustico calcolato da HMM con un DNN... e
l'output era lo stesso: stimare la probabilità di
un'osservazione condizionata a una sequenza
ipotizzata di parole (= sequenza di telefoni)
Nella seconda fase, anche gli HMM sono stati sostituiti da NNLM ricorrenti. Le prestazioni sono state decisamente
migliori, ma non ancora all'altezza di quelle attuali.
Oggi l'idea principale è quella di addestrare l'ASR end-to-end: invece di lavorare con le parole, lavoriamo con i
caratteri. Il concetto di telefono non è più interessante e i telefoni non vengono modellati affatto.
La rete si sta addestrando end-to-end fornendo da un lato informazioni acustiche (l'insieme delle caratteristiche
acustiche è esattamente lo stesso: sono ancora 39 come abbiamo
detto prima), dall'altra direttamente
la sequenza di caratteri in uscita. La
rete potrebbe essere costruita
utilizzando una RNN o una rete
neurale convoluzionale seguita da
molti strati...
Abbiamo un problema di sequenza-
sequenza: si potrebbe usare qualsiasi
tipo di RNN seq-to-seq. Il punto è che
entrambe queste architetture sono
addestrate
end-to-end, senza alcuna
interpretazione mediata: da un lato le
caratteristiche acustiche, dall'altro la
sequenza di caratteri (non parole!) che
formano la trascrizione.
● L'ultimo strato di una
DNN deve scegliere tra
l'intero lessico
richiederebbe uno schema molto complesso: è molto meglio fare una selezione tra 26 (o più) caratteri e addestrare
la rete a riconoscere le relazioni tra i caratteri che formano le parole.
○ Per questo motivo, per alcuni sistemi i ricercatori hanno introdotto il Character Error Rate: se la
rete sta producendo caratteri, questo tipo di tasso di errore è una misura più intelligente.
Al giorno d'oggi qualsiasi riconoscitore vocale si basa su trasformatori (un'altra architettura che potrebbe essere
introdotta, ma non monopolizza la soluzione come fa in altri compiti).
● ❗ I parametri cambiano: addestriamo DNN di qualsiasi architettura end-to-end per produrre caratteri
Esempio: NVIDIA NeMo è un grande pacchetto per la produzione di sistemi vocali → NVIDIA propone l'architettura
QuartzNet, basata su reti neurali convoluzionali, poiché sono molto più veloci da addestrare rispetto alle RNN.
● Dal punto di vista della decodifica, è possibile configurare la codifica e la fase di riconoscimento come una ricerca
greedy (= si prendono solo le prime ipotesi più probabili nel tempo) o una ricerca a raggiera (= in cui la dimensione
della raggiera può essere configurata).
● Si possono anche applicare alcune misure di rescoring: è vero che la rete riproduce ancora sequenze di caratteri
in modo affidabile (l'output potrebbe essere abbastanza buono senza ulteriori elaborazioni), ma per aumentare le
prestazioni si può immaginare di applicare un rescoring della ricerca a raggiera utilizzando un transformer
language model (un modello linguistico molto sofisticato costruito su trasformatori), che potrebbe cogliere alcuni
errori nella sequenza
👁 Si veda: F. Tamburini, Giocare con NeMo per costruire un riconoscitore automatico di parlato per l'italiano
❗ La valutazione generale per il riconoscitore vocale fornito da GoogleCloud, MicrosoftAzure e altri servizi cloud
forniti da gigantesche aziende IT si aggira intorno al 3/4% di WRE per l'inglese, ma l'inglese ha una grande risorsa per la
lingua... per l'italiano è
è più difficile!
● ≠ chatbot, che sono principalmente scritti e richiedono un'interazione scritta (mentre i sistemi di dialogo richiedono il
parlato) → ma, a patto di avere buoni sistemi di riconoscimento vocale e altro, sono simili...!
Un chatbot ideale dovrebbe comprendere il dialogo con un umano e rispondere in modo appropriato: idealmente,
potremmo immaginare un DNN addestrato su un'enorme quantità di dati in grado di conversare con un umano più o meno su
qualsiasi argomento, tenendo traccia del dialogo, della situazione comunicativa e rispondendo in modo appropriato agli stimoli
e all'interazione con l'umano.
I chatbot reali, per essere sufficientemente validi da essere considerati utili, sono tipicamente orientati al compito:
vengono addestrati su domini specifici per risolvere compiti specifici (ad esempio, per verificare l'indirizzo di consegna di una
spedizione, per la restituzione di alcuni beni, per prenotare un volo...). Sono addestrati a rispondere a domande in un dominio
molto specifico e in un tempo molto specifico, ed è per questo che sono chiamati bot domanda-risposta. Ma vorremmo
ottenere chatbot in grado di mantenere un dialogo con gli utenti, cosa che non avviene per la maggior parte di questi strumenti,
ma solo per un dominio molto limitato e per un insieme molto limitato di domande (che in genere hanno un obiettivo specifico).
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Sintesi Text-to-Speech
Oggi anche le sintesi Text-To-Speech vengono addestrate come DNN addestrate end-to-end, allo stesso modo
dell'ASR: si prende un corpus trascritto, si invertono le informazioni usando la trascrizione del testo come input e la forma
d'onda come output sintetizzato corretto.
● Potremmo utilizzare un'architettura
Encoder-Decoder basata su RNN,
CNN, trasformatori...
Da una parte c'è il testo, poi una prima elaborazione
nell'encoder, uno strato di attenzione e un decoder (che
viene addestrato a sintetizzare le caratteristiche
acustiche che formano, fotogramma per fotogramma, lo
spettrogramma). Sono tutti problemi di sequenza-
sequenza, l'unico punto che conta è quale sia la
sequenza in ingresso e quale quella in uscita.
● Ritorneremo su questo punto alla fine del
corso.
Chatbot DNN
Il DNN al centro potrebbe essere implementato come, ancora una volta, un NN basato su un sistema encoder-decoder: da
un lato si riceve la domanda, dall'altro si addestra il sistema a fornire la risposta, allo stesso modo di una traduzione
automatica NN. Considerando un modello di codificatore-decodificatore sequenza-sequenza come una traduzione tra un tipo
di messaggio e un altro tipo di messaggio, è possibile interpretare più o meno qualsiasi problema utilizzando questo
paradigma!
Come possiamo costruire un gestore del dialogo che funzioni per i veri chatbot?
I chatbot reali sono orientati al compito: da un lato abbiamo l'ASR, dall'altro il TTS. Nel mezzo abbiamo un pacchetto di
comprensione NL (NLU):
● Qualsiasi pacchetto disponibile sul mercato che consenta di creare chatbot dispone di un insieme appropriato di
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Al centro, la State Machine si basa sul paradigma frame intent entity: l'idea è di ottenere la trascrizione e lasciare che la
NLU converta il testo in dati strutturati, per determinare l'intento dell'utente e le entità coinvolte in tale intento. La State
Machine mantiene gli stati del dialogo, in modo che il dialogo sia organizzato come una macchina a stati finiti, con stati e, a
seconda dell'interazione, si passa da uno stato a un altro.
● Forse, se è richiesta un'entità, si può entrare in uno stato del dialogo in cui la macchina chiede l'entità
necessaria!
Alla fine, la macchina risponde.
Il vero punto è che c'è un nuovo lavoro per i linguisti: il designer del dialogo, che progetta in anticipo la struttura logica
completa del dialogo. Il dialoghista deve prevedere in anticipo tutte le possibilità, non c'è ML fino a questo punto!
12 ott. 2022
Tokenizzazione
❗ Attenzione: il processo di tokenizzazione è un processo dipendente dalla lingua → ci sono differenze fondamentali
per la tokenizzazione di una lingua alfabetica (ad esempio l'italiano e l'inglese) rispetto a una lingua ideografica (ad esempio il
cinese). Quindi, mai
utilizzare un tokenizer anche per lingue vicine, se non è stato sviluppato specificamente per la vostra lingua (ad esempio, non
utilizzate un tokenizer usato per l'inglese se dovete tokenizzare un testo italiano).
Che tipo di algoritmo possiamo mettere in atto come prima approssimazione del processo di tokenizzazione?
Una semplice regola di tokenizzazione consiste nel dividere la sequenza di caratteri in ogni posizione di spazio bianco e tagliare la
punteggiatura.
segni, parentesi e virgolette alle due estremità dei frammenti per ottenere la sequenza di token.
● L'idea è di usare gli spazi come separatori e di trattare ogni segno di punteggiatura come se fosse un token separato.
Problemi di tokenizzazione
Ci sono casi notevoli che devono essere trattati e che rendono questo processo molto più complicato.
A. Periodi .
○ Sono molto importanti perché segnano la fine di una frase → in linea di principio, vorremmo
isolare i periodi come token singoli, in modo da avere un token che segna la fine di ogni frase
dichiarativa
○ Ci sono però casi notevoli in cui i periodi non segnano la fine della frase e non devono essere trattati
come token separati: abbreviazioni, acronimi e numeri ordinali.
■ Tutti questi tipi di periodi devono essere conservati insieme alle altre parti del materiale
linguistico che formano un acronimo, un'abbreviazione, un numero ordinale... → avremmo
bisogno dell'elenco di tutti gli acronimi e le abbreviazioni per una determinata lingua e,
prima di dividere, controllare se il periodo sta segnando un'abbreviazione o un acronimo (e
quindi non può essere trattato come un token separato)
○ La disambiguazione dei periodi richiede informazioni contestuali
Le emoji non sono difficili da tokenizzare, in quanto sono singoli caratteri UTF-8 e possono essere facilmente
controllate e identificate come semplici unità... ma che dire delle emoticon, formate da combinazioni molto complicate di
segni di punteggiatura? Come si fa a scrivere un
RE affidabile per identificare le emoticon come singole unità e attribuire loro il significato appropriato?
C. Numeri ordinali → in tedesco sono contrassegnati da un punto, che è difficile distinguere da un periodo di fine
frase, bisogna capire la semantica!
D. Espressione multiparola
○ Da un punto di vista linguistico è molto più utile considerare "a causa di" e "affinché" come un'unica unità,
e lo stesso vale per altre proposizioni complesse, congiunzioni, frasi di prefisso, espressioni di data,
espressioni di tempo e nomi composti.
○ L'identificazione di un'entità di nome nei testi è così complessa che si tratta di un compito
completamente diverso → campo di riconoscimento delle entità di nome
E. Clitici
○ In molte lingue i pronomi enclitici sono attaccati ai verbi, ma sono un'unica voce.
○ Il trattamento dei clitici è diverso a seconda del compito: per l'etichettatura PoS possiamo tenerli
insieme come un unico token (e magari specificare in qualche modo che si tratta di un verbo con un
cluster clitico alla fine), per l'analisi sintattica di solito dividiamo l'espressione clitica
○ La gestione dei clitici è un altro grande problema della tokenizzazione.
F. Deifenazione
○ Il trattino deve essere considerato un token separato o no? Dipende: in alcune parole fa parte del token
(è inserito al centro), in molti testi segna la fine della riga (il token è spezzato e le due parti divise devono
essere ricongiunte)... è molto complicato.
○ Questo è un grosso problema per i giornali (e i loro articoli), i romanzi (poiché tutti i testi stampati
cercano di risparmiare spazio comprimendo il testo e le righe e alla fine dividendo le parole)
H. Lingue ideografiche
○ Le lingue ideografiche non segnano i confini delle parole con spazi vuoti.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
○ Le tecniche di tokenizzazione sono così complesse per queste lingue che non possono essere
concepite come una tecnica di pre-elaborazione (come lo è la tokenizzazione in NLP), ma sono un
compito NLP separato.
Morfologia computazionale
La morfologia è un'analisi linguistica della formazione delle parole. I processi sono principalmente tre: inflessione,
derivazione e composizione:
1. Composto = processo che prende due parole e le unisce per formarne una nuova (es. merlo, camposanto)
a. Crea nuove parole con significati diversi
2. Derivazione = processo di creazione di nuove parole utilizzando una fissazione, aggiungendo prefissi (iniziali) e suffissi (finali),
infissi (al centro) e circonfissi (su entrambi i lati) (ad es. quick → veloce aggiungendo il suffisso -ly)
a. Crea nuove parole con significati diversi
3. Inflessione
a. Si tratta di un processo diverso: non crea nuove parole con significati diversi, ma adatta la forma
base di una parola rispetto a diverse caratteristiche grammaticali.
b. Ad esempio, in italiano è possibile adattare un sostantivo al genere o al numero aggiungendo suffissi
appropriati (es. gatto, gatti, gatta...); per i verbi è possibile creare l'intero paradigma infliggendo la forma
base del verbo rispetto al tempo, all'umore, alla persona... (es. amare, amare, amare...).
Dal punto di vista computazionale non siamo strettamente interessati a modellare la derivazione e la composizione, ma le
trattiamo come parole diverse. L'unico processo morfologico che ci interessa, dal punto di vista computazionale, è l'inflessione:
dall'inflessione di una lingua si può avere uno schema inflazionistico molto complesso!
Esiste una piccola variante degli automi a stati finali che potremmo trasformare in
trasduttori a stati finali, che sono equivalenti ma, quando consumano un simbolo
dall'ingresso su un bordo, producono anche un simbolo in uscita.
● Ecotrasduttore → l'uscita è lo stesso simbolo dell'ecoscandaglio.
input... un po' inutile nel nostro caso
Possiamo utilizzare dei trasduttori per eseguire le nostre
operazioni: se introduciamo il simbolo ε che ci permette di migrare
da uno stato all'altro senza consumare alcun input, allora siamo in
grado di trasformare una forma di parola nel lemma e nelle
caratteristiche morfologiche corrispondenti.
Con i trasduttori a stati finiti possiamo implementare sia
l'operazione di analisi che quella di generazione... ma se dobbiamo
costruire il percorso per ogni forma di parola, ancora una volta non c'è
alcun guadagno!
Abbiamo molte operazioni di set tra i linguaggi riconosciuti da due automi in grado di produrre l'automa minimo che è
l'intersezione degli automi e che è anche quello minimo:
● La concatenazione di automi
○ Per l'inglese è possibile produrre l'automa per un
verbo regolare e l'automa per tutte le possibili
inflessioni per tutte le possibili forme di parola →
se poi li si concatena, si ottiene un automa che
riconosce tutte le forme di parola per quel verbo
regolare
○ Utilizzando questa operazione possiamo
specificare gruppi di lemmi (= forme di base)
che, una volta combinati con l'insieme
specifico di terminazioni di parole, possono
generare l'intero insieme di forme di parole
per quei lemmi.
○ ✗ Problema: quando si concatena una forma di base
con un suffisso inflessivo, al confine si dovranno spesso applicare alcune correzioni morfofonologiche
al fine di rispettare la fonologia della lingua
■ Esempio: try -stessi trasduttori di lavoro→ trys, tryed... dobbiamo cambiare qualcosa
● Dobbiamo utilizzare un'altra operazione: la composizione
● La composizione di automi
○ Viene utilizzato per gestire i fenomeni
morfo-fonologici
○ Utilizzando questo meccanismo è possibile
specificare gli automi che implementano i
riadattamenti morfofonologici e, componendoli con
il risultato della concatenazione, è possibile
riadattare il bordo
17 ott. 2022
Morfologia computazionale
Etichettatura PoS
L'etichettatura Part of Speech è il processo di assegnazione a ciascun token della sua classe lessicale (PoS).
Questo processo comporta una fase di disambiguazione: circa il 50% dei token sono ambigui rispetto alla loro classe
grammaticale (il maggior numero di ambiguità riguarda i nomi, gli aggettivi e i verbi). Il PoS tagger fornisce tutti i possibili tag
e poi bisogna scegliere quello corretto rispetto alla frase/contesto in cui viene utilizzato: le parole contenute nel contesto ci
aiutano a disambiguare tra le possibili classi di parole.
■ ...O modelli grafici probabilistici, cioè campi casuali condizionati: un altro tipo di modello
stocastico che non esamineremo in dettaglio e che è un modello stocastico
discriminativo, più sofisticato dell'HMM.
Esistono anche altre tecniche:
2) Massima entropia
3) Trasformazione
4) Alberi decisionali
5) Reti neurali
❗ Nelle [parentesi quadre] delle diapositive potete trovare strumenti liberamente disponibili in rete per risolvere il problema
del PoS con il metodo corrispondente!
Limitando le classi possibili per ogni parola a quella reale e non forzando lo strumento a scegliere tra tutte le classi
possibili (perché sarebbe più difficile!). Questo metodo consente di ottenere risultati ragionevolmente buoni e molto
semplici.
Quali sono le prestazioni di queste soluzioni? Dipende dalla lingua, dal benchmark... Ci sono alcune tendenze per
l'inglese e l'italiano, ma cambiando il benchmark o il tagset (l'insieme delle etichette) il risultato potrebbe cambiare,
ovviamente.
(1) Le migliori tecniche stocastiche → un po' meno del 98% di accuratezza sia in italiano che in inglese.
(2) RNN → leggermente superiore al 98% (es. 98,2%)
(3) Trasformatori di precisione → superiore al 99%
Dobbiamo fare due considerazioni molto importanti sulle prestazioni dei tagger PoS:
1. Questo 2% di errori si concentra sulle parti più importanti del testo
○ Quali sono gli errori più comuni commessi dai tagger PoS?
■ Le categorie più confuse sono i nomi, i verbi e gli aggettivi... questo è molto importante per noi,
perché queste sono le classi a cui siamo maggiormente interessati e un errore in una di queste
classi è molto più pesante di un errore su una parola grammaticale (che sono le più frequenti e
anche non così ambigue!).
○ La soluzione fornita dai trasformatori di italiano è in grado di correggere molti errori, fornendo solo l'1%
degli errori ed è in grado di modificare la distribuzione degli errori (che non sono più concentrati sui
sostantivi),
aggettivi e verbi, ma anche sulle parole grammaticali) → anche solo cambiare gli errori alle parole meno
interessanti è molto meglio
2. Prestare attenzione alla reale difficoltà del compito: un compito risolto da una linea di base con un'accuratezza
del 90% è un compito facile (ad esempio, ci sono molte parole non ambigue, quindi non ci sono molte decisioni da
prendere).
○ Quando facciamo le valutazioni, confrontiamo molto spesso la nostra proposta con le baseline (=
algoritmi standard) che risolvono il problema con un metodo molto stupido: per il PoS tagging la
baseline è assegnare ogni volta il tag più frequente a una data parola, senza mai guardare al contesto
(che è fondamentale per capire il ruolo di una parola in una frase) → la baseline ha un'accuratezza del
90%, quindi il 98% non è un gran miglioramento
❗ Fate attenzione: non fornite una soluzione per un determinato compito senza aver ben chiaro il quadro di valutazione
per quel compito, lo stato dell'arte e così via!
Morfologia computazionale
Lemmatizzazione
Questo compito consiste nell'assegnare a ogni token la forma di citazione standard presa dal dizionario (= il lemma).
Per convenzione, il lemma delle parole in italiano è al maschile, al singolare, e così via...
È molto utile per le lingue ad alta inflessione (ad esempio le lingue romanze come l'italiano) perché se si deve
analizzare un testo e si hanno molte forme inflesse per un dato verbo/novo, che significano tutte la stessa cosa (l'inflessione
non cambia il significato, semplicemente adatta la forma di base a caratteristiche grammaticali diverse), allora forse si
vorrebbe una normalizzazione per ogni parola, riconducendola alla forma di citazione.
● Il problema non è rilevante per l'inglese: una volta disambiguato il PoS, anche il lemma è già disambiguato.
● Esempio: it. danno → può essere sia un sostantivo che un verbo (e ancora, potrebbe essere due verbi diversi: dare e
dannare) → si può risolvere questa ambiguità solo con considerazioni semantiche e questo è un compito molto
complesso da risolvere
○ EVALITA 2011 - Tamburini ha implementato un algoritmo molto semplice per risolvere questo problema:
un algoritmo non basato sul ML, in quanto per addestrare un classificatore ML avremmo bisogno di un
grande corpus con l'annotazione manuale dei lemmi.
■ Annotare un corpus per PoS significa annotare un insieme di testi per un numero molto limitato
di categorie (ci sono 20/30/40 PoS), mentre annotare un corpus per lemma, fornendo
informazioni sufficienti sull'intera gamma, significa annotare manualmente un corpus enorme
(le classi sono tutti i lemmi del dizionario: decine di migliaia...).
■ ...EVALITA 2011 ha utilizzato l'idea di base: assegnare il lemma più frequente ad ogni forma di
parola → l'approssimazione si basa sulla "marca d'uso", una classificazione sviluppata dal prof.
De Mauro, un linguista, sul proprio dizionario.
■ La soluzione non era soddisfacente e la soluzione migliore utilizzava elenchi di parole, molte conoscenze...
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Completata l'analisi sintattica delle parole (= tagging PoS e lemmatizzazione), possiamo ora iniziare la discussione
sull'analisi sintattica a livello di frase: significa assegnare un qualche tipo di struttura formale a una frase,
delineandone la struttura sintattica sia analizzando i singoli costituenti sia esplicitando le relazioni tra le parole.
\Se volessimo analizzare la BN con strumenti computazionali, di cosa avremmo bisogno? Almeno tre elementi:
1. La frase che analizzeremo
2. Una grammatica formale per un dato linguaggio: dobbiamo formalizzare in un quadro formale la grammatica della nostra NL.
3. Un parser: un algoritmo che prende la grammatica formale e applica le regole della grammatica formale per
analizzare la frase e fornire, come output, l'albero
Per la CS, i dispositivi formali saranno quasi gli stessi che usiamo nei compilatori, ma il linguaggio che dobbiamo
analizzare è assolutamente e completamente diverso: attenzione a non esagerare con le conoscenze.
Per procedere dobbiamo considerare le NL come linguaggi formali: dobbiamo vedere un linguaggio naturale come un
insieme di stringhe (il lessico di una lingua potrebbe essere considerato un insieme di parole).
Dato S come vocabolario, S* è un insieme infinito di possibili sequenze costruite sul dizionario (è un insieme finito
di frasi costruite utilizzando un dizionario specifico):
● Potremmo definire un dizionario VEng avente un insieme di forme di parole (= forme inflesse)
𝑉𝐸𝑛𝑔 = {𝑎, 𝑎𝑎𝑟𝑑𝑣𝑎𝑟𝑘, ℎ𝑒, 𝑛𝑖𝑐𝑒, 𝑠𝑚𝑒𝑙𝑙𝑠, 𝑠𝑜𝑢𝑛𝑑𝑠, 𝑡ℎ𝑖𝑠, ..., 𝑧𝑖𝑡ℎ𝑒𝑟}
● 𝑉𝐸𝑛𝑔 *= {𝑎 𝑎 𝑎 𝑎 𝑎 𝑧𝑖𝑡ℎ𝑒𝑟 𝑎, 𝑎𝑎𝑟𝑑𝑣𝑎𝑟𝑘 𝑧𝑖𝑡ℎ𝑒𝑟 𝑠𝑚𝑒𝑙𝑙𝑠 𝑎 𝑎 ℎ𝑒, ℎ𝑒 𝑠𝑚𝑒𝑙𝑙𝑠 𝑎 𝑧𝑖𝑡ℎ𝑒𝑟, 𝑡ℎ𝑖𝑠 𝑠𝑜𝑢𝑛𝑑𝑠 𝑛𝑖𝑐𝑒, ... }
○ Questo non è l'inglese: è la st di tutte le frasi possibili costruite sul nostro specifico dizionario VEng
Ciò premesso, siamo pronti a definire un noto insieme di grammatiche: la grammatica a struttura di frase, secondo la
definizione di Chomsky, è un dispositivo formale composto da quattro elementi:
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
1. N, un insieme finito di simboli non terminali (disgiunti da Σ e corrispondenti a categorie sintattiche: i nodi interni di
un albero)
2. 𝚺, un insieme finito di simboli terminali (parole per una data lingua, si trovano nelle foglie dell'albero)
3. S, il simbolo iniziale distinto che deve trovarsi nella radice dell'albero per costruire un albero sintattico valido
4. P, un insieme finito di regole nella forma α → β
○ Dove α e β sono elementi di (𝑁 ∪ Σ) *
■ Ciò significa che α e β sono stringhe arbitrarie composte da simboli terminali o non
terminali (l'uno o l'altro)
○ α contiene almeno un simbolo non terminale
Possiamo quindi definire il concetto di derivazione: data una stringa di parole (una frase), diciamo che possiamo
riscrivere un dato non terminale se possiamo applicare un insieme di regole che consumano tutto l'insieme di parole e, alla
radice, si ha un dato simbolo. Utilizzando il concetto di derivazione, potremmo dire che questa grammatica riconosce una
determinata frase se, applicando ripetutamente diverse regole di essa, possiamo raggruppare tutte le parole in un albero che
arriva al nodo radice contenente il simbolo iniziale.
Grammatiche di dipendenza
In questo caso abbiamo un approccio diverso,
in cui uniamo le parole per mezzo di relazioni
● ❗ Non lasciatevi confondere
dall'immagine: sembra un albero ma
non lo è, è un grafico.
(al centro non ci sono simboli non
terminali, ma parole)
Ci possono essere molte relazioni di
dipendenza diverse: oggetto sintattico, oggetto
diretto, oggetto indiretto, complemento di una
preposizione, postmodificatori nominali... e così
via.
Banchi di alberi
Una treebank è un corpus annotato da qualsiasi tipo di struttura sintattica. La più famosa è la Penn Treebank per
l'inglese, ma esistono treebank per quasi tutte le lingue e oggi c'è l'importantissimo progetto sulle dipendenze universali.
Il punto importante sono le grammatiche a struttura di frase, perché domani partiremo da qui per discutere la gerarchia di
Chomsky e fare delle belle osservazioni sulla complessità della BN rispetto a tale gerarchia.
18 ott. 2022
Grammatiche e parsing
La gerarchia di Chomsky
Nel suo lavoro alla fine degli anni '50, considerando la grammatica a struttura di frase, ha proposto di analizzare diversi tipi
di linguaggi formali basati sulla grammatica a struttura di frase. In particolare, ha proposto una gerarchia di tali grammatiche
basata sul formato delle regole.
La complessità formale di NL
Chi lavora sui linguaggi teorici formali usa l'unità della lettera, mentre quando si lavora con la BN l'unità di
rappresentazione è la parola (che è una combinazione di lettere).
Nelle lingue formali "aabbcc" è una frase composta da unità che sono caratteri, ma in NL "I am the teacher" è una frase (e
le unità sono parole a più caratteri). Ma sono esattamente la stessa cosa: dobbiamo mantenere i due turni insieme, ma sono
perfettamente paralleli.
Perché la complessità formale della BN è interessante? Perché dovremmo preoccuparci? Rispondere alla domanda sulla
complessità formale dei BN ci fornisce alcune informazioni sulla struttura generale dei BN, permettendoci di trarre
conclusioni sull'adeguatezza della struttura dei BN.
di un dato formalismo grammaticale... sapere qual è la posizione della classe di NL nella gerarchia di Chomsky ci
permette di conoscere in anticipo quali tipi di formalismi dobbiamo scegliere e mettere al lavoro per riconoscere NL, in
quanto determina un limite inferiore per la complessità computazionale dei compiti di NLP.
...
● Tutti i matematici hanno già dimostrato che un bnn è un linguaggio almeno context-free
● Questo fenomeno non può quindi essere riconosciuto da un linguaggio regolare, poiché non è possibile abbinare
questi due percorsi ripetuti esattamente per lo stesso numero di volte.
○ Per superare davvero questa combinazione di fenomeni della BN è necessaria almeno una grammatica libera dal contesto.
L'idea è che se esiste l'inglese, che presenta un fenomeno che non può essere riconosciuto dalle lingue regolari, allora
tutte le classi di NL devono essere libere dal contesto.
Purtroppo le grammatiche sensibili al contesto presentano una complessità computazionale esponenziale, non
possiamo gestirle! Non c'è speranza di costruire davvero un parser per riconoscere la sintassi NL... in realtà, Chomsky non ha
fatto un lavoro completo e, tra le categorie che ha proposto, ci sono altri livelli, altri tipi di grammatiche:
● Tipo 0 - Grammatiche generali riscrivibili / ricorsivamente enumerabili
● Linguaggi ricorsivi
● Tipo 1 - Grammatiche sensibili al contesto
● Grammatiche e linguaggi indicizzati
● Grammatiche ad albero /
linguaggi leggermente sensibili
al contesto
○ Questa classe può
essere riconosciuta in
tempo polinomiale, è
gestibile
○ Produce grammatiche
leggermente sensibili al
contesto
● Tipo 2 - Grammatiche libere dal contesto
● Grammatiche e linguaggi
deterministici liberi da contesto
● Tipo 3 - Grammatiche lineari
e regolari
Siamo arrivati a queste conclusioni abbastanza soddisfacenti assumendo la prospettiva dei formalisti. Ci sono studi di
psicolinguistica che dimostrano che non siamo in grado di gestire molti livelli di ricorsione. D'altra parte, se non si ammette una
ricorsione infinita
(e ammettere al massimo 3), le NL non sono più leggermente sensibili al contesto, poiché possiamo
riconoscere qualsiasi fenomeno utilizzando grammatiche sensibili al contesto.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Da un lato è molto interessante discutere della complessità della BN da un punto di vista formalista, ma in pratica il
nostro cervello non è in grado di gestire la ricorsione infinita e nessuno si preoccupa della reale complessità
computazionale della BN e ci limitiamo a usare grammatiche context-free per riconoscere i fenomeni (usando
qualche trucco per i fenomeni più complicati).
Paper: A. Branco (2018), Complessità computazionale delle lingue naturali: A Reasoned Overview → alla fine dell'articolo
è presente la discussione
Al giorno d'oggi, la grammatica è indotta dai dati (naturalmente, nel corpus annotato è necessario avere in mente una
teoria sintattica mentre lo si annota).
1. Sostituzione
Sostituire un albero iniziale T1 con un albero T2 significa
sostituire un nodo di sostituzione ↓ in T2 con T1 .
Esempio: Dobbiamo aggiungere due frasi sostantive (un
soggetto e un oggetto) all'albero per completare l'albero
iniziale → con un'operazione di sostituzione aggiungiamo un
altro albero!
● Abbiamo la frase "A Giovanni piace xxx" →
attraverso l'operazione di sostituzione possiamo
collegare il nodo Giovanni all'albero principale, e
possiamo fare lo stesso con, per esempio, "Maria"
per completare l'albero
Utilizzando solo l'operazione di sostituzione, i
TAG sono grammatiche libere dal contesto.
2. Addizionale
Con questa operazione si può inserire un albero in un
altro albero: annettere un albero ausiliario T1 in un albero T2
significa inserire T1 in T2, nel nodo che è uguale alla radice
(e al piede) di T1 .
L'aggettivo è utile per i modificatori: tutti i modificatori
possono essere aggettivi (aggettivi, avverbi, frasi...).
Si tratta di un'operazione molto potente: attaccare alla
foglia è privo di contesto, ma se si inserisce, si aggancia
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
● ❗ I formalismi lievemente sensibili al contesto possono essere utilizzati per costruire grammatiche lievemente sensibili al contesto.
I modelli lessicalizzati sono fondamentalmente più potenti di quelli non lessicalizzati, qualsiasi tipo di approccio
deve essere lessicalizzato.
In senso stretto, dal punto di vista formale, le NL richiedono grammatiche leggermente sensibili al contesto, ma in
pratica anche le grammatiche libere dal contesto possono funzionare. Ma attenzione: l'uso di grammatiche libere dal
contesto significa che possiamo utilizzare parser veloci, ma abbiamo
non ha risolto un gran numero di problemi a causa dell'ambiguità.
Le grammatiche sono così complesse che il miglior parser potrebbe fornire centinaia di alberi perfettamente accettabili...
L'approccio tipico è quello di mantenere la grammatica stocastica, introducendo la probabilità nelle regole grammaticali.
Qualsiasi tipo di formalismo può essere abbinato a una sorta di motore di calcolo stocastico in modo da produrre molti alberi di
parsing, ma con un livello di probabilità associato a ciascuno. In questo modo possiamo mantenere quelli più probabili.
Al giorno d'oggi, gli approcci alla sintassi della BN sono diversi e ci si attiene al parsing delle dipendenze, in cui si devono
collegare tra loro le parole con relazioni linguistiche specifiche. Nel parsing delle dipendenze abbiamo tipicamente due
approcci:
19 ott. 2022
Semantica lessicale
Semantica lessicale
Stiamo parlando di parole e del loro significato. Quando ci occupiamo di questo argomento dobbiamo necessariamente
parlare di risorse lessicali, poiché sono molto importanti in questo campo. Le risorse lessicali più comuni sono i dizionari
(sia analogici che elettronici, che elencano tutti i significati di un dato lemma, fornendo anche esempi). Sono organizzati per
ordine lessicografico e, inoltre, le glosse producono un circolo nella definizione del significato: si definisce il significato di una
parola in una data lingua utilizzando quella stessa lingua. I dizionari sono utili per gli esseri umani ma non per le macchine,
perché non possono essere formalizzati (matematica: non si può definire x usando x).
Questa è una delle prime e più problematiche questioni che gli studiosi hanno dovuto affrontare quando si sono occupati
di semantica: come possiamo definire i significati in modo formale senza usare la BN?
Il primo tentativo si deve a Gothenfriede e all'approccio logico: assegnare forme logiche che definiscono il significato
delle parole e cercare di usare logiche complesse per combinare i significati usando principi di composizione. Questo primo
tentativo è stato molto difficile da gestire e sicuramente non è stato utilizzato nella linguistica computazionale per 10/15 anni.
Altri tentativi da un punto di vista cognitivo hanno generato WordNet, una risorsa lessicale introdotta all'Università di
Princeton a metà degli anni '90 e basata su teorie psicolinguistiche sulla memoria lessicale umana: l'idea è quella di definire il
significato non in modo ambiguo.
● L'idea è quella di immaginare una tabella astratta in cui mettiamo tutti i lessemi
e, dall'altra parte della tabella, mettiamo i significati (non importa come li
indichiamo, possiamo anche mettere delle glosse, l'importante è che li
identifichiamo chiaramente).
● Mettiamo una croce ogni volta che un lessema può avere un significato
specifico: alcuni lessemi hanno più di un significato, e più lessemi possono
avere lo stesso significato
● Abbiamo sia la relazione di sinonimia (= relazione semantica lessicale che
mette insieme lessemi che hanno un significato simile: due parole sono
sinonime quando
condividono il significato in un contesto specifico) e la polisemia (= diversa dall'omonimia, quando due lemmi diversi
sono scritti nello stesso modo ma hanno due significati diversi)
Data questa matrice lessicale, l'idea degli studiosi di Princeton è stata quella di definire un concetto, un significato, come
l'insieme delle parole sinonime che possono assumere questo significato → un significato/concetto astratto è definito
come un insieme di sinonimi (un synset):
● {consiglio, tavola, comitato
Naturalmente, si tratta di un trucco. Da un punto di vista formale, definire un significato come un insieme di oggetti è
perfettamente accettabile, ma la definizione del concetto è implicita: l'idea è che un madrelingua di quella lingua, leggendo
l'elenco dei sinonimi, possa capire immediatamente a quali concetti si riferiscono questi oggetti/parole.
I synset sono i nodi della struttura a grafo WordNet che collega i significati (definiti come insiemi di parole sinonime) ad altri
significati utilizzando la relazione semantica lessicale standard introdotta in linguistica:
- La sinonimia è implicitamente rappresentata in un sintagma
- La polisemia è rappresentata quando una parola appartiene a più di un sintagma.
- Iponimia / Ipernimia [ISA]
- L'iponimo è il sottotipo, l'iperonimo è il supertipo → si possono considerare come la stessa
relazione, solo invertita
- Esempio: [gatto/mammifero]
- Meronomia [HASA]: relazione tra la parte e il tutto, relazione di sostanza.
- Esempio: [ruota/bicicletta], [braccio/corpo], [legno/albero].
Queste e altre relazioni possono essere definite sui sinonimi, ma purtroppo ci sono relazioni che non possono essere
definite sui sinonimi:
- I sinonimi non possono essere definiti su set di sinonimi (ma non importa)
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
- Antonomia: una relazione di opposti (b/w, ricco/povero), che tipicamente coinvolge aggettivi che definiscono un
continuum (se qualcuno non è ricco, non significa che sia povero).
- Questa relazione potrebbe, in linea di principio, essere definita sui sinonimi, ma è problematica: affermare
che due sinonimi sono in una relazione implica che tutte le coppie sono accettabili in questa relazione.
- Da esperimenti psicolinguistici, ponendo in una relazione di antonimia i due sintagmi {sorgere,salire} e
{caduta,discesa} → quando si afferma che il primo sintagma è un antonimo del secondo, i parlanti
madrelingua presentano qualche problema ad accettare che discesa è un antonimo di salita
- Trattandosi di una risorsa lessicale di tipo cognitivo, gli studiosi preferiscono trovare anche
l'antonimia tra i lessemi
Ma alcune altre parole sono difficili da disambiguare (ad esempio, titolo, testa), poiché hanno molti significati che più o
meno si sovrappongono → prestazioni molto basse.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
logits che spinge i sinset strettamente connessi alla parola utilizzando gli spigoli di WordNet:
tutti i sinset direttamente connessi alla parola target in WordNet sono spinti verso l'alto, mentre
tutti gli altri sono spinti verso il basso
○ Questo è il modo standard per sviluppare più o meno qualsiasi applicazione al giorno d'oggi!
Si tratta di un'altra risorsa lessicale, molto importante nella linguistica computazionale. Siamo nel campo della semantica
dei frame, una teoria linguistica introdotta da Filmore (1982) che mette in relazione la semantica, dal punto di vista
linguistico, con la conoscenza di senso comune. È una delle teorie semantiche di maggior successo e ha un chiaro
collegamento e un chiaro seguito con la PNL.
L'idea è che non si possa comprendere il significato di una singola parola (siamo ancora a livello lessicale!) senza avere
accesso all'intera conoscenza legata a questa parola.
● Non si può capire la parola vendere senza conoscere la cornice, lo scenario delle transazioni commerciali
(ad esempio, i concetti di venditore, acquirente, merce, denaro...).
Una cornice semantica, in questa teoria linguistica, rappresenta un evento o uno scenario e possiede molti elementi di
cornice che contribuiscono alla definizione di una parola target. Una parola in un contesto attiva, o evoca, una cornice
semantica di conoscenza relativa al concetto specifico a cui si riferisce.
Fillmore ha iniziato a produrre FrameNet (2003) sulla base di questa teoria: si tratta di una risorsa lessicale per l'inglese
creata a mano, un dizionario che contiene più di 13000 parole che evocano una o più cornici (le parole polisemiche evocano
cornici diverse in contesti diversi).
● Per i ricercatori di PNL, le oltre 200.000 frasi annotate manualmente e collegate a più di 1.200 cornici semantiche (=
concetti astratti) forniscono un set di dati di formazione unico per l'etichettatura dei ruoli semantici.
Esempio: il lemma LEAVE evoca tre diverse cornici in tre diverse frasi
Nella stessa frase si possono avere parole diverse che evocano cornici diverse:
FrameNet è molto ricco e complesso, con molte frasi annotate (che sono tutte frasi reali tratte da un corpus annotato, il
Briggs corpus).
Inoltre, le cornici (che, in questa teoria semantica, sono concetti astratti) hanno anche relazioni di collegamento tra loro
● Ad esempio, la partenza è una sorta di evento
Sono tutti concetti astratti che, in qualche misura, sono istanze che condividono alcune proprietà. Si finisce per avere un
enorme grafo di relazioni diverse che collegano diversi quadri/concetti → abbiamo un'ontologia astratta collegata a parole
reali che possono essere evocate in diversi concetti/quadri.
Dal punto di vista della linguistica computazionale, abbiamo tre compiti principali nel tema generale del Frame Semantic Parsing:
1. Identificazione del target
○ Data una frase, individuare quale parola può evocare un quadro di riferimento
2. Identificazione del telaio
○ Data una parola target, dobbiamo identificare il frame da essa evocato
○ Questo è esattamente un compito di WSD nel campo della semantica delle cornici.
3. Identificazione dell'argomento (etichettatura semantico-ruolo)
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
○ Identificare gli elementi della cornice coinvolti in un quadro specifico evocato da una parola
specifica in una frase.
24 ott. 2022
Semantica distributiva
La Semantica Distributiva è un argomento di grande importanza per la PNL e può essere considerata una delle
principali innovazioni degli ultimi anni, sebbene si tratti di un processo iniziato negli anni '90 con un primo tentativo e che
ha vissuto un grande miglioramento negli ultimi 10 anni.
La pietra angolare di ogni approccio semantico distribuzionale è la cosiddetta Ipotesi Distributiva (DH), introdotta negli
anni '40 come principale strumento di indagine della linguistica strutturale americana. L'idea alla base di questa ipotesi
coniugata in ambito semantico è che "il grado di somiglianza semantica tra due espressioni linguistiche A e B è funzione della
somiglianza dei contesti linguistici in cui A e B possono comparire".
● Maggiore è la somiglianza tra i contesti, maggiore è la somiglianza semantica tra le due unità.
Secondo Z. Harriss, "la somiglianza semantica tra due parole è, infatti, una funzione del grado di somiglianza dei loro
"ambienti" linguistici".
L'idea che l'analisi distributiva dei contesti linguistici sia la chiave per comprendere il significato delle parole ha
una lunga tradizione in linguistica (iniziata negli anni '40, ma che ha continuato a essere popolare): ci sono linguisti che
sostengono che "quando i 'sensi delle parole' hanno un ruolo da svolgere in un vocabolario scientifico, devono essere
interpretati come astrazioni su cluster di usi delle parole". L'idea è che si possa costruire un dizionario raccogliendo grandi
quantità di dati e raggruppando il contesto di una data parola e assegnando un significato per ogni gruppo di contesti → si tratta
di una visione estrema, ma è esattamente quello che stiamo cercando di fare.
Se l'idea è quella di definire la somiglianza semantica tra unità di qualsiasi tipo come la somiglianza dei loro contesti, ciò significa che noi
necessità di dati: basiamo la definizione di similarità semantica sulla raccolta di dati e contesti da enormi corpora.
● Ancora una volta, enormi corpora linguistici elettronici stanno diventando il fulcro dell'analisi, in quanto
forniscono tutti i dati rilevanti di cui abbiamo bisogno per costruire qualsiasi modello semantico distributivo.
○ I corpora sono di nuovo le principali fonti di dati!
Questi approcci sono oggi chiamati modelli semantici distribuzionali, ma sono stati anche chiamati spazi di
parole/vettoriali, semantica vettoriale... e molti altri nomi.
Questo perché se possiamo riorganizzare le informazioni raccolte dai corpora (in particolare le informazioni relative al
contesto per una data unità) in un vettore matematico, allora, come sappiamo, data un'unità e il suo vettore che raccoglie tutte
le informazioni distributive raccolte dai corpora, sappiamo che un vettore di n-componenti è un punto in uno spazio n-
dimensionale. E se diciamo che contesti/vettori simili implicano una somiglianza tra le unità/parole corrispondenti, significa che
la somiglianza semantica tra unità/parole diventa una prossimità nello spazio n-dimensionale. Se possiamo costruire vettori
che raccolgono e riassumono tutti i contesti in cui una data parola appare in un grande corpus, allora la vicinanza dei
due punti corrispondenti ai due vettori nello spazio n-dimensionale rappresenta la somiglianza: abbiamo trasformato un
problema di somiglianza semantica nel dominio linguistico in un problema di prossimità in uno spazio vettoriale matematico n-
dimensionale (e quindi possiamo usare le distanze matematiche per misurare la somiglianza semantica tra le parole).
Come si costruiscono vettori affidabili a partire dai dati del corpus? Questa è la chiave per impostare questo approccio.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Passiamo attraverso una metafora geometrica del significato in cui i significati o la somiglianza tra significati diventano
prossimità nello spazio vettoriale matematico.
Cosa si intende per unità? Dipende dal compito che si vuole affrontare: possono essere caratteri, parole, frasi,
espressioni di più parole... Dipende dall'obiettivo. Il punto di partenza erano le parole, ma poi abbiamo iniziato a fare
distribuzioni
modelli semantici con caratteri (soprattutto in DNN), frasi, interi testi...
La distanza semantica tra le parole è una funzione della loro somiglianza distributiva. Possiamo interpretare questo
spazio vettoriale distributivo come uno spazio semantico in cui le parole simili sono vicine e quelle dissimili sono lontane.
Come possiamo costruire vettori affidabili che riassumano tutti i diversi comportamenti di una data unità in un corpus reale?
Useremo le parole come unità.
Prima di tutto, dobbiamo chiarire un punto. In un corpus di grandi dimensioni una parola potrebbe comparire più volte e in
contesti diversi, quindi dobbiamo chiarire come gestire questi diversi contesti: dobbiamo accumulare questo tipo di
informazioni o trattarle in modi diversi?
● Harris: "La distribuzione di un elemento sarà intesa come la somma di tutti i suoi ambienti" → accumuliamo tutte
le informazioni da tutti i contesti
○ In linguistica l'ambiente è chiamato contesto e di solito è il co-testo: il numero di parole intorno
all'unità/parola che stiamo esaminando.
■ In pratica, utilizziamo la frase come unità per definire l'intervallo del contesto → concettualmente
è il dominio migliore per gestire questo tipo di informazioni.
■ Nel nostro esempio non useremo la frase come unità, perché sarebbe troppo e occuperebbe
troppo spazio nella diapositiva: è del tutto insensato usare un intervallo piccolo (ad esempio ±1)
nei modelli reali.
■ Si può anche utilizzare un intervallo fisso (±10), ma in questo caso bisogna fare i conti con i casi limite.
Il punto chiave della costruzione di vettori è che si tratta di un processo non supervisionato: possiamo raccogliere
enormi quantità di dati senza dover annotare nulla. Questi tipi di modelli sono in grado di costruire modelli molto potenti a
partire dal testo grezzo.
I vettori prodotti dall'analisi semantica latente erano un buon processo... ma solo l'inizio della nostra storia.
Dopo l'analisi semantica latente ci sono stati alcuni metodi che hanno utilizzato un approccio più o meno simile: il conteggio delle
co-occorrenza di parole in enormi corpora con una diversa ponderazione della frequenza nella cella... ma l'idea di fondo era
condivisa ed era quella di contare le co-occorrenze.
2013 - Rivoluzione!
L'approccio ha smesso di contare e ha iniziato a prevedere: si tratta di un vero e proprio cambio di paradigma. L'idea
alla base è assolutamente la stessa: i due capisaldi (ipotesi distributiva e significato di metafora geometrica) vengono
mantenuti, ma ciò che cambia è il modo tecnico pratico di calcolare i vettori.
Mikolov et Al. (2013) hanno proposto Word2vec, il primo modello neurale per la costruzione di vettori che, da quel
momento, hanno iniziato a essere chiamati word embeddings.
L'idea era di considerare una rete neurale molto
semplice, con uno strato di input, uno strato di output
e un solo strato nascosto. La rete viene addestrata a
prevedere, dato un certo contesto (di 11 parole, o
comunque un numero dispari), la parola al centro, che
è stata rimossa dal contesto. Anche in questo caso, il
corpus è enorme e il metodo è ancora non
supervisionato (non abbiamo bisogno di annotazioni
nel corpus, la supervisione è creata al volo: quando
rimuoviamo una parola sappiamo che sarà la parola
corretta a essere aggiunta dalla NN).
All'inizio la rete non sarà in grado di prevedere
nulla, ma dopo un gran numero di calcoli (si lavora
sempre con il back-propagating dell'errore regolando
il peso e spostando poi una parola nel corpus), alla
fine dell'addestramento, la rete impara a prevedere la
parola al centro.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
e lo strato nascosto contiene esattamente un vettore per ogni parola del corpus. Questi vettori sono esattamente le
incorporazioni di parole che stiamo cercando. Per consentire alla rete di prevedere realmente l'output, deve creare vettori
simili per parole simili.
Dal 2013 tutto il mondo ha iniziato a usare Word2vec per creare embeddings di parole, che erano molto migliori di quelli
calcolati dall'analisi semantica latente: erano in grado di mantenere l'aspetto della somiglianza del coseno, ma erano anche
così sofisticati da poter fare analogie usando vettori
● Un'analogia linguistica è, ad esempio, uomo:donna = re:X
○ Con i vettori di Word2vec siamo stati in grado di calcolare i risultati di queste analogie utilizzando
operazioni algebriche sui vettori
○ La precisione dell'embedding delle parole nel creare analogie è stata eccellente: è stato in grado di
creare analogie con le capitali, il significato, la morfologia derivazionale... semplicemente eseguendo
operazioni matematiche su questi vettori.
Dopo Word2vec ci sono state altre proposte e metodologie (ad esempio Glove), ma tutti questi metodi sono stati definiti
incorporazioni statiche, in quanto a un'unità si può associare solo un vettore e le parole polisemiche si riducono ancora a
un vettore, confondendo molto il nostro modello e introducendo diversi problemi. La frequenza del contesto domina.
❗ I trasformatori
hanno, in ogni strato, diverse
teste multiple.
attenzioni personali. A ogni
livello, ogni testa di
autoattenzione sta imparando a
prestare attenzione a una
parte/aspetto specifico della
frase. C'è una grande quantità di
attenzione: il modello a 12 strati ha 12 autoattenzioni multitesta per strato, ognuna delle quali impara a prestare attenzione a
fenomeni specifici.
Come possiamo usare BERT? L'idea è che BERT possa fornire incorporazioni di parole contestualizzate, poi si
possono aggiungere uno o più strati, dopo BERT, per perfezionare BERT per il compito specifico.
● Abbiamo molte possibilità: possiamo usarlo per compiti di classificazione di una singola frase (una volta addestrato,
è possibile inserire una nuova frase e c'è un token specifico aggiunto all'inizio della frase che riceve un vettore
specifico nell'output che può essere utilizzato per classificare l'intera frase), compiti di tagging di una singola frase,
compiti di risposta alle domande, compiti di classificazione di coppie di frasi
L'idea è di avere un blocco fisso che produce il vettore e un blocco addestrabile per specificare i diversi compiti.
Questo è lo stato dell'arte.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Oggi il miglior embedding di frasi è Sentence-BERT, una rete siamese basata su BERT che
viene addestrata esplicitamente con frasi reali di cui sappiamo in anticipo se sono simili o meno: è
una rete addestrata a riconoscere frasi simili.
25 ott. 2022
Risolvere i compiti a valle
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
La quantità di strati del classificatore dipende dal compito (di solito ha 3 strati, ma si può avere una struttura più
complessa a seconda della complessità del compito).
Un insieme di applicazioni specifiche in cui si prende un documento (testo) e lo si deve classificare rispetto a qualche problema.
Alcuni esempi sono: il rilevamento dello spam, la classificazione delle opinioni e l'ascolto dei social media, la
classificazione dei ticket dell'assistenza clienti, la classificazione delle scansioni dei documenti e il riconoscimento degli oggetti
nelle immagini. Il paradigma è sempre lo stesso.
● Sentiment Analysis / Rilevamento della polarità
○ Nell'ambito della sentiment analysis ci sono diversi compiti: innanzitutto bisogna decidere se il
testo sta esprimendo fatti soggettivi o oggettivi: se i fatti sono oggettivi non possono essere
utilizzati per il rilevamento delle opinioni, in quanto non contengono opinioni.
○ Esempio: si deve decidere se un dato testo è positivo, negativo o neutro in generale o rispetto a diversi
aspetti nominati nel testo (si può avere anche una polarità mista); si può decidere di classificare l'intero
testo come misto; sentiment analysis basata sugli aspetti, che classifica ogni aspetto con la sentiment
analysis
○ In queste applicazioni si possono verificare due situazioni
■ Non si dispone di dati sufficienti: la raccolta di dati per la messa a punto del sistema non è
possibile, oppure il set di dati di cui si dispone è così piccolo che non è possibile addestrare in
modo affidabile un sistema di ML su di esso
● Per le lingue meno studiate potreste non avere nulla su cui allenare il vostro sistema!
● Se non si dispone di dati sufficienti per la messa a punto dell'enorme architettura
che si ha a disposizione, si ricorre a soluzioni basate su regole (utilizzare
risorse annotate lessicalmente) ✱
○ Per la Sentiment Analysis si può provare a immaginare una soluzione basata su regole, ma per la
altri compiti è impossibile (ad es. etichettatura dei PoS)
■ Si dispone di dati sufficienti per la messa a punto del trasformatore e si può risolvere con una regolazione fine
Se non si dispone di un corpus annotato per addestrare l'intera architettura, non c'è altra scelta che
utilizzare un sistema basato su regole!
Esempio: Nel 2020, Tamburini ha cercato di applicare in modo blando il fine tuning dei trasformatori a diversi compiti in
italiano; nelle slide possiamo trovare esempi per il rilevamento della soggettività, il rilevamento della polarità, il rilevamento
dell'ironia, il rilevamento dell'hate speech...
iniziale di un'espressione nominativa, token interno di un'espressione nominativa o token esterno di un'espressione
nominativa.
Se si adotta uno schema di classificazione di questo tipo, si ha un compito simile a quello dell'etichettatura PoS, in
quanto ogni token deve ricevere un'etichetta specifica di diverso tipo.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Una volta arrivati i trasformatori, ogni soluzione è stata appiattita su trasformatori di regolazione fine. Al momento non c'è
altro da dire, ma chissà tra 5 anni... � Lo stato dell'arte è rappresentato dai trasformatori di regolazione fine per produrre
qualsiasi tipo di buona soluzione ai compiti di PNL.
Negli ultimi anni è emersa una nuova idea e gli studiosi stanno studiando questa possibilità perché potrebbe essere il
futuro della PNL e, forse, dell'IA. Riassumiamo NLP ML
paradigmi:
Dal 2010 al 2018, abbiamo ancora un paradigma completamente supervisionato, ma con l'utilizzo di NN (abbiamo
potuto utilizzare le GPU e sviluppare DNN, che hanno immediatamente conquistato una posizione predominante rispetto a tutti
gli altri approcci ML). Non abbiamo più avuto la necessità di selezionare le caratteristiche: abbiamo iniziato a usare gli
embeddings di parole (2013), quindi l'ingegneria si è concentrata sull'ideazione di un'architettura appropriata per affrontare il
problema/task specifico. Per quanto riguarda la relazione con il compito, non è cambiato nulla: il modello linguistico era un
compito separato da qualsiasi altro compito. Sono cambiate solo le tecnologie utilizzate per risolvere le applicazioni.
A partire dal 2019 (con l'introduzione del BERT), il paradigma è cambiato radicalmente. Oggi lo stato dell'arte consiste
nell'avere trasformatori pre-addestrati e nel metterli a punto per risolvere compiti specifici. Dal punto di vista ingegneristico,
è sufficiente ottimizzare la fase di pre-addestramento e la connessione tra i diversi compiti è cambiata radicalmente: la
modellazione del linguaggio risolta dal pre-addestramento dei trasformatori diventa il fulcro della soluzione: utilizzando la
modellazione del linguaggio, con una supervisione minima e una messa a punto, possiamo risolvere problemi di
classificazione o di tagging di sequenze.
Diapositiva 6: Esperimento di Tamburini di disambiguazione del senso della parola con il j1-jumbo (178B).
L'ondata successiva è quella basata sul modello linguistico: utilizzando semplicemente il modello linguistico con le
opportune indicazioni, è possibile risolvere qualsiasi compito senza che il sistema di controllo sia in grado di fornire
informazioni.
ulteriori sforzi. La prova è che
se si riesce ad aumentare la
dimensione del modello
linguistico pre-addestrato,
l'architettura è la stessa, si può
semplicemente chiedere e
ottenere la risposta.
❓ Un modello linguistico è un
modello cognitivo? Come fa a conoscere la risposta corretta ad alcune domande?
È un trasformatore: durante l'addestramento viene esposto al linguaggio reale in modo incrementale e può comprendere la
morfologia, la sintassi, la semantica e anche i fatti delle frasi del linguaggio reale. Ci sono studi che cercano di suggerire che la
pesante stratificazione di trasformatori riproduca, alla fine, la nostra struttura cerebrale: se si ingrandiscono questi modelli, si
costruisce qualcosa che assomiglia al cervello umano.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]
Alcuni studiosi ritengono che questo approccio potrebbe essere l'IA del futuro: a patto che si possano addestrare 10 mila
miliardi di modelli, si è iniettata una tale quantità di conoscenza all'interno dell'architettura che forse a quel punto emergerebbe
un qualche tipo di IA.
In ogni caso, lo stato dell'arte è la messa a punto dei trasformatori e non siamo ancora nella nuova ondata.
Informazioni sull'esame: la data dell'esame viene fissata su appuntamento (almeno due settimane prima) e
sarà in presenza, senza eccezioni. È possibile decidere per un esame orale o per un progetto (in questo caso,
inviare la relazione per il progetto almeno sette giorni prima della data fissata).