IA subsimbolica: reti neurali
Come simulare il cervello umano con una rete neurale artificiale
Last updated
Was this helpful?
Come simulare il cervello umano con una rete neurale artificiale
Last updated
Was this helpful?
Questa parte è tratta da:
Simon Haykin. Neural Networks and Learning Machines, 3rd Edition, 2009 [Capitolo 1]
Stephen Wolfram. What is chatGPT doing and why does it work? , 2023.
Supponiamo di voler sapere (come fece Galileo alla fine del 1500) quanto tempo impiegherà una palla di cannone lanciata da ogni piano della Torre di Pisa a toccare il suolo. Si potrebbe misurare il tempo in ogni caso e compilare una tabella dei risultati. Oppure si potrebbe fare ciò che è l'essenza della scienza: creare un modello che fornisca una sorta di procedura per calcolare la risposta, anziché limitarsi a misurare e ricordare ogni caso.
Immaginiamo di avere dati (in qualche modo idealizzati) su quanto tempo impiega una palla di cannone a cadere da diverse altezze. Mettiamo sull'asse delle x l'altezza e sull'asse delle y il tempo:
Potremmo fare un'ipotesi matematica, ad esempio usare una funzione lineare (una retta, detta di regressione) del tipo , dove è la variabile tempo, la variabile altezza, e sono dei parametri costanti ma incogniti, come modello per interpolare i dati:
Potremmo scegliere diverse rette. Ma quella visualizzata sopra è quella che in media si avvicina di più ai dati che ci vengono forniti, cioè quella che minimizza l'errore misurato come somma dei quadrati dei residui (differenze) tra i valori reali osservati e quelli previsti dal modello.
Potremmo anche provare qualcosa di matematicamente più complicato - ad esempio la funzione polinomiale - e verificare che in questo caso abbiamo un modello migliore (con meno errore):
In effetti, abbiamo usato come curva di interpolazione la formula che esprime il tempo della caduta di un grave da altezza assumendo di essere sulla terra con forza di gravità è:
Qualsiasi modello si utilizzi ha una particolare struttura di fondo: il tipo di funzione, come quella lineare, polinomiale, esponenziale e altre ancora. Ogni famiglia di modelli ha dei parametri liberi, una sorta di manopole da impostare per adattarsi ai dati risolvendo un problema di minimizzazione dell'errore. Ad esempio, in , i parametri liberi sono .
Ricordiamo sempre che ogni modello è una astrazione, e dunque una semplificazione, della realtà, ovvero:
L'esempio che abbiamo fatto sopra riguarda la creazione di un modello per dati numerici che provengono essenzialmente dalla fisica e per i quali abbiamo una relazione esplicita, una formula matematica, tra dati di ingresso e risposta del modello.
Per realizzare modelli per compiti di tipo umano, come ad esempio modelli che riconoscono immagini o che riconoscono e generano il linguaggio naturale umano, dobbiamo cambiare strategia. Per una cosa del genere non abbiamo (almeno per ora) nulla di simile a formule matematiche esplicite e spiegabili. Quindi come potrebbe essere un tale modello?
Consideriamo il problema del riconoscimento di immagini che contengono cifre numeriche, come quelle mostrate in figura sotto.
Se consideriamo il valore del livello di grigio di ogni pixel come una variabile , esiste una funzione di tutte queste variabili che, una volta valutata, ci dica quale cifra è disegnata nell'immagine?
Come vedremo parlando di reti neurali artificiali, è di fatto possibile costruire una funzione di questo tipo, ma tale funzione non è particolarmente semplice. In ogni caso il risultato finale è che se inseriamo in questa funzione l'insieme dei valori dei pixel di un'immagine, ne uscirà il numero che specifica di quale cifra si tratta.
La ricerca sulle reti neurali artificiali (artificial neural networks, o ANN), comunemente chiamate reti neurali, è stata motivata fin dall'inizio dalla consapevolezza che il cervello umano calcola in modo completamente diverso dal computer digitale convenzionale. Il cervello è un sistema di elaborazione delle informazioni altamente complesso, non lineare e parallelo. Ha la capacità di organizzare i suoi componenti strutturali, noti come neuroni, in modo da eseguire determinati calcoli (ad esempio, il riconoscimento di pattern, la percezione e il controllo motorio) molto velocemente.
Ad esempio, consideriamo il sonar di un pipistrello. I pipistrelli utilizzano una tecnica chiamata ecolocazione per localizzare le loro prede e navigare nell'ambiente circostante. L'ecolocazione è un sistema biologico che coinvolge l'emissione di suoni ad alta frequenza e l'ascolto dell'eco riflesso per ottenere informazioni sull'ambiente circostante. Ecco come funziona:
Emissione di suoni: i pipistrelli emettono ultrasuoni a frequenze molto elevate, al di fuori della gamma uditiva umana. Questi suoni vengono emessi attraverso la bocca o il naso del pipistrello, a seconda della specie.
Propagazione degli ultrasuoni: gli ultrasuoni si propagano attraverso l'ambiente circostante. Quando incontrano un oggetto solido, come una preda o un ostacolo, parte dell'energia degli ultrasuoni viene riflessa indietro verso il pipistrello.
Ascolto dell'eco: il pipistrello ascolta attentamente l'eco degli ultrasuoni riflessi. Sulla base del tempo trascorso tra l'emissione del suono e la ricezione dell'eco, nonché dalla frequenza e dall'intensità dell'eco, il pipistrello può determinare la distanza, la direzione e persino la forma degli oggetti circostanti.
Adattamento in tempo reale: i pipistrelli sono in grado di adattare la frequenza e il ritmo dell'ecolocazione in tempo reale a seconda delle caratteristiche dell'ambiente e delle prede presenti.
Nel processo di formazione dell'immagine sono incorporate invarianze per caratteristica che lo rendono essenzialmente indipendente dal movimento del bersaglio e dal movimento del pipistrello stesso.
Le complesse computazioni neurali necessarie per estrarre tutte queste informazioni dall'eco del bersaglio avvengono in un cervello grande come una prugna. In effetti, un pipistrello ecolocalizzatore può inseguire e catturare il suo bersaglio con una facilità e un tasso di successo che farebbero invidia a un ingegnere umano.
Possiamo dare la seguente definizione di rete neurale vista come macchina adattativa:
Una rete neurale è un processore distribuito e parallelo composto da semplici unità di elaborazione (neuroni) che ha una naturale propensione a immagazzinare la conoscenza esperienziale e a renderla disponibile per l'uso. Assomiglia al cervello per due aspetti:
La conoscenza viene acquisita dalla rete dal suo ambiente attraverso un processo di apprendimento.
Le forze delle connessioni tra neuroni, note come pesi sinaptici, sono utilizzate per memorizzare la conoscenza acquisita.
La procedura utilizzata per eseguire il processo di apprendimento è chiamata algoritmo di apprendimento, la cui funzione è modificare i pesi sinaptici della rete per raggiungere un obiettivo desiderato. La modifica dei pesi sinaptici costituisce il metodo tradizionale per la progettazione delle reti neurali. Tuttavia, è anche possibile che una rete neurale modifichi la propria topologia, il che è motivato dal fatto che i neuroni del cervello umano possono morire e possono crescere nuove connessioni sinaptiche.
Le reti neurali posseggono svariate capacità che consentono di trovare buone soluzioni approssimate a problemi complessi che sono intrattabili su larga scala.
Una rete neurale ha la capacità di apprendere e quindi di generalizzare. La generalizzazione si riferisce alla produzione da parte della rete neurale di output ragionevoli per input non incontrati durante l'addestramento.
Un paradigma popolare di apprendimento, chiamato apprendimento con insegnante o apprendimento supervisionato, prevede la modifica dei pesi sinaptici di una rete neurale mediante l'applicazione di una serie di esempi di addestramento etichettati. Ogni esempio consiste in un unico segnale di ingresso e in una corrispondente risposta desiderata (target). Alla rete viene presentato un esempio scelto a caso dall'insieme e i pesi sinaptici (parametri liberi) della rete vengono modificati per minimizzare la differenza tra la risposta desiderata e la risposta effettiva della rete prodotta dal segnale di ingresso.
L'addestramento della rete viene ripetuto per molti esempi dell'insieme, finché la rete non raggiunge uno stato stazionario in cui non si verificano più cambiamenti significativi nei pesi sinaptici. In questo modo la rete apprende dagli esempi costruendo una mappatura input-output per il problema in questione.
In una struttura parallela, diversi componenti del sistema possono lavorare simultaneamente su parti indipendenti dei dati o dei calcoli. In particolare, le reti neurali sono composte da un insieme di nodi o neuroni interconnessi. In una rete parallela, i calcoli su questi nodi possono essere eseguiti in modo simultaneo. Questa parallelizzazione avviene spesso grazie a hardware specializzato, come le unità di elaborazione grafica (GPU) o le unità di elaborazione tensoriale (TPU), che sono in grado di gestire operazioni matriciali in modo efficiente e parallelo.
Si riferisce al fatto che la relazione tra l'ingresso e l'uscita di una rete neurale non è una semplice funzione lineare. Nei sistemi lineari, l'uscita è una combinazione lineare dell'ingresso, ad esempio . Una funzione non lineare è ad esempio la funzione logistica:
La non linearità permette alle reti neurali di apprendere e rappresentare schemi e relazioni complesse dei dati.
Le reti neurali hanno la capacità di adattare i loro pesi sinaptici ai cambiamenti dell'ambiente circostante. Inoltre, quando opera in un ambiente non stazionario (ovvero che cambia nel tempo), una rete neurale può essere progettata per modificare i suoi pesi sinaptici in tempo reale. Come regola generale, si può affermare che quanto più un sistema è adattivo, pur garantendo che rimanga stabile, tanto più robuste saranno le sue prestazioni quando il sistema dovrà operare in un ambiente non stazionario.
Va sottolineato, tuttavia, che l'adattabilità non sempre porta alla robustezza; anzi, può fare l'esatto contrario. Ad esempio, un sistema adattivo con costanti di breve durata può cambiare rapidamente e quindi tendere a rispondere ai minimi cambiamenti dell'ambiente, causando un drastico degrado delle prestazioni del sistema. Un sistema d'allarme non si deve attivare se una molecola d'aria si sposta, ma solo se c'è un cambiamento significativo.
Per sfruttare appieno i vantaggi dell'adattabilità, le costanti di tempo principali del sistema dovrebbero essere sufficientemente lunghe da permettere al sistema di ignorare i cambiamenti irrilevanti, ma sufficientemente brevi da rispondere a cambiamenti significativi nell'ambiente; un problema noto come dilemma della stabilità-plasticità.
Una rete neurale ha il potenziale di essere intrinsecamente tollerante ai guasti, o nel senso che le sue prestazioni degradano in modo graduale in condizioni operative avverse. Ad esempio, se un neurone o i suoi collegamenti sono danneggiati, il recupero di un dato memorizzato è invalidato. Tuttavia, a causa della natura distribuita delle informazioni memorizzate nella rete, il danno deve essere esteso a molti neuroni prima che la risposta complessiva della rete sia seriamente compromessa.
Il neurone è l'unità di elaborazione dell'informazione fondamentale per il funzionamento di una rete neurale.
Qui identifichiamo gli elementi fondamentali del modello neurale:
Un insieme di segnali di ingresso che raccolgono gli ingressi provienienti dai neuroni pre-sinaptici;
Un insieme di sinapsi, o collegamenti, ognuno dei quali è caratterizzato da un peso, detto anche forza. In particolare, il segnale di ingresso associato alla sinapsi collegata al neurone viene moltiplicato per il peso sinaptico . È importante notare il modo in cui sono scritti i pedici del peso sinaptico . Il primo pedice di si riferisce al neurone in questione, mentre il secondo pedice si riferisce al neurone pre-sinaptico che fornisce l'ingresso. In sostanza, l'insieme di tutti i pesi sinaptici si può rappresentare con una matrice :
La riga di indice della matrice indica i collegamenti in ingresso del neurone con neuroni pre-sinaptici
La colonna di indice della matrice indica i collegamenti in uscita del neurone con neuroni post-sinaptici
A differenza del peso di una sinapsi nel cervello, il peso sinaptico di un neurone artificiale può essere compreso in un intervallo che include valori negativi e positivi.
Un combinatore per sommare i segnali di ingresso, ponderati per i rispettivi pesi sinaptici del neurone; in questo caso abbiamo un combinatore lineare perché i pesi vengono moltiplicati per gli ingressi e sommati.
Un bias applicato dall'esterno, indicato con . Il bias, o termine di polarizzazione, gioca un ruolo fondamentale nelle reti neurali:
Il bias influenza la soglia di attivazione per il neurone. Esso determina quanto deve essere forte l'input combinato affinché il neurone si attivi.
Il bias consente alla rete di apprendere modelli che non passano per l'origine, migliorando la sua capacità di generalizzazione. Questo è cruciale perché permette al neurone di attivarsi anche quando tutti gli input sono zero.
Una funzione di attivazione per limitare l'ampiezza dell'uscita di un neurone. La funzione di attivazione è detta anche funzione di schiacciamento (squashing function), in quanto schiaccia (limita) l'intervallo di ampiezza ammissibile del segnale di uscita a un valore finito.
Una risposta , ovvero l'uscita del neurone.
In formule, possiamo descrivere questo modello per un neurone come segue:
dove:
è l'uscita del combinatore lineare;
è il potenziale di attivazione (detto anche campo locale indotto);
è la funzione di attivazione;
è il segnale di uscita del neurone.
Possiamo riformulare il modello includendo il bias tra gli input, ovvero aggiungendo un nuovo ingresso con peso , come mostrato nella figura seguente.
La nuova formulazione matematica è dunque:
dove e .
In teoria, ogni neurone può avere una funzione di attivazione diversa. In pratica, la funzione di attivazione è la medesima per la rete, oppure varia per alcuni strati della rete, ad esempio quello finale, ed è costante per gli altri strati.
Una semplice funzione di attivazione è la funzione soglia (threshold function), definita come segue:
Dunque con questa funzione l'uscita è binaria (0 o 1) a seconda che il potenziale di attivazione sia negativo o non-negativo, ovvero vale la proprietà "tutto o niente". Un neurone di questo tipo viene chiamato modello McCulloch-Pitts, in riconoscimento del lavoro pionieristico svolto da McCulloch e Pitts (1943).
La funzione sigmoide, il cui grafico è a forma di S, è di gran lunga la forma più comune di funzione di attivazione utilizzata nella costruzione di reti neurali. È definita come una funzione strettamente crescente che presenta un equilibrio aggraziato tra comportamento lineare e non lineare. Un esempio di funzione sigmoide è la funzione logistica, definita da:
dove è il parametro di pendenza della funzione logistica. Variando il parametro , si ottengono funzioni logistiche con pendenze diverse. Al limite, quando il parametro della pendenza si avvicina all'infinito, la funzione logistica diventa semplicemente una funzione soglia. Mentre una funzione soglia assume il valore di 0 o 1, una funzione sigmoide assume un intervallo continuo di valori da 0 a 1.
Si noti anche che la funzione sigmoide è differenziabile (ovvero ammette una derivata), mentre la funzione soglia non lo è. Una funzione differenziabile è una funzione matematica che ha una derivata in ogni punto del suo dominio. La derivata di una funzione rappresenta il tasso di variazione istantaneo della funzione in un determinato punto e può essere interpretata come la pendenza della retta tangente al grafico della funzione in quel punto. La differenziabilità è una caratteristica importante della teoria delle reti neurali.
Le funzioni di attivazione definite finora vanno da 0 a 1. A volte è auspicabile che la funzione di attivazione vada da -1 a 1. In particolare, la funzione soglia è ora definita come:
che viene comunemente chiamata funzione signum.
Per la forma corrispondente di una funzione sigmoide, possiamo usare la funzione tangente iperbolica, ovvero il rapporto tra seno e coseno iperbolici, definita da:
La funzione di attivazione ReLU è una delle più semplici e popolari nel campo delle reti neurali. ReLU sta per Rectified Linear Unit, ed è definita come:
Quindi:
Se , allora
Se , allora
Perché è così usata?
Semplicità computazionale. È facilissima da calcolare — niente esponenziali, tangenti iperboliche, né divisioni.
Evita il vanishing gradient. A differenza di sigmoid/tanh, non schiaccia l’input in intervalli molto piccoli (come [-1, 1]), quindi il gradiente rimane vivo durante il backpropagation.
Sparsità attivata. Poiché restituisce zero per molti input, induce representazioni sparse (ossia con pochi valori non nulli), cioè solo pochi neuroni si attivano — utile per efficienza e generalizzazione.
In compenso, se un neurone riceve sempre input negativi, la ReLU restituisce sempre 0 e quel neurone smette di imparare (il gradiente è zero).
La funzione di attivazione softmax è usata soprattutto nell’ultimo strato di una rete per problemi di classificazione multiclasse. Prende un vettore di valori reali e li trasforma in probabilità, cioè in numeri compresi tra 0 e 1 che sommano a 1. La formula è:
dove è il valore del neurone -esimo.
Softmax permette di interpretare l’output come una distribuzione di probabilità sulle classi evidenziando la classe più probabile normalizzando le attivazioni. Ed esempio, se è il vettore dei neuroni, il risultato dopo l'applicazione di softmax è approssimativamente . Come si vede, il valore massimo (8) viene evidenziato dalla funzione, che gli assegna una probabilità prossima a 1.
Il modello neurale descritto finora è deterministico, nel senso che il suo comportamento input-output è definito con precisione per tutti gli input. Per alcune applicazioni delle reti neurali, è auspicabile basare l'analisi su un modello neurale stocastico. In questo modello, alla funzione di attivazione del modello McCulloch-Pitts viene data un'interpretazione probabilistica. In particolare, a un neurone è consentito di risiedere solo in uno dei due stati, diciamo 0 o 1. La decisione di un neurone di attivarsi (cioè di cambiare il suo stato da spento ad acceso) è probabilistica: ad esempio, se c'è una probabilità del 90% a favore di 1 e 10% a favore di 0, allora il neurone avrà una probabilità di 9 su 10 di accendersi, e di 1 su 10 di rimanere spento.
Sia lo stato del neurone e la probabilità di accensione, dove è il campo locale indotto del neurone. Possiamo quindi scrivere:
Una scelta standard per è la funzione di forma logistica con parametro :
dove è una pseudo-temperatura utilizzata per controllare l'incertezza del neurone di accendersi. Si noti che quando tende a 0, il parametro di pendenza tende a infinito e il neurone stocastico si riduce a una forma "fredda" priva di incertezza, cioè al modello deterministico di McCulloch-Pitts. Viceversa quando la temperatura aumenta, cresce anche l'incertezza, ovvero la componente stocastica, del modello.
I diagrammi a blocchi del modello di un neurone artificiale possono essere semplificati utilizzando l'idea dei grafi di flusso del segnale, senza sacrificare nessuno dei dettagli funzionali del modello.
Un grafo di flusso del segnale è una rete di collegamenti diretti che sono interconnessi in determinati punti chiamati nodi. Si veda la figura seguente.
Il flusso dei segnali nelle varie parti del grafo è dettato da tre regole fondamentali:
Regola 1. Un segnale scorre lungo un collegamento solo nella direzione definita dalla freccia sul collegamento (vedere le parti (a) e (b) della figura precedente).
Si possono distinguere due diversi tipi di collegamenti:
Collegamenti sinaptici, il cui comportamento è regolato da una relazione lineare ingresso-uscita. In particolare, il segnale del nodo viene moltiplicato per il peso sinaptico per produrre il segnale del nodo (vedi parte (a) della figura precedente).
Collegamenti di attivazione, il cui comportamento è governato da una relazione tipicamente non lineare ingresso-uscita, corrispondente ad funzione di attivazione (vedi parte (b) della figura precedente).
Regola 2. Il segnale di un nodo è uguale alla somma algebrica di tutti i segnali che entrano nel nodo in questione attraverso i collegamenti in entrata (si veda la parte (c) della figura precedente).
Regola 3. Il segnale di un nodo viene trasmesso a ciascun collegamento in uscita che ha origine da quel nodo (si veda la parte (d) della figura precedente).
Ad esempio, utilizzando queste regole, possiamo costruire il grafo del flusso del segnale del modello di un neurone che abbiamo descritto in precedenza. Questo è chiaramente più semplice in apparenza, ma contiene tutti i dettagli funzionali del modello originale.
Un grafo diretto, così definito, è completo nel senso che descrive non solo il flusso di segnali da neurone a neurone (flusso inter-neuronale), ma anche il flusso di segnali all'interno di ciascun neurone (flusso intra-neuronale). Quando, tuttavia, l'attenzione si limita al flusso di segnali da neurone a neurone, possiamo utilizzare una forma astratta di questo grafo, omettendo i dettagli del flusso di segnali all'interno dei singoli neuroni. Un tale grafo diretto è chiamato grafo dell'architettura della rete neurale.
Si parla di retroazione (feedback) in un sistema dinamico quando l'uscita di un elemento del sistema influenza, direttamente o indirettamente, l'ingresso di quello stesso elemento, dando così origine a uno o più percorsi chiusi (loop) per la trasmissione di segnali all'interno del sistema.
In effetti, la retroazione si verifica in quasi tutte le parti del sistema nervoso di ogni animale. Le reti neurali biologiche sono fortemente ricorrenti. I neuroni biologici sono interconnessi in modi altamente ciclici. Esistono loop locali (tra pochi neuroni) e loop a lungo raggio. Le informazioni possono circolare più volte prima di arrivare a una risposta e questo rende possibile la memoria, l’attenzione, il contesto, e forse anche la coscienza.
Ad esempio, si consideri il circuito talamo-coticale. Il talamo riceve segnali dal mondo esterno (vista, udito, tatto...) o da altre parti del cervello. Li invia alla corteccia, che li elabora: riconosce un volto, capisce una parola, sente una melodia. La corteccia manda segnali di ritorno al talamo, creando un circuito. Il talamo modifica il modo in cui invierà i prossimi segnali, in base a quello che la corteccia ha già capito.
Inoltre, come vedremo, il feedback svolge un ruolo importante nello studio di una classe speciale di reti neurali artificiali, note come reti ricorrenti.
La figura seguente mostra il grafo del flusso del segnale di un sistema di retroazione a loop singolo, in cui sono presenti un segnale di ingresso , un segnale interno e un segnale di uscita . Il sistema è composto da un percorso di andata e uno di ritorno, caratterizzati rispettivamente dalle funzioni di attivazione e .
Possiamo descrivere matematicamente questo sistema ricorrente come segue:
Riscrivendo il segnale interno otteniamo un'equazione ricorsiva in cui segnale di uscita in un dato istante influenza il medesimo segnale all'istante successivo :
Il modo in cui i neuroni di una rete neurale sono strutturati è intimamente legato all'algoritmo di apprendimento utilizzato per addestrare la rete. La classificazione degli algoritmi di apprendimento verrà presa in considerazione più avanti; qui ci concentriamo sulle architetture (strutture) delle reti. In generale, possiamo identificare tre classi fondamentalmente diverse di architetture di rete.
In una rete neurale a strati, i neuroni sono organizzati in forma di strati (layer). Nella forma più semplice di rete a strati, abbiamo uno strato di ingresso di nodi sorgente che proietta direttamente su uno strato di uscita di neuroni, ma non viceversa.
In altre parole, in questa rete la computazione è strettamente in avanti (feedforward), dagli ingressi all'uscita. Una rete di questo tipo è chiamata rete neurale in avanti (FFNN, Feedforward Neural Network) a singolo strato, con la designazione "a singolo strato" riferita allo strato di uscita di neuroni di calcolo. Non contiamo lo strato di ingresso dei nodi sorgente perché in essi non viene eseguita alcuna computazione.
Ad esempio, la rete in figura ha 4 input ognuno dei quali è connesso a 4 neuroni di output:
Vediamo l'equazione matematica che descrive la rete. Per ciascun neurone di output (con ):
dove:
sono gli ingressi (input layer, con )
è il peso associato al collegamento tra il nodo di input e il neurone di output
è il bias del neurone
è la funzione di attivazione
Usando la notazione vettoriale risulta tutto più conciso:
dove:
è il vettore degli input
è la matrice quadrata con 4 righe e 4 collonne che contiene i pesi
è il vettore dei bias
è applicata elemento per elemento al vettore risultante
Input:
Pesi:
Bias:
Calcoliamo il del prodotto matrice-vettore:
Aggiungiamo il bias:
Applichiamo la funzione di attivazione (supponiamo ReLU) e otteniamo il risultato finale, ovvero il valore dell'output :
La seconda classe di reti neurali in avanti si distingue per la presenza di uno o più strati nascosti, i cui nodi di calcolo sono chiamati neuroni nascosti; il termine "nascosto" si riferisce al fatto che questa parte della rete neurale non è vista direttamente né dall'ingresso né dall'uscita della rete.
Aggiungendo uno o più strati nascosti, la rete è in grado di estrarre statistiche di ordine superiore dai suoi ingressi. In un certo senso, la rete acquisisce una prospettiva globale nonostante la sua connettività locale.
In una rete multi-strato, i nodi sorgenti o di input alimentano il primo strato. Il secondo strato è alimentato dalle uscite del primo strato e così via fino all'ultimo strato, ovvero i neuroni di output, che forniscono la risposta della rete al vettore di ingresso. La computazione avviene in avanti, per questo la rete si chiama feedforward.
In generale, una rete neurale calcola una funzione che trasforma un vettore di ingresso di numeri reali in un vettore di uscita di numeri reali, possibilmente di dimensioni diverse, passando per zero o più strati nascosti di computazione.
Nella figuara che segue, i 10 nodi di input riforniscono i 4 neuroni del primo strato nascosto. I segnali di uscita di questo strato vengono utilizzati come input per il secondo strato di 2 neuroni, che rappresenta l'output della rete. La rete è totalmente connessa, nel senso che ogni nodo (incluso l'ingresso) è collegato a tutti i nodi dello strato successivo. In questo caso, la rete calcola una funziona che trasforma un vettore a 10 componenti in un vettore a 2 componenti.
Abbiamo:
Input layer:
Hidden layer:
Output layer:
Possiamo riscrivere l'equazione completa della rete neurale feedforward a due strati come segue. Per lo strato nascosto (hidden layer) abbiamo:
dove:
è il vettore di input
è una matrice rettangolare con 4 righe e 10 colonne che contiene i pesi tra input e hidden layer
è il bias dello strato nascosto
è la funzione di attivazione dello strato nascosto
Per lo strato di uscita (output layer) abbiamo:
dove:
è una matrice rettangolare con 2 righe e 4 colonne che contiene i pesi tra hidden e output layer
è il bias dello strato di output
è la funzione di attivazione dello strato di output
L'equazione finale complessiva compone le due precedenti:
Vediamo in questo caso il codice in Python che implementa la funzione calcolata dalla rete su un esempio specifico:
Le reti feedforward computano in un solo passaggio solo in avanti. Sono più semplici da implementare e addestrare e computazionalmente efficienti dato che si prestano meglio ad essere parallelizzate. Di contro, non hanno memoria e dunque non adatte a dati sequenziali (es. testo, audio, serie temporali) che necessitano di capire un contesto (es. una parola in una frase). Sono invece più adatta a dati statici (es. immagini, classificazione).
Una rete neurale ricorrente (RNN, Recurrent Neural Network) si distingue da una rete neurale feedforward per la presenza di almeno un ciclo di retroazione (feedback loop).
Nella rete ricorrente in figura esiste un singolo strato di neuroni, con ogni neurone che restituisce il suo segnale di uscita agli ingressi di tutti gli altri neuroni diversi da sé stesso. Si noti che la retroazione in questo caso è indiretta: lo stato di ogni neurone non è influenzato direttamente ma solo indirettamente dallo stato del neurone stesso. Quindi non ci sono cicli di auto-retroazione (self-feedback loop), ovvero situazioni in cui l'uscita di un neurone viene reimmessa direttamente nel suo ingresso. Si noti che i loop di retroazione comportano l'uso particolari elementi indicati con , la cui uscita è ritardata di un'unità di tempo rispetto all'ingresso.
Chiamiamo i neuroni . Sia lo stato dei 4 neuroni al tempo . Ogni neurone è funzione degli altri 3 neuroni al tempo , quindi:
oppure in forma vettoriale:
con:
: matrice dei pesi, con zero sulla diagonale () per escludere il self-feedback
: bias
: funzione di attivazione applicata elemento per elemento
Sia:
Stato iniziale al tempo :
Calcolo di :
Somma con il bias:
Applichiamo ReLU:
Ecco il codice Python che calcola lo stato dei neuroni per 10 iterazioni:
Nella figura successiva viene illustrata un'altra classe di reti ricorrenti con neuroni nascosti. Le connessioni di retroazione mostrate provengono sia dai neuroni nascosti (i due più in basso) sia dai neuroni di uscita (i due più in alto). Inoltre, sono presenti cicli di auto-retroazione: l'uscita di ogni neurone ritorna come ingresso al neurone stesso e agli altri neuroni della rete. Vi sono due ingressi che confluiscono nei due neuroni di output.
Abbiamo:
2 input
2 neuroni nascosti
2 neuroni di output
Ogni neuroni riceve segnali dagli altri neuroni, incluso sé stesso, al tempo precedente
In particolare, i neuroni di output ricevono anche segnali dagli input correnti
Definiamo:
un vettore che giustappone lo stato dei neuroni nascosti e di uscita.
Stato nascosto:
Stato di output:
dove:
: pesi da input a output
: pesi da feedback totale (i 4 neuroni) a hidden/output
: bias
: funzioni di attivazione
Le reti ricorrenti computano un valore dinamico, che dipende dal passare del tempo, e non statico come le reti in avanti. Implementano in questo modo una memoria interna (possono ricordare eventi passati) e quindi sono più adatte per lavorare su dati che necessitano di memorizzare un contesto per essere compresi, come testo, audio o serie temporali. La memoria è però spesso limitata nel tempo (da pochi step precedenti) e oggi queste reti sono superate in molti casi dall'architettura Transformer.
La conoscenza si riferisce alle informazioni memorizzate da una persona o da una macchina per interpretare, prevedere e rispondere in modo appropriato al mondo esterno.
Uno dei compiti principali di una rete neurale è quello di apprendere un modello del mondo (ambiente circostante) in cui è inserita e di mantenere il modello sufficientemente coerente con il mondo reale, in modo da raggiungere gli obiettivi specificati dell'applicazione di interesse. La conoscenza del mondo consiste in due tipi di informazioni:
Lo stato del mondo conosciuto, rappresentato da fatti relativi a ciò che è e ciò che è stato conosciuto; questa forma di conoscenza è definita conoscenza pregresse e invarianti.
Le osservazioni (misure) del mondo, ottenute per mezzo di sensori progettati per sondare l'ambiente in cui la rete neurale dovrebbe operare. Le osservazioni sono la base per estrarre gli esempi utilizzati per addestrare la rete neurale.
Esistono quattro regole generali per la rappresentazione della conoscenza:
Regola 1. Input simili (tratti da classi che si assomigliano) devono produrre rappresentazioni di conoscenza (pesi sinaptici) simili all'interno della rete.
Regola 2. Input diversi (tratti da classi disparate) devono produrre rappresentazioni ampiamente diverse nella rete.
Regola 3. Se una particolare caratteristica è importante, allora ci dovrebbe essere un gran numero di neuroni coinvolti nella rappresentazione di quell'elemento nella rete.
Regola 4. Le informazioni pregresse e gli invarianti dovrebbero essere incorporate nella progettazione di una rete neurale ogni volta che sono disponibili, in modo da semplificare la progettazione della rete evitando di doverle apprendere.
La regola 4 della rappresentazione della conoscenza è particolarmente importante perché, rispettandola correttamente, si ottiene una rete neurale con una struttura specializzata. Questo è altamente auspicabile per diverse ragioni:
Le reti biologiche visive e uditive sono note per essere molto specializzate.
Una rete neurale con struttura specializzata ha di solito un numero inferiore di parametri liberi da regolare rispetto a una rete completamente connessa. Di conseguenza, la rete specializzata richiede un set di dati più piccolo per l'addestramento, apprende più velocemente e spesso generalizza meglio.
La velocità di trasmissione delle informazioni attraverso una rete specializzata (throughput) è accelerata.
Il costo di costruzione di una rete specializzata si riduce grazie alle sue dimensioni ridotte rispetto alla sua controparte completamente connessa.
Si noti, tuttavia, che l'incorporazione di conoscenze pregresse nella progettazione di una rete neurale limita l'applicazione della rete al problema specifico affrontato dalla conoscenza di interesse.
Una questione importante da affrontare, ovviamente, è come sviluppare una struttura specializzata incorporando informazioni pregresse nella sua progettazione. Possiamo utilizzare una combinazione di due tecniche:
la restrizione dell'architettura della rete, ottenuta attraverso l'uso di connessioni locali note come campi recettivi. Il campo recettivo di un neurone è definito come quella regione del campo di ingresso su cui gli stimoli in arrivo possono influenzare il segnale di uscita prodotto dal neurone.
la limitazione della scelta dei pesi sinaptici, che si realizza attraverso l'uso della condivisione dei pesi.
Ad esempio, si consideri la rete feedforward parzialmente connessa rappresentata nella figura successiva.
Questa rete ha un'architettura ristretta per definizione. I primi sei nodi sorgente costituiscono il campo recettivo del primo neurone nascosto, i secondi sei sono il campo ricettivo del secondo neurone nascosto e così via. Quindi c'è una forte intersezione tra i campi recettivi dei neuroni nascosti. Inoltre, possiamo aggiungere un ulteriore vincolo sulla condivisione dei pesi facendo in modo che ogni neurone nascosco utilizzi gli stessi pesi per le 6 connessioni di ingresso.
Consideriamo i seguenti fenomeni fisici:
Quando un oggetto di interesse ruota, l'immagine dell'oggetto percepita da un osservatore cambia in modo corrispondente, ma l'oggetto è il medesimo.
Una persona può parlare con voce bassa o alta, in modo lento o veloce, ma le parole sono le stesse.
Un sistema di riconoscimento di oggetti o un sistema di riconoscimento vocale deve essere in grado di gestire una serie di trasformazioni del segnale osservato, ovvero produrre risultati che sono invarianti rispetto a queste trasformazioni (la rotazione dell'oggetto o il cambio di voce umana).
Esistono almeno tre tecniche per rendere le reti neurali di tipo classificatore invarianti alle trasformazioni:
Invarianza per struttura. L'invarianza può essere imposta a una rete strutturandone opportunamente la topologia. In particolare, le connessioni e i pesi sinaptici tra i neuroni della rete vengono create in modo che le versioni trasformate dello stesso input siano costrette a produrre lo stesso output.
Invarianza per addestramento. La rete viene addestrata presentandole un certo numero di esempi diversi dello stesso oggetto, scelti in modo da corrispondere a diverse trasformazioni dell'oggetto. Se il numero di esempi è sufficientemente grande e se la rete viene addestrata per imparare a discriminare tra le diverse viste dell'oggetto, possiamo aspettarci che la rete generalizzi correttamente a trasformazioni diverse da quelle che le vengono presentate.
Spazio delle caratteristiche invarianti. La terza tecnica si basa sulla premessa che sia possibile estrarre caratteristiche che definiscono il contenuto informativo essenziale di un insieme di dati in ingresso e che siano invarianti rispetto alle trasformazioni dell'ingresso. Se si utilizzano tali caratteristiche, la rete come classificatore viene sollevata dall'onere di dover delineare la gamma di trasformazioni di un oggetto.
Così come esistono diversi modi in cui noi stessi impariamo dall'ambiente che ci circonda, lo stesso vale per le reti neurali. In senso lato, possiamo classificare i processi di apprendimento attraverso i quali funzionano le reti neurali come segue: apprendimento con un insegnante (o supervisionato) e apprendimento senza insegnante (o non supervisionato). Una via di mezzo è l'apprendimento per rinforzo.
L'apprendimento supervisionato, il metodo più utilizzato, prevede l'addestramento di un modello su dati etichettati, in cui ogni esempio in ingresso è accompagnato dalla corrispondente risposta. Questa guida permette al modello di apprendere una mappatura tra gli input e gli output desiderati, consentendogli di generalizzare a nuovi dati non visti. I compiti di classificazione e regressione esemplificano la versatilità dell'apprendimento supervisionato, applicato con successo al filtraggio dello spam e al riconoscimento delle immagini.
Al contrario, l'apprendimento non supervisionato opera su dati non etichettati, privi di categorie o etichette predefinite. Il compito del modello è quello di scoprire schemi e strutture nascoste all'interno dei dati stessi senza sapere a priori quali sono. Questa capacità trova applicazione nel clustering, dove gli elementi in uno spazio vengono raggruppati in base alla loro somiglianza, e nel rilevamento delle anomalie, dove i valori anomali vengono identificati come deviazioni dalla norma.
L'apprendimento per rinforzo si distingue dalle sue controparti supervisionate e non supervisionate perché immerge l'agente in un ambiente interattivo. L'agente impara interagendo con l'ambiente, compiendo azioni e ricevendo ricompense o penalità in base ai risultati. Questo approccio per tentativi ed errori (trial-and-error) consente all'agente di sviluppare una politica (policy, una sorta di strategia), un insieme di regole che guidano le sue azioni alla ricerca della massimizzazione della ricompensa cumulativa. I giochi, la robotica e la finanza sono domini in cui l'apprendimento per rinforzo ha dimostrato notevole successo.
L'apprendimento con un insegnante è anche definito apprendimento supervisionato. La figura successiva mostra un diagramma a blocchi che illustra questa forma di apprendimento.
In termini concettuali, possiamo pensare che l'insegnante abbia una conoscenza dell'ambiente e che tale conoscenza sia rappresentata da una serie di esempi di input-output. L'ambiente, tuttavia, è sconosciuto alla rete neurale (nella figura, l'ambiente è esterno al ciclo di retroazione colorato in azzurro). Supponiamo ora che l'insegnante e la rete neurale siano entrambi esposti a un vettore di addestramento (cioè un esempio) tratto dallo stesso ambiente. In virtù della conoscenza pregressa, l'insegnante è in grado di fornire alla rete neurale una risposta desiderata per quel vettore di addestramento. La risposta desiderata rappresenta l'azione ottimale che la rete neurale deve eseguire.
I parametri della rete vengono quindi regolati sotto l'influenza combinata del vettore di addestramento e del segnale di errore. Il segnale di errore è definito come la differenza tra la risposta desiderata e la risposta effettiva data dalla rete. Questa regolazione viene effettuata in modo iterativo, passo dopo passo, con l'obiettivo di far sì che la rete neurale emuli l'insegnante.
In questo modo, la conoscenza dell'ambiente a disposizione dell'insegnante viene trasferita alla rete neurale attraverso l'addestramento e immagazzinata sotto forma di pesi sinaptici fissi, che rappresentano la memoria a lungo termine. Quando si raggiunge questa condizione, si può fare a meno dell'insegnante e lasciare che la rete neurale si occupi dell'ambiente da sola.
Ad esempio, immaginiamo che la rete neurale debba distinguere le immagini di un gatto da quello di un bambino. Potremmo fornire alla rete un certo numero di immagini associate all'etichetta "Gatto" o "Bambino". In fase di addestramento, per ogni immagine fornita, la rete vede solo l'immagine, senza conoscere l'etichetta (ovvero la semantica). Se la rete risponde correttamente, nulla viene fatto. Altrimenti i pesi della rete vengono modificati opportunamente. Quando la rete risponde sufficientemente bene, l'addestramento è concluso.
Più precisamente, la tecnica usata per modificare i pesi è detta retropropagazione (backpropagation). Il processo è chiamato backpropagation perché consiste nel lavorare a ritroso dallo strato di uscita a quello di ingresso, regolando sistematicamente i pesi in base all'errore (la differenza tra l'uscita prevista e quella effettiva).
Passaggio in avanti: In primo luogo, un input viene fatto passare attraverso la rete neurale strato per strato (dall'input all'output) per produrre una previsione. Questa operazione è nota come passaggio in avanti.
Calcolo della perdita: Una volta che la rete produce un'uscita, la differenza tra questa uscita e il valore vero (target) viene calcolata utilizzando una funzione di perdita (loss function).
Passaggio all'indietro: Qui avviene la vera azione della retropropagazione. Partendo dallo strato di uscita, l'errore viene utilizzato per calcolare il gradiente della funzione di perdita rispetto a ciascun peso della rete. Il gradiente è un vettore che contiene le derivate parziali della funzione di perdita e quindi ci indica la direzione e la velocità di discesa nello spazio multidimensionale di tutti i pesi.
Aggiornamento dei pesi: Il gradiente calcolato durante il passaggio all'indietro viene utilizzato per apportare piccole modifiche ai pesi. Di solito si tratta di una semplice operazione di addizione, in cui una parte del gradiente (scalata da un tasso di apprendimento) viene aggiunta a ciascun peso.
Iterazione: Questo processo (passaggio in avanti, calcolo della perdita, passaggio indietro, aggiornamento dei pesi) viene ripetuto per molte iterazioni (o epoche) sul set di dati di addestramento, finché la rete non ottiene prestazioni sufficienti.
Un'analogia per la retropropagazione potrebbe essere il tentativo di trovare il punto più basso in un terreno collinare mentre si è bendati. Si percepisce la pendenza del terreno sotto i piedi e si fanno dei passi nella direzione che sembra essere in discesa. Gradualmente si arriva a valle. Allo stesso modo, la retropropagazione si muove gradualmente verso l'errore più basso percependo la pendenza del paesaggio degli errori.
Esistono due tipi principali di apprendimento supervisionato: classificazione e regressione.
La classificazione viene utilizzata quando l'output è una categoria o una classe, come "spam" o "non spam" nel filtraggio delle e-mail, o "sano" o "malato" nella diagnosi medica. Il modello impara a mappare i dati di input a una delle possibili categorie di output.
La regressione viene utilizzata quando l'output è un valore continuo, come il prezzo di una casa o il numero di giorni di permanenza di un paziente in ospedale. Il modello impara a mappare i dati di input su un valore continuo all'interno di un certo intervallo.
L'apprendimento supervisionato è uno strumento per risolvere un'ampia varietà di problemi, tra cui:
Riconoscimento di immagini. Classificare immagini di oggetti, come volti o automobili.
Elaborazione del linguaggio naturale. Classificare testi, ad esempio assegnare ad un testo un sentimento positivo, neutro o negativo.
Sistemi di raccomandazione. Raccomandare prodotti, film o musica agli utenti in base al loro comportamento passato e al comportamento di utenti simili.
L'apprendimento per rinforzo è un tipo di apprendimento in cui un agente interagisce con un ambiente per massimizzare una ricompensa. L'agente non ha accesso alle regole complete dell'ambiente, quindi deve imparare per tentativi ed errori.
Il processo di apprendimento per rinforzo è tipicamente suddiviso in quattro fasi:
Osservazione: l'agente osserva l'ambiente e raccoglie informazioni sul suo stato attuale.
Decisione: l'agente utilizza le informazioni ricavate dall'osservazione per decidere un'azione da intraprendere.
Azione: l'agente intraprende l'azione scelta e osserva il cambiamento dell'ambiente che ne risulta.
Ricompensa: l'agente riceve una ricompensa o una penalità in base al risultato della sua azione.
L'obiettivo dell'agente è imparare una politica, ovvero una mappatura dagli stati di conoscenza alle azioni che massimizzi la ricompensa cumulativa attesa.
La figura successiva mostra un diagramma a blocchi che illustra questa forma di apprendimento. Si noti che a differenza dell'apprendimento supervisionato in questo caso l'ambiente è interno al feedback loop del sistema. In altri termini, la rete impara provando e sbagliando nell'ambiente. Inoltre, nel diagramma è presente la figura del critico, che a differenza dell'insegnante dell'apprendimento supervisionato, ha il compito di fornire rinforzi (ricompense o penalità) all'agente in base a come questi si agisce nell'ambiente. Il critico è una forma di insegnante che non fornisce all'agente la soluzione finale ma indica se l'agente è sulla giusta via per raggiungerla.
L'apprendimento per rinforzo è stato applicato per risolvere un'ampia varietà di problemi, tra cui:
Giochi: è stato utilizzato per sviluppare agenti in grado di giocare a livelli sovrumani. Ad esempio, AlphaGo sviluppato da DeepMind è stato addestrato con questa tecnica.
Robotica: è stato utilizzato per sviluppare robot in grado di camminare, afferrare oggetti e navigare in labirinti.
Finanza: può essere utilizzato per sviluppare algoritmi di trading in grado di prendere decisioni basate su dati di mercato in tempo reale.
L'apprendimento non supervisionato è un tipo di apprendimento automatico in cui il modello viene addestrato su dati non etichettati. Ciò significa che i dati non hanno etichette o categorie predefinite. L'obiettivo del modello è quello di trovare schemi e strutture nei dati senza alcuna guida da parte dell'uomo.
Riconsideriamo l'esempio di sopra del riconoscimento di immagini di gatti e bambini. In tal caso le immagini non hanno l'etichetta semantica. Il compito della rete è quello di classificare ogni immagine in gruppi. Verosimilmente, la rete creerà due gruppi, una per i gatti e una per i bambini. Infatti i gatti tendono ad avere caratteristiche diverse, come il fatto che camminano con quattro zampe, il fatto di avere la coda e il pelo. Si noti che la rete non sa che i gruppi corrispondono semanticamente a gatti e bambini; sa solo che le immagini hanno una distribuzione statistica di pixel differente e quindi le separa. Se nel dataset di addestramento ci sono molti bambini che gattonano, questi potrebbero essere scambiati per gatti, oppure la rete potrebbe creare un gruppo a parte per questi esempi.
Alcuni esempi in cui l'apprendimento non supervisionato viene tipicamente usato sono:
Clustering: si tratta di raggruppare un insieme di elementi in uno spazio in base alla loro somiglianza (esiste una metrica che misura quanto distanti sono due elementi). Ad esempio, un algoritmo di clustering può essere utilizzato per raggruppare i clienti in diversi segmenti in base alle loro abitudini di acquisto.
Rilevamento di anomalie: si tratta di identificare gli insiemi di dati che sono diversi dal resto dei dati. Ad esempio, un algoritmo di rilevamento delle anomalie potrebbe essere utilizzato per identificare le transazioni fraudolente in un set di dati finanziari.
Esaminiamo un problema di apprendimento apparentemente molto semplice. Cerchiamo di far apprendere la funzione unaria a una rete neurale:
Per questo compito, avremo bisogno di una rete che abbia un solo ingresso e una sola uscita, come:
Come possiamo trovare i pesi che riproducono la funzione? L'idea di base è quella di fornire molti esempi di input → output, ovvero coppie di valori da cui apprendere, e poi cercare di trovare i pesi che riproducano questi esempi. Ecco il risultato di questa operazione con un numero progressivo di esempi:
Una mappa non è il territorio.
Ecco una descrizione passo per passo del funzionamento della retropropagazione ( una animazione):
Per esempio, consideriamo l'IA che cerca di imparare a programmare opere d'arte generativa in p5.js. Quando Botto crea uno sketch, questo innanzitutto viene valutato sintatticamente dal compilatore del linguaggio. Se non è corretto, Botto riceve una penalità. Se è corretto, lo sketch viene valutato (semanticamente) dai membri della DAO di Botto, che fungono da critici. Se un'opera piace a molti, Botto riceve una gratificazione, e usa con maggiore probabilità quell'opera per proseguire la propria ricerca artistica.