Zusammenfassungen
Universitätsnotizen im Markdown-Format aus Obsidian.
Reti neurali multistrato
download MD herunterladenStruttura del 2-layer NN
Le caratteristiche del 2-layer NN sono:
-
l'indice di conteggio inizia dal primo layer nascosto fino al layer di output;
-
ogni nodo di un livello è connesso a tutti i nodi del livello successivo (feed-forward, NN completamente connesso);
-
in linea di principio, un NN può avere un numero qualsiasi di strati nascosti;
-
un NN con 1 o 2 strati nascosti è chiamato NN poco profondo, altrimenti NN profondo;

-
i nodi sia nello strato nascosto che in quello di output sono neuroni sigmoidei, quindi ogni neurone calcola il valore di attivazione $ \sigma (Z)$.
Feed-forward (NN completamente connesso)

L'input viene propagato ai nodi del (primo) strato nascosto tramite il calcolo:
$x'_1 = \sigma (\sum_{i=0,4} w_{1i}x_i)$ \ $x'_2 = \sigma (\sum_{i=0,4} w_{2i}x_i)$

Le attivazioni $x'_i$ vengono poi propagate ai nodi del layer successivo (output) tramite il calcolo:
$y_1 = \sigma (\sum_{i=0,2} w'_{1i}x_i)$ \ $y_2 = \sigma (\sum_{i=0,2} w'_{2i}x_i)$ \ $y_3 = \sigma (\sum_{i=0,2} w'_{3i}x_i)$
Ad esempio:

$x'_1 = \sigma (w_{10} + w_{11}x_1 + w_{12}x_2 + w_{13}x_3)$ \ $x'_2 = \sigma (w_{20} + w_{21}x_1 + w_{22}x_2 + w_{23}x_3)$ \ $y = \sigma (w'_{10} + w_{11}x_1 + w_{12}x_2)$
Errore

Quando viene fornito un esempio di addestramento $d =
$\varepsilon_d (W) = \frac{1}{2} \sum_{i=1,n} (y_i - t_i)^2$
Addestrare una rete neurale
Addestrare un NN significa assegnare pesi e distorsioni a tutti gli archi e nodi, rispettivamente, in modo tale da calcolare la funzione target, con un certo grado di approssimazione. Ogni assegnazione di pesi e distorsioni rappresenta un'ipotesi. Lo spazio delle ipotesi è l'insieme di tutte le possibili ipotesi. Lo spazio delle ipotesi è continuo, a differenza dello spazio delle ipotesi degli alberi decisionali, dei classificatori basati su regole, ecc.
Esempio di NN per classificare le cifre scritte a mano
I punti principali di una NN per classificare le cifre scritte a mano sono:
- Task: riconoscere immagini che rappresentano numeri scritti a mano;
- Input: immagini di numeri scritti a mano 0-9;
- Output: il numero corretto associato a una determinata immagine.

Nello specifico:
- input: una cifra è rappresentata come un'immagine di $28*28=784$ pixel. Ogni pixel di input è in scala di grigi, con un valore di $1,0$ che rappresenta il bianco e un valore di $0,0$ che rappresenta il nero;

- livello di input: 784 nodi di input che codificano i valori (tra 0 e 1) dei pixel;
- livello di output: 10 neuroni, ciascuno associato a un valore di output. Ogni neurone ha un valore di attivazione compreso tra 0 e 1. Se, ad esempio, l'ultimo neurone ha il valore più alto, l'output è 9;
- due strati nascosti, ognuno composto da 16 nodi;

- addestrare questo NN significa assegnare valori a tutti i 13.002 parametri in modo tale da minimizzare l'errore.
Errore
Supponiamo che l'input sia una rappresentazione della cifra 2. Quindi il numero del nodo di output 2 dovrebbe essere 1, tutti gli altri sono 0. Altrimenti c'è un errore:

$\varepsilon_d (W) = \frac{1}{2} \sum_{i=1}^{10} (y_i - t_i)^2$
dove $y_i$ è il valore dell'i-esimo nodo di output e $t_i$ il rispettivo valore target.

NOTA: W è l'insieme dei parametri di rete (pesi e distorsioni) che, nel nostro caso, ha 13.002 elementi. $\varepsilon (W)$ è una funzione davvero complicata!
Per migliorare questo output, dovremmo aumentare il valore del nodo di output 2 (da 0,2 a 1,0) e diminuire i valori di altri nodi, ad esempio i nodi 1, 3 e 6. Come facciamo questo lavoro?

Matematicamente tramite:
$y_2 = 0,2 = \sigma (w_{2,0} + w_{2,1}x_1 + ... + w_{2,16}x_{16})$
dove $\sigma$ è la funzione sigmoidea e $x_1, ..., x_{16}$ sono i valori di attivazione dei nodi del secondo strato nascosto. Per aumentare $y_2$ potremmo aumentare:
- i pesi $w_{2,0}, ..., w_{2,16}$;
- i valori di attivazione $x_1, ..., x_{16}$.
NOTA: oltre ad aumentare il valore del nodo di output 2, dobbiamo abbassare i valori degli altri nodi di output.

Possiamo lavorare via diverse strategie:
- aumenta il peso;
- aumentare le attivazioni;
- retropropagazione (backpropagation).

Aumenta il peso
$w_{2,j} (1 \leq j \leq 16)$ in proporzione a:
- l'errore $\varepsilon_{y2} = \left | y_2 - t_2 \right |$, dove $t_2$ è il valore target per il nodo 2;
- l'attivazione $x_j$, perché le connessioni con le più alte attivazioni hanno l'effetto maggiore.
Cioè:
$\Delta w_{2,j} \approx \varepsilon_{y2}*x_{j}$, per ogni $j$ tale che $1 \leq j \leq 16$
Aumentare le attivazioni
Richiama questo:
$y_i = \sigma (w'_{i,0} + w'_{i,1}x_1 + ... + w'_{i,16}x_{16})$
dove $x'_i$ è l'attivazione dell'i-esimo nodo del precedente strato nascosto, e $w'_{ij}$ è il peso da $x'_j$ al nodo $x_i$ dello strato nascosto 2. Quindi per cambiare $x_i$ dobbiamo cambiare i pesi e le attivazioni del livello precedente, come abbiamo fatto per i nodi di output.
Il problema è che i valori di destinazione vengono forniti solo per i nodi di output, in modo che l'errore dei nodi nascosti non sia disponibile.
Retropropagazione (backpropagation)
Ed è qui che entra in gioco l'idea della retropropagazione:

- aggiorna i valori di output aggiornando i rispettivi pesi dal livello nascosto 2. I pesi vengono modificati in proporzione all'errore $\varepsilon$ e alle attivazioni $x_i$ del livello nascosto 2;
- aggiorna ogni xi nel livello nascosto 2 modificando i rispettivi pesi dal livello nascosto 1. I pesi vengono modificati in proporzione all' "errore" e alle attivazioni dei nodi del livello nascosto 1;
- questo viene applicato in modo ricorsivo a tutti i precedenti livelli nascosti della rete (se presenti).