Uno sguardo nel Machine Learning - Le reti neurali

Usiamo ogni giorno oggetti tecnologici che ci semplificano la vita. Molti li usano senza sapere come funzionano, preoccupandosi solamente che funzionino correttamente, ma alcuni curiosi invece si pongono delle domande.
 

Questo blog è nato dal corso universitario di Tecnologie della comunicazione scientifica della magistrale in Fisica di Pavia. Io e un gruppo di miei compagni di corso abbiamo deciso di soddisfare quella curiosità di alcuni utilizzando questo blog.
 

In particolare cercherò di farvi osservare per un poco quel mondo sommerso e ignoto ai più del Machine Learning, in particolare delle Reti Neurali (Artificiali). 

Input pesati di un singolo neurone

L’ elemento base delle reti neurali è il neurone (artificiale). Il neurone è una funzione matematica che modella un neurone biologico. Questo riceve in ingresso dei segnali tramite delle connessioni (che rispecchiano i dendriti dei neuroni biologici) e in uscita invia tramite altre connessioni (che mimano l’assone del neurone biologico) il proprio stato di attivazione. Questo si traduce nel fatto che lo stato di attivazione del singolo neurone è computato a partire dagli input che riceve. In ingresso si hanno gli stati di attivazione (xj) dei neuroni a lui collegati moltiplicati per uno specifico valore (wj) più una costante (b).  Il valore wj rappresenta l'intensità della connessione. L' input totale al neurone (z) è la somma degli stati di attivazione dei neuroni collegati pesati dalla connessione (xjwj) più la costante b e n è il numero di neuroni collegati al neurone in considerazione. 


La forma matematica precisa per il calcolo dello stato di attivazione di un singolo neurone è riportata di seguito:

Come possiamo notare sopra, lo stato di attivazione del neurone non è semplicemente l’input totale al neurone, ma ben sì è il risultato dell’applicazione di una funzione a(), detta funzione di attivazione, all’input totale z. Questo è necessario perché se fosse uguale a z, che è una combinazione lineare degli stati di attivazione dei neuroni collegati al neurone in considerazione, potremmo descrivere solo comportamenti lineari nei dati in esame, cioè descrivibili da una retta. Invece introducendo la funzione a(), che è una funzione non lineare abbiamo la possibilità di descrivere comportamenti non lineari dei dati, perciò più complessi. Vi sono diverse funzioni che possono fungere da funzione di attivazione e la scelta dipende dal tipo di problema. Per esempio a() può essere l’arcotangente e la tangente iperbolica, ma ve ne sono anche altre.

Nelle reti neurali non vi è un solo neurone, ma un insieme di questi. Le reti neurali sono modellate come un insieme di neuroni che comunicano tramite delle connessioni. Ogni neurone compie un singolo calcolo, ovvero il computo del proprio stato di attivazione, e la combinazione dell’elaborazione di più neuroni produce un comportamento complesso della rete.  

Esempio di rete neurale organizzata in strati

In genere le reti neurali sono composte da strati o layers di neuroni. Il primo strato è quello di ingresso in cui le caratteristiche che descrivono i dati sono inserite nella rete neurale come stato di attivazione dei neuroni di input. L’ultimo strato detto di di uscita produce il risultato del problema, e quindi avrà caratteristiche diverse in base al tipo di problema. Gli strati di neuroni tra il primo e l’ ultimo strato sono detti strati nascosti, ed è dove avviene l’elaborazione della rete. Questi strati definiscono la “profondità” (deep) della rete. La profondità indica il numero di set di connessioni della rete, dove un set si ha tra un layer e un altro. Perciò la profondità delle rete sarà il numero di strati nascosti +1.


 

Affinchè una rete neurale risolva correttamente il problema sottopostole deve avere i pesi wj di ogni connessione e la costante b per ogni neurone adatti al problema. Quindi si pone il quesito di come trovare i parametri migliori. La risposta è allenare la rete!


Per allenare la rete si usa un set di dati di cui si conosce la risposta finale ricercata tramite la rete neurale. In questo modo si va a studiare in quali casi la rete neurale tramite quei determinati parametri dà la risposta finale sbagliata. Questo concetto è tradotto in una Funzione di costo (loss function) che rappresenta il costo che si ha quando la rete dà una risposta sbagliata. Ogni risposta sbagliata aumenta il costo totale. Quindi il nostro scopo è quello di ottenere il valore minimo della funzione di costo, poiché questo significa aver trovato i parametri migliori, cioè wj e b. La funzione di costo è diversa in base alla tipologia di problema affrontato, ma tutte si basano sulla probabilità e sulla statistica.


Durante l'allenamento della rete si calcola la funzione di costo totale ottenuta tramite i parametri utilizzati. Grazie alla funzione di costo calcolata si modificano i parametri, ottenendo quindi dei nuovi valori per i parametri, in modo tale da avvicinarsi al minimo della funzione di costo. Terminata questa operazione si ripete il calcolo della funzione di costo totale con i nuovi parametri e si procede in questo modo fino alla localizzazione del minimo della funzione di costo.
 

Per variare i parametri si sottrae ai parametri la derivata prima della funzione di costo rispetto ai parametri stessi. Questo perché il gradiente (cioè il vettore con all’interno le derivate prime) indica verso dove si ha il massimo incremento della funzione, perciò spostandosi in direzione opposta si procede verso il minimo della funzione di costo. Questo è l’approccio più semplice, ma ha al suo interno delle problematiche tecniche che lo rendono poco efficiente nelle reti neurali, nonostante questo l’idea su cui si basano gli altri metodi per modificare i parametri è la medesima, ma con dei piccoli accorgimenti.

Una volta allenata la rete e trovati i parametri ottimali, questa sarà in grado di risolvere il nostro problema anche sottoponendole dati su cui non si è allenata.


Quanto descritto fino ad ora è valido in generale, ma compiti diversi richiedono strutture delle reti neurali diverse.

  • La struttura più diffusa è quella in cui ogni neurone in uno strato è connesso a ogni neurone dello strato successivo e lo stato di attivazione è calcolato come spiegato in precedenza. Questo è il multilayer Perceptron ed è in grado di rispondere a molte tipologie di problemi.
  • Per analizzare segnali, come immagini o suoni, si ricercano dei pattern, come un viso, una macchina o una parola precisa. Per questo compito si usano le Reti neurali basate sulle convoluzioni (Covolutional Neural Networks). In questa tipologia di rete ogni neurone in uno strato è connesso solo a un numero preciso di neuroni dello strato successivo, inoltre i valori delle connessioni di un neurone in un layer sono gli stessi di quelli degli altri neuroni nello stesso strato. Questo fa sì che di fatto vi siano le stesse connessioni ripetute e condivise tra neuroni, e ciò permette l’identificazione di un determinato pattern in tutto il segnale e non in una sola posizione.
  • Per il riconoscimento vocale o per l’elaborazione di linguaggi si usano reti neurale ricorrenti (Recurrent neural networks), questo perché i dati in ingresso hanno dimensioni variabili. Non tutti i testi hanno la stessa lunghezza, così come i file audio. Ciò che caratterizza questo tipo di rete neurale è che, a differenza delle precedenti, vi sono delle connessioni che formano dei cicli. Queste particolari connessioni servono da memoria per immagazzinare le passate elaborazioni, cosicché ciò che è stato osservato in precedenza influenzi ciò che è osservato nel presente.
  • Esistono altri tipi di reti neurali più specifici e complicati, ma qui non verranno trattati.



Presentiamo un esempio:  

Tutti conoscono le assistenti virtuali Alexa e Siri, ebbene entrambe alla base funzionano nel medesimo modo, poiché entrambe usano il riconoscimento vocale. Per funzionare vi è un processo che riconosce la parola chiave “Alexa” o “Siri”, e nel caso venga individuata si attiva la rete neurale ricorrente. I dati inseriti nella rete sono gli spettrogrammi di quello registrato dall’assistente, ovvero le nostre voci. Lo spettrogramma è la rappresentazione grafica dell’intensità di un suono in funzione del tempo e della frequenza. La rete che è stata allenata a riconoscere parole dagli spettrogrammi è in grado di associare un significato al suono registrato e a eseguire gli ordini impartiti all’assistente.


 

Fonti:

“Notes on machine learning”, Clausio Cusano, spring 2021

https://en.wikipedia.org/wiki/Neural_network


A cura di Francesco Morosato  










Commenti

Post popolari in questo blog

Esame 21 febbraio