Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni70 pagine

NLP FullCourse It

Il documento fornisce un'introduzione alla Linguistica Computazionale (PNL), evidenziando la sua natura interdisciplinare che unisce linguistica, informatica, psicologia e altre discipline. Viene discusso il passaggio da approcci empiristi a razionalisti nell'analisi linguistica, con riferimento alle teorie di Chomsky e all'importanza del Machine Learning. Infine, si sottolinea il ruolo fondamentale del calcolo delle probabilità e della raccolta di dati per sviluppare modelli linguistici efficaci.

Caricato da

cesarefinmatica
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni70 pagine

NLP FullCourse It

Il documento fornisce un'introduzione alla Linguistica Computazionale (PNL), evidenziando la sua natura interdisciplinare che unisce linguistica, informatica, psicologia e altre discipline. Viene discusso il passaggio da approcci empiristi a razionalisti nell'analisi linguistica, con riferimento alle teorie di Chomsky e all'importanza del Machine Learning. Infine, si sottolinea il ruolo fondamentale del calcolo delle probabilità e della raccolta di dati per sviluppare modelli linguistici efficaci.

Caricato da

cesarefinmatica
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --

[Link]

19 sett. 2022
Introduzione

❗ Queste diapositive sono uguali a TRAM_11-08-2021

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!

Una panoramica sullo sviluppo della linguistica computazionale


Alla fine della seconda guerra mondiale (1949), durante la quale tutte le migliori menti dell'epoca erano impegnate nella
crittografia, Warren Weaver suggerì che il problema della traduzione automatica poteva essere parafrasato come un problema
di crittografia: abbiamo un testo cifrato e dobbiamo "decifrarlo", traducendolo in un'altra lingua. Questa idea ebbe molto
successo, ma tra la fine degli anni Cinquanta e l'inizio degli anni Sessanta ci si rese conto che il compito non poteva essere
risolto in modo semplice!
Così, a metà degli anni Sessanta fu introdotto per la prima volta il termine "linguistica computazionale", rendendosi conto
che la gestione delle lingue dal punto di vista computazionale riguardava molti compiti diversi, non solo la traduzione. Nel 1962
nacque la cosiddetta ACL, Association for Machine Translation and Computational Linguistics. Nel 1980 viene fondata la
rivista Computational Linguistics.

L'evoluzione delle idee alla base della Linguistica Computazionale


● Anni '40/'50 → dal punto di vista linguistico l'approccio all'analisi del linguaggio era su base empirista
○ L'analisi dei fenomeni è stata effettuata osservando i testi e raccogliendo dati in quei testi reali.
○ Esaminare dati reali per indurre teorie linguistiche che spieghino il fenomeno in esame.
● Fine anni '50 → Noam Chomsky pubblicò la sua tesi di dottorato (1957), che cambiò radicalmente il punto di vista
sull'analisi dei fenomeni linguistici, spostando l'attenzione dai dati reali alla competenza dei parlanti di madrelingua
○ Chomsky ha fortemente contrastato il punto di vista empirista
○ Il linguaggio era visto come un oggetto formale completamente descritto matematicamente e si pensava
che una parte della nostra rete neurale fosse precostituita fin dalla nascita per gestire l'informazione
linguisticaù
○ Chomsky proponeva l'introspezione come strumento di analisi per proporre conclusioni sui fenomeni
○ Chomsky criticava l'uso dei corpora, dei dati per la costruzione di modelli linguistici, a favore della
competenza linguistica: un madrelingua, interrogando la propria competenza linguistica, poteva
rispondere a qualsiasi domanda e creare qualsiasi modello linguistico.
● Con Chomsky si è verificato uno spostamento del punto di vista da un approccio empirista a un approccio razionalista.
○ In questi 40 anni, tutti i sistemi erano basati su regole: un esperto lanciava una lista di regole, e
l'informatico aveva il compito di trasformare questa lista di regole in un sistema computazionale in grado
di risolvere qualche problema (ad esempio, l'analisi sintattica di un testo dato).
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

■ Il passaggio di formalizzazione veniva fatto dall'esperto "elencando le regole" → questa era


un'idea generale all'epoca, anche per l'Intelligenza Artificiale
● Dopo 40 anni di ricerca, negli anni '90 si è assistito a una rinascita dell'approccio neo-empirista.
○ Nel campo dell'IA è stata introdotta una nuova classe di algoritmi, noti come algoritmi di Machine Learning:
una classe di metodi in grado di creare un modello formale osservando i dati in modo autonomo.
○ Oggi ogni sistema viene addestrato fornendogli dei dati, un corpus di dati, in modo appropriato → sia l'IA
che la PNL si basano sul Machine Learning e su una visione empirica (che è anche la nostra posizione
in questo corso: dai dati elaboriamo un modello formale per risolvere un compito specifico).

Razionalismo VS Empirismo → vedi: TRAM_11-08-2021


● Razionalismo
○ Una teoria razionalista è una teoria basata su dati comportamentali artificiali e su giudizi introspettivi consapevoli.
○ Segue un approccio di ragionamento deduttivo
● Empirismo
○ Un approccio empirista al linguaggio è dominato dall'osservazione dei dati che si verificano naturalmente,
tipicamente attraverso il mezzo del corpus ( → il corpus qui sta per una collezione di testi elettronici, dati
reali, testi reali... parleremo di una definizione più precisa più avanti)
○ Segue un approccio di ragionamento induttivo

Competenza → la capacità di un madrelingua di gestire la propria lingua


Performance → qualsiasi atto comunicativo pronunciato

Le critiche di Chomsky all'approccio empirista ... e le possibili risposte


1. La performance è uno specchio povero della competenza: una delle proprietà di qualsiasi NL è quella di essere
produttivamente infinita (possiamo produrre un insieme infinito di frasi) → non è possibile confrontare una cosa
infinita (come la competenza) e una cosa finita (la performance, ad esempio un corpora, che deve essere finito
perché non può essere infinito).
a. ...Ma ad alcuni livelli linguistici, l'osservazione dei dati è l'unica scelta possibile (ad es. fonetica,
acquisizione del linguaggio).
2. La NL è produttivamente infinita: qualsiasi corpus naturale sarà skewed e la frequenza è l'unico parametro per
l'inclusione dei fenomeni.
a. ...Ma le osservazioni basate sul corpus sono intrinsecamente più verificabili dei giudizi introspettivi: sono
oggettive! L'analisi oggettiva dei dati e la discussione sulle teorie sono l'unico modo per fare scienza.
3. Perché dovremmo spendere molto tempo e denaro per costruire un corpus al fine di ottenere la risposta, quando la
mia competenza è in grado di dare la risposta immediatamente?
a. ...Ma se non troviamo un fenomeno in un corpus, questo dice molto sulla sua frequenza: la scarsità
di un fenomeno dice molto sulla sua centralità nell'intero sistema linguistico.
4. Senza ricorrere a giudizi introspettivi (interrogando la competenza), come posso distinguere un fenomeno molto raro
che non fa parte del corpus da un fenomeno che non fa parte del sistema? Come si possono distinguere gli enunciati
sgrammaticati da quelli che semplicemente non si sono ancora verificati? → dal punto di vista della modellazione,
questo è problematico.
a. ...Ma non si potranno mai fornire informazioni affidabili sulla frequenza di un fenomeno attraverso
l'introspezione e senza basarsi su dati reali, anche se il nostro cervello è il più potente motore di gestione
delle informazioni! E la frequenza è il primo dato da raccogliere dai testi per costruire qualsiasi
modello computazionale.

La visione empirista - le fasi


1. Raccogliere un buon insieme di dati testuali (corpus) composto da testi della varietà linguistica che ci interessa studiare
2. Raccogliere tutte le occorrenze del fenomeno che ci interessa (raccogliere tutte le prove)
3. Analizzare le occorrenze per trovare regolarità ed eventualmente elaborare un quadro formale che regoli il
fenomeno esaminato, per descrivere il fenomeno all'interno del corpus.
4. Generalizzare le nostre conclusioni, tratte dall'esame dei dati del corpus, all'intera NL
a. Se il corpus non è buono, non possiamo generalizzare le conclusioni.

La legge di Zipf (1949)


Negli anni '40 c'era uno studioso, George Zipf, che per primo
iniziò a raccogliere informazioni di frequenza dai testi: raccolse un
piccolo corpus (ovviamente, essendo fatto a mano) e misurò la
frequenza di ogni parola in esso contenuta. Poi ordinò la lista di
frequenza in modo decrescente: da un lato abbiamo la frequenza
della parola, dall'altro il rango della parola (la posizione della parola
nella lista).
Esiste una relazione precisa tra la frequenza e il rango: la
frequenza della parola è inversamente proporzionale al rango: la
frequenza va molto rapidamente a uno (un piccolo insieme di parole
è molto frequente, come le parole grammaticali, mentre un grande
insieme di parole è molto raro, come le parole lessicali). Le parole e
le combinazioni di parole più interessanti sono quelle formate dalle
parole lessicali, che costituiscono la spina dorsale di qualsiasi
significato fornito da qualsiasi testo!
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

𝐹 ∝ 1/ 𝑅(∃𝑘, 𝐹 * 𝑅 ≈ 𝑘) In altre parole: la frequenza per rango è più o meno costante.

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).

Ma qual è la definizione classica di "probabilità"?


La definizione classica di probabilità passa attraverso la descrizione di un esperimento (un processo aleatorio) e dei suoi possibili
risultati, che devono essere semplici e reciprocamente esclusivi.
● Ω è lo spazio di campionamento (= tutte le uscite possibili)
○ Definire formalmente la nozione di evento è molto semplice: qualsiasi sottoinsieme dello spazio di
campionamento Ω è un evento → un evento è un sottoinsieme dello spazio di campionamento.
● Possiamo identificare due tipi di eventi
○ Eventi semplici = un insieme contenente un solo risultato semplice dell'esperimento
○ Eventi complessi = sottoinsiemi contenenti più di un possibile risultato semplice
dell'esperimento Considerando il lancio di un dado, l'evento "ottenere un 6" o "ottenere un 2" sono entrambi eventi
semplici (= sono sottoinsiemi
contenente un solo risultato semplice: {6}, {2}). Al contrario, eventi come "ottenere un numero pari" o "ottenere un numero
inferiore a 5" sono eventi complessi (= i sottoinsiemi contengono più di un risultato semplice: {2,4,6}, {1,2,3,4}).

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)

Esempi con il lancio di un dado:


● p("a 5") → 𝑝({5}) = 1/6
● p("un numero pari") → 𝑝({2, 4, 6}) = 3/6 = 1/2
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

● p("un numero inferiore a 5") → 𝑝({1, 2, 3, 4}) = 4/6 = 2/3

Naturalmente, questa definizione ha alcune proprietà:


● La probabilità di un certo evento è 1 → 𝑝(Ω) = 1
● 𝑝({}) = 0
● 𝑝(𝐴∪𝐵) = 𝑝(𝐴) + 𝑝(𝐵) → se A e B sono disgiunti!

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)

Abbiamo due casi possibili:


1. La probabilità a posteriori è uguale alla probabilità a priori → A e B sono indipendenti
○ 𝑝(𝐴|𝐵) = 𝑝(𝐴) B non influenza p(A)
2. Le due probabilità sono diverse (questo è molto comune quando si tratta di sequenze di parole)

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).

Teorema di Bayes e inversione bayesiana


Dalla definizione di probabilità condizionata possiamo dedurre il teorema di Bayes e l'inversione bayesiana.
𝑝(𝐴|𝐵) ∗ 𝑝(𝐵) = 𝑝(𝐴, 𝐵 = 𝑝(𝐵|𝐴) ∗ 𝑝( 𝐴)𝑝(𝐴|𝐵) = 𝑝(𝐵|𝐴)∗𝑝(𝐴)
𝑝(𝐵)

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 𝑝(𝐵|𝐴).

Stima della frequenza e della probabilità


Nei corsi standard di probabilità gli esempi si basano su monete, dadi (e la definizione classica di probabilità funziona
abbastanza bene in questi casi)... Ma come possiamo calcolare la probabilità di alcune parole? Non possiamo, perché
l'assunto di base della definizione classica di probabilità è che gli eventi semplici sono tutti ugualmente probabili, e in questo
caso ciò è falso (alcune parole hanno più probabilità di essere usate di altre...).
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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

I nostri esperimenti non sono un "lancio di dadi",


ma una "raccolta di dati da corpora di testi reali"!
Anche in questo caso, abbiamo bisogno di
costruire grandi corpora. Ma poi c'è la legge di Zipf,
e anche se si costruiscono corpora molto ampi
Se abbiamo un corpus di 100MW e troviamo solo 3 occorrenze di una determinata parola, significa che si tratta di una parola
molto improbabile. Trasformiamo una misura di frequenza in un'asserzione teorica.
I corpora sono la fonte primaria dei nostri esperimenti e grazie ad essi possiamo misurare la frequenza dei fenomeni,
quindi, attraverso una stima, possiamo stimare la probabilità di quei fenomeni linguistici e possiamo costruire un modello
teorico utilizzando la probabilità (stimata dai dati).
● Quando iniziamo a misurare le cooccorrenze delle parole, la frequenza di ottenere entrambe le parole o tre parole
è molto inferiore a quella di ottenere la singola parola: diminuisce in modo esponenziale.
○ Anche se abbiamo una parola molto frequente e misuriamo la co-occorrenza con un'altra parola molto
frequente, la co-occorrenza è molto rara.
Affermando che un fenomeno è al di fuori di un sistema linguistico, stiamo dicendo che quel fenomeno non può verificarsi:
è un'affermazione molto forte!

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.

Per gestire questo problema abbiamo due possibilità


1. Possiamo adottare una stima non parametrica: approssimare 𝑝(𝐴) con 𝑓 (𝐴)
𝑟
○ 𝑝(𝐴) = 0 è un grosso problema e una soluzione potrebbe essere rappresentata dalle tecniche di smoothing.
■ Dipende dal compito che dobbiamo risolvere; in generale possiamo pensare di sostituire ogni
probabilità pari a 0 con valori molto piccoli, più piccoli di tutte le altre probabilità dedotte dai dati,
in modo che non abbiano alcuna influenza su di esse e non le riducano a 0.
2. Possiamo adottare un approccio completamente diverso e imporre la stima parametrica
○ Per evitare completamente questo problema, possiamo decidere di sapere in anticipo o imporre che la
distribuzione di probabilità avrà una forma molto specifica (ad esempio, distribuzioni binomiali,
multinomiali, gaussiane...) e stimare solo i parametri della distribuzione (che dipendono dalla
distribuzione che ho imposto)
○ Ma come possiamo imporre la distribuzione di probabilità per ciò che riguarda le parole? Welp!
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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.

Modelli linguistici a N-grammi

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

Come possiamo stimare qualsiasi elemento di questo prodotto iterato?


Può essere stimata utilizzando la frequenza relativa.

𝑝(𝑤 , ..., 𝑤 ) 𝑓(𝑤 , ..., 𝑤 )/𝑁 𝑓(𝑤 , ..., 𝑤 )


𝑝(𝑤 |𝑤 , ..., 𝑤 )= 1 𝑖
= 1 𝑖
= 1 𝑖
𝑖 1 𝑖-1 𝑝(𝑤 , ..., 𝑤 ) 𝑓(𝑤 , ...,𝑤 )/𝑁 𝑓(𝑤 , ..., 𝑤 )
1 𝑖-1 1 𝑖-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.

In un modello di Markov semplice, l'uscita è detta


visibile ed è rappresentata dalla sequenza di stati toccati
nella navigazione della rete. La probabilità di attraversare
una data sequenza di stati può essere facilmente calcolata
come abbiamo appena fatto con la precedente macchina di
Markov semplice.
𝑃(𝑋 , 𝑋 , ..., 𝑋 ) = 𝑃(𝑋 ) - 𝑃(𝑋 |𝑋 ) - 𝑃(𝑋 | 𝑋 , 𝑋 ) - ... - 𝑃(𝑋 | 𝑋 , ..., 𝑋 - 1) =
1 2 𝑇 12 13 1 2𝑇 1 𝑇
= 𝑃(𝑋 ) - 𝑃(𝑋 |𝑋 ) - 𝑃(𝑋 | 𝑋 ) - ... - 𝑃(𝑋 | 𝑋 - 1) =
12 13 2𝑇 𝑇
𝑇-1
=π ∑ 𝑎
𝑥1 𝑋𝑡-1,𝑋𝑡
𝑡=1

Modelli di Markov nascosti (HMM)


La sequenza di stati è nascosta, conosciamo solo la sequenza di uscita e dobbiamo scoprire la migliore sequenza di
stati che ha la probabilità di generare tale sequenza di uscita.
A noi interessa un modello molto più complesso: l'HMM. Arricchiamo il modello, che rimane lo stesso, ma con un
particolare: ora, quando arriviamo in uno stato la macchina emette un simbolo.
● Ora abbiamo due sequenze: la sequenza degli stati visitati, esattamente come prima, e la sequenza dei
simboli di uscita; entrambe le sequenze, ovviamente, hanno la stessa lunghezza.
Il nuovo modello è più o meno uguale a quello precedente per:
● L'insieme degli stati è uno stato finito
○ 𝑆 = {𝑠1, 𝑠2, ..., 𝑠𝑁 }
● La matrice di transizione da uno stato all'altro è esattamente la stessa
○ 𝐴 = [𝑎𝑖𝑗]
● Il vettore di probabilità iniziale π è esattamente lo stesso di prima
○ Π = [π𝑖]
● ❗ Ma ora abbiamo un insieme finito di possibili simboli di uscita
○ 𝑉 = {𝑣1, 𝑣2, ..., 𝑣𝑀 }
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

● Abbiamo anche la matrice di emissione dei simboli 𝐵 = [𝑏 ]


𝑖𝑘
○ In ciascuno dei suoi elementi, abbiamo la probabilità di emettere un simbolo specifico, dato lo stato
○ Naturalmente, la somma delle probabilità di emettere un insieme di simboli è una (1)
○ 𝑏 = 𝑃(𝑂 = 𝑣 | 𝑋 = 𝑠 ) Σ𝑏=1
𝑖𝑘 𝑡 𝑘 𝑡 𝑖 𝑘 𝑖𝑘
Abbiamo una nuova ipotesi di indipendenza: che la probabilità di arrivare in uno stato dipenda solo da quello precedente
(potrebbe dipendere dai 2 o 3 precedenti, ma non ci interessa). La nuova ipotesi di indipendenza è che la probabilità
congiunta di emettere un simbolo da un dato stato dipende solo dallo stato corrente e dalla distribuzione di probabilità di
emettere un simbolo in quello stato. Ciò significa che ogni stato contiene una distribuzione di probabilità di emissione dell'intero
vocabolario di simboli
● 𝑃(𝑠 , 𝑣 ) = 𝑃(𝑋 = 𝑠 ) - 𝑃(𝑂 = 𝑣 | 𝑋 = 𝑠 )
𝑖 𝑘 𝑡 𝑖 𝑡 𝑘 𝑡𝑖

Possiamo visualizzare un HMM in due modi diversi:


1. Possiamo dispiegare l'HMM nel tempo
a. Decidiamo prima il primo stato della sequenza e dal
primo stato possiamo emettere il primo simbolo, poi
passiamo al secondo stato ed emettiamo il secondo
simbolo e così via...
2. Come stati e connessioni
a. Ora ogni stato ha una distribuzione di probabilità
per l'emissione di uno dei simboli di uscita

Possiamo usare gli HMM come generatori di sequenze di simboli, ma


in genere non ci interessa generare tali sequenze rispettando la
distribuzione di probabilità, siamo più interessati ad altri tipi di operazioni,
soprattutto in NLP. Salteremo quindi questa diapositiva.

I problemi fondamentali per gli HMM sono tre


1. Valutazione
○ Data una sequenza di osservazioni (𝑂 = (𝑂 , 𝑂 , ..., 𝑂 )) e un HMM (che possiamo modellare fornendo A,B
1 2 𝑇
e strutture π: λ = (𝐴, 𝐵, Π)), come possiamo calcolare ufficialmente la probabilità di ottenere questa
sequenza dato il modello?
○ Esiste una soluzione efficiente, chiamata algoritmo della procedura di avanzamento.
2. Riconoscimento
○ Data una sequenza di osservazioni (𝑂 = (𝑂 , 𝑂 , ..., 𝑂 )) e un modello HMM (λ = (𝐴, 𝐵, Π)), si vorrebbe
1 2 𝑇
di scegliere la sequenza di stati (𝑋 = (𝑠 , 𝑠 , ..., 𝑠 )) che, in un certo senso, è ottimale (= che hanno la
12 𝑇
massima probabilità di aver generato tale sequenza)
○ In linea di principio, potremmo usare un algoritmo simile a quello precedente, ma non è affatto efficiente:
potremmo elencare tutte le possibili sequenze di stato, per ogni sequenza calcolare la probabilità di
generare tale sequenza di osservazione e tenere la migliore... questo è molto inefficiente, quello
efficiente è chiamato algoritmo di Viterbi
3. Formazione
○ Nei primi due problemi, assumiamo di avere un HMM e tutte le probabilità, ma potremmo non avere nulla!
Quindi abbiamo bisogno di qualcosa da impostare, da addestrare, e questo potrebbe essere considerato,
in una certa misura, un metodo di apprendimento automatico.
○ Abbiamo bisogno di un modo che, data una sequenza di osservazioni (𝑂 = (𝑂 , 𝑂 , ..., 𝑂 )), permetta di regolare i
parametri
1 2 𝑇
del modello di Markov (λ = (𝐴, 𝐵, Π)) per massimizzare la probabilità di ottenere tale osservazione →
Dobbiamo massimizzare una funzione: 𝑃(𝑂|λ)
○ Abbiamo un algoritmo iterativo: la procedura Forward/Back (Baum/Welch).
■ ❗ Attenzione: questo semplice algoritmo non può saltare i massimi locali e, a seconda del
punto di partenza casuale, si fermerà lì anche se non è il massimo effettivo della
probabilità!

Potete saltare le diapositive che spiegano tutte queste procedure per risolvere i tre problemi di base.

Uso tipico di HMM


Gli HMM sono solitamente utilizzati per risolvere problemi in cui i dati sono rappresentati dalla sequenza di simboli di
uscita O e le incognite sono rappresentate dalla sequenza di stati X. Dobbiamo rimappare queste due sequenze e poi
possiamo utilizzare, per una sequenza di simboli di uscita, l'algoritmo di Viterbi per raccogliere la sequenza di stati.
● Parte del problema del tagging del parlato: abbiamo una sequenza di parole a cui dobbiamo assegnare
un'etichetta unica che rappresenti la categoria grammaticale: come possiamo riformulare il nostro problema (che
è un problema di sequenze)?
○ Le parole sono la sequenza di osservazione O, perché sono i miei dati.
○ Per una data sequenza di parole, possiamo usare il modello per trovare la migliore sequenza di
stati/etichette X, la sequenza di etichette che ha la più alta probabilità di essere assegnata alla
sequenza di parole
Se posso rimappare il mio problema reale con l'osservazione di simboli di uscita e sequenze di stati, allora possiamo usare
l'algoritmo di Viterbi e trovare la migliore sequenza di stati che genera la sequenza di osservazione.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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.

Dove possiamo trovare i nostri dati?


Possiamo raccogliere i dati in un'infinità di modalità diverse; per noi i dati vengono estratti dai corpora, che sono la nostra
fonte primaria di dati per l'addestramento dei sistemi di apprendimento automatico.

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.

Apprendimento supervisionato e applicazioni


Con i sistemi di ML supervisionati, dobbiamo fornire un corpus di dati annotati: se vogliamo creare un sistema
automatico di PoS, dobbiamo fornire un corpus annotato con PoS, se voglio un'analisi sintattica, devo fornire un corpus con
struttura sintattica annotata...
● La possibilità di ottenere un numero sufficientemente elevato di istanze rappresentative della funzione target
determina se l'apprendimento supervisionato è un metodo di apprendimento automatico appropriato per
un'applicazione.
Questo corpus che forniamo è chiamato insieme di addestramento e i valori delle istanze sono solitamente definiti
attraverso l'annotazione manuale.
L'apprendimento supervisionato viene solitamente impiegato in compiti di classificazione (otteniamo un'istanza di un
problema e la classifichiamo in classi di categorie (≠ compiti di regressione, che sono marginali)).
1. Prima di tutto, dobbiamo definire le nostre istanze di dati → ogni istanza è un vettore di caratteristiche linguistiche
○ Ogni sistema ML pretende che i dati in ingresso siano formalizzati come vettori numerici
○ Il primo passo consiste nel ricodificare le istanze di dati come un vettore di numeri
○ L'insieme di addestramento è un insieme di istanze del problema che il sistema deve imparare a risolvere.

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 𝑛

● ❗ Un vettore di qualsiasi dimensione rappresenta un punto in uno spazio n-dimensionale.


Abbiamo molti punti con molti vettori diversi. A ogni vettore/istanza del nostro problema è associata una classe specifica
con esso.
𝑑1 → 0
𝑑2 → 1
𝑑3 → 1
...
𝑑𝑚 → 0

Passiamo a uno spazio bidimensionale, in modo che sia più semplice.


Ogni compito che un sistema ML deve svolgere è quello di determinare un separatore tra le due classi (supponendo
di iniziare con un separatore casuale). Minimizzando l'errore, ogni sistema ML cerca di adattare il separatore in modo da
ridurre l'errore (rispetto al set di addestramento). Dopo alcuni tentativi ed errori, le due classi sono perfettamente separate: le
prestazioni di classificazione di questo sistema ML sul set di addestramento sono perfette, al 100%!
Il sistema viene addestrato, il modello formale viene appreso per risolvere il problema. Essere in grado di classificare le
istanze in modo appropriato significa che i sistemi di apprendimento automatico sanno come risolvere il problema. Il
separatore è il modello appreso, il modello formale, che posso utilizzare con nuovi dati, nuove istanze.
Ciò significa che a un certo punto, quando dobbiamo classificare una nuova istanza, la mettiamo sul piano e chiediamo al
sistema di classificarla (è 1 o 0). Dato il separatore, lo classificherà come "croce" (1) (perché si trova nella parte del piano delle
croci).

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

Sistemi di apprendimento automatico supervisionati


La potenza del sistema ML è dimostrata dal tipo di proiettore che è in grado di mostrare nello spazio n-
dimensionale: alcuni sistemi ML possono mostrare solo un separatore lineare (come i classificatori Naive Bayes) e non sono
così potenti, come i sistemi lineari.
separatore non si adatta molto bene alle classi due/n, che possono sovrapporsi o avere forme diverse).

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.

Macchine vettoriali di supporto (SVM)


È stato il sistema di ML di maggior successo (prima delle Reti Neurali Profonde)!
Questo sistema di ML è stato molto utile per risolvere i problemi, in quanto è molto
flessibile e veloce durante l'addestramento ed è in grado di fornire risultati affidabili
e solidi. Se si dispone di pochi dati per addestrare i sistemi di ML, forse SVM è una
scelta migliore rispetto alle DNN (poiché le DNN richiedono un'elevata quantità di dati
per essere addestrate correttamente).
Non vedremo i dettagli di questo sistema/tecnica di ML, ma solo le basi:
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

● 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.

Come funzionano i sistemi di apprendimento automatico supervisionato?


1. Forniamo alcuni esempi di algoritmo di apprendimento (l'algoritmo utilizzato per l'addestramento) → abbiamo una
fase di addestramento che impiega l'algoritmo di apprendimento sul set di...
2. ...Un modello formale che possiamo usare...
3. ...Quando abbiamo nuove istanze di dati (abbiamo solo l'istanza e non conosciamo la classe corretta) e chiediamo
all'algoritmo di etichettatura di fornire la classe (= chiediamo al sistema automatico di eseguire il processo di
classificazione)

Sistemi di apprendimento automatico non supervisionati


Nell'apprendimento supervisionato dobbiamo fornire i dati contenenti la soluzione corretta per ogni compito (la tendenza
generale è: più dati forniamo, meglio è). Nei sistemi di ML non supervisionati, non abbiamo alcuna annotazione, alcuna
indicazione sulla soluzione corretta: non avendo alcuna indicazione, non possiamo nemmeno definire un compito, abbiamo
semplicemente un insieme di dati e l'unica operazione che un sistema di ML classico può fare con i dati non supervisionati
(= testo grezzo, per noi), è semplicemente l'implementazione di algoritmi di clustering (= un tipo di algoritmi che sono in
grado di prendere istanze del vostro problema e raggruppare istanze simili tra loro).
L'unico compito che i classici sistemi di ML non supervisionati (≠ DNN) possono risolvere è quello di rivelare i raggruppamenti naturali nei
dati.
attraverso l'uso di algoritmi di clustering.

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).

Introduzione all'apprendimento neurale profondo

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]

○ Si tratta della sostituzione classica del passo binario


● Funzione iperbolica
○ Si tratta della sostituzione classica del passo binario
Oggi alcuni studiosi hanno introdotto diversi tipi di funzioni di attivazione, che in alcuni casi possono
essere migliori (ma non ci soffermeremo a descriverle): la ReLU (Rectified Linear Unit) e la GELU
(Gaussian Error Linear Unit).
Abbiamo ora completato la descrizione matematica del nostro neurone artificiale, imitando in modo
molto bello e preciso le funzionalità del neurone biologico (funzionano più o meno allo stesso modo!).

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

1. Percettori multistrato (rete feed-forward) - MLP


Come minimo la MLP ha uno strato di input che riceve tanti input quante sono le dimensioni della nostra istanza
(ricordate: abbiamo ancora la nostra istanza del problema formalizzata come un vettore, e forse abbiamo anche la classe,
l'output corretto per classificare l'istanza → Le DNN sono sempre un
sistema ML supervisionato), sullo strato di uscita
abbiamo le classi corrispondenti.
● In ingresso abbiamo un
neurone per ogni caratteristica
● In uscita abbiamo un neurone
per ciascuna classe in cui
dobbiamo classificare i valori in
ingresso
L'input e l'output sono definiti dal mio
problema: non dobbiamo fare nulla di più.
→ dato il mio problema, abbiamo la definizione
di ingresso e di uscita.
● Al centro si possono collocare 0
o più strati nascosti (nascosti =
senza strato di ingresso né di
uscita).
La MLP è quindi un'architettura organizzata
in strati: ogni neurone di un dato strato è
collegato a tutti gli altri neuroni del livello.
strato precedente e dello strato successivo, senza eccezioni. Se il peso della connessione diventa 0, i livelli non sono più
connessi, ma questo non è il nostro problema.
Ogni connessione ha un peso che simula la sinapsi che modula l'uscita di un neurone prima di arrivare all'ingresso del
neurone successivo. Un dato neurone si comporta esattamente come descritto in precedenza: raccoglie tutte le uscite di
ogni neurone dello strato precedente, le somma ponderandole con il peso corrispondente e se questa somma è
superiore a una determinata soglia le invia in avanti. Tutti i neuroni si comportano allo stesso modo, tranne i neuroni di
ingresso, che sono messi lì solo per visualizzare qualcosa e che raccolgono semplicemente gli ingressi.

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).

❓ Come si può calcolare l'errore?


-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

È 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.

L'apprendimento è una procedura di minimizzazione degli errori (utilizzando l'algoritmo di retropropagazione).

Retropropagazione su grafici computazionali


...Al giorno d'oggi abbiamo ideato molte architetture diverse, molto più profonde delle MLP. La necessità di calcolare
l'algoritmo di backpropagation per modelli così complicati ci metteva in difficoltà, ma possiamo calcolare la backpropagation
su grafi computazionali, una tecnologia chiave di ogni struttura NN.
L'idea alla base del grafo computazionale è che qualsiasi tipo di espressione matematica può essere vista come un
DAG (Directed Acyclic Graph, dove i nodi rappresentano operazioni matematiche e gli spigoli sono etichettati con variabili o
valori). Scorrendo il grafo in questo modo, siamo in grado di calcolare l'uscita/risultato p (l'equivalente del mio errore), ma
abbiamo bisogno di una procedura per retropropagare l'errore e utilizzare la derivata parziale di p per modificare le tre
variabili che minimizzano l'errore.
● L'idea è che la derivata parziale di p su p sia 1, quindi è possibile calcolare la derivata parziale di p su x e su z →
quindi, è possibile retropropagare la derivata parziale dividendola nuovamente nella derivata parziale di p su x e su y
Questa procedura può essere utilizzata per calcolare i gradienti in modo iterativo (il gradiente è la derivata parziale dell'errore).

𝑝 = (𝑥 + 𝑦) ∗ 𝑧

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.

2. Reti neurali convoluzionali - CNN


Questo è il secondo tipo di architettura di base che esamineremo. L'idea alla base di queste architetture deriva dal modo in
cui i sistemi neurali dietro gli occhi degli animali elaborano le informazioni, quindi sono state utilizzate principalmente per
l'elaborazione delle immagini, ma possono essere utilizzate anche per lavorare sui testi.
Operazione di convoluzione
Quando parliamo di immagini (rappresentate
come matrici di valori), possiamo applicare un
operatore di convoluzione (un kernel o filtro molto
piccolo) all'intera immagine in questo modo:
possiamo iniziare applicando il kernel in un
punto definito (= questo significa che
moltiplichiamo ogni cella del kernel con ogni cella
corrispondente nell'immagine) e
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

e sommare i risultati. Questa operazione matematica produrrà un unico valore.


● L'applicazione del filtro a questo pezzo della matrice/immagine originale produce come risultato un singolo valore
Quindi si sposta il kernel di uno o più posti e si applica la stessa operazione, ottenendo un altro valore. E poi inseriamo
questo valore nell'output finale nella sua posizione. Poi spostiamo il filtro ancora e ancora... per l'intera immagine.
I kernel/filtri sono il cuore della NN convoluzionale, in quanto sono in grado di applicare un'operazione a un'intera
immagine ottenendo un'altra immagine che non è più un'immagine ma una mappa di caratteristiche → trasformano la
matrice originale con cui rappresentiamo l'immagine in una mappa di caratteristiche.
Questa è l'operazione di base, ma nella CNN vengono introdotti decine di filtri diversi, ognuno dei quali applica
esattamente la stessa operazione convolutiva. Qual è la differenza tra i filtri? I valori dei filtri sono i parametri delle reti
neurali convoluzionali che dobbiamo impostare durante il processo di addestramento. I filtri adattano il loro comportamento
durante la fase di addestramento.

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.

Se partiamo da un'immagine, il primo strato di convoluzione


estrae caratteristiche di basso livello (caratteristiche grafiche quando
si lavora con le immagini: linee con colori diversi, bordi tra i colori,
piccoli cerchi... configurazioni geometriche molto semplici
nell'immagine), il secondo strato di convoluzione (applicato al primo)
estrae caratteristiche di medio livello (caratteristiche e forme più
complesse) e così via. L'idea è che ogni strato convolutivo sia in
grado di astrarre un po' dalle informazioni originali, creando una
rappresentazione più astratta dell'immagine e riuscendo a
riconoscere diversi tipi di complessità nell'immagine originale. È una
sorta di elaborazione delle caratteristiche, un diverso livello di
astrazione. Alla fine del processo è necessario aggiungere un
classificatore addestrabile di qualsiasi tipo (tipicamente un
classificatore MLP, ma potrebbe anche essere uno più complesso, a
seconda del compito da risolvere) per risolvere un compito
specifico.

❓ Come impara? Il meccanismo è esattamente lo stesso di prima.


Presentiamo un'immagine, la rete propaga l'output e l'ultimo livello è un
che classifica l'immagine in una delle n classi possibili. All'inizio la rete commetterà
sicuramente molti errori, per cui si procede al backpropagate dell'errore. I pesi, in
questo caso, sono i valori dei kernel (che sono piccoli rispetto all'immagine e
possono muoversi sull'immagine). A ogni trasformazione si ottiene una
rappresentazione più astratta dell'input originale, quindi ogni kernel alla fine
dell'addestramento sarà specializzato nel riconoscimento di alcune configurazioni
specifiche nell'input (nel caso di un input visivo si tratta di figure geometriche; nel
caso di un input testuale si tratta di essere in grado di riconoscere correlazioni tra
fenomeni linguistici).
● Possiamo applicare la CNN anche ai testi (funziona trasformando le
parole in embeddings/vettori).
○ Se si suppone di poter associare un vettore di caratteristiche
a ogni parola, se si impilano i vettori per tutte le parole di una
frase
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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.

3. Reti neurali ricorrenti - RNN


Questa è l'architettura di RNA più appropriata per gestire i fenomeni linguistici, in quanto gestisce
sequenze di dati.
La struttura è semplice ma molto potente. Abbiamo tre elementi:
● Uno strato di ingresso x
● Uno strato di uscita o
● Uno o più strati nascosti h
Abbiamo una connessione loop-back che rappresenta l'uscita dello strato nascosto insieme all'ingresso per il
passaggio successivo. In questo caso, la tempistica è importante e la RNN lavora passo dopo passo. In un
determinato punto dell'elaborazione della sequenza lineare, lo strato nascosto riceve due tipi di informazioni:
l'input della sequenza in quel momento e l'output dello strato nascosto al passo precedente.
La stessa architettura può essere rappresentata dispiegandola nel tempo (vedi immagine a destra). A partire
dal secondo passo, ogni passo viene elaborato e l'output corrispondente è
prodotto utilizzando l'ingresso corrispondente della sequenza e l'uscita
precedente dello strato nascosto.
L'addestramento è esattamente lo stesso: per ogni sequenza di dati,
una volta elaborata interamente, producono un output che può essere
confrontato con quello corretto e quindi retropropagato in tutta la rete. Ciò
che viene ottimizzato dipende dal compito.

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

Il problema viene risolto con RNN bidirezionali: utilizziamo due RNN


1. Uno è organizzato come il precedente: segue la sequenza e, ad ogni istante,
produce un output guardando al passato
2. L'altra lavora in parallelo sulla stessa sequenza, ma in ordine invertito (la
sequenza di input viene presentata in forma invertita → si tratta di un semplice
riarrangiamento della sequenza di input) → la RNN guarda al passato che è, in realtà,
il futuro
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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.

Abbiamo trovato la configurazione ideale per DNN che


risolve tutti i nostri problemi? No. RIP.
In linea di principio, questa architettura di codificatore-
decodificatore è molto adatta per l'NLP, ma in pratica non è
così.
● Il punto intermedio tra il codificatore e il
decodificatore è un grave collo di bottiglia:
tutte le informazioni della sequenza in ingresso
devono essere compresse in un unico valore
○ Sì, è possibile ingrandire il vettore,
ma il vettore è lo stato nascosto del
codificatore e ingrandirlo significa
ingrandire lo stato nascosto del
codificatore e avere tempi di
addestramento molto grandi (le
operazioni non possono essere
parallelizzate, è necessario attendere
tutte le operazioni di addestramento).
precedenti per calcolare un passo) → non è possibile beneficiare delle GPU
○ Questo è un problema di costruzione, per definizione
● È possibile utilizzare solo corpora di addestramento molto piccoli: un corpus di addestramento di
grandi dimensioni significherebbe aspettare settimane per completare l'addestramento dell'intera rete.
In ogni caso, hanno ancora problemi nell'apprendere le dipendenze a lungo termine.
● Poiché l'allargamento del lato nascosto è l'unico parametro controllabile per dare potenza alla rete, se lo si mantiene
piccolo si hanno fasi di addestramento molto rapide ma poche capacità di memoria (la rete dimenticherà gli stati
passati della sequenza molto rapidamente: si perdono le dipendenze a lungo termine), se lo si allarga la rete ricorda
più informazioni ma si paga con tempi di addestramento più lunghi.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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.

Esempio: traduzione dal russo all'inglese

Si può intendere l'attenzione come un recupero di chiavi in un database, in cui si


hanno diversi valori collegati a diverse chiavi. Si fa una query e si vogliono recuperare tutti i
valori
valori corrispondenti alla chiave che corrisponde alla query. Si dispone di una funzione di
somiglianza che confronta la query con la chiave, fornisce un punteggio di somiglianza e quindi
si utilizza questo punteggio di somiglianza (peso dell'attenzione) per pesare il contributo di
ciascun valore nel calcolo dell'attenzione finale (diapositiva 18).

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.

Rimuovendo tutte le informazioni non utili, il


trasformatore è una pila di codificatori e una pila di
decodificatori e realizza la trasformazione dell'ingresso
in uscita. Questa è la proposta iniziale di Vaswani et al. nel
2017, ma quasi subito si è deciso di utilizzare solo lo stack di
codificatori O solo lo stack di decodificatori. L'architettura
proposta è stata immediatamente interrotta e nessuno ha
utilizzato il trasformatore nella sua configurazione completa.
Subito dopo la proposta originale, sono state ideate
molte altre architetture (leggermente diverse tra loro). Nel
mezzo, qualcuno (il più importante è il T5) utilizza ancora
l'intera architettura a trasformatori.
Subito dopo questo articolo, sono state
introdotte due architetture molto famose:
- BERT, utilizzando solo la pila di codificatori per
creare la rappresentazione astratta dell'ingresso.
- GPT, utilizzando solo lo stack del
decodificatore per la generazione dei testi
-E' in grado di generare un'immagine perfettamente ragionevole
testi dati un input (una volta addestrato su insiemi molto grandi di testi in modo supervisionato)

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

Come valutare un sistema NLP?


Prima di tutto, dobbiamo prendere una decisione preliminare: vogliamo valutare il nostro sistema in modo estrinseco o
intrinseco?
● Misura intrinseca → stiamo semplicemente confrontando il nostro sistema con altri sistemi dello stesso tipo
(confrontando l'output)
○ Si tratta di metodi che giudicano la qualità dei risultati del sistema attraverso analisi dirette in termini di un
insieme di norme (risultati corretti): il sistema è in accordo con esempi pre-giudicati (ad esempio un corpus
annotato usato come benchmark)?
○ In questo caso, la valutazione può essere automatizzata!
● Misura estrinseca → inseriamo il nostro sistema in un altro sistema più grande che esegue un compito più grande
e valutiamo l'intero sistema.
○ Si tratta di una valutazione che valuta la qualità dei risultati del sistema in modo indiretto,
incorporando il sistema NLP nelle attività a valle e misurando i miglioramenti.
○ Ad esempio, verifichiamo se le prestazioni migliorano sostituendo un vecchio sistema con un altro più recente.

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

Da un lato abbiamo la corretta classificazione


fornite dall'uomo, dall'altro lato abbiamo la classificazione automatica proposta dal sistema. Questo genera quattro possibili
combinazioni:
● Buone classificazioni
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

○ Vero negativo (TN) → il sistema classifica correttamente 0 → rifiuto corretto


○ Vero positivo (TP) → il sistema classifica correttamente 1 → rilevamento corretto
● Errori
○ Falso positivo (FP) → il sistema produce un 1 invece di uno 0 → linguistica: inserzioni
■ In ingegneria si usa una terminologia diversa: falsi allarmi.
○ Falso negativo (FN) → il sistema produce uno 0 invece di un 1 → linguistica: cancellazioni
■ In ingegneria si usa una terminologia diversa: mancati rilevamenti.

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

6. Curva ROC (curva caratteristica operativa del ricevitore)


○ Questa misura si trova maggiormente nel campo dell'ingegneria: si tratta di un grafico che pone il tasso
di FP sull'asse delle ascisse e il tasso di TP sull'asse delle ordinate.
■ Dato che è chiaro che,
regolando gli iperparametri
del sistema ML, si può
variare la decisione, si può
variare il numero di FN e
FP (e tipicamente sono uno
contro l'altro); l'idea è
quella di costruire una
curva in cui si varia il tasso
di FP misurare il tasso di
veri positivi e mettere dei
punti sul grafico →
interpolando questi punti si
ha la curva ROC
○ Più alta è la curva, migliore è il sistema
(vedi: la posizione del classificatore
perfetto)
○ L'area sotto questa curva è l'AUC (Area Under the ROC Curve) → più è grande, meglio è!
■ Quest'area è in grado di fornire una visione d'insieme, una misura aggregata, del mio
sistema rispetto a qualsiasi possibile impostazione degli iperparametri: è una misura che
non dipende dall'insidiosa impostazione degli iperparametri che sono in grado di
effettuare.
■ Si tratta, in linea di principio, di un sistema strutturalmente migliore, non complicato dalle
impostazioni degli iperparametri, in quanto esploriamo ogni possibile configurazione che dia
ogni possibile risultato.

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

❗ Queste diapositive sono uguali a TRAM_11-09-2021

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].

Annotazione del corpus


Si tratta di un argomento molto importante per noi, poiché i corpora annotati sono molto preziosi. L'annotazione del
corpus è la pratica di aggiungere informazioni linguistiche interpretative a un corpus [Leech, 2005]. Stiamo aggiungendo
informazioni e rendendo esplicita, interpretabile ed esplorabile dal computer la struttura linguistica implicita di un
testo [LMP, 2005].
Perché dovremmo dedicare molto tempo all'annotazione di un corpus?
Innanzitutto, l'esplicitazione delle informazioni ci fornisce una risorsa linguistica, in linea di principio, e questo, dal punto
di vista linguistico, è meglio! Inoltre, permette alla linguistica di esplorare il corpus in modo più specifico: possiamo
interrogare il corpus non semplicemente cercando parole o combinazioni di parole, ma possiamo anche cercare annotazioni e
combinazioni di annotazioni o di annotazioni e parole. Il linguista è in grado di recuperare i dati in modo più complesso!
Infine, un corpus annotato ci permette di addestrare qualsiasi sistema di ML per imparare a risolvere automaticamente lo stesso
compito.

Esistono due macro categorie di annotazioni:


1. Annotazioni extra-testuali (metadati del documento): autore, tipo, fonte, titolo, data di pubblicazione...
2. annotazioni testuali (linguistiche): relative al testo, possono riferirsi a qualsiasi livello di analisi linguistica (PoS,
lemmatizzazione, strutture sintattiche...)
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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.

Linee guida per l'annotazione linguistica


1. L'annotazione deve essere separabile
○ Quando si inseriscono le annotazioni bisogna essere sicuri di non corrompere il testo originale (al giorno
d'oggi con l'XML questo non è un compito problematico).
2. Dovrebbe essere fornita una documentazione dettagliata ed esplicita (quale teoria linguistica, come si è svolta
l'annotazione, qual è l'accordo interumano...).
3. Le pratiche di annotazione dovrebbero essere linguisticamente consensuali.

❗ 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

❗ Queste diapositive sono uguali a TRAM_11-12-2021

Le tre operazioni di base per l'estrazione dei dati dai corpora


1. Estrazione delle concordanze
○ Una concordanza è un'istanza di lingua in uso, un esempio di fenomeno linguistico recuperato
all'interno del mio grande corpus (ad esempio la parola "contratto", che è il nodo, messo al centro e
visualizzato all'interno di un frammento di co-testo).
○ Il nodo (= la parola) è collocato all'interno di un co-testo, che può essere ordinato in base alla prima
parola a sinistra o a destra, il che consente ai linguisti di vedere facilmente gli schemi.
○ Come linguisti computazionali,
non siamo realmente
interessati a studiare le
concordanze, in quanto si tratta
semplicemente di istanze di
una parola specifica all'interno
del testo.
○ Si tratta di un'operazione di
base che, anche se non è
interessante dal punto di vista
computazionale linguistico,
potrebbe essere interessante
per gli algoritmi di text retrieval.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

2. Estrazione delle collocazioni


○ Le collocazioni sono coppie/gruppi di parole che presentano preferenze semantiche nel testo.
■ Ad esempio, "A strong cup of tea" è preferibile nell'uso rispetto a "A powerful cup of tea" in
inglese (powerful non è un buon aggettivo se usato con il tè, ma è un buon aggettivo con il
computer, mentre per strong è il contrario)
○ Le collocazioni sono parole che co-occorrono nel co-testo immediato del nodo in modo
statisticamente significativo → John Sinclair ha scoperto che se si limita il co-testo a +/-4 parole, è
possibile cogliere tutte le informazioni rilevanti della collocazione tra parole
○ Si possono quindi raccogliere tutte le parole che appartengono a questo intervallo e progettare un
algoritmo che spinga la preferenza semantica più forte tra il nodo e tutte le parole nel co-testo immediato
in cima al rango: vogliamo identificare le parole nel co-testo che hanno la preferenza semantica più alta
■ E se si ordinassero le parole del co-testo in base alla frequenza? Questo non va bene: per la
legge di Zipf sappiamo che le parole non sono distribuite in modo omogeneo e ci troveremmo in
cima alla classifica le parole grammaticali e irrilevanti.
1. Questo problema viene solitamente risolto utilizzando qualche indicatore statistico
a. Esempio: PMI(w1,w2), Pointwise Mutual Information, che è un rapporto
tra due probabilità: avere le due parole nello stesso intervallo P(w1,w2) e
l'altra è la probabilità che le due parole siano indipendenti P(w1)*P(w2) → un
modo per confrontare la realtà con l'indipendenza: se queste due probabilità
sono molto simili allora il rapporto è quasi uno e il logaritmo è 0; se le due
parole co-occorrono molto spesso insieme che da sole, allora significa che
hanno qualche legame linguistico
b. Utilizzando questo tipo di indici possiamo ordinare le parole nel co-
testo e raccogliere quelle che presentano la più alta preferenza
semantica.
○ L'estrazione automatica della collocazione è molto interessante dal punto di vista linguistico computazionale.
3. È possibile calcolare le stesse cose per le categorie grammaticali (colligazioni)
4. Calcolo degli elenchi di frequenza delle parole

Come possiamo recuperare tutte le occorrenze di un determinato fenomeno in un determinato corpus?


L'algoritmo più semplice sarebbe una ricerca lineare (= partire dall'inizio del corpus, che può essere immaginato come
un enorme testo, e consultare il corpus parola per parola): la sua velocità è proporzionale alla dimensione del corpus dato.
➢ AntConc esegue solo una ricerca lineare ed è quindi utile solo per corpora di piccole dimensioni.

Come possiamo risolvere questo problema? Possiamo indicizzare il nostro corpus.


Nei libri accademici inglesi, di solito c'è un
indice... → vorremmo estendere la stessa idea
all'intero corpus: invece di fare l'indice per un
campione di parole (le parole-chiave), vorremmo
farlo per l'intero corpus. L'idea è di costruire una
struttura di dati come questa:
● I token possono essere ripetuti nei
libri, ma i tipi sono unici.
● Elenchiamo tutti i tipi del corpus in
ordine alfabetico
● Contiamo le frequenze di ciascuna
tipologia nel corpus
● Abbiamo un puntatore al file di
indice che elenca tutte le posizioni
di tutte le occorrenze per un dato
tipo
Quando dobbiamo recuperare tutte le
occorrenze di una determinata parola, cerchiamo
rapidamente nella tabella dei tipi utilizzando una
ricerca lineare (si tratta di una tabella organizzata).
Seguendo l'indicizzazione, possiamo recuperare
immediatamente tutte le occorrenze senza dover
leggere l'intero corpus.
Questo meccanismo funziona se, data una posizione per una data occorrenza, possiamo saltare immediatamente al
corpus. Ma il corpus è formato da token (= parole), e ogni parola ha una lunghezza diversa (e sappiamo che 1 carattere = 1
byte, in generale)... e se iniziamo a contare dall'inizio, è esattamente come se stessimo facendo una ricerca lineare!
Di cosa abbiamo bisogno per risolvere questo problema?
Ricodifichiamo l'intero corpus utilizzando numeri interi (ogni numero intero rappresenta ogni parola). Ricodificando il
corpus sostituendo le parole con il loro indice, dato che i numeri interi hanno un numero fisso di byte (2 o 4 o più a seconda
della loro presentazione), possiamo calcolare immediatamente la posizione nel file del numero in base alla dimensione
dell'intero nel mio sistema.
● Senza questo trucco, l'intera struttura è completamente inutile.
Dato che gestiamo miliardi di dati, dobbiamo implementare procedure intelligenti di recupero del testo quando interroghiamo il corpus.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

Parte II - Elaborazione del linguaggio naturale

Questa potrebbe essere una risorsa interessante.

Rapida introduzione al campionamento audio e ai formati digitali


I suoni sono un'onda di pressione che si propaga nell'aria. Questa pressione d'onda è prodotta da un flusso d'aria che
esce dai polmoni e dalla bocca e che incontra molti articolatori nella bocca e nella gola: mantenendo una posizione diversa,
ogni articolatore è in grado di creare o modificare i suoni e creare risonanze. Il suono esce quindi dalla nostra bocca e si
propaga attraverso l'aria come un'onda di pressione → si tratta di fonetica acustica ed è molto interessante per noi: l'onda di
pressione, a un certo punto, raggiunge un microfono e, tramite alcuni dispositivi nel computer, viene digitalizzata e diventa un
segnale audio digitale.
I computer lavorano tipicamente sulla parte acustica del nostro discorso.
● Esiste un'altra parte della linguistica che si occupa di
fonetica percettiva.
Il punto importante è che il segnale audio è un segnale analogico e
continuo nel tempo → possiamo rappresentare il parlato nel tempo
immaginando un segnale analogico che rappresenti la modulazione della
pressione d'onda nel tempo
● Da un lato abbiamo il tempo, dall'altro l'ampiezza dell'oscillazione
dell'onda
Nel microfono diventa un segnale elettrico continuo della stessa forma e, per
essere elaborato dal computer, deve essere digitalizzato non solo nel tempo,
ma anche nell'ampiezza.
1. Asse temporale
○ Quando si digitalizza attraverso il tempo, l'asse temporale
viene suddiviso in intervalli costanti di dimensioni fisse ∆𝑡
○ Ad ogni intervallo il segnale ha una specifica ampiezza
○ Quanto è grande l'intervallo?
■ ∆𝑡 = 1
𝑆𝐹
■ Questo è il primo parametro che posso controllare quando digitalizzo un qualsiasi segnale
sonoro: è la frequenza di campionamento (kHz).
■ Ogni strumento di elaborazione vocale che consente di registrare il suono nel microfono e di
trasformarlo in forma digitale permette di impostare le frequenze di campionamento.
■ Le frequenze di campionamento tipiche sono 8, 11, 25, 16 (questa è quella che utilizzeremo,
in quanto garantisce il mantenimento di tutte le informazioni fino a 8 kW → questo è un ottimo
intervallo per il parlato, in quanto i nostri suoni sono più o meno confinati a questi valori
quando parliamo), 22,05, 44,1 kHz
2. Asse dell'ampiezza
○ Su questo asse abbiamo più o meno lo stesso compito: dobbiamo digitalizzare il possibile intervallo di
variazione fissandolo in una serie di intervalli diversi
○ Questa volta definiamo il numero di intervalli in cui viene digitalizzata l'espansione minima e massima
specificando il numero di #bit
■ I valori tipici sono 8, 16, 24, 32... → 2^16 significa 65536: ciò significa che l'intervallo tra
l'ampiezza massima e quella minima è diviso in 65536 piccoli intervalli
■ I valori sono approssimati all'intervallo più vicino → digitalizzando il nostro campione
analogico stiamo facendo alcune approssimazioni
3. Nella digitalizzazione del parlato ci sarebbe un terzo parametro: il numero di canali.
○ Essendo il parlato proveniente da una singola sorgente, è stato digitalizzato come mono, non stereo

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.

Il segnale vocale: produzione, percezione e caratterizzazione acustico-fonetica

Pagina 23 del libro (7 pdf):


Questa è una forma d'onda (oscillogramma) ed è esattamente il grafico nel tempo di un
segnale vocale ("dovremmo inseguire"). Possiamo notare che nella forma d'onda abbiamo alcuni
intervalli in cui si trovano segnali periodici, piccole onde che si ripetono nel tempo, e altri intervalli
in cui abbiamo un segnale che assomiglia al rumore bianco.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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

Possiamo esaminare ulteriormente i suoni vocali e riconoscere immediatamente che ogni


suono vocale ha una specifica piccola forma d'onda ripetuta nel tempo: la forma dei
frammenti ripetuti è diversa. Sembra che i suoni abbiano una precisa impronta digitale nel tempo:
ogni suono ha la sua.
Ma confrontare frammenti di forme d'onda, nel dominio del tempo, è molto complesso e non è la situazione ideale dal
punto di vista computazionale.

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.

Che tipo di informazioni possiamo trarre da questo spettrogramma?


Possiamo vedere che ci sono alcune bande che, in una certa
misura, rimangono costanti nel tempo, in alcuni brani del parlato
→ queste sono le formanti, e il punto in cui possiamo trovare
queste bande nel dominio della frequenza è esattamente
l'impronta digitale di ogni suono vocale nel dominio della
frequenza.
● Identificare la periodicità e confrontare i periodi nel
dominio del tempo è stato difficile, ma nel dominio
della frequenza è più facile, in quanto abbiamo barre
costanti, formanti costanti → le formanti sono le
componenti principali del singolo suono
Alcuni suoni non presentano alcuna struttura formantica: si
tratta di suoni non vocali (in questo caso dell'immagine
corrispondono, ad esempio, ai suoni "s").

Avendo a disposizione tali informazioni raccolte dall'analisi


fonetica del parlato, i primi studiosi che si occupavano di
Automatic Speech Recognition iniziarono subito a pensare di
risolvere il riconoscimento vocale come un algoritmo di
pattern-matching: se ogni suono per una data lingua (e
possiamo elencarli anche se sono parzialmente diversi da lingua
a lingua → abbiamo un numero limitato di suoni) possiamo
immaginare di raccogliere n-differenti configurazioni in frequenza
per una data lingua, mediando in qualche misura tra
femmine/maschi, giovani/adulti... e quindi possiamo immaginare
di fare il riconoscimento vocale in questo modo: confrontiamo
alle combinazioni che abbiamo memorizzato e associare la combinazione dell'enunciato sconosciuto a un determinato suono.
In questo modo possiamo ricostruire la sequenza telefonica e poi, attraverso la trascrizione fonetica, ricostruire in
qualche misura la trascrizione ortografica.
Immediatamente gli studiosi hanno capito che si trattava di un'idea corretta a livello 0, ma poi abbiamo dovuto fare i conti con tre aspetti molto
forti
problemi:
1. Variazione interumana
○ È vero che non possiamo modificare troppo i nostri suoni pronunciati per permettere alle persone di capirci,
ma tutti i parametri acustici dei nostri suoni sono relativi alla nostra produzione → i parametri acustici
cambiano a seconda delle diverse voci
○ Questo ha introdotto un sacco di variazioni!
2. Suoni ipoarticolati di scomparsa di suoni
○ Gli ascoltatori, molto spesso, hanno un cervello che è in grado di ricostruire il suono in modo molto abile:
la catena di informazioni in ingresso è costantemente abbinata a tutto il lessico linguistico, alla situazione
comunicativa interattiva, a tutte le conoscenze di base... e anche se a volte non c'è alcuna evidenza
acustica per un determinato suono, il nostro cervello è comunque in grado di ricostruirlo.
○ Questo perché il nostro sistema articolatorio è un sistema biomeccanico, quindi molto lento → i
nostri articolatori cercano sempre di produrre suoni (dettati dal nostro cervello), ma non possono
andare alla stessa velocità del nostro cervello, che quindi decide di saltare alcuni suoni che
possono essere compresi
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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

❓ Come viene elaborato il segnale acustico, in pratica?


La prima operazione è quella di suddividere l'enunciato in fotogrammi: si tratta di
Dobbiamo trovare un intervallo di N campioni, poi dobbiamo
spostarlo di un dato numero di M campioni e questi due
intervalli sono due fotogrammi sovrapposti che vengono utilizzati
per calcolare qualsiasi parametro acustico in quel fotogramma:
altezza, energia e altri parametri...
E dato un parametro, possiamo produrre trame
combinando i valori in ogni fotogramma.
● Due fotogrammi successivi devono sovrapporsi e le
dimensioni del fotogramma sono strettamente
legate alle frequenze del campione.
∆𝑡 = 1/𝑠𝑎𝑚𝑝𝑙𝑒 𝑓𝑟𝑒𝑞𝑢𝑒𝑛𝑐𝑦 = 1/16. 000 = 0. 0000625 →
62 microsecondi

Tutte queste complicate connessioni tra i parametri del


sistema hanno un forte impatto sul risultato. Se pretendiamo di
esaminare le caratteristiche all'interno di un singolo suono e
progettiamo un fotogramma più lungo di
il suono, allora stiamo mescolando suoni diversi e i parametri acustici si confonderanno e diventeranno una fonte di problemi.

❗ 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.

Tecnologie per l'elaborazione del parlato

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.

Riconoscimento delle emozioni


Anche se non siamo in grado di produrre riconoscitori vocali,
Più o meno nel 2004/2005 si è cominciato a desiderare di riconoscere le emozioni nel
parlato: si voleva sapere non solo cosa si diceva in un enunciato, ma anche come lo si
diceva! Sia nel linguaggio parlato che in quello scritto, l'idea alla base del riconoscimento
delle emozioni è quella di adottare una teoria psicologica delle emozioni che definisca
un piccolo insieme di emozioni fondamentali nel discorso e cerchi di riconoscere queste
emozioni in un determinato enunciato.
● Esistono vari modelli dal punto di vista psicologico:
○ Il modello di Ekman propone sei emozioni di base
○ Il modello di Plutchik propone otto emozioni di base
■ Non ci sono solo le otto emozioni di base, ma anche le
loro combinazioni: si tratta di un modello molto ricco e
molto semplice da interpretare anche per i non psicologi.
■ Vedi: immagine
Dal punto di vista computazionale, è possibile addestrare una macchina di ML per
classificare le emozioni da un dato enunciato!

Quali dati si possono utilizzare per costruire un sistema di questo tipo?


In passato il primo tentativo è stato quello di utilizzare un corpora emozionale (= si prende in prestito una
attori professionisti e chiedere loro di produrre un enunciato specifico con una determinata emozione) in cui ogni
enunciato è stato preclassificato con un'emozione specifica. La prima idea è stata quindi quella di considerare
specifici tipi di caratteristiche acustiche e addestrare i classificatori a riconoscere un'emozione rispetto alle altre.
● Non ci sono quasi studi, dal punto di vista linguistico, in grado di far corrispondere una specifica emozione
a una particolare configurazione linguistica nel discorso: sì, sappiamo che la gioia è collegata a variazioni
estreme di tono, mentre la tristezza significa un discorso più o meno monotono... ma queste sono le uniche cose che
sappiamo, gli studi non sono sufficienti per progettare un sistema computazionale diverso, basato su dati ed
evidenze solide.
L'unico modo è avere un corpus e raccogliere alcuni parametri fonetici acustici e cercare di addestrare un
classificatore per distinguere le sei o otto emozioni diverse.

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).

Sintesi vocale emozionale


Da un lato abbiamo lo Speech-to-Text (chiamato anche Speech Recognition), dall'altro questo tipo di sintesi:
Si fornisce un testo e il computer deve sintetizzare un enunciato.
È composto da due blocchi diversi:

1) Il primo blocco opera su una visione simbolica dell'informazione


a) L'input è il testo che si deve sintetizzare, magari correlato da
un'emozione.
b) Poi c'è un modulo NLP che analizza il testo in ingresso
determinando quali sono i PoS delle parole del testo
i) Se si ha come input "record", bisogna sapere se si
tratta di un verbo o di un sostantivo in inglese, poiché
hanno pronunce diverse (ad esempio, l'italiano
"àncora"/"ancòra").
c) Un parser sintattico-prosodico → dal punto di vista linguistico la
prosodia e la sintassi sono collegate tra loro
i) L'utilizzo di un parser di questo tipo ci permette di
inserire correttamente le pause, quali sillabe devono
essere accentate in modo da essere percepite come
preminenti...
d) Trascriviamo quindi il testo in ingresso in forma fonetica
e) Generiamo le informazioni sulla prosodia
2) Il secondo blocco è il modello di elaborazione del segnale digitale
a) Ha il compito di sintetizzare realmente una forma d'onda acustica
b) In passato, un parlante leggeva un ampio insieme di enunciati
foneticamente bilanciati (un insieme predeterminato di enunciati
progettati in modo tale che ogni combinazione telefonica, ogni
diafonia fosse presente in questo set di dati) in modo monotono
(senza alcuna prosodia, possibilmente)
c) Il sistema è quindi in grado di suddividere automaticamente le
informazioni acustiche in difoni, in piccoli pezzi di informazioni
acustiche collegate a un difono, formando un database di
segmenti di difoni del parlato.
d) Con un enunciato da sintetizzare, il sistema è in grado di
generare una lista di segmenti, di concatenarli, di sovrapporre
la prosodia (intonazione, pause...) e quindi di sintetizzare il
segnale vocale emesso in uscita.

Annotazione delle risorse linguistiche


I corpora linguistici costituiscono la spina dorsale di qualsiasi applicazione vocale, poiché i sistemi di ML hanno bisogno di
dati per essere impostati. L'annotazione manuale delle risorse linguistiche è un passo fondamentale per la produzione di
qualsiasi applicazione/soluzione di elaborazione del parlato.
Nelle diapositive si può vedere un enunciato estratto da un corpus italiano, con la trascrizione ortografica, una
trascrizione fonetica che utilizza non l'alfabeto IPA ma l'alfabeto SAMPA (un alfabeto fonetico equivalente all'IPA ma che
utilizza semplici combinazioni di
caratteri). Poi si possono
inserire i profili di
intonazione (che possono
essere calcolati
automaticamente) e avere
la forma d'onda.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

Altri corpora possono contenere annotazioni più sofisticate:


● Esempio tratto dal corpus e dall'enunciato giapponese, in cui in basso si trova non solo la trascrizione
ortografica con le sillabe principali marcate chiaramente, ma anche i fonemi intonativi

Strumenti per l'apprendimento delle lingue


Possiamo immaginare di costruire sistemi di pronuncia automatica per l'insegnamento della pronuncia assistito dal
computer e di inserire questi strumenti negli strumenti tecnologici per l'insegnamento delle lingue.
● I sistemi di pronuncia automatica sono in grado di rilevare le pronunce errate e di inviare segnali per aiutare gli
studenti a migliorare la loro pronuncia → gli errori provengono di solito dalla lingua madre degli studenti, e questi
sistemi devono quindi essere sintonizzati per due lingue (sono sistemi molto specifici e non sono così utili per classi
eterogenee)

Strumenti per la terapia del linguaggio


Possiamo immaginare di costruire sistemi per la terapia del linguaggio (ad esempio, insegnare una comunicazione parlata
come alternativa a una comunicazione basata sul linguaggio dei segni per i bambini audiolesi). In Computer Grafica, più
triangoli si usano nelle ricostruzioni wireframe, più precisa è la ricostruzione, e si potrebbero costruire "teste parlanti" digitali in
grado di mostrare le posizioni specifiche della lingua e delle labbra nel riprodurre i suoni.
● Utilizzando questi sistemi siamo in grado di riprodurre esattamente gli stessi movimenti di un essere umano
che produce un suono specifico: esistono tecniche per registrare i movimenti delle labbra quando si pronuncia un
suono specifico in modo che, a fianco di un fonema, si abbia un visema (vedi: Wikipedia): un elenco di movimenti
necessari per produrre suoni specifici da parte di un osservatore esterno

Tutor virtuali e sistemi di dialogo


Questa è l'applicazione più comune al giorno d'oggi.
● Da un lato abbiamo la catena di acquisizione/ingresso
○ Un riconoscitore vocale automatico (ASR)
che ascolta la voce e la trasforma in testo.
○ Poi potrebbe esserci un'analisi della
pronuncia (ad esempio, potrebbe
determinare il vostro accento, o potreste
avere un software di rilevamento delle
emozioni).
● Al centro si può avere un gestore del dialogo (il
significato dipende dal dialogo... oggi abbiamo
chatbot, Alexa, Siri, Google Home...) e un gestore
dell'esercizio.
● La catena di uscita
○ Le informazioni audiovisive sono sintetizzate
○ Una testa parlante può essere inserita
visivamente per consentire una più facile
interazione umana.

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.

Riconoscimento automatico del parlato - ASR

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)

Mario Intervento (ETHZ, Airbus)

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
𝑃(𝑂)

■ 𝑃(𝑂) non dipende da 𝑊: è una costante!


○ Pertanto, quando applichiamo l'argmax al teorema di Bayes, possiamo eliminare il denominatore
perché è la stessa cosa con o senza di esso

L'argmax applicato a Bayes è la stima massima a posteriori (MAP-E).

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 𝑃(𝑊)).

Si tratta di un'architettura di sistema


generica per la formazione
- Abbiamo una forma d'onda dalla quale
estrarremo alcune caratteristiche acustiche
(formando la sequenza O)
- Abbiamo quindi il corpus scritto attraverso il
quale possiamo calcolare il modello
linguistico N-grammi (che corrisponde a
𝑃(𝑊) per una data sequenza W di parole)
- Dalle caratteristiche acustiche (O)
possiamo addestrare un HMM creando il
modello acustico
Per il riconoscimento si eseguono gli stessi
passaggi, ma poi si utilizza il decodificatore Viterbi
per trovare la sequenza migliore o la sequenza che
ha la più alta probabilità di verificarsi.

Come possiamo calcolare il modello acustico?


Possiamo immaginare di produrre un HMM con la
stessa
architettura, composta da cinque stati collegati
esattamente in questo modo: c'è uno stato iniziale e uno
stato finale... e questo singolo modello è un modello che
cerca di modellare un singolo suono (telefono) per una
data lingua.
● C'è una fase iniziale in cui si cerca di
considerare la coarticolazione con il telefono
precedente.
● Una fase intermedia che rappresenta più
o meno lo stato stabile del telefono
● Lo stato finale che rappresenta la co-
articolazione con un altro telefono
Dato un modello per i telefoni, possiamo combinarli e
costruire modelli per le parole (che hanno esattamente la
stessa struttura del precedente, ma combinano i modelli
per ogni telefono che compone una data parola).
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

Il modello di estrazione delle caratteristiche può essere visto anche


dal punto di vista acustico. Le caratteristiche di base per l'estrazione
sono
MFCC (Mel Frequency Cepstral
Coefficients), che vengono calcolati
automaticamente applicando l'algoritmo
appropriato.
● Si tratta di un vettore di 39
caratteristiche acustiche che
pilotano l'ingresso di un
riconoscitore vocale → per ogni
osservazione abbiamo 39
parametri acustici (quando
spostiamo l'inquadratura
abbiamo altri 39 parametri
acustici!).

Esempio: E se volessimo riconoscere


i numeri in inglese? Abbiamo un lessico
molto piccolo (con la trascrizione
fonetica) e possiamo costruire molto
semplicemente un riconoscitore.
Possiamo costruire una catena HMM per
ogni singola parola e, se utilizziamo un
modello linguistico unigram, possiamo
semplicemente moltiplicare questa
catena per la probabilità di qualsiasi
numero nel mio modello linguistico e il
gioco è fatto!
● Il modello linguistico a 1
grammo è molto semplice
E se utilizzassimo un modello linguistico a bi-grammi? Possiamo costruire, sulla stessa struttura, connessioni più
complesse e progettare un HMM globale che includa un modello linguistico. Combiniamo l'HMM con il modello acustico.

A sinistra, un esempio di rete per gli uni-grammi. A


destra, un esempio di rete per i bi-grammi.

11 ott. 2022
Riconoscimento automatico del parlato - ASR

Come si valuta il riconoscimento vocale?


La metrica standard per il riconoscimento vocale è il Word Error Rate: per valutare le prestazioni di ogni sistema che
possiamo produrre, dato un compito, possiamo usare le metriche standard che abbiamo discusso... ma forse i singoli compiti
potrebbero avere metriche specifiche per misurare meglio l'output del sistema automatico.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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)

❗ Ricordate che tra le parole e i telefoni c'è un lessico →


una risorsa necessaria per qualsiasi approccio tradizionale.
per il riconoscimento vocale: una parola non presente nel dizionario
non aveva la possibilità di essere riconosciuta, in quanto non faceva
parte del lessico.

● Il primo tentativo ha semplicemente sostituito il modo di


calcolare le probabilità di osservazione, mentre il resto è
rimasto invariato, mantenendo la suddivisione tra
modello acustico e modello linguistico.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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!

Sistemi di dialogo parlato

● ≠ 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]

Architettura generale dei sistemi di dialogo


Da un lato abbiamo un ASR che riceve
il parlato in ingresso dall'utente, dall'altro
una sintesi TTS che legge all'utente la
risposta proposta dal sistema.
● Abbiamo buoni ASR e ottimi
sintetizzatori TTS, quindi questo
non è un problema che dovremo
affrontare.
Il punto è il cuore del sistema di dialogo, il
gestore del dialogo, in cui sono presenti
alcune parti (SLU e NLG) che sono
intrinsecamente legate all'NLP (ma non
necessariamente basate su conversazioni
vocali):
● Spoken Language
Understanding (SLU) → si tratta
di un modulo che comprende la
domanda effettuando il tagging
PoS, l'analisi sintattica e
l'elaborazione della domanda in
qualche modo.
● Generazione del linguaggio naturale (NLG) → sintetizza la forma scritta della risposta (forse il sistema che
riceve la risposta la riceve in un modo formale che deve essere tradotto in NL prima di essere sintetizzato con il
sistema TTS)
Una volta che abbiamo una rappresentazione formale della domanda, come possiamo trovare, nella Knowledge Base, le
informazioni necessarie, elaborarle e produrre una risposta utile alla domanda? Quale tecnologia dovremmo utilizzare?
Questo è il punto: i due blocchi del Dialogue State Tracking (DST) e del Dialogue Management (DM).

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.

Come costruire il miglior Dialogue Manager per


creare un sistema di dialogo che dia davvero
l'impressione di mantenere un dialogo ragionevole
con gli umani?
Si potrebbe utilizzare un'enorme quantità di dati relativi a conversazioni reali tra esseri umani per addestrare un sistema
DNN in grado di interagire con gli esseri umani in modo utile e piacevole, come se fosse un altro essere umano. La DNN ha il
compito di comprendere la domanda, ragionare su di essa e generare una risposta appropriata, il tutto tenendo presente il
dialogo precedente.
Questo approccio non è possibile in questo modo: non abbiamo abbastanza conversazioni per addestrare un sistema.
● Se l'idea è quella di costruire un sistema in grado di conversare come un essere umano, in linea di principio tale
sistema potrebbe conversare su qualsiasi argomento; inoltre, non ci è consentito raccogliere conversazioni tra
esseri umani (ad esempio per questioni di privacy → si veda: Amazon è stata accusata di ascoltare le persone
nelle loro case con Alexa per creare pubblicità personalizzata migliore).
Come vedremo alla fine del corso, c'è un altro modo di fare la stessa cosa che è quello successivo.

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]

strumenti NLP per analizzare l'input (vedi: DialogueFlow, IBMWatson...).


-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

Dall'altra parte c'è un motore di generazione NL.

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!

Esempio: Sistemi di dialogo basati su frame


Il sistema ML comprende l'intento della mia frase NL e le varie entità coinvolte. Se tutte le entità sono compilate, il sistema
è in grado di calcolare immediatamente la risposta; se invece non è così (per esempio, non c'è DEST-CITY), il sistema non
elabora immediatamente la richiesta, ma chiede le informazioni mancanti.
entità.
Dopo aver elaborato la richiesta, forse potrebbe esserci
un'altra frase e un altro intento con altre entità.

Molte altre applicazioni interessanti sono la


diarizzazione dei parlanti (chi/quale parlante ha parlato
quando?) e l'identificazione dei parlanti (legata alla
scienza forense o alla sicurezza).
Nel riconoscimento vocale non ci interessa il
parlante, ma vorremmo escludere qualsiasi proprietà del
parlante.
poiché siamo interessati solo a ciò che viene detto. Alcune funzioni sono quindi più utili di altre.
Per l'identificazione del parlante abbiamo un obiettivo esattamente opposto: non ci interessa cosa viene detto, ma siamo
interessati a proprietà specifiche del parlante e le caratteristiche utili per questo obiettivo sono diverse da quelle necessarie
per la SR.

12 ott. 2022
Tokenizzazione

❗ Queste diapositive sono uguali a TRAM_11-15-2021

Qual è la differenza tra un token e un tipo?


● Un token è un'istanza di una sequenza di caratteri in un particolare documento che sono raggruppati come un
unità "semantica" utile per l'elaborazione
○ Un token può essere ripetuto all'interno dello stesso testo
● Un tipo è la classe di tutti i token che contengono la stessa sequenza di caratteri.
○ Il numero di tipi sarà sempre inferiore al numero di token, poiché i tipi non possono essere ripetuti.
I testi sono sequenze di caratteri non segmentati e bisogna ideare una procedura appropriata (= tokenizzazione) per
identificare i token all'interno della sequenza di caratteri; la tokenizzazione è il compito fondamentale di ogni sistema NLP.
Perché i token non sono parole? Sono due concetti diversi anche in linguistica.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

❗ 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

B. Altri segni di punteggiatura ! ? ; :


○ ! e ? sono per lo più univoci
○ ; e : sono ambigui, perché a volte dividono le frasi e a volte no.
○ In linea di principio, ogni segno di punteggiatura è un token separato, ma bisogna identificare URL,
email, codici postali, qualsiasi tipo di codice... e tutte queste unità devono essere trattate come
un'unica unità semantica → un'email è una
email, non importa se contiene qualche segno di punteggiatura!

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)

G. Spazi bianchi mancanti


○ A volte non c'è uno spazio vuoto dopo un segno di punteggiatura... ma cercheremo di essere ottimisti con i nostri testi!
○ Di solito disambigua statisticamente tali stringhe

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.

Rilevamento dei confini delle frasi


Una volta che la sequenza di caratteri è stata tokenizzata in modo appropriato, qualsiasi punto, interrogativo o esclamativo
considerato come un singolo token è un segno di confine della frase!
Attenzione: le citazioni possono rendere il problema più complesso.
● Vedi: l'esempio ""Perché non abboccare all'amo?" ha detto un portavoce" dalle altre note.

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!

Come trattiamo la morfologia infettiva?


Siamo decisamente interessati a definire due operazioni di base che dobbiamo implementare:
A. L'analisi morfologica
○ Prende una forma di parola inflessa ed è in grado di produrre il lemma o i lemmi corrispondenti (=
la forma di citazione standard in un dizionario) + tutte le caratteristiche morfologiche.
■ L'analizzatore morfologico lavora con forme di parola isolate, e non è possibile disambiguare
omografi appartenenti a parti del discorso diverse, a lemmi diversi... il sistema ha il dovere di
restituire ogni possibile lemma (con la caratteristica morfologica corrispondente) per ogni
possibile parola.
B. La generazione morfologica
○ In due approcci diversi
■ Si fornisce un lemma e si chiede al generatore morfologico di generare tutte le forme
di parola + le caratteristiche morfologiche.
● Esempio: amare → amo, ami, amiamo, amiate, amassimo... + caratteristiche
morfologiche che definiscono il tempo, l'umore, la persona...
■ Si forniscono un lemma e delle caratteristiche morfologiche e si chiede al generatore
morfologico di generare tutte le forme di parole
● Esempio: prima persona singolare del presente indicativo della parola amare → amo

Possiamo risolvere il problema ideando un'implementazione molto


semplice basata su una tabella (= la struttura dati di un database), in cui
abbiamo alcune colonne (minimo 3): la forma della parola, il lemma e i
gesti morfologici.
Per una data lingua posso elencare tutte le forme di parola, il lemma
corrispondente e le caratteristiche morfologiche connesse.
Come possiamo implementare l'operazione di analisi? Data una
forma di parola, possiamo cercare nella prima colonna, trovare tutte le
forme di parola che soddisfano la mia domanda e poi possiamo restituire
il lemma corrispondente e la morfologica
caratteristiche. Per la generazione è la stessa cosa: si cerca il lemma nella colonna lemma (e forse si cerca anche nella
colonna caratteristiche morfologiche) e poi si restituisce la forma della parola.
❗ Problema: chi ci dà la tabella compilata? Per ogni lingua abbiamo milioni di righe: un normale dizionario è circa
100.000 lemmi che possono generare così tante forme di parole diverse! Per le lingue altamente inflesse, questa sarebbe una tabella enorme e
deve essere riempito a mano dai linguisti. Abbiamo bisogno di metodi più potenti per gestire i fenomeni di inflessione.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

Automi a stati finali


Sono macchine a stati molto semplici, composte da
stati e bordi (tra gli stati)
● Gli stati con doppio cerchio sono chiamati
"stati riconosciuti" e sono stati finali: se la
macchina può consumare tutto l'input e alla
fine dell'input lo stato corrente è uno stato
riconosciuto, allora la macchina "riconosce la
stringa di input".
● Esempio: questo è un automa che riconosce
se si sono inseriti 25 centesimi (la somma di
denaro per ottenere una lattina di cola); se si
inserisce una monetina o un centesimo, si
sposterà da uno stato all'altro.
La macchina parte da uno stato e, a seconda degli
input, passa da uno stato all'altro.
Dato un automa a stato finale, esiste un insieme
di stringhe che contiene tutte le stringhe che sono
riconosciuto da questo automa: quell'insieme è la lingua riconosciuta da questo automa!
● 𝐿 = {𝑄, 𝐷𝐷𝑁, 𝐷𝑁𝐷, 𝑁𝐷𝐷, 𝐷𝑁𝑁𝑁, 𝑁𝐷𝑁𝑁, 𝑁𝑁𝐷𝑁, 𝑁𝑁𝑁𝐷, 𝑁𝑁𝑁𝑁𝑁} → la combinazione di monete per arrivare a 25
centesimi nel caso della Macchina della Cola semplice

Morfologia a due livelli


Questo modello si basa su automi a stati
finiti per riconoscere, ad esempio, le parole.
Quindi, posso immaginare di costruire un automa
molto grande con percorsi diversi e ogni percorso
riconosce una forma di parola per una determinata
lingua.
Ma progettare un automa complesso con un percorso per ogni forma di parola è
esattamente equivalente alla tabella precedente... non c'è alcun guadagno!

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!

Per ottenere un guadagno dobbiamo condividere strutture e percorsi.


L'aspetto importante dell'utilizzo degli automi a stati finali per il nostro obiettivo è che si tratta di dispositivi
matematici teorici che esistono fin dagli anni '40 e che ci sono molte
algoritmi e operazioni tra automi che hanno un algoritmo
corrispondente ed efficiente per implementare tale operazione! Ci
basiamo su un ampio bagaglio di conoscenze teoriche derivate dalla
matematica teorica e dall'informatica:
● Operazioni per unire e fondere gli automi
● Operazioni per la derivazione di un automa
minimo da un automa dato
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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

L'analizzatore morfologico ANITA


Si tratta di un analizzatore morfologico per l'italiano, costruito
specificando un lessico di lemmi, una serie di suffissi morfologici e
collegando i lemmi alle terminazioni e alle categorie flessionali appropriate.
● Esiste anche una regola di riadattamento morfofonologico: 0:i ⇔
[c|g] _: [a|à|o|ò|u|ù]

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.

Quali sono le tecniche utilizzate per risolvere il problema?


Abbiamo molte soluzioni diverse, quasi tutte basate su tecniche di ML:
1) Tecniche stocastiche
○ = 𝑎𝑟𝑔𝑚𝑎𝑥𝑡1...𝑛𝑃(𝑡1...𝑛 | 𝑤1...𝑛)
𝑇𝑏𝑒𝑠𝑡
○ Basato su modelli di Markov nascosti (HMM) e su approcci stocastici.
○ L'idea è quella di scegliere la sequenza di tag che massimizza la probabilità di tag rispetto alla
sequenza di parole → questa è un'affermazione molto generale che può essere utilizzata come punto
di partenza per...
■ ...Modelli stocastici generativi (come HMM), che invertono questo condizionamento
utilizzando la regola di Bayes e procedono in una direzione, come vedremo...
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

■ ...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!

(1) Approccio tradizionale - HMM


● Documento: Carlberger, Krann (1999), Implementing an Efficient Part-Of-Speech Tagger (Implementazione di un tagger efficiente di parti
del discorso).
Il punto di partenza è un'equazione che afferma che stiamo cercando la migliore assegnazione di tag che massimizza la
probabilità della sequenza di tag rispetto alla sequenza di parole. Possiamo applicare la regola base: poiché l'argmax è su
una sequenza di tag, posso rimuovere il denominatore e ottenere la forma generale dell'equazione.
Dobbiamo introdurre due ipotesi di base utilizzate con gli HMM:
1. La probabilità di una parola che in linea di principio può essere collegata a ogni parola e a ogni tag, in
pratica viene approssimata considerando solo questo termine
2. Anche la seconda probabilità è approssimata considerando solo tre tag: la probabilità di un tag dipende solo dai
due precedenti, non da tutta la sequenza!
Sostituendo queste due ipotesi nella prima equazione, si ottiene il modello finale basato su HMM.
Se utilizziamo questo modello considerando le parole come la sequenza di uscita dell'HMM e i tag come la sequenza di
stati, possiamo utilizzare l'algoritmo di Viterbi per trovare la sequenza di stati (cioè la sequenza di tag) che ha la più alta
probabilità di essere associata alla sequenza di parole in ingresso (che, nell'interpretazione dell'HMM, è la sequenza di uscita).

Come possiamo stimare queste due probabilità?


Ricordate: dato un modello stocastico, abbiamo l'equazione perfetta (la prima), poi dobbiamo introdurre le due ipotesi e
arriviamo al modello approssimato... poi dobbiamo stimare tutte le probabilità coinvolte nel nostro modello approssimato!
Come si fa a stimare le probabilità, con qualsiasi modello stocastico? Ho bisogno di un corpus annotato per PoS nella mia
lingua di arrivo: dobbiamo essere abbastanza sicuri che nel corpus di addestramento le annotazioni siano corrette, quasi al
100%.
Questo è il modello approssimato e possiamo usare questo processo per approssimare tutte le probabilità relative all'annotazione.
Esaminando un corpus annotato, è possibile impostare il modello HMM approssimando tutte le probabilità con i conteggi di
frequenza. Questo vale anche per le probabilità lessicali! Il punto è che il corpus di addestramento è utile per impostare le
probabilità.
Una volta fatto questo, posso usare l'algoritmo di Viterbi per trovare, data una sequenza di parole, la sequenza più
probabile di stati/etichette ad essa associati → questo significa etichettare PoS una data sequenza di parole.

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.

(2) Approccio intermedio - Reti neurali ricorrenti


● Paper: Tamburini (2016), (Meglio dello) stato dell'arte del PoS-tagging per i testi italiani
La soluzione classica per il deep learning che ha resistito fino all'introduzione dei trasformatori (2019) è stata quella di
utilizzare un'architettura specifica: impilare uno o più strati LSTM bidirezionali (bidirezionali = si possono considerare sia i
token passati che quelli futuri nella decisione) e poi mettere uno strato di dropout nel mezzo.
● Un livello di dropout è un livello che scarta casualmente una
percentuale dell'output, lo si può inserire tra i livelli e scarta
casualmente un certo contributo → questo costringe la rete a
convergere realmente verso un buon modello, poiché non può
memorizzare i modelli (dato che si rimuove un certo contributo)
○ Il NN imparerà a gestire questi colpi artificiali.
→ si rafforza la ridondanza e la comprensione reale
di come risolvere il compito invece di memorizzare il
percorso giusto (un forte pericolo con gli NN): si
previene l'overfitting
All'uscita dei due BLSTM è comune avere uno strato Conditional
Random Field (CRF): in linea di principio, le RNN si occupano di tutti gli
ingressi e di tutte le decisioni precedenti (non dovrebbe essere necessario un
ulteriore strato che gestisca le sequenze)... ma le RNN sono così complesse
che a volte dimenticano qualcosa: avere un ulteriore strato concentrato solo
sulle sequenze di tag in uscita è un miglioramento.

In questa architettura l'input è costituito da embeddings, di cui


parleremo in una prossima lezione (si possono immaginare come vettori di
caratteristiche linguistiche)... quindi per ora non parliamo dell'input!
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

(3) Approccio allo stato dell'arte - Trasformatori di regolazione fine


In questo caso, abbiamo un trasformatore, e in particolare una pila di codificatori (= il BERT) che, data una sequenza di
token, ne fornisce una rappresentazione intermedia e poi un MLP effettua il fine-tuning di ogni output, scegliendo l'etichetta
(un tag PoS, in questo caso).
-Un altro problema: non abbiamo spiegato l'architettura dei BERT, sappiamo solo che si tratta di un insieme di codificatori...
L'idea è quella di prendere un trasformatore, o parte di esso, e di mettere a punto una parte di esso su un compito specifico.
Il trasformatore fornisce una rappresentazione intermedia generale utile per vari compiti, e si mette a punto questa
rappresentazione con un singolo strato denso che risolve un problema specifico e può essere addestrato per risolvere
esattamente quel problema e solo quello.
● Questa è un'architettura e una soluzione comune utilizzata per quasi tutti i problemi, al giorno d'oggi!
Questa è l'architettura utilizzata attualmente per risolvere il tagging PoS, a condizione che si disponga di un modello BERT
pre-addestrato per la lingua (e questo non è sempre il caso, soprattutto per le lingue a bassa risorsa, o per varietà specifiche di
lingue a più alta risorsa per le quali forse non esiste un modello).

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]

Analisi sintattica - Il livello della frase

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.

Nella linguistica (computazionale) esistono due grandi tipi di analisi:


1. L'analisi della costituenza, in cui si utilizza un albero per delineare la
struttura sintattica di una frase.
○ In primo luogo, identifica i costituenti (= gruppi di parole che agiscono
come unità: frasi di nomi, frasi di verbi...).
○ Questo è l'approccio classico nella tradizione linguistica generativa,
dovuto a Chomsky
○ Problema: se si utilizza un albero per rappresentare le strutture
sintattiche, si incontrano problemi quando una parola ha più di una
funzione, poiché i rami degli alberi non possono incrociarsi e un nodo
non può essere collegato ad altri due nodi.
■ Troverete elementi artificiali chiamati "tracce"
introdotti per risolvere questo problema (che
è frequente soprattutto con i pronomi relativi)
2. L'analisi delle dipendenze, in cui si collegano parole che, in qualche
misura, sono le due parti di una relazione linguistica (ad esempio,
relazione soggetto, relazione oggetto...).
○ Esiste una relazione diretta tra le due parole, alla quale è
associata una specifica funzione sintattica
○ Trattandosi di un grafico, si possono avere relazioni di incrocio e si
possono esprimere, per una data parola, molte funzioni diverse allo
stesso tempo.
■ Il grafo è la struttura dati più generale e potente dell'albero: ogni albero è un grafo, ma non
ogni grafo è un albero).
○ Al giorno d'oggi quasi tutti i parser sintattici che lavorano con il NL utilizzano l'approccio delle dipendenze,
per ragioni che sono in parte legate ai problemi appena discussi, ma anche principalmente alla struttura
interna del parser (di cui parleremo domani).

Grammatiche a struttura di frase


Per oggi e forse anche per domani ci atterremo alla modellizzazione originale
proposta da Chomksy: le grammatiche a struttura di frase, poiché qualsiasi risultato
teorico ottenuto con queste grammatiche ha un risultato equivalente in qualsiasi altra
cornice sintattica e sono anche più facili da spiegare!
Un modo per rappresentare la struttura sintattica di una frase con un albero è il seguente:

\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

Esempio: nella diapositiva 5/13

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.

❗ Sul significato dei diversi caratteri:


- Le lettere greche rappresentano qualsiasi combinazione di simboli terminali o non terminali.
- Le lettere minuscole rappresentano i simboli dei terminali
- Le lettere maiuscole rappresentano simboli non terminali

● Tipo 0 - Grammatiche generali riscrivibili / ricorsivamente enumerabili


○ Se nella vostra grammatica utilizzate regole molto generiche, allora la grammatica che siete in grado di
produrre è una grammatica molto espressiva e potente, con la quale potete produrre molte
combinazioni di simboli diversi.
○ C'è un parallelo tra il nome della grammatica e il nome della lingua
■ Data una grammatica, c'è un'associazione immediata al linguaggio formale riconosciuto da
quella grammatica → se la grammatica si chiama "riscrittura generale", si chiama anche il
linguaggio riconosciuto
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

○ Da un punto di vista computazionale, qual è la complessità computazionale del parser? La complessità è


molto alta, perché questo parser non potrebbe mai terminare il calcolo per alcune frasi e, se lo facesse, la
complessità computazionale sarebbe molto alta → non vorremmo occuparcene, perché è troppo
complesso per qualsiasi tipo di computer
● Tipo 1 - Grammatiche sensibili al contesto
○ Se la regola più complessa che si inserisce nella grammatica è di questo tipo, allora si hanno
grammatiche sensibili al contesto (e le lingue riconosciute sono lingue sensibili al contesto)
○ E la loro complessità computazionale? Questa volta la complessità è decidibile: il parser terminerà in
un certo tempo e non si bloccherà durante la decisione, ma purtroppo la complessità computazionale del
parser è ancora esponenziale rispetto al numero di parole che compongono la frase che il parser deve
riconoscere.
■ Essere esponenziali significa essere impraticabili, in pratica!
● Tipo 2 - Grammatiche libere dal contesto
○ Questo tipo di grammatica formale limita ulteriormente il tipo di regole che possono essere inserite nella
grammatica → limitando le regole, si riduce anche l'espressività della grammatica, ma si riduce anche
la complessità, rendendo le grammatiche più gestibili dai computer
○ Utilizza un singolo simbolo non terminale a sinistra (𝐴) e una qualsiasi combinazione di simboli
terminali e non terminali a destra (β).
● Tipo 3 - Grammatiche lineari e regolari
○ Queste grammatiche sono molto semplici
○ Esempio: Le espressioni regolari sono un tipo di
linguaggio regolare, la loro grammatica è una
grammatica regolare!
○ La complessità computazionale per il riconoscimento delle
grammatiche regolari è lineare: è molto semplice e veloce,
ma anche poco potente.

❗ Nel diagramma a destra: ogni classe è strettamente inclusa nella


classe che la precede immediatamente (la classe delle grammatiche libere
da contesto è strettamente
incluse nella classe delle grammatiche sensibili al contesto).

Ieri abbiamo assunto la prospettiva di analizzare le NL come se fossero


lingue formali: se consideriamo una NL (ad esempio l'inglese) come lingua da
riconoscere, la domanda è: in quale categoria si trova la grammatica per
riconoscere tale lingua?
● Da un lato abbiamo i linguisti che hanno bisogno di una grammatica potente per esprimere tutti i
complessi fenomeni sintattici del linguaggio che abbiamo in NL → i linguisti spingono verso l'alto, verso il
tipo 0
● Dall'altro lato abbiamo il problema della complessità computazionale → gli informatici cercano di spingere
verso il basso, verso il tipo 3
Dobbiamo trovare un compromesso: deve essere rappresentativo dei fenomeni linguistici, ma non troppo complesso
per renderlo in grado di calcolare il parser.

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.

Quali idealizzazioni della BN sono necessarie?


1. Esiste una famiglia di BN: dobbiamo considerare tutti i BN come appartenenti allo stesso gruppo
○ Se questo non è il caso, dobbiamo trattare tutte le diverse NL come problemi separati.
○ Possiamo affermare che tutte le BN sono strutturalmente simili, hanno tutte una capacità generativa
simile e sono tutte utilizzate per lo stesso obiettivo.
■ Sono tutti diversi (con complessità diverse a diversi livelli), ma sono tutti complessi allo
stesso modo perché servono tutti allo stesso scopo (far comunicare gli esseri umani).
■ Inoltre, i bambini possono imparare ogni NL come se fosse la loro lingua madre (in un periodo di
tempo simile) → non c'è alcuna prova di una reale differenza strutturale tra le lingue e possiamo
ragionare come se fossero un'entità unica
2. Consideriamo le lingue come insiemi di stringhe su un alfabeto
3. NL ⊂ RE
○ Le NL si trovano all'interno della gerarchia di Chomsky e non possiamo considerarle più complesse delle grammatiche di tipo-0,
poiché i nostri cervelli (computer molto potenti) non si bloccheranno mai durante l'analisi di una NL
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

4. Ogni NL è costituita da un insieme infinito di stringhe


Date queste idealizzazioni, possiamo iniziare a ragionare su quale sia la posizione corretta della BN nella gerarchia di Chomsky.

1957 - Chomsky dimostra che i BN non sono regolari.


L'idea è che, dato che tutte le lingue appartengono alla stessa famiglia, se in una NL riesco a trovare un fenomeno che
non può essere rappresentato dalla grammatica che sto esaminando, allora automaticamente tutte le classi di NL devono
salire di un gradino.
Chonksy ha analizzato l'inglese e ha dimostrato che non è una lingua normale, poiché è possibile creare frasi inglesi
perfettamente corrette che nessuno pronuncerà mai:
- una donna ha assunto un'altra donna
- una donna che un'altra donna ha assunto ha assunto un'altra donna
- una donna che un'altra donna che un'altra donna che un'altra donna ha assunto ha assunto ha assunto un'altra donna
- una donna che un'altra donna che un'altra donna che un'altra donna che un'altra donna assunta assunta
assunta assunta un'altra donna

...
● 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.

1985 - Shieber ha dimostrato che nemmeno le NL sono libere dal contesto.


● Esempio: Lo svizzero-tedesco consente una struttura in cui si hanno tre frasi di nome seguite da tre frasi di verbo
che corrispondono l'una all'altra nell'ordine → si tratta di dipendenze interseriali
○ Si tratta di un fenomeno che non può essere riconosciuto con le grammatiche libere da contesto,
poiché è isomorfo con wa b xc d ynmnm
● In tedesco la stessa costruzione richiede che la corrispondenza sia annidata → dipendenze annidate
○ Si tratta di un fenomeno che può essere riconosciuto con le grammatiche libere da 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

Non abbiamo prove di fenomeni di BN che


non possono essere riconosciuti da
grammatiche lievemente sensibili al contesto,
non abbiamo prove di un fenomeno che
potrebbe costringerci a fare un ulteriore passo avanti. Non possiamo dimostrare che i NL rientrano nelle grammatiche
lievemente sensibili al contesto, perché dovremmo considerare tutti i NL vivi e morti e verificare se tutti i fenomeni di queste
lingue possono essere riconosciuti con una grammatica di questo tipo. Siamo più o meno convinti che la classe in cui i
NL devono rimanere è quella delle grammatiche lievemente sensibili al contesto.

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).

Grammatica ad albero contigua lessicalizzata -


TAG Petr Horacek, Eva Zamecnıkova e Ivana
Burgetova

Una Tree Adjoining Grammar (TAG) è una quintupla (T, N, I, A, S):


- T, un insieme finito di simboli terminali
- N, un insieme finito di simboli non terminali
- I, un insieme finito di alberi iniziali (= alberi a struttura di frase)
- A, un insieme finito di alberi ausiliari (= albero a struttura di frase con un nodo nonterminale foglia che è
uguale al suo simbolo radice)
- S, un simbolo iniziale (S ∈ N)
Ma al posto delle regole di produzione abbiamo alberi lessicalizzati (quelli in I e A) e sono ammesse solo due operazioni su
alberi: sostituzione e aggancio.

Questo formalismo, come qualsiasi altro formalismo


moderno per la scrittura della grammatica, è
lessicalizzato: qualsiasi proprietà sintattica è costituita
da centinaia di forme di parole, assegniamo
caratteristiche sintattiche a ogni forma di parola in modo
da poter trattare ogni forma di parola come
completamente idiosincratica. Questo è stato uno dei
grandi miglioramenti in termini di prestazioni, in quanto è
possibile specificare il comportamento sintattico con
la possibilità di essere molto precisi; mentre in
Chomsky la grammatica è costruita su PoS e funziona
molto male.
● Questa struttura di Tree Adjoining Grammar è
lessicalizzata e gli alberi (che in questo caso
sono le caratteristiche sintattiche utilizzate per
costruire la struttura sintattica) hanno centinaia
di forme di parole.

Esempio 2: in questo albero ausiliario dobbiamo


aggiungere un'altra frase sostantiva e un soggetto →
in questo caso utilizziamo l'operazione di aggancio

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]

un albero a un altro albero, si raggiunge la potenza


lievemente sensibile al contesto.
-- 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.

Parsing delle dipendenze basato sulle transizioni


D. Jurafksy, J. H. Martin, Elaborazione del parlato e del linguaggio (2021)

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:

1. Parsing delle dipendenze basato sulle transizioni


L'architettura di base prevede un parser e altre due strutture di dati (il buffer di ingresso e lo stack) e poi un
grafico di dipendenza:
● Al tempo 0, il buffer di input conterrà la frase (= sequenza di parole) che dobbiamo analizzare, mentre lo stack e il
grafo sono vuoti.
L'operazione che il parser può fare è spostare la prima parola del buffer di input in cima alla pila o aggiungere
relazioni (= archi, con LEFTARC e RIGHTARC) tra le parole della pila, rimuovendo quella dipendente.
Chi ha deciso passo dopo passo qual è
l'operazione migliore da applicare? Un
oracolo
● Si tratta di un classificatore neurale
che prende una decisione su quale
azione il parser deve
intraprendere, implementato come
una qualsiasi tecnica di ML che
prende due parole e decide la
relazione più appropriata tra di
esse.
● Si addestra questa NN utilizzando
un corpus annotato
sintatticamente, dal quale si
estraggono tutte le triple
corrispondenti a qualsiasi
operazione, per poi addestrare il
parser.

2. Parsing delle dipendenze


basato su grafi
Questo approccio è più accurato del
Transition-Based Parsing, soprattutto su frasi
lunghe, in quanto attribuisce un punteggio a
interi alberi anziché affidarsi a decisioni locali
avide. Inoltre, può produrre alberi non proiettivi
(e la proiettività è un problema per molte lingue
del mondo).
Questo tipo di parser cerca nello spazio degli
alberi possibili per una data frase l'albero (o gli
alberi) che massimizza il punteggio (= la soluzione
ottimale): in pratica, si forma un grafo completo tra
le parole e si assegna un punteggio a ogni
spigolo; poi si sceglie il grafo che minimizza il
punteggio.
Il punto è: come assegnare il punteggio
corretto al bordo corretto? E come trovare il
miglior albero di parsing, dati i punteggi di tutti i
bordi potenziali?
Il percorso corretto è quello che presenta il
minimum spanning tree: l'albero con la somma
dei pesi più bassa.
Come si assegna il peso? Utilizzando la
DNN, prendendo i due elementi, l'etichetta e
decidendo quale sia il punteggio.
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

❗ Documento: Vacareanu et al. (2020), Il parsing come tagging


L'idea è quella di analizzare una frase come se fosse un compito di etichettatura PoS. La proposta è di avere, come input, la parola
embeddings, poi un LSTM bidirezionale, un MLP per la comunicazione intermedia e, alla fine, due diversi strati lineari (un
altro MLP a singolo strato, il primo che sceglie a quale parola ogni parola è connessa e l'altro che sceglie l'etichetta di quella
connessione).
Con una RNN molto semplice e due decisioni diverse, hanno ottenuto risultati molto buoni, paragonabili a parser di
dipendenza basati su transizioni/grafi molto complessi.
Il problema è che il risultato potrebbe essere un albero di parsing non accettabile con collegamenti strani, quindi è
necessario post-elaborare l'output, calcolando la distribuzione di probabilità e ottenendo quella più alta. Si tratta di una
sorta di parsing delle dipendenze basato su un grafo, in cui il punteggio è stabilito dalla distribuzione di probabilità.

19 ott. 2022
Semantica lessicale

Abbiamo modi diversi di vedere gli approcci semantici:


1) Semantica a livello di parola (ad esempio a livello di lessico)
2) Semantica a livello di frase
3) Semantica anche a livello di testo

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

Qual è l'idea alla base di WordNet?


L'idea era quella di costruire una risorsa lessicale elettronica (più
simile a un thesaurus che a un dizionario). Gli studiosi hanno
prodotto quattro diversi database, uno per ogni PoS lessicale (nome,
verbo, aggettivo, avverbio) e per ognuno hanno trovato tutte le
relazioni tra le parole.
● La relazione di iponimia è in grado di trovare una
gerarchia completa tra tutti i nomi della lingua inglese →
questo albero si arricchisce di relazioni di meronimia e
così via
Abbiamo una rete di parole che possiamo sfogliare e navigare
navigando nelle relazioni semantiche a livello lessicale tra i significati
(definiti come insiemi di sinonimi).
In WordNet esistono molte relazioni lessicali. Per i verbi abbiamo
relazioni molto specifiche:
● Entailment → dai verbi (eventi) ai verbi (eventi) che comportano: ad esempio, se stai russando, stai dormendo.
● Iperonimo → da eventi a eventi sovraordinati
● Troponimo → da un verbo (evento) a un modo specifico elaborazione di quel verbo, specifica un modo specifico di
fare qualcosa (es. se si cammina, si passeggia)
● Antonimo → opposti

👁 Vedi: alcuni documenti su WordNet.


Navigando in rete è possibile fare delle deduzioni a un
livello lessicale: si può dedurre che una persona è
composta da un corpo, ha braccia e gambe che
sono composte da carne e ossa. Si tratta di una
sorta di organizzazione ontologica dei significati a
livello lessicale (non è un archivio enciclopedico, ma
solo un contenitore di significati di parole).

Il primo WordNet è stato prodotto per l'inglese


americano, è stato gratuito fin dall'inizio ed è sia
navigabile dalla rete che scaricabile (si scaricano i
file che definiscono il grafo) → se si ha bisogno di
usarlo per una qualsiasi soluzione NLP, c'è un buon
Python
con molti strumenti per l'NLP, che permette anche di interrogare facilmente WordNet e di navigare al suo interno. La WordNet
dell'inglese americano è enorme e ricca ma, a partire da quel periodo, molti progetti hanno iniziato a costruire WordNet per le
lingue nazionali e ci sono stati progetti su gruppi di WordNet per diverse lingue allineate! Per l'italiano abbiamo ItalWordNet e
MultiWordNet.

Disambiguazione del senso delle parole - WSD


Si tratta di un compito molto classico della semantica lessicale: è più o meno l'equivalente, a livello semantico,
dell'etichettatura PoS (che è per il livello sintattico): si ha una parola che può assumere diversi significati e si deve decidere
quale significato è quello corretto in quello specifico contesto.
In questo caso il problema è piuttosto
complesso, poiché abbiamo bisogno di un
dizionario di riferimento che elenchi, in modo
formale, tutti i significati della nostra parola
target.
● Per l'inglese, WordNet è il
"dizionario" di riferimento utilizzato
per questo compito.

In genere ci sono omonimi che uno


strumento automatico è in grado di
disambiguare abbastanza facilmente (ad
esempio, banca si riferisce sia all'istituzione che
alla barriera di terreno che contiene fiumi e laghi
→ loro
sono due significati completamente diversi che non condividono nulla) → ottima performance, 95%!
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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]

Esistono vari approcci per risolvere questo problema:


1. WSD supervisionato basato su un algoritmo stocastico Naive Bayes
○ Questo è l'approccio stocastico classico
○ Data una parola w, a cui è associato un insieme di sensi 𝑠 = {𝑠1, ..., 𝑠𝑛}
(otteniamo i sensi dalla risorsa lessicale di riferimento), allora potremmo
impostare la soluzione del problema dicendo che otteniamo il senso che ha la
più alta probabilità condizionata a un insieme di caratteristiche f estratte dal
contesto → Dobbiamo disambiguare w in un dato contesto c
○ Anche in questo caso applichiamo la regola di Bayes, eliminando il
denominatore (poiché non fa parte dell'argmax e stiamo massimizzando sul
senso) → quindi, per stimare questa probabilità, abbiamo bisogno di un corpus
annotato che disambigui ogni parola ambigua a mano rispetto alla risorsa
lessicale
○ Possiamo stimare queste probabilità nel numeratore a partire dal corpus
annotato, ma sfortunatamente abbiamo il problema della legge di Zipf: se
l'insieme di caratteristiche è molto grande è quasi impossibile trovarlo
specificamente nel corpus di addestramento, quindi dobbiamo introdurre alcune
assunzioni di indipendenza: le caratteristiche sono tutte indipendenti l'una
dall'altra
■ Si può immaginare l'insieme delle caratteristiche come l'insieme
delle parole lessicali della frase → stiamo misurando le volte in cui
la parola target
co-occorrono nel corpus di addestramento con ogni parola della frase
○ È possibile semplificare l'equazione e stimare le due probabilità dal corpus
contando quante volte una parola assume un determinato senso e quante volte
una determinata caratteristica co-occorre nella stessa frase con un senso della
parola target
2. L'algoritmo di Lesk
○ Si tratta di un algoritmo molto più intelligente: l'idea alla base è tuttora utilizzata per migliorare le
prestazioni anche di soluzioni neurali per WSD
○ L'idea è che, se si dispone di una risorsa lessicale che, per qualsiasi significato, ha un gloss che
descrive quel significato e alcuni esempi collegati a quel significato, e poi si ha una parola da
disambiguare che può assumere diversi sensi (ogni senso
con un gloss e il rispettivo significato),
si può scegliere il senso che ha la
massima sovrapposizione tra le
parole nel gloss e quelle nel
contesto
■ Rimuovete le stopword dai
gloss e dagli esempi e
misurate la sovrapposizione
con le parole nella frase che
contiene la parola target (ad
esempio, mutuo è sia nella
frase che in un esempio,
depositi è sia nella frase che
nel gloss = sovrapposizione
di 2)
○ Se il dizionario di riferimento è una WordNet, è possibile aumentare l'insieme delle parole sia per il
contesto che per quelle che definiscono i diversi sensi, ad esempio utilizzando la relazione di iponimia e
iperonimia.
→ è possibile arricchire l'insieme di parole in modo da ottenere una maggiore sovrapposizione e quindi
scegliere quella che presenta una maggiore sovrapposizione.
○ Si tratta di un'idea molto intelligente e vecchia che è ancora utile al giorno d'oggi anche per le reti neurali.
3. Soluzione DNN - Bevilacqua, Navigli (2020)
○ Questa è una delle migliori soluzioni per risolvere il problema WSD al giorno d'oggi.
○ Come input si ottiene una frase con una parola target che può avere diversi significati definiti
nel synset
○ Utilizzando un trasformatore BERT per produrre una rappresentazione intermedia e un semplice DNN
feed-forward, è possibile calcolare la distribuzione di probabilità di avere un senso sul possibile insieme
di sensi, sull'intero insieme di sinset
(WordNet è la risorsa lessicale di
riferimento!).
○ Produrre una distribuzione di
probabilità sull'intero insieme di
sensi, dato che la parola target
potrebbe avere un numero limitato
di sensi, è un'assurdità!
■ Gli studiosi hanno
quindi sviluppato una
struttura
-- 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!

Semantica del telaio

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.

Come valutare un sistema: il sistema Electra-AGE_FE di F. Tamburini


Questo sistema cerca di risolvere il compito di identificazione dei fotogrammi (FI).
● ❗ Non preoccupatevi della descrizione del sistema, ma prestate attenzione ai tipi di operazioni per la valutazione di
tale sistema, in quanto sono un ottimo esempio del processo necessario per pubblicare un articolo in NLP.
Questo sistema presenta molti blocchi diversi: uno relativo all'incorporazione del grafo, uno relativo alla parola target e alla
classificazione e un altro alla classificazione degli elementi del frame.
Come valutare il sistema? Ci troviamo subito di fronte al problema del benchmark corretto: qual è la scelta migliore? Si
tratta di testare il sistema su qualsiasi benchmark, in modo da confrontarlo con tutti gli altri sistemi aggiornati.
● Per questo problema specifico sono stati presi in considerazione due benchmark specifici (FN 1.5 e FN 1.7), che
però hanno utilizzato split e criteri di pulizia diversi, creando una grande confusione → il sistema ha dovuto essere
testato su sette esperimenti diversi, combinando i diversi split e criteri di pulizia
Ogni volta che si presentano i risultati dei sistemi DNN, è necessario eseguire più di un esperimento (almeno 10) e
presentare la media e la deviazione standard delle metriche utilizzate.
Se il vostro sistema è complesso e composto da diversi moduli, dovreste fare uno studio di ablazione: scoprire qual è il
modulo che fa aumentare le prestazioni (aggiungendo e rimuovendo diversi moduli).

Quali sono quindi i passi da compiere per valutare i sistemi?


1. Prestare attenzione al numero di benchmark e ai criteri di suddivisione presenti in letteratura
2. Eseguire più di una prova con la stessa configurazione per avere un'idea chiara di quali sono le prestazioni
(utilizzando la media e la deviazione standard).
3. Fate lo studio dell'ablazione perché le persone vorrebbero sapere quali sono i miglioramenti (nel caso in cui il
vostro sistema sia molto buono e migliore dello stato dell'arte) che hanno permesso al vostro sistema di
funzionare in modo così buono!

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.

Spazi di parole - Principi


● Ipotesi distributiva: parole con proprietà distributive simili hanno significati simili.
● Metafora geometrica del significato: i significati sono luoghi in uno spazio semantico e la somiglianza semantica
è la vicinanza tra i luoghi.

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.

Esempio: il primo esempio di costruzione di tali vettori


Corpus: Di cui non si può parlare, si deve essere
silenzioso. Bisogna fare silenzio.
Costruiamo quindi la matrice di co-occorrenza, in cui da
un lato abbiamo tutte le forme di parola (≠ lemma) per tutti i
token del corpus e dall'altro abbiamo esattamente la stessa
cosa: è una matrice enorme con i token su entrambi i lati. Nelle
celle contiamo quante volte una parola co-occorre con
un'altra parola nello stesso contesto (di solito il contesto è
una frase, in questo esempio sarà ±1).

Se consideriamo tutte le righe della matrice, abbiamo


accumulato tutte le informazioni distributive del token-parola di
quella riga.
Ogni riga della matrice è esattamente il vettore. Due parole che co-occorrono in un contesto simile significa che co-
occorrono più o meno nello stesso insieme di parole e i due vettori finiscono per essere molto simili.
● Ogni riga della matrice di co-occorrenza rappresenta un punto nello spazio n-dimensionale associato a una parola specifica.
→ possiamo confrontare la somiglianza tra due parole semplicemente misurando la distanza tra i due vettori
● Una cella della matrice di co-occorrenza contiene la frequenza di co-occorrenza di una parola con un'altra.

Ci sono molte distanze da utilizzare:


● La somiglianza più utilizzata è la somiglianza del coseno
○ In qualsiasi spazio, i vettori possono essere visti come "frecce" che congiungono l'origine dello spazio con qualsiasi punto
○ La somiglianza del coseno misura il coseno dell'angolo tra i due vettori: se le due parole sono molto
simili, appartengono a un contesto simile e hanno vettori simili, allora la somiglianza del coseno è
prossima a 1.
○ La somiglianza del
coseno va da -1 a +1
■ La somiglianza
più bassa è zero
■ -1 significa
qualcosa, in
qualche
misura!
○ Questo era il primo
approccio, molto semplice
da capire
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

L'approccio della similarità del coseno presenta alcuni problemi:


1) La matrice di co-occorrenza è enorme: su entrambi i lati abbiamo la lista di token
○ All'epoca i modelli reali utilizzavano solo le parole/token più frequenti nel corpus per limitare la
dimensione della matrice.
○ Questa matrice è una matrice rada: la grande maggioranza delle celle è riempita con 0: nessuna parola può co-occorrere con
tutte
le altre parole → questi modelli sono costruiti su parole lessicali, e le stop words sono tipicamente rimosse
○ Questa elevata dimensionalità ha portato alla creazione di vettori molto lunghi che specificano
le informazioni distributive di una parola (ad esempio, vettori di 20 mila componenti, difficili da
gestire).
○ Landauer & Dumais (1997) hanno proposto di applicare una tecnica matematica per ridurre e
trasformare le informazioni da uno spazio a uno spazio dimensionale inferiore, mantenendo
la massima quantità di informazioni.
■ Quando si riduce da uno spazio a un altro si finisce per perdere alcune informazioni, ma le
tecniche di riduzione della dimensionalità (definizione del valore singolare, scalatura
multidimensionale...) fanno del loro meglio per mantenere la massima quantità di
informazioni riducendo lo spazio.
■ Le parole che erano vicine nello spazio originale lo saranno anche nello spazio dimensionale
inferiore: si mantiene lo stesso tipo di somiglianza semantica avendo uno spazio molto più
gestibile.
■ Al giorno d'oggi si gestiscono in genere vettori di 50-1000 componenti.
■ Comprimendo lo spazio, la tecnica di riduzione della dimensionalità è stata anche in grado
di far emergere le dimensioni latenti e, in particolare, le co-occorrenze di ordine superiore.
● Nella matrice di co-occorrenza si sa che A co-occorre molto spesso con B e B co-
occorre molto spesso con C, ma non si può dedurre che anche A co-occorre molto
spesso con C → riducendo la dimensionalità, emergono anche co-occorrenze di alto
ordine: lo spazio finale risulta essere più informativo e più ricco di relazioni di
similarità rispetto a quello originale
■ Questo modello ha dato il via ad una rivoluzione: a quel punto abbiamo iniziato a concepire le unità linguistiche
come vettori
2) Polisemia
○ Se si ha una parola polisemica che può avere due significati diversi (ad esempio, banca) e si fondono
insieme tutti i contesti in cui è possibile trovare questa parola in un corpus, allora si intermezzano i due
significati e si ottiene un solo vettore contenente entrambi i contesti → questo approccio può offuscare un
po' il modello finale
○ Si può tentare di risolvere parzialmente questo problema utilizzando i grafici di co-occorrenze
■ Raccogliendo i vettori e applicando alcune tecniche simili al grafo di co-occorrenza è possibile
indurre, a partire dai testi, i diversi significati di una parola polisemica

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]

Non abbiamo bisogno di predire una parola nel


mezzo, questa rete è completamente inutile... ma
l'informazione immagazzinata nella matrice tra gli
input
-- 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.

Hanno proposto due architetture:


● CBOW: dato un contesto, predire la parola al centro
● Skip-Gram: data la parola al centro di un contesto, prevedere una o più parole del contesto.

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.

2017 - Incorporazione contestuale di parole


Nel 2017 gli studiosi hanno iniziato a proporre embeddings di parole contestualizzati (o dinamici).
L'idea è che ogni token possa ricevere un embedding specifico dato il contesto, la frase in cui viene introdotto:
l'embedding è in parte condiviso con tutti i contesti, in parte specifico per questa frase. In linea di principio, le parole
polisemiche possono ricevere due incorporazioni diverse a seconda del contesto, le incorporazioni sono contestualizzate
dinamicamente.
● Il primo metodo è stato ELMO, utilizzato per un anno.
● 2018 - BERT → questa è un'altra grande rivoluzione.

Rappresentazioni di codificatori bidirezionali da trasformatori (BERT)


Si tratta di un modello che utilizza solo la pila di encoder.
Google lo ha presentato alla fine del 2018 e lo ha pubblicato nel 2019 (Devlin et al.). È composto da una pila di
codificatori (12 o 24 a seconda del tipo di modello utilizzato) che prende in ingresso embeddings di parole (può anche avere
un embedding posizionale aggiuntivo) e BERT può ricevere una o due frasi.
BERT è stato addestrato
utilizzando due compiti diversi:
Masked Language Model (l'input
è una sola frase con il 50% delle
parole mascherate/rimosse → il
modello deve prevedere la parola
rimossa) e Next Sentence
Prediction (l'input è costituito da
due frasi con un separatore nel
mezzo e il modello viene
addestrato a prevedere se la
seconda frase segue realmente
la prima).

❗ 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]

E i vettori associati a frasi o testi?


Fin dall'inizio, dall'analisi semantica latente, visto che le incorporazioni di parole sono così potenti e forti nell'aiutarci
Per risolvere le applicazioni pratiche, gli studiosi hanno iniziato subito a pensare di ottenere vettori simili per frasi e testi.
Immediatamente hanno iniziato a pensare di combinare i vettori di parole con strumenti matematici, ma i vettori hanno
proprietà commutative e associative che erano dirompenti per i linguisti (non si possono scambiare le parole, come dice la
proprietà commutativa, né riorganizzare le strutture sintattiche, come dice la proprietà associativa). Così, i linguisti hanno
iniziato a pensare al prodotto tensoriale, un prodotto che non è commutativo, ma ogni volta che si moltiplicano due vettori si
aumentano le loro dimensioni: si costruisce una matrice, e poi la si deve moltiplicare per un altro vettore e si ottengono
strutture sempre più grandi e non comparabili! Un bel pasticcio dal punto di vista matematico.
Il modo giusto è stato scoperto da Mikolov (Le, 2014): essi hanno introdotto una leggera variazione di Word2vec
● Il modello e il codice sono esattamente gli stessi
● L'idea è stata quella di introdurre all'inizio di ogni unità testuale (a scelta dell'utente: si possono creare vettori
per frasi, interi testi...) una parola falsa (assicurandosi che non appartenga alla lingua considerata)
● La prima parola per ogni unità viene trattata in modo diverso rispetto alle altre: viene inserita nello stesso contesto
per l'intero calcolo all'interno dell'unità
○ Se si decide che la frase è la propria unità, Word2vec prende in considerazione il primo blocco e poi si
sposta (le 10 parole sono sempre diverse) mentre qui la parola falsa fa parte del calcolo dell'intero
paragrafo e contribuisce alla predizione e alla fine riceveremo una
vettore per tutte le informazioni relative alla frase
○ Si può usare questo vettore per la classificazione delle frasi,
come input per l'addestramento del classificatore in qualsiasi
compito che coinvolga un testo di grandi dimensioni.

A quel punto, ci si è resi conto che utilizzando le DNN siamo anche in


grado di costruire vettori di testo o vettori di frasi di grandi dimensioni. Per
la creazione di embedding di frasi sono stati quindi utilizzati diversi tipi di NN:
autoencoder (basati su RNN o CNN)
● Come si formano gli autoencoder? Si ottiene una sequenza di parole in
ingresso, poi si ha una parte di codificatore che riduce/comprime la
dimensione e una parte di decodificatore che ricostruisce la frase in
ingresso → la rete viene addestrata per ricostruire l'ingresso in uscita,
ma nel mezzo si riduce la quantità di informazione passata

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.

Molte architetture e diverse configurazioni... dobbiamo discutere come è cambiato il mondo


delle caratteristiche di input nella linguistica computazionale?
Prima delle word embeddings, per ogni compito da risolvere si doveva pensare a
quali fossero le caratteristiche migliori per risolvere tali compiti.
● Se ci concentriamo su PoS e cerchiamo di risolverlo con HMM sappiamo già che
utilizzeremo due probabilità
● In CRF, un altro modello stocastico, abbiamo più combinazioni di tratti linguistici che
possiamo prendere in considerazione
● Se utilizziamo SVM, possiamo considerare un insieme molto ampio di vettori di caratteristiche numeriche.
● Per gli NN classici è esattamente la stessa cosa: dobbiamo scegliere le
caratteristiche di ingresso, definendo il vettore di caratteristiche
Ma dobbiamo scegliere queste caratteristiche manualmente (feature engineering).
Dobbiamo identificare manualmente le caratteristiche di input e le prestazioni del sistema sono critiche.
da questo dipendeva (un cattivo lavoro significava un cattivo sistema). Le parole erano banalmente ricodificate come simboli:
una parola non significava altro che la sequenza di caratteri (senza informazioni aggiuntive), non erano altro che simboli. Se le
ricodifichiamo come numeri interi non cambia nulla: ancora nessuna informazione in più.
Ora, con le incorporazioni contestualizzate di parole/sentenze/testi, forniamo a qualsiasi sistema di ML
informazioni di base in ingresso che contengono un'enorme quantità di informazioni.
● Consideriamo un semplice sistema di ML per il tagging dei PoS: prima conteneva solo le parole e le parole
precedenti/successive, ma ora, con il word embedding, stiamo fornendo informazioni distributive complete sul
comportamento di ogni unità nel contesto, in un testo reale → stiamo fornendo una quantità enorme di informazioni!
Negli ultimi dieci anni, le rappresentazioni vettoriali hanno rappresentato una vera e propria rivoluzione: ogni tipo
di struttura può essere trasformata in un vettore, esibendo le proprietà distributive dei vettori di parole distribuite. Il
campo dell'apprendimento delle rappresentazioni è diventato la vera rivoluzione degli ultimi dieci anni. Il cambiamento di
rappresentazione è un cambiamento di paradigma: non pensiamo più ai simboli, ma ai vettori!

25 ott. 2022
Risolvere i compiti a valle
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

Come si risolvono i compiti a valle con i trasformatori?


Sappiamo già che i trasformatori sono DNN che stanno raccogliendo tutte le attenzioni, vengono impiegati per
risolvere quasi tutti i problemi e, in particolare, l'idea di base per utilizzare un'architettura di trasformatori pre-addestrati per
risolvere qualsiasi tipo di compito a valle è quella di mettere a punto il trasformatore aggiungendo un piccolo pezzo di NN, la
"testa di classificazione", dopo il trasformatore. In genere, questo è sufficiente per mettere a punto l'architettura in modo da
fare previsioni per un determinato compito.

Esistono due modi diversi di applicare questa soluzione:


1) Si addestrano solo gli strati aggiuntivi che sono stati aggiunti dopo l'architettura del trasformatore (BERT).
○ Il trasformatore può essere addestrato in modo non supervisionato su un corpora molto ampio.
○ Abbiamo un modello linguistico pre-addestrato, aggiungiamo uno o più strati aggiuntivi e addestriamo
solo questi strati aggiuntivi per il compito a valle (utilizzando l'approccio standard: abbiamo bisogno di
un corpus annotato che può essere piccolo, dato che stiamo provando un piccolo NN)
○ Questo significa che i gradienti che si
propagano dall'uscita non vengono propagati
al trasformatore: si congelano i pesi del
trasformatore e si blocca la propagazione
del gradiente quando raggiunge il
trasformatore.
○ Questa potrebbe essere una buona
soluzione quando abbiamo poche
possibilità computazionali: retropropagare i
gradienti all'interno della trasformazione
richiede molto tempo ed è un processo
pesante dal punto di vista computazionale,
congelare il trasformatore è una buona idea.
○ Vantaggio: è possibile riutilizzare il
trasformatore per compiti diversi, cambiando
semplicemente il classificatore.
2) Messa a punto dell'architettura completa in base
all'attività a valle
○ Il trasformatore è ancora preaddestrato (viene
fornito con tutti i pesi più o meno stabiliti e
fissati), ma i gradienti apportano piccole
modifiche e aggiornamenti anche all'interno
del trasformatore.
○ A seconda dell'attività, alcuni gradienti
retroagiscono attraverso il trasformatore
è possibile modificare alcuni pesi, aumentando le prestazioni dell'intera architettura per questo
specifico compito a valle → si salva e si utilizza l'intero modello, poiché il trasformatore potrebbe essere
stato modificato durante l'addestramento!
○ In linea di principio questa soluzione dovrebbe fornire risultati migliori, ma è sempre necessario provare, nulla è sicuro.
○ Questa soluzione e i suoi surrogati sono la soluzione standard per le attività di NLP, che producono lo stato dell'arte
■ Dal punto di vista della ricerca, questo approccio ha completamente appiattito gli approcci alla
ricerca: non c'è modo di battere questa configurazione ora: è molto probabile che le prestazioni
del vostro nuovo sistema ricercato saranno peggiori di questa soluzione → non ci sono soluzioni
concorrenti, questo approccio domina quasi questo campo

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).

Come possiamo risolvere alcuni compiti?


Prima di tutto è necessario un benchmark per addestrare il classificatore e per testare le prestazioni complessive del
sistema (la valutazione è una parte fondamentale di qualsiasi impresa). Uno dei benchmark più comuni è il benchmark GLUE
ed esistono molti tipi diversi di benchmark: sull'accettabilità (se una frase è accettabile o meno da parte di un parlante
madrelingua), sull'analisi del sentimento, sulla somiglianza e sull'analisi del testo.
compiti di parafrasi, compiti di inferenza (ad
esempio, se un testo implica un altro testo)...
Questo è il tipico set di benchmark su cui
vengono valutati i trasformatori per dimostrare
l'effettivo miglioramento della nuova soluzione.
Per qualsiasi compito da risolvere è
necessario un benchmark, un corpus
annotato per addestrare l'ultima parte
dell'architettura e valutare i risultati.

Ci sono molte applicazioni/compiti:


1. Classificazione dei documenti
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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

✱ Analisi del sentimento basata su regole


Per questo compito, abbiamo bisogno di lessici annotati: per ogni parola polarizzante si segna il tipo di polarità (magari in una scala da -1 a
+1): parole generiche, negatori
(parole che possono invertire la
polarità) e intensificatori
(possono intensificare o ridurre
il contributo di alcune parole
polarizzanti).
Dato il lessico annotato, si
hanno alcune regole di
propagazione della polarità da
derivare
La polarità della frase o del testo viene ricavata dalla polarità delle parole (ad
esempio, i negatori e gli intensificatori moltiplicano i valori delle parole comuni). Un
approccio di base è quello di sommare semplicemente la polarità di ogni parola... ma si
può vedere come questo non funzioni! Dobbiamo utilizzare l'analisi sintattica della
frase.

Socher (2013) ha seguito più o meno lo stesso approccio, ma la fusione delle


polarità è stata fatta seguendo un albero sintattico con un NN, che ha deciso come
fondere le polarità.
polarità diverse.

� Se non si vuole usare la lexica per l'analisi del sentimento, si possono


semplicemente mettere a punto i trasformatori:
● La prima possibilità è quella di prendere l'output per il primo token falso (il BERT inserisce un token falso
all'inizio e uno alla fine), utile per addestrare un classificatore per la predizione (è usato in modo simile ai vettori di
paragrafo)
○ Viene utilizzata una parola fittizia per contrassegnare l'inizio della frase e il trasformatore viene
addestrato in modo tale che l'output corrispondente sia una sorta di embedding riassuntivo dell'intera
frase.
● Il secondo approccio consiste nel non utilizzare alcun token falso, ma nel calcolare la media dei risultati degli
ultimi quattro livelli per tutte le parole della frase reale e quindi addestrare il classificatore a prevedere il
risultato reale.
Questi sono due modi tipici di mettere a punto i codificatori trasformatori per i problemi di classificazione del testo:
non solo per l'analisi del sentimento, ma per qualsiasi compito di classificazione del testo.

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...

2. Classificazione delle parole


Il Name Entity Recognition è un compito che consiste nell'individuare e classificare le entità nominate nei testi in
categorie predefinite (ad esempio, nomi di persone, organizzazioni, località...). Il modo standard per risolvere questo
problema è utilizzare il cosiddetto formato BIO (Beginning, Inside, Outside): l'idea è di classificare ogni token come token
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

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]

� La soluzione standard con i trasformatori è una commistione di RNN


(LSTM bidirezionale) seguita da una CRF condizionale.
● Abbiamo visto questa architettura per il tagging dei PoS prima dei
trasformatori Oppure possiamo anche mettere a punto un modello BERT
pre-addestrato (di nuovo, lo stesso): per
per ogni parola abbiamo un embedding di parola contestualizzato, strati di
classificatore lineare (uno o più) e si ottengono le etichette di uscita per ogni parola.
Si tratta esattamente della stessa soluzione di prima, ma il compito è diverso:
l'architettura è la stessa, ma l'addestramento è diverso.

Per quanto riguarda i problemi di classificazione delle parole, Tamburini ha eseguito


gli stessi esperimenti per il PoS tagging, il PoS tagging sulle dipendenze universali, il
Named Entity Recognition...

La conclusione è che non abbiamo più ricerche: i trasformatori risolvono


sempre il problema con un piccolo difetto nel modo migliore. Noi
non è necessario fare alcuna ricerca, purché non si produca un'architettura migliore dei trasformatori. Per lo stato dell'arte, la
soluzione attuale è la più semplice e performante.

3. Similitudine semantica testuale


Si può risolvere con una soluzione di embedding di frase: si confrontano i due embedding per decidere quanto sono
simili. Si può usare l'architettura siamese! Con sette righe di codice si riesce a risolvere un problema di somiglianza semantica
tra testi.
Questo approccio produce i migliori risultati (si veda il documento originale che propone SentenceBERT).

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.

Prompt dei modelli linguistici pre-tracciati

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:

Fino al 2010/2, il primo


approccio era un apprendimento
completamente supervisionato,
non basato su DNN con ingegneria
delle caratteristiche (dovevamo
scegliere quali caratteristiche
dovevano essere incluse nella
definizione dell'istanza, il vettore di
input). I compiti di classificazione
necessitavano di un addestramento
specifico, così come i compiti di
etichettatura delle sequenze e di
generazione del testo → questi tre
esempi coprono più o meno l'intero
panorama e richiedono tutti un
addestramento specifico e
caratteristiche specifiche. La
modellazione del linguaggio, a quel
tempo eseguita con gli N-grammi,
era solo una parte del gioco, non
proprio
-- PNL -- appunti di conoscenza aperta -- disponibile gratuitamente -- NON VENDERE --
[Link]

aggiungere qualcosa di estremamente rilevante ad altri compiti.

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.

Quanto sono grandi i modelli linguistici pre-addestrati?


Le dimensioni dei modelli linguistici pre-addestrati sono progredite nel
corso degli anni. La scala logaritmica rappresenta il numero di parametri di
ciascun modello, il numero di numeri in virgola mobile che compongono
l'intera DNN, l'intero trasformatore e il numero di parametri che compongono
il modello.
● Se in un MLP si hanno 10 pesi, si tratta di un modello
contenente 10 parametri.
Il primo modello linguistico contestualizzato, ELMo, era composto da
94 milioni di parametri; mentre BERT aveva 340 milioni di parametri
(2018), GPT-2 aveva 1,5 miliardi di parametri..., GPT-3 ha 175 miliardi di
parametri. Alla fine del 2021, abbiamo Megatron-Turing, una forza
congiunta tra Nvidia e Microsoft, composta da oltre 500 miliardi di
parametri, addestrata con 870 TB di testi in chiaro (per fare un paragone,
Wikipedia è 18 GB)... ora stanno cercando di preaddestrare un modello
linguistico che superi i 1000 miliardi di parametri.
A partire dal GPT-3, gli studiosi hanno iniziato a vedere che questi
modelli sono in grado di creare nuovi testi, poesie... si possono dare alcuni
input e loro possono continuare a creare testi, rispondere a domande e così
via, semplicemente continuando a generare testi! I testi generati sono così
buoni che possono essere confusi con quelli prodotti dall'uomo.

Gli studiosi hanno iniziato a pensare a un modo diverso di


utilizzare tali modelli linguistici. L'idea della prossima ondata sta
spingendo
● Chiedere semplicemente a un modello linguistico preaddestrato di grandi dimensioni di completare il compito come se fosse umano.
● È sufficiente preparare il prompt giusto per iniettarlo nel modello linguistico preaddestrato per avviare il processo, in
modo che sia in grado di completare il prompt e il processo.
● Esempio: vogliamo risolvere un compito di sentiment analysis
○ Scrivete un piccolo testo in cui spiegate qual è il compito (scritto in inglese), poi date una piccola serie di
esempi con uno schema che classifica i testi; poi iniziate con l'input reale, seguendo lo stesso schema
→ chiedete al modello linguistico di aggiungere un'altra parola al testo di input e lui risponderà
○ Questo è il motivo per cui si chiama apprendimento a pochi colpi: si forniscono pochi esempi.
Se si riesce a preaddestrare un modello linguistico molto grande (con un'enorme quantità di testi), il modello linguistico sarà in grado di
rispondere a una domanda scritta in chiaro.

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.

La "Santa Trinità" dell'IA e della PNL


1. Algoritmi
○ Tutti gli algoritmi per la gestione di questi modelli possono essere scaricati liberamente da Github:
i codici sono disponibili
2. Dati
○ Per preaddestrare il modello linguistico abbiamo bisogno di un'enorme quantità di dati che devono
essere curati: abbiamo bisogno di testi buoni e puliti, e abbiamo un'esperienza di 40 anni nella
costruzione di corpora, è solo una questione di scala... possiamo farlo.
○ E i modelli addestrati? Al giorno d'oggi questi sono una sorta di strumenti chiave che molte aziende non
condividono, ma a febbraio e marzo Meta AI, infastidita da questo approccio di mantenere segreto il
modello linguistico pre-addestrato, ha addestrato enormi modelli linguistici nei propri server e li ha
consegnati liberamente agli studiosi.
○ È possibile scaricare molti modelli, fino a un modello GPT-3!
3. Calcolo
○ Abbiamo la potenza di calcolo necessaria per utilizzare o addestrare questi modelli?
○ Una tabella di NVIDIA mostra, in relazione alle dimensioni del modello, il numero di GPU necessarie per
l'addestramento di un modello... e anche per utilizzare semplicemente questi modelli, abbiamo bisogno di
molte GPU!
○ Quali sono le infrastrutture di calcolo in Italia?
■ Il Cineca dispone di un ottimo supercomputer: MARCONI100, circa 980 nodi
● Possiamo entrambi addestrare un modello nuovo di zecca su questo
supercomputer, ma dovremo occuparlo per molto tempo e questo non ci
sarebbe consentito.
● Non c'è speranza che un singolo studioso abbia abbastanza potenza di calcolo per
addestrare un nuovo modello linguistico (ad esempio per l'italiano).
■ Potete pagare per i servizi di Google o Amazon
■ Comprare un sistema locale (buona fortuna con i soldi, sono 150000 dollari per quattro GPU...)
○ Siamo semplicemente fuori dal gioco, e la prossima ondata sarà studiata e sviluppata da Google,
NVIDIA, Microsoft, e non da noi...

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).

Potrebbero piacerti anche