Ep.1 — Recognize handwritten digits of 28x28 pixel

Paolo David
7 min readJul 28, 2020

--

Indice

  1. Architettura della rete neurale
  2. Addestramento
  3. Parametri della rete (esi, sigmoid, bias)
  4. Considerazione sui parametri
  5. Equazione finale
  6. Conclusioni

Architettura della rete neurale

Una rete neurale è composta da neuroni, ognuno contenente un numero compreso tra 0 ed 1 al suo interno.

La nostra rete ha in totale 784 neuroni corrispondenti a ciascuno dei 28 x 28 pixel dell’immagine in scala di grigi di input. Ogni neurone rappresenta il valore di gradazione di grigio del pixel corrispondente, che vanno da 0 per i pixel neri a 1 per i pixel bianchi. Questo numero all’interno del neurone si chiama “activation”. Il neurone si accende quando ha un valore di attivazione alto.

Questi 784 neuroni costituiscono il primo strato o “layer” della nostra rete.

L’ultimo layer invece ha dieci neuroni, ciascuno avente un’attivazione compresa tra zero e uno che rappresenta quanto il sistema pensa che una determinata immagine corrisponda a una determinata cifra.

Il neurone più luminoso (avente cioé il valore di attivazione più elevato) tra i 10 finali corrisponde alla cifra dell’immagine in input.

Gli strati o layer di mezzo sono chiamati livelli nascosti o “hidden layers”. In questa rete ho scelto due strati nascosti ciascuno con 16 neuroni. La scelta é arbitraria.

Così come per le reti neurali biologiche il modo in cui la rete gestisce le attivazioni in un livello determina le attivazioni del livello successivo.

Significa che se inserisci un’immagine che attiva i 784 neuroni del livello di input in base alla luminosità di ciascun pixel nell’immagine, quel pattern di attivazioni provoca un pattern molto specifico nel livello successivo, che a sua volta provoca qualche pattern in quello successivo e cosi via fino al layer di output finale.

Addestramento

Ma come funziona l’addestramento della rete?

Quando riconosciamo le cifre, mettiamo insieme i vari componenti che le caratterizzano: un 9 ha un anello in alto e una linea a destra, un 8 ha un anello in alto ma è accoppiato con un altro anello in basso, un 4 si suddivide fondamentalmente in tre linee specifiche e cosi via.

L’obiettivo della rete neurale é quello di frammentare l’immagine di partenza nei suoi sottocomponenti, assegnare questi ai diversi layer ed infine accendere i neuroni corrispondenti a tali sottocomponenti nel layer finale. Per ogni layer si accenderanno solo quei neuroni specifici la cui attivazione sarà prossima a uno.

L’obiettivo è quello di avere un qualche meccanismo tale che il 2° layer possa riconoscere i bordi del numero dato in input nel 1° layer, ed il 3° layer possa riconoscere gli anelli e le linee dei bordi del 2°. Il layer finale dovrebbe solo mettere insieme questi pezzi per riconoscere il numero.

Parametri della rete

La rete ha due parametri: pesi e bias.

Pesi (Weights)

Un peso é essenzialmente un numero assegnato a ciascuna delle connessioni tra il nostro neurone e i neuroni del primo strato.

I pesi ci dicono quale pattern di pixel un dato neurone sta individuando nel secondo strato.

Questa identificazione viene fuori da un matching tra attivazioni e pesi. Vediamo come.

Prendiamo le attivazioni dal primo strato e calcoliamo la loro somma ponderata in base a questi pesi.

Trovo utile pensare a questi pesi come organizzati in una piccola griglia o maschera, con i pixel verdi ad indicare i pesi positivi e i pixel rossi i pesi negativi, dove la luminosità di quel pixel è una rappresentazione del valore dei pesi.

Nella figura sotto stiamo analizzando solo la connessione tra il primo layer ed un solo neurone, quindi a sinistra é evidenziata solo un parte della maschera.

Iterando il meccanismo per tutti gli altri neuroni otterremo la maschera dei pesi completa.

Nella maschera dei pesi (sinistra) mettiamo a 0 tutti i pesi che non si trovano nella regione di nostro interesse.

Sovrapponendo le due maschere aggiorno la somma ponderata.

Per individuare la presenza di un background, quello che si potrebbe fare è avere alcuni pesi negativi associati ai pixel circostanti il numero che vogliamo identificare.

Funzione di attivazione Sigmoid

Quando si calcola una somma ponderata come questa il risultato potrebbe essere qualsiasi numero, ma per questa rete ci interessa avere un valore compreso tra 0 e 1.

Abbiamo bisogno di una funzione che schiacci la somma ponderata nell’intervallo tra 0 e 1, vale a dire la funzione sigmoid, dove fondamentalmente gli ingressi molto negativi vengono approssimati a zero, gli ingressi molto positivi ad 1, ed aumenta solo costantemente intorno all’ingresso 0.

L’attivazione del neurone quindi è una misura di quanto sia positiva la relativa somma ponderata.

Bias

Cosa succede se voglio che il neurone si illumini quando la somma ponderata è più grande di 10 piuttosto che di 0?

Vorrei cioè che il bias sia inattivo.

Quello che faremo allora è semplicemente aggiungere qualche altro numero (come -10) a questa somma ponderata prima di collegarlo attraverso la funzione di attivazione sigmoid.

Questo numero aggiuntivo si chiama “bias.

Il bias indica quanto deve essere alta la somma ponderata prima che il neurone inizi a diventare significativamente attivo.

Quindi l’attivazione per ciascun neurone nei diversi strati si basa su una somma ponderata di tutte le attivazioni nel livello precedente più il bias.

Considerazione sui parametri

Abbiamo visto solo il collegamento tra il primo strato e il secondo. Le connessioni tra gli altri strati inoltre, hanno un mucchio di pesi e biases ad essi associati. Questa rete ha quasi esattamente 13.000 pesi e biases totali, 13.000 manopole e quadranti cioé che possono essere modificati e ruotati per far sì che questa rete si comporti in modo diverso.

Quindi quando parliamo di apprendimento quello a cui si riferisce è far sì che il computer trovi un’impostazione valida per tutti questi tanti numeri, in modo che risolva effettivamente il problema a portata di mano.

Equazione finale

  1. Organizzo tutte le funzioni di attivazione di un livello in un vettore colonna.
  2. Organizzo tutti i pesi come una matrice in cui ogni riga di quella matrice corrisponde alle connessioni tra uno strato e un particolare neurone nello strato successivo.
  3. Invece di aggiungere il bias a ciascuno di questi valori in modo indipendente lo rappresentiamo organizzando tutti questi bias in un vettore e aggiungendo l’intero vettore al precedente prodotto vettoriale della matrice.
  4. Come passo finale applico la sigmoid ad ogni componente specifico del vettore risultante

Così fatto si può comunicare la transizione completa delle attivazioni da uno strato all’altro in una piccola espressione stretta e ordinata.

Conclusioni

Quindi è in realtà più preciso pensare ad ogni neurone come ad una funzione che prende le uscite di tutti i neuroni dello strato precedente e sputa un numero compreso tra zero e uno.

In realtà l’intera rete è solo una funzione che prende in ingresso 784 numeri e ne sputa dieci come uscita.

È una funzione assurdamente complicata che coinvolge tredicimila parametri nelle forme di questi pesi e pregiudizi che riprendono certi schemi e che comporta l’iterazione di molti prodotti vettoriali a matrice e la funzione di attivazione sigmoide.

--

--