Dialogo con ChatGPT.
Ciao ti chiederei delle spiegazioni sul neurone artificiale. IL dato in entrata è un n-pla in int4 o int8. Immagino che questi tipi non prevedano il segno ed un modello sià più preciso se usa gli int8. Ti chiedo se un modello può avere tipi diversi. Lo spazio quindi è lineare di dimensione n. COme puoi spiegare in modo divulgativo che si considera un iperpiano, quindi uno spazio di dimensione n-1, ritengo per semplificare… Inoltre si ricorra ad una matrice mxn immagino con m < n per semplificare il problema…
Certo. Ti propongo di separare alcuni concetti che spesso vengono mescolati: tipo numerico (INT4/INT8), spazio degli input, iperpiano, e matrice m×nm\times n. La tua intuizione è buona, ma ci sono un paio di correzioni importanti.
1. INT4 e INT8: il dato può essere con o senza segno
Un ingresso di un neurone artificiale può essere rappresentato, per esempio, come:
dove ogni è un numero intero.
Ma INT4 e INT8 possono essere signed oppure unsigned.
Per esempio:
- INT8 signed:
- INT8 unsigned:
- INT4 signed:
- INT4 unsigned:
Quindi non è corretto dire che INT4/INT8 non prevedono il segno.
Inoltre, INT8 non è necessariamente più preciso di INT4 in senso assoluto. Ha semplicemente più livelli rappresentabili:
contro
Quindi INT8 consente generalmente una quantizzazione più fine, ma la precisione effettiva dipende anche da come vengono quantizzati e scalati i valori.
2. Un modello può tranquillamente usare tipi diversi
Sì, assolutamente.
Anzi, nei modelli moderni è normale avere una certa eterogeneità numerica.
Per esempio potresti avere:
per gli ingressi,
per i pesi, ma utilizzare un accumulatore più grande, per esempio INT32, per il prodotto scalare:
Poi il risultato può essere nuovamente quantizzato.
Quindi una situazione concettualmente possibile è:
Questo è molto importante nelle reti quantizzate.
3. Lo spazio degli input è davvero -dimensionale
Qui la tua intuizione è corretta.
Se hai:
hai un punto in uno spazio di dimensione .
Per esempio, con tre caratteristiche:
puoi immaginare un normale spazio 3D.
Con:
hai invece uno spazio a 100 dimensioni. Non possiamo visualizzarlo, ma matematicamente il concetto è esattamente lo stesso.
Il fatto che i valori siano INT8 non cambia la dimensione dello spazio: cambia il numero di valori possibili lungo ciascuna dimensione.
4. Dove compare l’iperpiano?
Qui arriviamo al cuore del neurone artificiale.
Un neurone calcola, in forma semplificata:
oppure:
Immagina ora di chiedere:
Quali sono i punti per cui il neurone produce esattamente zero?
Poniamo:
Questa equazione descrive un iperpiano.
Ed è qui che entra in gioco la dimensione .
Se lo spazio degli input ha dimensione , l’insieme dei punti che soddisfano:
ha generalmente dimensione:
Un esempio molto intuitivo
Nel mondo 2D hai:
Questa equazione descrive una retta.
Lo spazio è 2D:
x2
↑
|
----+--------- ← retta
|
|
+----------→ x1
Una retta ha dimensione 1:
Nel mondo 3D:
descrive un piano.
Lo spazio è 3D, mentre il piano è 2D:
E in dimensioni abbiamo:
5. Ma perché un neurone “ha bisogno” dell’iperpiano?
Perché l’iperpiano rappresenta una sorta di confine decisionale.
Supponiamo di avere una funzione di attivazione molto semplice:
Il neurone divide quindi lo spazio in due regioni:
e
L’iperpiano
è il confine tra le due.
Questa è probabilmente la maniera più divulgativa per pensare al neurone:
Un neurone prende uno spazio nn-dimensionale e, attraverso i suoi pesi, definisce un confine n−1n-1-dimensionale che separa lo spazio in due regioni.
Naturalmente una rete neurale con funzioni di attivazione non lineari può creare confini molto più complessi.
6. E la matrice ?
Qui bisogna fare una piccola distinzione.
Supponiamo di avere un solo neurone:
I pesi sono un vettore di dimensione :
Se invece abbiamo m neuroni, ciascuno dei quali riceve gli stessi ingressi, possiamo mettere tutti i pesi in una matrice:
Questa è una matrice:
E possiamo scrivere:
Se:
e
allora:
Quindi abbiamo trasformato:
7. Però non è necessario
Questo è un punto importante rispetto alla tua ipotesi.
Non è necessario che:
Può essere:
oppure
oppure
Dipende da quello che deve fare il layer.
Per esempio:
è una riduzione dimensionale.
Ma puoi anche avere:
In questo caso hai un’espansione dello spazio.
8. Una maniera intuitiva di vedere la matrice
Puoi pensare alla matrice come a m neuroni messi insieme.
Hai:
neurone 1
/
x1 ---------------/
x2 --------------/
x3 -------------/
...
xn ------------/
neurone 2
/
x1 ---------------/
x2 --------------/
...
xn ------------/
...
neurone m
Ogni neurone ha il proprio vettore di pesi:
Quindi hai m diversi iperpiani, o meglio diverse direzioni/decision boundaries associate ai neuroni.
La matrice semplicemente li raccoglie tutti:
9. Dove entra la “semplificazione” ?
Qui farei attenzione alla terminologia.
Se scegli:
stai effettivamente facendo una compressione/riduzione della dimensionalità:
Per esempio:
Questo può essere utile perché una rappresentazione di 100 dimensioni può essere sufficiente per conservare l’informazione rilevante.
Ma non è il motivo per cui si usa una matrice m×nm\times n.
La matrice deriva semplicemente dal fatto che hai m neuroni, ognuno con n pesi.
Un’ultima precisazione molto importante
C’è un passaggio concettuale che secondo me vale la pena approfondire perché probabilmente è proprio quello che stai cercando di capire:
non significa semplicemente che “riduciamo lo spazio perché “.
La moltiplicazione per è una trasformazione dello spazio. Se , in generale stai proiettando/comprimendo dimensioni in dimensioni e inevitabilmente alcune informazioni possono andare perse.
E qui si apre il collegamento molto interessante con rango della matrice, kernel/null space, proiezioni, PCA e perché una rete neurale può comprimere un’enorme quantità di dati mantenendo le informazioni utili.
Ma cosa intendi per proiezioni? Certamente non della geometrai proiettiva …
Esatto: non sto parlando di geometria proiettiva. 😊
Uso “proiezione” nel senso di algebra lineare, cioè di una trasformazione che rappresenta un oggetto di uno spazio mediante un numero minore di coordinate.
Un esempio molto concreto
Immagina un punto nello spazio 3D:
Se costruisco:
e calcolo:
ho trasformato:
In pratica ho eliminato la coordinata z.
Geometricamente puoi immaginare di guardare lo spazio 3D “dall’alto”: punti che hanno e uguali, ma diverso, finiscono nello stesso punto del piano.
Questa è una proiezione nel senso dell’algebra lineare.
Ma con una matrice generica è più interessante
Considera:
Ora:
Non stiamo semplicemente buttando via . Stiamo combinando le tre coordinate per costruire due nuove coordinate.
Questo è molto più vicino a quello che succede in una rete neurale.
Infatti ogni riga di è un neurone:
Quindi:
Abbiamo trasformato uno spazio a 3 dimensioni in uno a 2 dimensioni:
E qui c’è una sottigliezza importante
Quando ho detto prima “proiettando/comprimendo”, “proiettando” era un po’ troppo informale.
Una generica trasformazione
con non è necessariamente una proiezione geometrica nel senso stretto.
È più corretto dire:
una trasformazione lineare da uno spazio di dimensione nn a uno spazio di dimensione mm.
Se ha rango , questa trasformazione porta dimensioni in dimensioni, ma inevitabilmente diversi punti dello spazio originale possono produrre lo stesso risultato.
Ed è proprio questo il concetto che diventa fondamentale per capire le reti neurali.
Per esempio, se:
i punti
e
producono entrambi:
Quindi la trasformazione ha perso informazione: partendo da non puoi sapere quale dei due punti originali avevi.
Questo è il significato profondo di una trasformazione
E il concetto matematico che descrive quale informazione viene persa è il kernel (o nucleo) della matrice. È probabilmente il prossimo concetto più utile da introdurre, perché si collega direttamente a ciò che stavi chiedendo sulla matrice .
Ma dal punto di vista strettamente matematico non si può parlare di trasformazione che richiede la biunivocità e quindi una matrice invertibile ovvero quadrata..
Sì, hai colto una distinzione matematica importante, ma c’è da precisare il termine “trasformazione”.
In algebra lineare si parla tranquillamente di trasformazione lineare anche quando non è biiettiva. La biiettività non è richiesta per essere una trasformazione lineare.
Data una matrice
la funzione
è una trasformazione lineare per qualsiasi .
Dove entra la biiettività?
Se vuoi che sia invertibile, allora sì: deve essere biiettiva.
E affinché una trasformazione lineare
sia biiettiva, necessariamente deve essere:
e la matrice deve avere rango pieno:
Quindi, nel caso quadrato:
puoi avere:
e poi recuperare univocamente:
Se , cosa succede?
Supponiamo:
Non può essere iniettiva.
Questo segue direttamente dal teorema rango-nullità:
Dato che:
necessariamente:
Quindi esiste almeno un vettore non nullo tale che:
E allora, per qualunque :
Quindi x e x+v diventano indistinguibili dopo la trasformazione.
Ed è precisamente per questo che dicevo che c’è perdita di informazione.
Quindi correggerei la mia formulazione precedente
Quando parlavo di “proiezione” riferendomi a
avrei dovuto dire più precisamente:
una trasformazione lineare non invertibile che riduce la dimensionalità.
“Proiezione” è un termine che si può usare in particolari circostanze, ma non è sinonimo generale di matrice rettangolare.
E questa distinzione è molto utile per capire le reti neurali: un layer m×n con m<n non sta semplicemente “cambiando coordinate”. Sta effettuando una funzione non invertibile e, in generale, sta eliminando alcune direzioni dello spazio degli input.
C’è poi un punto ancora più interessante: il neurone singolo con
non sta nemmeno facendo principalmente una riduzione da a . Sta producendo uno scalare, quindi la trasformazione lineare associata è
L’iperpiano n−1-dimensionale compare invece come insieme di punti che hanno la stessa uscita (per esempio ). Questa è una distinzione concettuale fondamentale.
Per “produrre uno scalare” forse intendi applicare il prodotto scalare che rende un numero.
Esattamente. È proprio il prodotto scalare il punto di partenza.
Se l’ingresso è
e i pesi del neurone sono
il neurone calcola:
che è uno scalare, cioè un singolo numero.
Poi normalmente aggiunge il bias:
Quindi possiamo rappresentare il neurone come:
e, se poi applichiamo una funzione di attivazione :
E qui torna l’iperpiano
Il prodotto scalare ha una proprietà geometrica interessante.
Consideriamo tutti i punti per cui:
Questi punti formano un iperpiano di dimensione .
Per esempio, in 3D:
è un piano 2D dentro lo spazio 3D.
Quindi abbiamo tre oggetti distinti, che è bene non confondere:
- Lo spazio degli ingressi
- Il prodotto scalare
che trasforma il vettore in uno scalare. - L’iperpiano
che è un sottoinsieme dello spazio degli ingressi e, genericamente, ha dimensione .
Ed è proprio questa terza cosa che può generare confusione: l’iperpiano non è il risultato del prodotto scalare. È l’insieme degli ingressi che producono un particolare risultato, in questo caso zero.
Anzi, possiamo fare un passo ulteriore: il vettore è ortogonale all’iperpiano. Questa proprietà permette di capire geometricamente perché i pesi del neurone determinano l’orientamento della “separazione” tra le due regioni dello spazio.
Ed i pesi cosa rappresentano?
Sì. E qui arriviamo probabilmente al concetto più importante per capire cosa “impara” un neurone.
I pesi
sono, matematicamente, i coefficienti con cui il neurone pesa ciascuna componente dell’ingresso.
Il neurone calcola:
Un’interpretazione molto intuitiva
Supponiamo che descriva una persona attraverso tre caratteristiche:
Il neurone potrebbe avere:
Allora calcola:
Significa che, per quel neurone, le tre caratteristiche contribuiscono in maniera diversa al risultato:
- : contributo relativamente piccolo e positivo di ;
- : contributo positivo maggiore di ;
- : contributo negativo di .
Naturalmente questa interpretazione va fatta con cautela se le variabili hanno scale diverse: normalmente gli input vengono opportunamente normalizzati/quantizzati.
Ma geometricamente i pesi sono ancora più interessanti
Il vettore
non è soltanto un insieme di coefficienti.
È anche un vettore nello stesso spazio degli input.
E questo vettore ha una proprietà fondamentale:
dove l’iperpiano è:
Quindi, se immaginiamo lo spazio degli input come un enorme spazio -dimensionale, il vettore dei pesi stabilisce l’orientamento del confine.
Per esempio, in 2D:
determina la retta:
Il vettore è perpendicolare alla retta:
↑ w
|
|
---------+--------- ← iperpiano
|
|
Quindi:
I pesi determinano l’orientamento dell’iperpiano.
Mentre il bias bb determina sostanzialmente dove questo iperpiano si trova.
E cosa significa che il neurone “impara”?
Questa è forse la parte più bella.
All’inizio i pesi sono, semplificando, valori iniziali:
Durante l’addestramento la rete li modifica.
Quindi sta cercando valori di:
che producano le risposte desiderate sugli esempi di addestramento.
In termini geometrici, puoi pensare che il neurone stia cercando l’orientamento e la posizione dell’iperpiano che separano meglio determinate regioni dello spazio degli input.
E qui c’è una precisazione importante rispetto a quanto dicevamo prima: un singolo neurone fa una cosa molto semplice. Una rete con molti neuroni e molti layer combina moltissimi di questi semplici elementi, e le funzioni di attivazione introducono la non linearità necessaria per costruire separazioni molto più complesse.
In altre parole, il peso dice al neurone quanto la componente xi conta nel prodotto scalare, mentre l’intero vettore definisce una direzione geometrica nello spazio degli input.
Il bias è una traslazione?
Sì come effetto geometrico, ma farei una precisazione importante: il bias non è una somma tra vettori nel calcolo del neurone. È uno scalare che viene sommato allo scalare prodotto dal prodotto scalare.
Il neurone calcola:
dove:
Quindi:
Però geometricamente il bias produce una traslazione
Consideriamo l’iperpiano:
Senza bias avremmo:
Quest’ultimo iperpiano passa necessariamente per l’origine.
Introducendo :
l’iperpiano viene spostato rispetto all’origine.
Per esempio, in 2D:
è una retta che passa per l’origine.
Se mettiamo:
otteniamo:
che è una retta parallela alla precedente, ma traslata.
Quindi:
- w determina l’orientamento dell’iperpiano;
- b ne determina lo spostamento;
- w^Tx+b è comunque uno scalare.
E perché non è una “somma tra vettori”?
Perché potremmo però riscrivere il bias in una forma geometrica interessante.
Se , possiamo trovare un vettore tale che:
Allora l’iperpiano può essere scritto come:
dove
Qui sì che compare una vera somma vettoriale: .
In sostanza, l’iperpiano con bias è una traslazione dell’iperpiano passante per l’origine.
Questa formulazione, secondo me, è molto utile perché collega perfettamente i tre concetti che stiamo costruendo:
E c’è un piccolo dettaglio elegante: la distanza dell’iperpiano dall’origine è
Quindi determina lo spostamento, ma non da solo: lo spostamento effettivo dipende anche dalla lunghezza di .