Come apprende una rete neurale attraverso a pesi, bias e funzione d'attivazione

Spesso sentiamo dire che le reti neurali artificiali sono delle rappresentazioni dei neuroni cerebrali umani all'interno di un computer. Questi insiemi di neuroni formano reti interconnesse, ma i loro processi che scatenano eventi e attivazioni sono alquanto diversi da quello di un cervello vero.

Un neurone, preso singolarmente, è relativamente inutile, ma se unito a centinaia o migliaia di altri neuroni formano un rete interconnessa che spesso supera le performance di qualsiasi altro algoritmo di machine learning.

Breve background storico

Il concetto di rete neurale è alquanto antico - i primi pensieri di modellare un software prendendo ispirazione dal cervello umano risalgono agli inizi del 1940, da parte di Donald Hebb, McCulloch e Pitts. Per oltre 20 anni il concetto è rimasto sul piano della teoria, poiché l'addestramento delle reti neurali è stato possibile solo attraverso una maggiore potenza computazione e alla creazione dell'algoritmo di backpropagation da parte di Paul Werbos, un efficiente meccanismo che permette alla rete di imparare propagando il feedback di un neurone a quello che lo precede.

Spicca il lavoro di Geoffrey Hinton, Andrew Ng e Jeff Dean che, insieme ad altri ricercatori, hanno reso il paradigma delle reti neurali popolare e efficace per tutta una serie di problemi.

Oggi le reti neurali vengono utilizzate in una miriade di compiti grazie alla loro abilità di risolvere problemi prima considerati impossibili da risolvere come la traduzione simultanea tra lingue, sintesi di video e audio e guida autonoma.

Neurone naturale e neurone artificiale - quali sono le differenze?

Anche se è vero che le reti neurali si ispirano ai neuroni naturali, questo paragone è quasi fuorviante poiché le loro anatomie e comportamenti sono diversi. Non andrò molto nell'aspetto neuroscientifico, ma i neuroni naturali sembrano preferire una attivazione basata su "switch", on oppure off. Attività oppure nessuna attività. In seguito al periodo di attività, tra l'altro, i neuroni naturali mostrano un periodo refrattario, cioè dove la loro abilità di attivarsi nuovamente è soppressa. Questo comportamento viene descritto nel concetto di potenziale d'azione.

‚Äć

Visione generale dell'anatomia di un neurone
Anatomia di un neurone artificiale

‚Äć

Reti neurali come "black box"

Le reti neurali sono considerate delle black box (scatola chiusa)- non sappiamo perch√©¬†raggiungano queste performance, ma sappiamo come lo fanno. I cosiddetti dense layers (strati densi), che sono gli strati pi√Ļ comuni in una rete neurale, creano interconnessioni tra i vari strati della rete. Ogni neurone √® connesso ad ogni altro neurone dello strato successivo, il che significa che il suo valore di output diventa l'input per i prossimi neuroni. Ogni connessione tra neuroni possiede un peso (weight) che √® uno dei fattori che viene modificato durante l'addestramento. Il peso della connessione influenza quanto input viene passato tra un neurone all'altro. Questo comportamento segue la formula $inputs *¬†weights$.

Una volta che un neurone riceve gli input da tutti gli altri neuroni connessi ad esso, viene aggiunto un bias, un valore costante che va sommato al calcolo che coinvolge il peso menzionato. Anche il bias è un fattore che viene modificato durante l'addestramento. Una rete neurale è in grado di generalizzare e modellare un problema nel mondo reale (che non è altro che una funzione matematica) proprio grazie al costante aggiustamento di pesi e bias, che modulano l'output e l'input di ogni singolo neurone finché non la rete non approccia ad una soluzione accettabile.

L'output di un neurone è espresso dalla formula $output = inputs * weights + bias$.

L'aggiustamento di pesi e bias viene fatto nelle hidden layers (strati nascosti), che sono gli strati presenti tra lo strato di input e quello di output. Sono detti "nascosti" proprio perché non vediamo il comportamento di aggiustamento di pesi e bias. Ecco perché le reti neurali sono delle black box.

Come apprende una rete neurale

La caratteristica che rende complesse le reti neurali è proprio la enorme mole di calcoli che avviene a livello sia di rete che di singolo neurone. Insieme ai pesi e bias ci sono le funzioni di attivazione che aggiungono una ulteriore complessità matematica ma influenzano enormemente la performance di una rete neurale.

Pesi e bias

Pesi e bias possono essere interpretati come un sistema di manopole che possiamo ruotare per ottimizzare il nostro modello - come quando cerchiamo di sintonizzare la nostra radio ruotando le manopole per cercare la frequenza gradita. La differenza sostanziale è che in una rete neurale, abbiamo centinaia se non migliaia di manopole da girare per raggiungere il risultato finale.

Poiché pesi e bias sono dei parametri della rete, questi saranno oggetto del cambiamento generato dalla rotazione della manopola immaginaria. Visto che i pesi sono moltiplicati all'input, questi influenzano la magnitudine dell'input. Il bias, invece, poiché è sommato all'espressione $inputs * weights$, sposterà la funzione nel piano dimensionale. Vediamo degli esempi.

Ricordiamo che la formula è $output = inputs * weights + bias$

Come cambia l'output di un neurone in base a peso e bias

Com'è possibile notare, pesi e bias impattano il comportamento di ogni neurone artificiale, ma lo fanno in maniera rispettivamente diversa. I pesi sono solitamente inizializzati randomicamente mentre il bias a 0.

‚ÄćIl comportamento di un neurone √® anche influenzato dalla sua funzione di attivazione che, parallela al potenziale d'azione per un neurone naturale, definisce le condizioni di attivazione e relativi valori dell'output finale.

Funzioni di attivazione

Il tema delle funzioni di attivazione merita un articolo a sé, ma qui presenterò una overview generale. Se ricordate, ho menzionato come un neurone naturale abbia una attivazione a switch. In gergo informatico/matematico, chiamiamo questa funzione una step function (funzione gradino).

Comportamento di una step function (funzione gradino)

Seguendo la logica

$1 \ x > 0; 0 \ x \leq 0$

la funzione gradino permette al neurone di restituire 1 se l'input è maggiore di 0 oppure 0 se l'input è minore o uguale a 0. Questo comportamento simula il comportamento di un neurone naturale e segue la formula

$output = sum(inputs*weights) + bias$

La step function √® per√≤ molto semplice, e nel settore si tende ad usare delle funzioni di attivazione pi√Ļ complesse, come l'unit√† lineare rettificata (ReLU) e SoftMax.

Come scrivere una piccola rete in Python

Creemo una piccola rete neurale con 4 input e 3 neuroni per comprendere come funziona il calcolo di pesi e bias.

Architettura della piccola rete che andremo a scrivere in Python

Iniziamo dal definire questi parametri manualmente a scopo d'esempio

Ora creiamo il loop che andrà a creare la nostra piccola rete neurale

L'output finale è questo

Il risultato della rete neurale

Codice completo

‚Äć

Andrea D'Agostino
Ciao, sono Andrea D'Agostino e sono un data scientist con 6 anni di esperienza nel campo della business intelligence. Applico tecniche statistiche e di machine learning per aiutare i clienti a trovare e risolvere problemi nei loro asset digitali e a sfruttare le debolezze dei competitor a loro vantaggio.

Sono il fondatore e l'autore di questo blog, il cui obiettivo √® raccogliere le informazioni pi√Ļ importanti che ho imparato durante il mio percorso lavorativo e accademico al fine di poter aiutare il lettore a migliorare le sue analisi.