Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
RETI NEURALI
a.a. 2020-2021
Capitolo 1
• interesse di natura biologica: cercare di capire come funzionano i veri cervelli ani-
mali attraverso modelli di computazione neurale (legato alle neuroscienze, per
capire di più la biologia di questo sistema),
• costruzione di algoritmi di machine learning ispirati alla biologia del cervello (dalla
quale si possono discostare) e usati per risolvere problemi di diversa natura.
I modelli che studieremo sono reti di neuroni intese come unità computazionali legate
una all’altra in modo gerarchico (l’informazione è processata a strati). L’obiettivo è di
costruire modelli che riescono a processare un’informazione anche quando l’input è del
tutto nuovo (ad esempio rete neurale che processa immagini dopo che è stata addestrata
a risolvere task). Le reti neurali artificiali sono state richiamate come il deep learning
(imparare le caratteristiche implicite del dataset usando reti neurali), reti neurali che
hanno più livelli di neuroni. negli ultimi anni ci sono stati molti sviluppi dal punto
di vista sia applicativo che concettuale, anche se le basi c’erano da molto tempo. Le
reti neurali che studieremo sono un particolare tipo di algoritmi di machine learning
(abilità di imparare senza essere programmato appositamente), il quale a sua volta è
compreso nell’intelligenza artificiale (tecniche che permettono ai computer di imitare il
comportamento umano).
Machine learning
Il machine learning è un campo di studio che cerca di dare ai computer le abilità di
imparare dai dati senza essere esplicitamente programmati: sulla base di tanti esempi
(dataset possibilmente grandi), la macchina è in grado di estrarre informazioni senza il
bisogno di scrivere esplicitamente le regole per passare dall’input all’output. Operativa-
mente, il machine learning è definito da una certa misura di performance dell’algoritmo,
da un task e dall’esperienza. L’esempio classico è quello della classificazione delle mail,
ovvero dell’identificazione di mail di spam. Il task è di classificare le mail tra spam e
non spam; l’esperienza, ovvero il modo in cui si può allenare l’algoritmo, è data da una
classificazione manuale di mail. Si può quindi misurare la sua performance andando
ad analizzare la percentuale di mail che ha classificato in modo corretto. La differenza
sostanziale con la programmazione tradizionale è che il computer, dato un dataset e un
certo output che voglio, scriva le regole per assolvere questo task. Ad esempio, è difficile
scrivere un codice con regole dure sulle features che faccia la classificazione delle mail
sulla base di queste, ma da utente si riesce facilmente a dare una label ad ogni mail
2
1.1. INTRODUZIONE ALLE RETI NEURALI 3
anche se lo spazio dei dati è molto complicato: tocca quindi al computer capire quali
sono le features che gli servono per fare la classificazione vedendo come abbiamo dato
noi le label.
Il computer quindi è allenato attraverso tanti esempi e non tramite una definizione speci-
fica e rigorosa (esempio: riconoscimento dei volti un’immagine): abbiamo a disposizione
in questo periodo storico numerosi dataset, molti già labellati. Questi algoritmi non sono
applicati solo alle immagini: ad esempio, sono usati anche per il riconoscimento di parole
o nella sanità (informazioni delle cartelle cliniche digitalizzate per analizzare ad esempio
i raggi X o immagini di lesioni della pelle).
Esempi tipici di task per cui il machine learning può essere molto utile sono:
• riconoscimento pattern: volti o espressioni facciali, lettere o parole, immagini me-
diche,
• generazione pattern: generare immagini o sequenze una volta inferite statistiche
sui dati,
• riconoscimento anomalie: transazioni sospette, rilevamenti inusuali in un impianto
nucleare.
Sebbene per noi il riconoscimento delle immagini risulti essere una task semplice, è molto
complesso per il computer in quanto deve tenere conto della segmentazione (ci sono più
oggetti nella stessa immagine), della deformazione (gli oggetti di una stessa categoria
possono essere deformati anche in modi non affini) e della funzione (gli oggetti sono spesso
definiti in base al loro utilizzo). Inoltre, la posizione dell’oggetto non deve influenzare
la classe e le feature devono quindi esser invarianti rispetto a trasformazioni. Il machine
learning viene solitamente diviso in tre categorie:
• supervised learning: ho esempi di input in cui so qual è l’output giusto (labelled)(la
maggior parte delle applicazioni si basa su questo tipo di ML): si divide in fare
classificazione (separare le osservazioni in diverse variabili categoriche a partire
da caratteristiche definite) e regressione (il valore di output non è una variabile
categorica, ma uno scalare: attraverso un set di (xi , yi ), si cerca di capire la funzione
che associa a ciascun valore di x un valore di y),
• unsupervised learning: ho tanti dati senza label e l’obiettivo è cercare strutture nei
dati (clutersing, riduzione della dimensionalità senza perdere troppe informazioni,
estrazione di variabili nascoste che determinano alcune caratteristiche),
• reinforcement learning: ho un agente e un modello dell’ambiente in cui si può muo-
vere con delle strategie e in base ai rewards che ottiene adottando queste strategie
cambierà le sue scelte.
I dendriti raccolgono i segnali che arrivano al neurone, solitamente da altri assoni tramite
sinapsi. Se questi segnali sono sufficienti ad accendere il neurone, questo fa firing e il
cono di integrazione manda uno spike, ovvero un impulso, che viaggia attraverso l’assone.
Le sinapsi non sono uguali tra di loro e possono cambiare nel tempo: può avvenire
l’adaptation, in quanto la densità dei recettori può cambiare, quindi gli input sono pesati
in modo diverso rispetto alla sinapsi permettendo di fare task diverse. Una volta che il
1.2. MODELLO DEL NEURONE 5
neurone ha mandato lo spike, c’è un periodo refrattario: il neurone deve aspettare una
certa quantità di tempo prima di poter fare firing di nuovo, a prescindere dai segnali in
ingresso.
Ora vediamo un modello di neurone sviluppato negli anni 40, in particolare il modello
di percettrone sviluppato da McCulloch e Pitts nel 1943. Questo modello è molto
semplificato ed è stato ripreso successivamente. Il nostro obiettivo è catturare gli input
x1 , . . . , xD che arrivano al neurone. I diversi input vengono pesati in modo diverso perché
c’è eterogeneità tra le sinapsi: definiamo quindi diversi pesi w1 , . . . , wD . Il neurone quindi
fa una somma di questi segnali pesati e sulla base di questa somma se fare firing oppure
no: il suo output dovrà essere una funzione a scala, dove se la somma è maggiore di una
certa soglia T l’output cambia. Nel modello originale gli input erano variabili binarie
(0, 1), così come l’output. Questo modello cattura strutture biologiche in grado di fare
task, ma ha fortissime analogie con i circuiti che permetteva un’implementazione anche
a livello di hardware.
Nel dettaglio, l’input è un vettore D-dimensionale x, come anche i pesi. La somma quindi
diventa wT x e l’output ŷ è 1 se wT x ≥ T oppure 0. Fino alla somma il sistema è lineare,
poi viene introdotta una non linearità chiamata funzione di attivazione che cattura il
concetto di azione binaria.
L’input viene immesso all’interno di tanti neuroni che formano un brain: questi analizzato
l’input e lo trasformano in un set di feature utili per lo specifico task per cui la rete è
stata addestrata e l’output viene restituito attraverso una regressione sotto forma di un
vettore Rn . Si parla di regressione in quanto la neural net costruisce ŷ = fˆ(x, w, T ).
Se assumiamo che esista una funzione vera data dalla natura y = f (x) che associa ad
ogni immagine il giusto vettore spostamento (ground truth), la rete neurale cerca di
approssimare al meglio questa funzione trovando il setting di parametri ottimale. Nel
caso in cui l’output sia binario (è un oggetto o non lo è), il tutto diventa un problema di
classificazione: tipo di task definisce come sarà l’output della rete, ma dietro c’è sempre
un certo wiring di neuroni che estraggono feature a partire da un input. Nel caso in cui
si hanno a disposizione tanti esempi di associazione tramite la funzione giusta f , si parla
di supervised learning. Come tutte le rappresentazioni modellistiche, anche questa del
percettrone cattura bene alcune cose e altre no:
Per capire la bontà dell’approssimazione è necessaria una misura dell’efficienza della rete.
Un primo approccio è vedere la norma della differenza, ||y − ŷ||, che presenta un punto
angoloso. Questo problema è risolto considerando il quadrato e la condizione ideale sa-
rebbe essere nel minimo: la misura diventa quindi J(w, T ) = ||y − ŷ||2 .
6 CAPITOLO 1. INTRODUZIONE ALLE RETI NEURALI
Data una funzione di questo tipo, il nostro obiettivo è trovare w e T che minimizzano la
funzione J: questo lo si può fare utilizzando il gradient descent sfruttando la direzione
in cui il gradiente diminuisce. Si calcola infatti ∇w J, il gradiente di J, e lo si usa per
calcolare il successore di w tale che Deltaw = −η∇w J, dove η è il learning rate.
Ci sono tuttavia alcuni problemi:
I. Dato il modello di neurone, se definiamo z = wT x − T , la funzione a scala ha il gradino
in corrispondenza dello zero e dipende da z. Se aumentiamo la dimensionalità del vetto-
re input e del vettore dei pesi aggiungendo il valore x0 = 1 con il peso w0 = −T (bias),
abbiamo che z = wT x e quindi la treshold è stata riassordiba. In questo modo quindi
ŷ = θ(z), cioè l’output diventa la theta di Heavyside di wT x.
II. L’algoritmo di learning si basa su Deltaw = −η∇w J: vogliamo cambiare i pesi ba-
sandoci sulle derivate della funzione costo J(w) ∝ ||y − ŷ||2 . Tuttavia ŷ è una funzione a
gradino e la sua derivata è una delta di Dirac, quindi sempre zero e diverge nel punto di
soglia: usare questa come regola di learning diventa quindi un problema. Ci sono algo-
ritmi per addrestrare funzioni di soglia a gradino, ma se le reti diventano più complesse
diventa più difficile e sarebbe più comodo usare le derivate. L’idea è quindi quella di
passare ad una funzione smooth in (0, 1), ovvero una sigmoide ŷ = σ(z) = 1−e1−z . Que-
sta funzione ha le proprietà giuste in quanto di comporta come la theta di Heavyside:
quando gli input pesati sono molto grandi la funzione tende ad 1, se invece sono molto
grandi e negativi tende a zero, quando la somma pesata è 0 sta nel mezzo. Questa funzio-
ne può anche essere interpretata come una versione probabilistica del firing del neurone:
in questo caso, dato l’input, il neurone restituisce la probabilità di fare firing, ovvero
P(y = 1|x, w). Questa interpretazione probabilistica (probabilità che il neurone faccia
firing) suggerisce di stare facendo una regressione logistica (la variabile dipendente è di
tipo dicotomico: probabilità che l’input appartenga ad una classe oppure ad un’altra).
Come mai la sigmoide è la funzione giusta per fare smoothing della theta di Heavyside.
P(B|A)P(A)
P(A|B) =
P(B)
Date due classi, C1 e C2 (nel caso del neurone fired o not fired), vogliamo definire la
probabilità di appartenere ad una delle due classi dato un certo input, ovvero P(Ck |x).
Applicando il teorema di Bayes otteniamo la sigmoide:
P(x|C1 )P(C1 )
P(C1 |x) = (dividendo per il numeratore)
P(x|C1 )P(C1 ) + P(x|C2 )P(C2 )
1 P(x|C1 )P(C1 )
= P(x|C2 )P(C2 )
ponendo z = ln
1 + P(x|C P(x|C2 )P(C2 )
1 )P(C1 )
1
=
1 + e−z
In questo caso z, ovvero la trasformazione dell’input, è il logaritmo di un rapporto di
probabilità: z = wT x viene quindi interpretato come log ratio di probabilità. Se infatti
z è grande, la probabilità di avere C1 è maggiore, analogamente se z è negativo.
z
La funzione σ(z) = 1+e1−z = eze+1 ha proprietà interessanti:
• 1 − σ(z) = σ(−z)
• σ 0 (z) = σ(z)σ(−z) (utile nel gradient descent)
Capitolo 2
Distribuzione gaussiana
Data una variabile Gaussiana X ∼ N (x|µ, σ 2 ), la sua funzione di densità di probabilità
e i suoi momenti sono
1 1
p(x) = √ exp − 2 (x − µ)2 ,
2πσ 2 2σ
Z
E[X] = xp(x)dx = µ, E[X 2 ] = µ2 + σ 2 .
Una statistica sufficiente è data da (µ, σ 2 ): questa coppia di numeri caratterizza del
tutto le caratteristiche di un dataset estratto da una gaussiana. Questo suggerisce una
correlazione tra fare inferenza sui parametri e comprimere i dati. La gaussiana è molto
importante per il teorema centrale del limite e il principio di massima entropia.
Covarianza
La covarianza è un valore numerico che fornisce una misura di quanto le due varino
assieme, ovvero della loro dipendenza. Date X, Y variabili aleatorie, la covarianza è:
Più questo valore è grande, più tendono a muoversi assieme, se invece tende a 0 vuol
dire che non sono dipendenti l’una dall’altra. Possiamo anche definire il coefficiente di
Pearson, che è la covarianza normalizzata sulle deviazioni standard:
cov[X, Y ]
ρXY = .
σX σY
Dato X un vettore d-dimensionale, possiamo definire la sua covarianza: questo oggetto
diventa una matrice di covarianza che è denotata con Σ, dove sulla diagonale ci sono
le varianze delle singole componenti, che è simmetrica (diagonale se le variabili sono
indipendenti).
7
8 CAPITOLO 2. BASI DI MACHINE LEARNING
Gaussiana multivariata
Le gaussiane esistono anche in più dimensioni. I parametri sono un vettore di valori medi
e da una matrice di covarianza.
1 1 T −1
p(x) = d 1 exp − (x − µ) Σ (x − µ) .
(2π) 2 |Σ| 2 2
L’idea quindi è quella di voler trovare i parametri (µ, σ 2 ) che massimizzano questa pro-
babilità. Usando il logaritmo (funzione monotona) per usare la log-likelihood function,
troviamo che essa è massimizzata dagli stimatori di massima verosimiglianza
1 X (i) 2 1 X (i)
µM L = (x ), σM L = (x − µM L )2 .
m m
Una valutazione della bontà di uno stimatore θ̂n è data dal bias
b(θ̂n ) = E[θ̂n ] − θ.
2 m−1 2
E[µM L ] = µ, E[σM L] = σ .
m
Per avere uno stimatore unbiased della varianza possiamo usare
2 1 X (i)
σ̂M L = (x − µM L )2 .
m−1
2.2. STIMATORE DI MASSIMA VEROSIMIGLIANZA - REGRESSIONE 9
Possiamo scrivere il tutto in maniera più compatta attraverso la design matrix, dove
le righe sono formate da 1 seguito dalle D feature:
(1) (1) (1)
−x(1)t −
1 x1 x2 · · · xD
. .. .. .. .. ..
X= .. . = .
. . . .
(m) (m) (m)
1 x1 x2 ··· xD −x(m)t −
δJ(w)
=
δw
1
δw wt X t Xw − wt X t y − y t Xw + y t Y =
2m
1
δw wt X t Xw − 2y t Xw + y t Y =
2m
1 t
2X Xw − 2y t X = 0.
2m
Da cui otteniamo l’equazione normale (soluzione analitica che dipende solo dai dati e dai
valori del training set):
wM L = (X t X)−1 Y t X = (X t X)−1 X t Y,
dove
..
(1) (m) (1)
x1 . x1 −x −
X X = ...
t .. .. ..
. .
.
(1) .. (m)
(m)
−x −
xD . xD
(i) 2 (i) (i)
" Pn P #
i=1 (xi ) i x1 x2 ···
= .. .
.
per poter avere le feature in un simile range di variabilità. In questo modo X t X diventa
proporzionale alla matrice di covarianza. Quando calcoliamo wM L , X t X deve essere
invertibile: in generale questo succede quando ci sono delle feature ridondanti, ovvero
quando rank(X) ≤ D + 1. Quindi, generalmente, se il numero dei dati m è maggiore del
numero delle feature, generalmente esiste l’inversa. Inoltre, una matrice di covarianza è
positiva semidefinita se gli autovalori λi ≥ 0 ∀i. Tuttavia, può succedere che invertire la
matrice X t X possa essere più costoso che usare algoritmi locali di ricerca (e.g. gradient
descent).
Ricapitolando, data una rete neurale, lo scopo è estrarre uno scalare ŷ: i neuroni cercano
di estrarre una nuova rappresentazione, quindi nuove feature utili per il task ovvero la
regressione lineare.
12 CAPITOLO 2. BASI DI MACHINE LEARNING
La regressione lineare può essere estesa per ottenere come output un vettore d-dimensionale
a partire dai vettori di input D-dimensionali. Applicandolo alle reti neurali, otteniamo
che i parametri costituiscono una matrice di pesi W dove l’elemento wij è il peso tra xi e
ŷj . Anche in questo caso, le funzioni di applicazione sono lineari e abbiamo che ŷi = wit x:
infatti possiamo vedere Ŷ = W X, dove X è la design matrix trasposta (i vettori input
riga diventano colonna trasponendoli).
−w1t −
(1)
ŷ · · · ŷ (m) .. x(1) · · · x(m)
=
| | .
| |
−wdt −
Possiamo far regressione lineare per rappresentare funzioni che non sono lineari tra
input e output (generalizzazione dell’esempio del polinomio). In questo caso possiamo
utilizzare una funzione di x invece che x stesso: resta una funzione lineare perché la linea-
rità resta nei pesi, ma rispetto all’input rappresentiamo funzioni non lineari. Abbiamo
quindi il linear basis function model
X
Ŷ (x, X) = wj φj (x) = wt φ(x),
j
P(D|w)P(w)
P(w|D) = ,
P(D)
Analizziamo ora le differenze tra una stima basata sulla massima verosimiglianza e una
sull’inferenza bayesiana. In primo luogo, wM L è uno stimatore puntuale (si stima un set
di parametri che soddisfa la maximum likelihood), invece l’inferenza bayesiana ricostrui-
sce una distribuzione di probabilità quindi tutte le possibili configurazioni andranno a
contribuire alle predizioni. Ad esempio possiamo scrivere che (full bayesian: stima della
distribuzione in probabilità su tutti i parametri)
Z
P(x(m+1) |x(1) , . . . , x(m) ) = P(x(m+1) |w)P(w|x(1) , . . . , x(m) )dw
Abbiamo quindi che ciò che stiamo stimando P(w|D) ∝ P(D|w)P(w), man mano che il
dataset cresce, P(D|w) peserà sempre di più quindi i dati possono spostarmi molto dalla
prior: tuttavia, se non ho dati a sufficienza, il guess iniziale sui parametri è importante.
Questo approccio fornisce in automatico una error bar, ovvero una stima di incertezza. Se
stiamo utilizzando l’approccio frequentista e vogliamo comunque avere una stima dell’in-
certezza possiamo usare il bootstrap (metodo euristico per stimare quanto mi aspetto
che varino le stime dei parametri). Dato un dataset X = {X1 , · · · , XN }, creaimo dei da-
taset XB facendo sampling with replacement da X: questi altri dataset X̃1 , · · · , X˜N
sono pescati da X, quindi alcuni dati saranno ripetuti, e si stima w. Tutto questo è
ripetuto L volte: si avranno quindi L stime di w che permettono di vedere quanto sarà
variabile la stima di w sui dataset.
MAP quindi è simile a maximum likelihood, ma allo stesso tempo è diverso perché c’è
anche l’informazione sulla prior. Mettere una prior sui w, ad esempio spingere affinché
alcuni w siano 0, vuol dire cercare di ridurre il numero di feature importanti nella predi-
zione. Prendendo ad esempio il caso ŷ = w0 + w1 x + w2 x2 + w3 x3 + · · · , dove abbiamo
pochi dati messi a parabola, siamo interessati a spingere verso zero i coefficienti di grado
maggiore di due, altrimenti di rischia overfitting. In questo quindi sta la differenza tra
ottimizzazione e machine learning: se vogliamo ridurre la distanza tra la predizione e i
dati reali ha senso aumentare il grado, ma se vogliamo utilizzare il modello su dati mai
visti dobbiamo settare la complessità il più bassa possibile (penalizzando maggiormente
i polinomi di grado alto).
Possiamo considerare ad esempio la regressione lineare bayesiana (MAP). Data la
full bayesian P(w|D) ∝ P(D|w)P(w), noi ci accontentiamo invece di ricostruirla di trovare
il set di parametri che la massimizza:
wM AP = argmaxw P(w|D)
= argmaxw log P(D|w) + log P(w)
= argminw − log P(D|w) − log P(w),
dove otteniamo lo stesso termine da minimizzare che ottenevamo nella maximum likeli-
hood al quale però aggiungiamo la prior (che non dipende dai dati, quindi diventa sempre
meno dominante all’aumentare dei dati). Per poter andare avanti, dobbiamo scegliere la
prior (dove α è la precision e z costante di normalizzazione):
Y 1
Y
1 − α wj2
p(w) = N wj |0, = e 2 ,
j
α j
z
la nostra assunzione è quindi quella di avere small weights. Quindi ora, dato D il numero
di feature da 1 (non includiamo il bias nella prior),
D
αX 2
− log P(w) = w + cost prior
2 j=1 j
m
β X (i)
− log P(w) = (y − ŷ (i) ) likelihood.
2 i=1
Il risultato è quindi
m D
β X α X
wM AD = argminw (y (i) − ŷ (i) ) + w2
2 i=1 2 j=1 j
∆w = −η∇w J(w)
λ
∇w J = ∇w JM L + w(priorlaplaciana)
m
λ
wnew = wold − η( wold + ∇w JM L )
m
λ
= wold (1 − η ) − η∇w JM L
m
e quindi ad ogni step i pesi si riducono.
Se usiamo la regressione lineare, si ha che ŷ = Xw con X design matrix, quindi
1
((Xw)t − y t )(Xw − y) + λwt w
J(w) =
2m
1 t
2X Xw − 2y t X + 2λw = 0
δw J(w) =
2m
→ (X t X − λ1)w = y t X → wM AP = (X t X − λ1)− 1X t y
Anche in questo caso abbiamo una soluzione analitica, dove però c’è un termine in più
dovuto alla regolarizzazione che rimuove tutti i problemi di invertibilità. La regolariz-
zazione diventa quindi un modo per ovviare al problema di feature ridondanti perché
spinge ad avere un basso grado di complessità. Inoltre, se X è ortogonale, otteniamo i
Xty w0
pesi che otterremmo con maximum likelihood riscalati w = λ+1 = λ+1 .
Se J è convessa (derivata seconda positiva oppure Hessiana semidefinita positiva cioè con
autovalori positivi) nella regressione lineare, wM L (e anche wM AX ) è un minimo globale.
Nel caso della regressione lineare, la convessità di J è assicurata da (proprietà persa nelle
reti neurali)
δ2 δ t
X Xw − y t X = X t X.
J=
δw2 δw
Ora introduciamo la regolarizzazione L1 oppure LASSO (Least Absolute Shrinkage and
Selection Operator) o Sparse Regularization. La regolarizzazione L2 implica λwt w
(dal prior gaussiano). Possiamo anche prendere la prior laplaciana (molto più piccata in
0, quindi spinge i pesi a zero e permette di selezionare le feature):
Y α
p(w) = e−α|wj | .
i
2
X
− log P(w) = α|wj | + · · · ,
i
prior. Abbiamo che J ∝ ||ŷ − y||2 + λ||w||2 . In questo caso quindi possiamo vincolare w
a stare in una sfera definita la λ attraverso t:
Possiamo definire la stessa cosa in L1 , dove si sta sotto t col modulo dei pesi:
tuttavia in machine learning i w arrivano dal training sul training set, quindi l’errore di
training sarà sempre minore di quello di generalizzazione perché ho ottimizzato il sistema
su training set. Quindi il machine learning è sostanzialmente definito da due problemi:
• I. rendere piccolo il training error (ottimizzazione) → se si fallisce si ha l’under
fitting,
• II. rendere la differenza tra il training e il test error piccolo → se si fallisce si ha
l’over fitting (segue il noise dei dati senza catturarne la struttura).
2.5. DECOMPOSIZIONE BIAS-VARIANCE 17
Introduciamo ora il concetto di capacity del modello, ovvero l’abilità del modello nel
fittare molte funzioni (questo è legato all’hypothesis space, ovvero lo spazio di tutte le
possibili associazioni (x,y) che sono in grado di fittare col modello). Ad esempio, con la
linear regression
Pk possiamo fittare tutte le funzioni lineari, mentre se prendiamo il modello
ŷ = b + i=1 wi xi possiamo fittare funzioni con polinomi di grado k-esimo (k setta la
capacità del modello). Tuttavia, bisogna tenere conto di una capacità effettiva: anche se
un modello in linea di principio potrebbe fittare un certo set di funzioni, non è detto che
l’algoritmo di learning sia in grado di esplorare tutto l’hypothesis space.
Una buona generalizzazione coincide dunque con il cercare una spiegazione semplice
dei dati che abbiamo (ridurre la complessità senza allontanarci troppo dai dati): ci
aspettiamo quindi di vedere il seguente plot dell’errore in funzione della capacità, dove
il generalizazion gap è dato dalla distanza tra il test error e il traning error.
Cross-validation
Di solito, il dataset è diviso in training set e in test set, il quale ha tipicamente dimensioni
minori. Tuttavia, potrebbe capitare di avere pochi dati, il che porta a dei problemi.
Innanzitutto, sarebbe auspicabile usare tutti i dati per fare training, inoltre la misura
di performance è misurata su pochi dati del test set causando una misura sbagliata
della reale performance. Per risolvere questo problema, possiamo usare la K-fold cross
validation. Dividiamo il dataset in K parti che non overlappano. Durante il primo run,
prendiamo una parte per fare il test e tutto il resto per fare training. Ad ogni run,
seleziono un test set diverso e traino sul resto, ripetendo questa operazione per K volte
(tanti quanti i partizionamenti). Alla fine, facendo una media delle performance si ha un
valore molto più attendibile di quanto il modello sarà in grado di generalizzare, anche
se i test set sono piccoli (le fluttuazioni sono mitigate dalla media). Se K è uguale al
numero dei dati m, questa procedura prendi il nome di leave-one-out (piccoli dataset).
18 CAPITOLO 2. BASI DI MACHINE LEARNING
Decomposizione bias-variance
Supponiamo di avere un dataset D = (x(i) , y (i) ) , con y (i) ∈ R (caso di regressione),
dove assumiamo che i dati derivino dalla distribuzione p(x, y), dove (x(i) , y (i) ) sono i.i.d..
abbiamo che Y è una variabile aleatoria, ovvero p(x, y) = P(y|x)P(x). L’algoritmo, data
una x, ci deve fornire
R una ŷ dove il goal è che assomigli il più possibile all’y medio
ȳ(x) = Ey|x [y] = yp(x, y)dy.
Ora, supponiamo di chiamare il nostro algoritmo A (neuronal net): preso il dataset D,
costruiamo hD = A(D), ovvero un mapping tra x e ŷ che costruisce il guess e che dipende
da D. In questo caso di regressione, il valore atteso del test error per questa funzione è
Z Z
2
Ex,y∼p (hD (x) − y(x))2 =
[hD (x) − y(x)] p(x, y)dxdy.
x y
Inoltre, anche hD è stocastica, in quanto è una funzione che dipende dal dataset D scelto:
quindi facendo learning su diversi D saranno prodotte diverse hD e possiamo cercare la
funzione attesa (che dipende da A e da p(x, y), non più dal dataset)
Z
h̄ = ED∼pm [A(D))] = hD p(D)dD.
D
Tenendo conto di tutto ciò, possiamo calcolare il vero valore atteso dell’errore di genera-
lizzazione di A:
Z Z Z
2
Ex,y∼p,D∼pm (hD (x) − y)2 =
[hD (x) − y(x)] p(x, y)p(D)dxdydD.
D x y
Quindi h i
¯ 2 + E (h̄(x) − y)2 ,
E (hD (x) − y)2 = E (hD (x) − h(x))
dove il primo termine indica la varianza di hD , mentre per il secondo termine possiamo
notare che
• Bias2 : rappresenta l’errore intrinseco del modello ideale (è legato all’under fitting)
Questa decomposizione permette di capire tutte le possibili fonti di errore nella gene-
ralizzazione (variabilità del training su dataset del modello, capacità del modello, noise
intrinseco dei dati), il che è molto utile per raggiungere un certo livello di performance.
Spesso di parla di trade-off tra varianza e bias in quanto spesso la varianza è legato ad
una alta complessità del modello, mentre il bias ad un’alta semplicità del modello.
Di seguito, possiamo vedere come il nostro modello individua il target e con quanta
variabilità lo centra in termini di variance e bias.
Early stopping
Early stopping è un tipo di regolarizzazione molto usata nelle reti neurali. Supponiamo
di stare facendo training con gradient descent, ovvero wt+1 = wt − η∇J: man mano
che l’algoritmo procede abbiamo la seguente situazione. Anche in questo caso possiamo
notare la presenza di uno sweet spot nel numero di iterazioni t∗ prima che il validation
error inizi a salire quando la capacità aumenta e c’è over fitting (se la capacità del modello
è alta, si adatta al training set). Questo suggerisce quindi di tenere traccia del vettore
dei pesi w e dell’errore di validazione durante il training dopo dopo un certo valore
temporale. Quando il validation error inizia ad aumentare, si interrompono le iterazioni
e si va a cercare il valore per cui il validation error era il minore per utilizzare poi la
rispettiva configurazione dei pesi. Il vantaggio rispetto alla regolarizzazione L1 o L2 in
quanto per fissare il parametro bisognava ogni volta rifare il training per diversi valori di
20 CAPITOLO 2. BASI DI MACHINE LEARNING
λ tra cui si sceglieva poi il migliore. Inoltre, concettualmente, l’early stopping assomiglia
alla regolarizzazione L2 . Avevamo detto che risolvere il problema di regressione con il
regolarizzatore coincideva con il cercare la versione di w che minimizza J vincolata a
stare in delle sfere. Early stopping ci assomiglia molto in quanto stiamo facendo una
traiettoria, che viene però interrotta dopo un certo tempo dopo un certo tempo, ma non
per dei vincoli. In entrambi i casi si guarda però l’errore di generalizzazione.
In particolare, focalizziamoci sul percettrone, primo esempio di rete neurale molto fa-
cile da implementare. Useremo la notazione equivalente della funzione soglia come la
funzione segno di wt x, dove quindi le label sono -1,1. Vogliamo trovare un decision
boundary ortogonale a w: gli iperpiani sono della forma H = {x/wt x + bias = 0} che
diventano includendo il bias nei pesi (aggiungo una dimensione, ma gli iperpiani passano
per l’origine) H = {x/wt x = 0}. L’ipotesi di base del percettrone è che esiste un iper-
piano che separa le label (il problema è linearmente separabile). Ovviamente questo caso
è molto raro: anche solo pensando in due dimensioni, basta un po’ di noise per rendere
falsa questa assunzione. Tuttavia, mantenendo costante il numero di dati, più si sale di
dimensione più è probabile che il problema sia linearmente separabile.
Vediamo ora lo pseudocodice del learning algorithm, il quale trova un iperpiano che sepa-
ra le label se questo esiste: Notiamo quindi che l’update è tale che se la label era positiva,
22 CAPITOLO 2. BASI DI MACHINE LEARNING
Algorithm 2 PERCETTRONE
1: w = 0 (initialization)
2: while TRUE do:
3: m = 0 (where m = n° points misclassified)
4: for (x, y) ∈ D
5: if ywt x ≤ 0 (error test, as ŷ has the same sign as y)
6: w ← w + yx (update)
7: m←m+1
8: if m = 0 then BREAK (no misclassified point)
ma era stata classificata come negativa, aggiungiamo, altrimenti sottraiamo. Nel caso in
cui la notazione usata sia y =0,1, l’update diventa w ← w +η(y − ŷ)x, dove η è il learning
rate che possiamo settare ad 1. Inoltre, se non esiste l’iperpiano, il ciclo non termina: è
necessario quindi mettere uno stop al numero di cicli che si può fare.
Una domanda che ci si può porre è: quanti update posso fare continuando a sbagliare?
Supponendo di avere un dato sbagliato (x, +1), il fatto di avere sbagliato vuol dire che
ŷ = wt x ≤ 0: facciamo quindi l’update (w + x)t x ≤ 0. Supponendo di sbagliare k volte,
cioè alla kesima volta abbiamo (w + kx)t x ≤ 0, deduciamo che un upper bound per k su
un singolo input è:
wt x
wt x + kxt x ≤ 0 −→ k ≤ − t .
xx
Ora siamo interessati a dimostrare che l’algoritmo di apprendimento del percettrone con-
verge nel caso di label linearmente separabili.
La prima assunzione è che esista un iperpiano che separa lo spazio degli input in due
zone: questo equivale all’esistenza di una certa configurazione del pesi w∗ tali che qual-
siasi dato (x, y) ∈ D sia classificato nel modo giusto, ovvero che yw ∗t x > 0 (assenza di
errore). Osserviamo che se esiste w∗, allora anche αw∗ è una soluzione con α costante (la
risoluzione del problema è indipendente dalla scala di w∗): questo permette di assumere
che la norma di w∗ sia 1 senza perdere di generalità. Possiamo analogamente riscalare
l’input in quanto il problema di classificazione non cambia: per riscalare usiamo il mas-
simo delle norme dei vettori di input x(i) , quindi tutti i dati di input sono tutti inclusi in
una ipersfera (centrata nell’origine perché abbiamo incluso il bias) di raggio uno divisa da
un iperpiano identificato da w∗. Ora vogliamo dimostrare che un qualsiasi update di w
con w + yx lo avvicina sempre di più a w∗ nell’ipersfera, ovvero che wt w∗ diventa sempre
più grande (non però perché la norma di w cresce, ma perché si allineano). Quando cè
un update, poiché yw∗t > 0 per definizione di w∗
Possiamo provare a quantificare questa quantità: al minimo sarà grande come il valore
dell’input più vicino al bordo, ovvero il margine γ = min(x,y)∈D |xt w ∗ | ≥ 0. Quindi
dopo l’update abbiamo che wnew w∗ ≥ wt w ∗ +γ, ovvero questa quantità cresce con gli
update.
Ora dobbiamo controllare che stia crescendo perché w si sta avvicinando pian piano a
w∗ e non perché sta crescento wt w. Per definizione di update abbiamo che
dove 2ywt x ≤ 0 altrimenti non avrei fatto l’update e xt x ≤ 1 perché abbiamo riscalato i
t
dati all’inizio. Segue quindi che dopo l’update wnew w ≤ wt w + 1. Dopo M update:
wt w ≤ M,
√ √
M γ ≤ wt w∗ = ||w||||w ∗ || cos θ ≤ ||w||||w ∗ || = ||w|| = wt w ≤ M,
da cui concludiamo che M ≤ γ12 . Questo risultato mostra che il numero di update fatti è
limitato superiormente e dipende soltanto L’iperpiano che passa per l’origine con il mar-
gine più ampio sarà quello che meglio separa le label: se i dati sono molto ben separati,
è molto più facile trovare l’iperpiano e infatti il numero di iterazioni è minore.
L’unica pecca è questo sistema può funzionare solo con problemi linearmente separabili:
ad esempio lo XOR (A XOR B = A and !B OR !A and B) è un problema molto semplice
(4 quadranti dove i segni dei quadrati adiacenti sono opposti), ma non è linearmente
separabile. Inoltre, non è immediato generalizzare questa regola se abbiamo più neuroni
disposti in modo gerarchico.
Ora ci concentriamo sul concetto di capacity del percettrone. Abbiamo già affrontato il
tema di capacità con l’argomento della decomposizione bias-variance: avevamo definito la
capacità come il numero di relazioni input-output che il modello è in grado di realizzare.
In generale, è difficile definire la capacità: nel caso del percettrone però si può calcolare
esplicitamente. Vedremo quindi il teorema di Cover (1966).
Nel percettrone, le funzioni sono legate alla classificazione binaria e sono chiamate anche
dicotomie: ci chiediamo quante dicotomie il percettrone è in grado di realizzare. Sup-
poniamo di avere m input point x1 , . . . , xn , dove xi ∈ RD . Questi punti possono essere
abbinati ad un vettore binario b1 , . . . , bn tramite una dicotomia. Poiché sono m dati, ho
2m possibili configurazioni. Ci chiediamo quante di queste sono linearmente separabili
e quindi realizzabili da un percettrone. Vogliamo trovare una risposta generale, quindi
supponiamo i punti siano in general position: presi xii=1,...,m punti di D-dimensioni,
supponiamo che ogni sottoinsieme di dimendione minore o uguale di D sia linearmente
indipendente e non ci siano D + 1 punti sullo stesso iperspazio D − 1-dimensionale. Nel
caso in cui D = 3, in particolare, significa che non ci siano 3 punti collineari o 4 sul-
lo stesso piano. Ovviamente, non è detto che tutti i dataset reali, in particolare quelli
strutturati, soddisfino queste ipotesi: ad esempio le immagini non sonop distribuite a
caso nello spazio con dimensionalità pari al numero di pixel. Definiamo con C(m, D) il
numero di dicotomie che possono essere realizzate con un percettrone dati m punti in
posizioni casuali in RD . Iniziamo da alcuni casi facili, assumendo che l’iperpiano passi
per l’origine (includiamo il bias, quindi x0 = 1):
• D = 1, ∀m: C(m, 1) = 2
Troviamo ora il valore di C(m, D) per induzione: supponiamo di avere per m punti
C(m, D), cosa succede se aggiungiamo un punto? Se abbiamo (b1 , . . . , bm ), con b ∈ −1; 1,
esiste w tale che (output percettrone) (sign (wt x1 ) , . . . , sign(wt xm )) = (b1 , . . . , bm ). Ag-
giungendo un punto, abbiamo una nuova dicotomia definita dalla presenza di w, ovvero
(sign (wt x1 ) , . . . , sign(wt xm ), sign(wt xm+1 )): quindi la dicotomia precedente ne definisce
almeno un’altra quando aggiungo un punto. Segue che C(m + 1, D) ≥ C(m, D) e quindi
C(m + 1, D) = C(m, D) + A. Siamo quindi interessati a trovare il valore di A. Ragionia-
mo in due dimensioni: se riesco a realizzare una dicotomia che passa esattamente per il
nuovo punto, ottengo due dicotomie diverse (spostandolo un po’ più giù o un po’ più sù,
posso ottenere la stessa dicotomia di prima ma con +1 o -1 per quel punto). Questo tut-
tavia non è sempre possibile: le dicotomie che posso selezionare che passano per un punto
corrispondono a delle dicotomie con una dimensione in meno (vincolo che riduce la dimen-
sionalità) e quindi otteniamo la formula ricorsiva C(m + 1, D) = C(m, D) + C(m, D − 1).
24 CAPITOLO 2. BASI DI MACHINE LEARNING
Finché il numero di punto è minore della dimensionalità del problema, tutte le possibili
dicotomie sono realizzabile, mentre questo non è vero quando il numero di punti eccede
la dimensionalità. Quindi più è alta la dimensionalità, più è probabile che il proble-
ma sia linearmente separabile. In particolare, se il numero di punti è il doppio della
dimensionalità, frazione di possibili dicotomie che il percettrone realizza è
C(2D, D) 1
C(2D, D) = 2m−1 = 22D−1 → m
=
2 2
Questo plot, oltre a sembrare una transizione di fase, suggerisce che, dal punto di vi-
sta della teoria dell’informazione, riusciamo ad immagazzinare i parametri wi con due
bit (fino a quando m < 2D riesco ad immagazzinare al massimo 2 volte il numero di
parametri, ovvero 2D label binarie).
Come possiamo settare il vettore w che fa da discriminante? Utilizziamo, come nel ca-
so di regressione, la maximum likelihood estimation dove cerchiamo argmaxw P(D|w).
2.7. REGRESSIONE LOGISTICA 25
Non possiamo tuttavia usare direttamente P cosa avevamo trovato nel caso della regres-
(i)
sione in quanto avevamo che J(w) ∝ i (y − ŷ (i) )2 , formula ricavata a partire da
−1
P(y|x, w) = N (y|µ = ŷ, β ) (abbiamo settato il modello del noise gaussiano dell’at-
tribuzione x-y, dove però ŷ è deterministico). Ora questa assunzione non ha più senso
perché y è già una variabile aleatoria stocastica (assume solo i valori 0 o 1): ora ci serve
un noise model per variabile stocastiche binarie per poter applicare il principio di maxi-
mum likelihood.
Consideriamo ora X una variabile aleatoria distribuita come una bernoulliana di para-
metro θ(=probabilità che X = 1). Abbiamo allora che
1 X n
→ θM L = xi = , (n è il numero di volte che x = 1)
m i m
Analizziamo ora la funzione costo per la regressione logistica. Dato un dataset x(i) , y (i) ,
dove y (i) è 1 se appartiene alla classe C1 , altrimenti 2 se appartiene alla classe C2 .
Utilizzando la sigmoide, abbiamo che
1 1
ŷ (i) (z (i) ) = = .
1+e −z (i)
1 + e t x(i)
−w
P(y (i) = 1|x(i) , w) = σ(z (i) ), P(y (i) = 0|x(i) , w) = σ(−z (i) ).
Possiamo notare un’analogia con un sistema con due stati (definiti da due energie 0 e
1 ) con particelle non interagenti. Possiamo identificare y (i) come lo stato della particella
i. Ci chiediamo quindi
e−β1 1
P(y (i) = 1|0 , 1 , t) = = ,
e−β0 + e−β1 1 + e−β∆
dove il neurone definise quindi la differenza di energia di appartenenza ad una classe o
1
ad un’altra, −β∆ = wt x, e quindi β = kT (parametro di freddezza/temperatura).
Tornando alla likelihood, il nostro obiettivo è quello di massimizzare argmaxw log P(D|w),
mentre la label è una variabile aleatoria binaria. Vogliamo che il modello descriva la
probabilità che y (i) = 1 attraverso la sigmoide.
m
Y m h
Y iy(i) h i1−y(i)
P(D|w) = P(y (i) |x(i),w ) = ŷ (i) 1 − ŷ (i)
i=1 i=1
"m #
X
log P(D|w) = − y (i) log ŷ (i) + (1 − y (i) ) log (1 − ŷ (i) ) .
i=1
26 CAPITOLO 2. BASI DI MACHINE LEARNING
Possiamo anche aggiungere dei regolarizzatori, il che coincide con avere delle prior sui
valori dei parametri, per evitare l’overfitting (sia L1 che L2 ).
1
Per trovare i valori di w, possiamo posse a 0 la derivata? Ricordando che ŷ (i) = −z (i)
,
1+e
d (i)
dove z (i) = wt x(i) , e che dz ŷ = ŷ (i) (1 − ŷ (i) ):
" m
#
δ 1 X (i)
0= − y log ŷ (i) + (1 − y (i) ) log (1 − ŷ (i) )
δw m i=1
m
1 X y 1−y
=− ŷ(1 − ŷ)δw z + (−1)ŷ(1 − ŷ)δw z
m i=1 ŷ 1 − ŷ
1 X
=− (y − y ŷ − ŷ + y ŷ)δw z.
m i
δ t δ t
Ricordando che δw w x = δw x w = x, otteniamo che
1 X (i)
∇w J(w) = (ŷ − y (i) )x(i) = 0.
m i
Tuttavia non c’è nessuna risoluzione analitica per wM L in quanto ŷ (i) è la sigmoide:
bisogna ricorrere a metodi numerici. Oltre al gradient descent ∆w = −η∇wJ, un altro
modo per risolverlo è il metodo di Newton (molto più usato): utilizzando l’hessiana H,
abbiamo un metodo dei minimi quadrati pesato dove ∆w = −H −1 ∇wJ.
Abbiamo ottenuto una certa forma per il gradiente di J (con gradient descent), che è la
stessa forma ottenuta nel caso di linear regression dove:
1 X (i) 2
J(w) = y − ŷ (i)
2n i
∂ 1 X (i) ∂
J(w) = − y − ŷ (i) ŷ (i)
∂w m i ∂w
1 X (i)
= ŷ − y (i) x(i)t .
m i
Abbiamo visto che nel caso di regressione lineare J era convessa, quindi ogni spostamento
verso un valore J più basso portano verso il minimo globale. Questo vale anche per la
regressione logistica anche se non riusciamo a rivolvere l’equazione analiticamente?
2.8. SOFTMAX: REGRESSIONE LOGISTICA MULTICLASSE 27
P (x | ck ) P(Ck ) eak
P (Ck | x) = P = P aj ,
j P (x | Cj ) P(Cj ) je
dove ak = log P (x | ck ) P(Ck ). Questo si chiama softmax: nel caso specifico di regres-
sione logistica abbiamo che ak = wkt x, dove x è il vettore di input e wk il vettore dei
persi del k-esimo neurone di output. La softmax diventa quindi un’estensione naturale
della sigmoide, ma possiamo anche vederlo come uno smoothing della funzione di mas-
simo usata dalla classificazione binaria del percettrone (si prende la label k tale per cui
wkt x = zk > zj ).
28 CAPITOLO 2. BASI DI MACHINE LEARNING
e−βk 1
σ(k) = P −βj = e−βk , dove zk = −βk .
j e z
Vediamo ora la relazione di softmax con il caso con due classi. In quel caso, abbiamo
1
visto che il vettore di output è ŷ = σ(wt x) = 1+e−w t x = P(y = 1|x). Ora però abbiamo
un altro modo di rappresentarlo, ovvero tramite il softmax: usiamo due pesi w1 e w2 per
1
predire il vettore ŷ t = ez1 +e z2 (e
z1 z2
, e ).
in questo modo ogni input è associato ad una sola classe anche se abbiamo una formula
generale perché
(i) (i)
∀x(i) → yk = 1 yj = 0∀j 6= k;
(i)
m X c P yk = 1|X (i) , w
(i)
X
− log P(D|w) = − yk log
i=1
,
k=1
(1) (i)
dove vogliamo che ŷk =σ z . La cross-entropy nel caso di C classi diventa
m c
1 X X (i) (i)
J(w) = − yk log ŷk
m i=1
k=1
y=1 y=0
ŷ = 1 TP FP P̂
ŷ = 0 FN TN N̂
P N
tot = P + N = T P + F P + F N + T N.
Ci possono tuttavia essere problemi se usiamo solo queste come misure di performance.
Ad esempio, supponiamo di aver fatto training di un classificatore di immagini per la
diagnosi (cancer/not cancer) e di aver poi calcolato con il test set che l’accuracy è del
99% (error= 1%). Siamo interessati a sapere quanto sia vera questa stima. Supponiamo
un test set con 104 analisi, tra cui 100 pazienti con label postiva. La confusion matrix
nel caso in cui il classificatore attribuisca a tutti la label ŷ = 0∀x(i) è In questo caso
y=1 y=0
ŷ = 1 0 0
ŷ = 0 100 9900
P=100 N=9900
9900
quindi l’accuracy è 10000 = 99%, ma il classificatore non predice bene. L’accuracy non
è quindi una buona misura della performance nel caso in cui gli esempi non sono ben
distribuiti nelle classi, ma questo non è sempre vero nei dataset reali. Ad esempio, ora
prendiamo il caso del classificatore spam/non spam. I due errori possibili, lasciar passare
la spam e bloccare mail non di spam, sono molto diversi tra loro e il secondo è molto più
grave. Tuttavia, dal punto di vista dell’accuracy questi due tipi di errore sono equivalenti,
quando invece può essere cruciale nelle applicazioni.
Ora vogliamo quindi passare a misure più precise a partire dalla confusion matrix, la quale
contiene tutte le informazioni riguardo agli errori che l’algoritmo sta facendo. (Nota: nel
caso di "classi rare", quindi che comprendono piccole % della popolazione, in genere si
usa y = 1).
La prima quantità che definiamo è la precision = TP̂P = T PT+F P
P , ovvero la frazione di
veri positivi in chi è pseudopositivo. Una high precision è implicata, in termini di soglia,
da una treshold alta (mi aspetto però di avere molti FN, in quanto siamo diventati
molto selettivi alzando la soglia). Per bilanciare la precision, definiamo ora la recall (o
sensitivity o true positive rate) come TPP = T PT+FP
N : indica la frazione di positivi che è
stata predetta tra tutti i positivi reali. Una high sensitivity è implicata da una treshold
bassa. Diventa quindi importante guardare il trade off tra la precision (se ti dico che
sei positivo è molto probabile che tu lo sia) e la recall(se sei postivo è molto probabile
che ti dica che sei positivo). L’idea quindi è che a fissata recall la precisione sia più alta
possibile.
2 2P R
F1 = 1 1 = .
P + R
P +R
Un’altra misura molto usata insieme alaa sensitivity (la recall) è la specificity (quanti
tra quelli sani sono effetticamente sani): tramite queste si definiscono le ROC curves.
TP TN TN
Recall/sensitivity: Specificity: =
P N TN + FP
Anche in questo caso c’è un trade off tra le due misure, in base alla treshold abbiamo
infatti: Un elemento che può essere calcolato è l’AUC, ovvero l’area sotto la curva, che
distingue i modelli e descrive quanto il modello è performante su entrambi i fronti.
Tuttavia, per queste misure, è molto più popolare il plot delle ROC curves (Reveiver
Operating Characteristics), dove mettiamo sull’asse x 1-specificity (= FNP false positive
rate) e sull’asse y la recall (true positive rate):
0 1 2 ···
0 c00 c01 c02 ···
1 c10 c11 c12 ···
.. .. ..
. . .
Problema di regressione
La misura di performance più usata nei modelli di regressione è la root mean square
error r
1
RM SE = sumi=1 m(ŷ (i) − y (i) )2 ,
m
ovvero la l2 -norm, ed è la distanza tra la predizione il valore reale. Se ci sono outliers,
tuttavia, questi possono dominare il risultato. Per evitare ciò si può usare la mean
absolute error
1 X
M AE = m|ŷ (i) − y (i) |,
m i=1
ovvero la l1 -norm o Manhattan norm, che è meno sensibile agli outliers. In generale, si
possono usare le lk -norm: al crescere di k ci focalizziamo di più sui valori grandi.
Capitolo 3
Teoria dell’informazione
3.1 Entropia
La teoria dell’informazione nasce alla fine degli anni ’40/inizio anni ’50 soprattutto gra-
zie ai lavori di Shannon: questa teoria è nata per poter costruire codici ottimali per
trasmettere informazioni attraverso canali che potevano essere rumorosi (ad esempio per
la trasmissione radio). C’è un link profondo tra la teoria dell’informazione e il machine
learning: per fare data compression (rappresentare nel modo più efficiente possibile i da-
ti che ho ottenuto da variabili stocastiche), meglio conosciamo la distribuzione di questi
eventi, più saremo capaci di costruire un codice compatto per rappresentare questi dati.
Ad esempio, il linguaggio è il risultato di un processo di ottimizzazione: le parole che
sono molto corte tendenzialmente sono usate con una frequenza molto alta. Quindi se ho
un’idea della frequenza degli eventi, posso associare agli eventi più probabili codici più
corti, permettendo di comprimere il codice per trasmettere informazioni. Quindi tutto
ciò richiede un modello probabilistico dei dati, quindi bisogna costruire un modello di
inferenza per capire da dove sono generati i dati. Da questo punto di vista quindi diventa
un problema di machine learning: da dai dati, si cerca di capire riprodurre nel modo più
fedele possibile il modello generativo dei dati.
L’intuizione alla base della teoria dell’informazione è semplice, ma non banale: venire a
conoscenza di un evento molto improbabile porta tanto contenuto di informazione, men-
tre se un evento è fortemente probabile e capita di continuo venirne a conoscenza non
porta granché di informazione. Come si può tradurre questa intuizione in dei requisiti
formali per definire una qualche misura del contenuto di informazione?
32
3.1. ENTROPIA 33
Entropia e coding
Enunciamo ora il teorema del noiseless coding: l’entropia H(x) è il lower bound per
il numero di bit necessari (in media) per codificare l’outcome di p(x).
Ad esempio, se prendiamo una variabile stocastica x che ha 8 possibili outcome e1 , . . . , e8 .
Se prendiamo il caso in cui le probabilità sono eque (la probabilità di ogni evento è 81 ),
abbiamo che l’entropia legata alla p(x) è
8
X 1 1
H(x) = − log2 = log2 23 = 3 bit.
i=1
8 8
Risulta quindi che 3 bit è la lunghezza del codice che ci serve per codificare 8 eventi, infatti
permettono di codificare 23 stati: Nel caso in cui gli eventi non fossero equiprobabili, ma
e1 e2 e3 e4 e5 e6 e7 e8
000 100 010 001 011 110 101 111
qualcuno è molto più probabile degli altri, l’entropia diventa 2 bit (nel momento in qui
gli eventi non sono più equiprobabili, il limite inferiore del numero di bit che servono
34 CAPITOLO 3. TEORIA DELL’INFORMAZIONE
per trasmettere l’outcome della distribuzione è ridotto), quindi la lunghezza dei codici
varia in base alle probabilità (pochi bit per quelli più probabili): Quindi ora la lunghezza
x e1 e2 e3 e4 e5 e6 e7 e8
1 1 1 1 1 1 1 1
p(x) 2 9 8 16 64 64 64 64
code (0) (10) (110) (1110) (111100) (111101) (111110) (111111)
Entropia differenziale
Finora ci siamo occupati di variabili con output discreti e finiti, nel caso di variabili
continue possiamo estendere il concetto di entropia con l’entropia differenziale
Z
Hp (x) = − p(x) log p(x)dx.
Non è una definizione banale in quanto non è solo il limite dal discreto al continuo. Infatti,
se prendiamo dei bin di ampiezza ∆, possiamo associare alla probabilita dell’i-esimo bin
una probabilità discrete
Z (i+1)∆
.
i∆
Quindi in generale diventa
X
H∆ = − p(xi )∆ log [p(xi )∆]
i
X X
=− p(xi )∆ log [p(xi ) − p(xi )∆ log ∆∆]
i i
X
=− p(xi )∆ log p(xi ) − log ∆,
i
dove è la divergenza.
P Passando al limite per Delta che tende a 0, log ∆ diverge mentre
l’altra parte − i p(xi )∆ log p(xi ) diventa l’entropia differenziale. Quindi bisogna prima
rimuovere la divergenza perché stiamo definendo p(xi ) in infinite posizioni.
caso definiamo la Lagrangiana con l’entropia meno i vincoli esplicitati (la somma sugli
stati somma ad 1): !
Xm
L=H −λ p(xi ) − 1
i=1
P
dove H = − i p(xi ) log p(xi ) e λ sono i moltiplicatori di Lagrange. I punti critici di
L coincidono con il problema di ottimizzazione soddisfatti vincoli. Quindi prendendo la
derivata funzionale di questo oggetto e ponendola uguale a zero
δL
= − log p − 1 − λ = 0,
δp
quindi otteniamo la forma funzionale p(x) = e−λ−1 e sostituendola nel vincolo otteniamo
i moltiplicatori di Lagrange
M
X
e−λ−1 = 1 ⇒ M e−λ−1 = 1 ⇒ λ = log M,
i
quindi
δL
= − log p − 1 − λ1 − λ2 x = 0,
δp
da cui la forma funzionale di p(x) = e−(λ1 +λ2 +1) e, sostituendola nei vincoli,
X
p = 1 → e−(λ1 +1) + e−(λ1 +λ2 +1) = 1,
X
xp = θ → e−(λ1 +λ2 +1) = θ
otteniamo x
θ
p(x) = (1 − θ) = θx (1 − θ)1−x .
1−θ
Possiamo conclurre quindi che la distribuzione con massima entropia di una variabile con
due output fissati e con una media fissate è una distribuzione di Bernoulli.
δL
= − log p − 1 + λ0 + λ1 x + λ2 (x − µ)2 .
δp
Si ottiene per sostituzione che p(x) ∼ N (x|µ, σ 2 ).
36 CAPITOLO 3. TEORIA DELL’INFORMAZIONE
δL X
= − log p − 1 + λ0 + λi fi (x).
δp i
Nel primo caso, non è importante se q ha bassa densità dove ci sono dati, ma non può
avere alta densità dove non ce ne sono. Nel secondo caso, nei picchi di p voglio che ci sia
più densità possibile di q per minimizzare la DKL , ma avendo una gaussiana sola, siamo
obbligati a riempire il buco di p (che non conta nella minimizzazione in quanto il termine
p(x) annulla tutto).
wM L = argmaxw P(D|w)
Ym
= argmaxw q(xi |w)
i=1
X
= argmaxw log q(xi |w)
i
1 X
= argmaxw log q(xi |w)
m i
1 X 1 X
= argmaxw log q(xi |w) − log p(x)
m i m i
m
1 X p(x)
= argminw log
m i=1 q(xi |w)
Z
p(x)
−→ argminw p(x) log dx, per m → ∞,
q(x|w)
quindi la maximum likelihood è una minimizzazione della cross entropy (per questo si
chiamano cross entropy le funzioni costo), ma anche della KL divergence in quanto
Ora vediamo perché i modelli ottenuti con maximum likelihood hanno dei problemi ad
essere dei modelli generativi. Ad esempio, nel caso visto prima con p mixture di due
gaussiane e q la gaussiana che minimizza DKL (p||q) (quello che fa maximum likelihood),
può capitare che il modello metta alta probabilità in zone dove la vera distribuzione ha
densità vicino a 0. Abbiamo quindi alta probabilità di pescare oggetti che in realtà non
sono realistici. Dei miglioramenti sono stati ottenuti con le GAN (generative adversary
network), dove sono combinante entrambe DKL (p||q) e DKL (q||p).
che si muovono assieme). Nel caso in cui le variabili fossero completamente scorrelate
abbiamo infatti che la probabilità fattorizza p(x, y) = p(x)p(y). Vogliamo quindi misurare
quanto le variabili distino dal caso di fattorizzazione con la mutual information
0 ≤ I(X, Y ) ≤ min {H(X), H(Y )}, dove H(X) ≤ log |X|(n° stati possibili)
La mutual information è una misura molto più efficiente e sofisticata per misurare le
correlazioni perché comprende qualsiasi tipo di dipendenza. Ad esempio con Pearson:
Capitolo 4
4.1 Recap
Finora ci siamo concentrati principalmente su problemi di supervised learning, dove
abbiamo un dataset D =(x(i) , y (i) ).
Nel problema della regressione lineare, abbiami vusto la rappresentazione grafica di neu-
rone dove le feature erano pesate da pesi wi e in uscita c’era una predizione ŷ (i) associata
al vettore x(i) che corrispondeva ad un’attivazione lineare. Il learning consiste nel trovare
i pesi che portano ad una risposta il più giusta possibile dato un set di associazioni giu-
ste. Il principio che abbiamo usato per trovarle è quello di maximum likelihood, dove
abbiamo cercato i pesi che massimizzassero
Pm P(D|w). Questo ci ha portati a definire la
1 (i)
seguente funzione costo J(w) = 2m i=1 (ŷ −y (i) )2 : la minimizzazione di questo ogget-
to porta ad una forma chiusa risolvibile analiticamente, l’equazione normale (si possono
usare, ma algoritmi iterativi di learning non sono necessari). Abbiamo poi generalizzato
questo modello nel caso in cui l’output non fosse uno scalare, ma un vettore.
(i)
Inoltre, abbiamo sempre cercato di includere il bias nel vettore di pesi aggiungendo x0
per poter scrivere in forma compatta le nostre espressioni.
A queste funzioni costo J(w) si possono aggiungere dei termini di regolarizzazione che
cercano di limitare la crescita dei pesi o cercano di metterne alcuni a 0. Questi termini
sono stati introdotti come l’effetto di una prior sui pesi w.
Classification
Anche nel caso della classificazione abbiamo dato una rappresentazione simile a quella
del caso della regressione con la somma pesata dell’input, la differenza è nell’output della
rete. Mentre il percettrone attribuisce direttamente la classe attraverso una funzione a
tratti, la logistic regression fa uso della sigmoide, ovvero ŷ = σ(wt x) = σ(z) = 1+e1−z . In
questo caso, abbiamo una interpretazione probabilistica dove ad un vettore x associamo
la probabilità che appartenga ad una classe piuttosto che ad un’altra.
Anche in questo caso abbiamo applicato il principio di maximum likelihood per ottenere
la seguente funzione costo (detta anche cross entropy)sotto l’assunzione che la variabile
stocastica y (i) fosse descritta da una distribuzione di Bernoulli:
"m #
1 X (i)
J(w) = − y log ŷ (i) + (1 − y (i) ) log (1 − ŷ (i) ) .
m i=1
40
4.2. IL PROBLEMA DELLA DIMENSIONALITÀ 41
Abbiamo visto che in questo caso la minimizzazione di J non ha una forma chiusa, quindi
bisogna applicare algoritmi che cercano il minimo.
R Si chiama cross entropy perché abbia-
mo visto che minimizzare la cross entropy p(x) log p̂(x)dx coincide con il minimizzare
la divergenza KL DKL (p||p̂).
Abbiamo poi anche in questo caso esteso al caso di multiple classes. L’output è dato
da un vettore binario dove compare solo un 1 in un posto in corrispondenza alla classe
a cui appartiene (one-hot encoding). Nel caso di classificazione in più classi, abbiamo
un vettore di uscita per ogni classe, dove ogni componente del vettore di dimensione c è
calcolato applicando la sigmoide alla somma pesata del singolo neurone (softmax).
In questo caso la funzione costo (cross entropy) è
m X
c
(i)
X
J(w) = − yk log ŷ (i) .
i=1 k=1
Questi modelli non sono abbastanza e bisogna passare alle reti neurali, sebbene facciano
quello quello a cui siamo interessati. La motivazione sta nel fatto che la maggior parte
dei problemi non sono lineari: ad esempio, nel caso di classificazione, molto spesso il
boundary che separa le classi è non lineare (non per il noise, è proprio intrinseco nel
dataset). Finora noi abbiamo visto modelli lineari nel parametro w: possiamo quindi de-
finire nuove feature complicandole con polinomi (a partire da conoscenze sul problema)
in quanto in spazi con dimensioni maggiori il problema può diventare linearmente sepa-
rabile e possiamo applicare la regressione logistica. Tuttavia questo approccio presenta
dei problemi: in primo luogo possiamo partire già da un dato con alta dimensionalità (n
feature) e se non sappiamo quali combinazioni fare, considerando tutti i quadrati passia-
mo ad una dimensione di n2 /2, rendendo questo approccio intrattabile. Questo quindi
diventa un problema nel caso di immagini in quanto queste hanno già una dimensionalità
alta già nel dato grezzo. Cerchiamo di formalizzare questo possibile approccio di classic
machine learning : dato il vettore di feature, costruiamo una nuova configurazione dei
dati tramite una trasformazione fissata (anche non lineare) dalla quale ricaviamo ŷ con
un modello lineare. Con questo tipo di approccio, il vantaggio è che il learning avviene
soltanto nell’ultimo passaggio e inoltre è un problema convesso (se mi muovo verso un
minimo, sono sicuro di stare andando verso un minimo globale). L’approccio delle reti
neurali invece anche la trasformazione delle feature è parametrizzata con dei pesi w che
sono all’interno dell’algoritmo di learning (l’algoritmo capisce la rappresentazione giusta
del vettore di input); si applica poi un modello lineare. La differenza in questo caso è che
il problema di minimizzazione di complica che rendono le funzioni costo non convesse.
La non linearità non è l’unico problema: dobbiamo infatti tenere conto anche del fatto
di lavorare in spazi altamente dimensionali. I problemi che lavorare in uno spazio alto
dimensionale possono causare vanno sotto il nome di curse of dimensionality. Tutto
si riconduce al fatto che il numero di possibili configurazioni cresce esponenzialmente con
le dimensioni dei dati. La prima osservazione è che tipicamente i dati sono sparsi/isolati
in spazi alto dimensionali. Infatti il numero di dati in 1D deve essere simile al numero di
regioni con cui voglio stimare la funzione (idealmente ne vorrei uno per zona). Tuttavia,
se la dimensionalità d aumenta, il numero di dati richiesto sarà k d se consideriamo k
regioni per avere un buon campionamento. Ora immaginiamo questo esperimento per
capire che i punti sono isolati in spazi alto-dimensionali. Prendiamo un ipercubo (cubo in
Rd di lato 1) e supponiamo di avere N data points pescati in modo uniforme all’interno
del cubo. Supponiamo di prendere uno di questi cubi e di costruirci attorno un altro cubo
di lato l: ci chiediamo quanto debba essere grande l per contenere almeno altri k punti
42 CAPITOLO 4. RECAP + IL PROBLEMA DELLA DIMENSIONALITÀ
tra gli N punti. Tenendo conto del fatto che la proporzionalità è uniforme, otteniamo:
ld k k 1
' → l = ( )d .
1 N N
Con questa formula notiamo che più d cresce, più cresce anche l: diventa quindi perico-
loso attribuire ad un valore la label del suo primo vicino in questo caso perché è molto
distante (paragonabile alla massima distanza possibile nell’input space).
Un altro aspetto è che i data points stanno tutti sul boundary dello spazio di input.
Supponiamo infatti di avere una sfera di raggio r = 1, dove i punti sono pescati a caso
all’interno di questa sfera. Il suo volume è Vd (r) = kd rr . Ora ci chiediamo quanti punti
stanno in una scorza identificata da una sfera di raggio i − : visto che i punti sono
distribuiti unifermemente, possiamo fare il rapporto fra la dimensione della scorza e il
volume totale otteniamo 1 − (1 − )d , il che dimostra la nostra affermazione, ovvero che
con l’aumentare di d la frazione di volume contenuta nella buccia diventa sempre più
grande.
Un terzo aspetto è che i data points sono relativamente vicini a iperpiani (che possiamo
suppore fare da boundary nella classificazione). Se saliamo di dimensionalità, la distanza
tra i punti aumenta perché per definizione di distanza stiamo aggiungendo delle quan-
tità (ha senso perché sono isolati). Tuttavia la distanza dall’iperpiano non cambia in
quanto la dimensione aggiunta è ortogonale al vettore norma che definisce l’iperpiano,
sebbene i punti si allontanino tra di loro. Questo quindi implica che piccole pertur-
bazioni dei punti in alte dimensioni possono cambiare la boundary rule (adverasarial
example:perturbazioni che fanno cambiare di categoria).
Questi aspetti sembrano rendere svantaggioso fare machine learning con spazi alto di-
mensionali, tuttavia un’assunzione che abbiamo fatto è stata avere i dati distribuiti in
modo uniforme. Questo in generale non è vero (manifold hypothesis): i dati reali sono
concentrati in una piccola porzione dello spazio. Ci sono prove empiriche infatti sul fat-
to che i dati vivano in superfici (continuità: possiamo fare trasformazioni) a più bassa
dimensionalità rispetto allo spazio di input (tenendo conto ovviamente del noise). Ad
esempio le immagini reali, ad esempio di volti, non occupano tutto lo spazio di input:
se scegliessimo infatti colori casuali per ogni pixel il risultato non sarebbe un’immagine
sensata. Un’altra assunzione che si fa è che queste superfici siano delle varietà, ovvero
localmente sono spazi euclidei e vivono in uno spaio di dimensione maggiore.