L’algoritmo Error Backpropagation – 1° PARTE –

robot professore

Nei miei precedenti articoli vi ho parlato di come apprendono i propri pesi e bias le reti neurali artificiali usando l’algoritmo Gradient Descent.
Non abbiamo ancora, però, parlato di una cosa particolarmente importante, ossia di come si calcola il gradiente della funzione di errore.

Tranquilli non sarà difficile!

In questo articolo spiegherò un velocissimo algoritmo che calcola questo gradiente.
Stiamo parlando dell‘agoritmo di backpropagation o anche error backpropagation oppure retropropagazione dell’errore.

L’algoritmo di Error Backpropagation (anche EBPA error back propagation algorithm ) fu in origine introdotto negli anni 70, ma non fu preso in considerazione fino a che David Rumelhart, Geoffrey Hinton e Ronald Williams non lo resero famoso con il loro paper. Il paper descriveva numerose reti neurali artificiali dove il backpropagation era decisamente più veloce dei tentativi fatti in precedenza, rendendo così possibile la risoluzione di problemi che prima di questo momento non erano risolvibili.
Ai giorni nostri, error backpropagation è il motore, il cavallo di battaglia dell’apprendimento delle reti neurali artificiali.

Da qui in poi ci sarà un po’ di matematica.

Se la matematica non ti piace, peccato! Per capire il cuore delle reti neurali artificiali è necessario conoscere almeno alcuni dettagli matematici.
Certamente, se vuoi, potrai trattare i modelli di reti neurali come scatole nere ma io te lo sonsiglio vivamente.
La ragione, ovviamente, è comprenderne il funzionamento e quindi avere delle certezze in più sull’ambito di utilizzo finale.

Partiamo subito quindi con l’elemento principale al centro dell’error backpropagation ossia: la derivata parziale ∂C/∂w della funzione di errore C rispetto a ogni peso (bias compreso ) nella rete neurale artificiale.

Questa espressione ci dice quanto velocemente cambia l’errore quando noi modifichiamo i pesi e i biases.

L’espressione sembra una cosa molto complessa e astrusa ma nasconde dietro di se qualcosa di magico la cui interpretazione alla fine è assolutamente qualcosa di naturalmente intuitivo e semplice.
L’algoritmo di error backpropagation non è solamente un algoritmo molto veloce di apprendimento. La retropropagazione dell’ errore ci mostra come il cambiare pesi e bias della rete cambia il comportamento totale dell’intera rete.
Questo è il valore aggiunto di studiarne i dettagli matematici!

Quindi, fai un po’ tu!

Salta la lettura dei dettagli matematici, va bene. In ogni caso qui trovi tanti altri articoli che trattano l’EBP come una scatola nera e tutto funziona ugualmente anche se in futuro potrai trovare qualche punto in cui farò riferimento ai risultati ottenuti qui di seguito.

 

Per iniziare:
un modo velocissimo di calcolare l’output della rete neurale artificiale basato sulle matrici

Prima di addentrarci nell’approfondimento dell’algoritmo di error backpropagation facciamo un po’ di riscaldamento con un approccio per il calcolo veloce dell’output della rete basato su operazioni su matrici.
Prima di tutto familiarizziamo con la notazione che fa riferimento ai pesi della nostra rete in un modo inequivocabile.
Dato il seguente schema di rappresentazione di una rete neurale artificiale
Chiamiamo “layers” i vari gruppi di neuroni e ogni singolo layer verrà indicato con la lettera minuscola l
Il peso w dal neurone k-esimo del layer (l-1) al neurone j-esimo del layer l verrà indicato con (wjk di l)

Rete neurale Artificiale - backpropagation

Quindi nello schema qui in alto ho sottolineato in rosso la connessione con peso (w 1 4 di 3)

e cioè il peso nella connessione
fra l’out del 4° neurone del layer (l-1) cioè il 2° layer
e l’input del 1° neurone (l’unico) del 3° layer cioè l =3

Può sembrare una notazione un po’ incasinata e vi sarete accorti anche di una evidente stramberia:
immagino che per logica ti saresti aspettato che j fosse riferito all’uscita del neurone più a sinistra (il 4° neurone nel layer 2)
mentre k l’avresti riferito al neurone più a destra (il 1° neurone nel 3° layer)

anch’io all’inizio feci fatto questa osservazione.

Ora ti spiego il motivo di questa cosa strana.

Noi usiamo un notazione similare per i biases e le attivazioni della rete.

Con queste notazioni, l’attivazione (a j-l) del j-esimo neurone del l-esimo layer è correlato(collegato) alle attivazioni nel (l−1)-esimo layer tramite l’equazione

 

formula del calcolo dell'attivazione neurone artificiale

 

dove la somma viene fatta lungo tutti i k neuroni nel layer (l-1)th. Per riscrivere questa espressione in un forma a matrice noi chiameremo un matrice di pesi wl per ogni layer. I valori della matrice di pesi wl sono proprio i pesi connessi al l-esimo layer di neuroni, che significa, il valore nella j-esima riga e k-esima colonna è wljk.

Ugualmente, per ogni layer l noi definiamo un vettore bias,

Bl

. Puoi indovinare come funziona – le componenti del vettore bias sono proprio blj, un componente per ogni neurone nel l-esimo layer.

In fine, definiamo un vettore di attivazioni in cui tutti i componenti sono le attivazioni.

L’ultimo ingrediente che dobbiamo riscrivere in forma di matrice è l’idea di rendere sotto forma di vettore la funzione σ.

L’idea è la seguente : vogliamo applicare una funzione come σ ad ogni elemento del vettore v.
Useremo la notazione σ(V) per descrivere questo tipo di applicazione più estesa di una funzione. Tutto ciò significa che i componenti di σ(V) sono proprio σ(V)j=σ(Vj).

Al = σ( Wl + A(l-1) + Bl )

Questa espressione ci da la possibilità di pensare in un modo più globale a come le attivazioni in un layer si relazionano alle attivazioni nel layer precedente : noi applichiamo esattamente la matrice dei pesi alle attivazioni, quindi aggiungiamo il vettore dei bias, e infine applichiamo la funzione σ.
La visione globale è normalmente più facile e succinta ( e impiega pochi indici!) rispetto la visione neurone-per-neurone che abbiamo avuto fin’ora.
Vedilo come un modo di semplificare in una versione più naif eliminando gran parte degli indici che sono spesso oggetto di confusione, dando comunque una visione precisa di ciò che succede.

In oltre questa espressione si presta perfettamente alla realizzazione pratica in quanto la maggior parte delle libreria forniscono meccanismi veloci di moltiplicazione tra matrici, somma di vettori e vettorizzazione.

 

Quindi, più avanti nel codice, farò uso implicito di questa espressione per calcolare il comportamento della rete.

continua…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Articolo successivo

Tensor Processing Units