Mettiamo caso voi abbiate trovato il partner perfetto, e siate degli schifosi/e nerd brufolosi/e (come me) che non hanno un minimo di esperienza nel relazionarsi con altri esseri umani, tanto da spaventarvi a morte e cadere in mille elucubrazioni se si tratta di uscire con un tanto desiderato partner. Lettori, non temete, per fortuna ho la soluzione che fa per voi! Cominciamo….

Dovete in primis informarvi riguardo le abitudini del vostro desiderato partner, che, da ora in poi, per via del mio sesso e del mio orientamento sessuale, inizierò a chiamare ragazza.

Se non siete uomini o non siete eterosessuali, non temete, voglio ricordarvi che questa guida funziona praticamente con chiunque.

Dunque, in preda alla follia più totale iniziate a seguire la vostra ragazza, scrivendole messaggi e chiedendole cosa fa la sera, se ha da fare o meno, ed entrando in incognito nel suo gruppo di amiche per annotarvi i programmi delle serate.

Inoltre segnatevi le condizioni meteorologiche di ogni sera nella quale vi sentite e, con un po’ di fatica, arrivate a collezionare la seguente tabella 1 che considera 5 variabili differenti (dove 1 è uguale a sì, mentre 0 è uguale a no):

 

Tabella 1
Pioveva? Aveva da studiare? Eravamo nel Weekend? Uscita per un drink? Uscita per Cena? È uscita?
0 1 0 1 0 0
1 0 1 0 0
1 0 0 1 0 1
1 0 0 1 1 0
0 0 1 0 1 0
1 1 0 1 0 0
0 0 0 1 1 1

 

 

Decidete quindi di fare il grande passo…

Quindi, per stasera, decidete di fare il grande passo, chiedendole di uscire. Vi alzate, andate a controllare alla finestra (o chiedete a Cortana o Siri se piove) e stilate un piccolo elenco delle condizioni e del programma di questa serata.

 

 

Piove? Ha da studiare? Siamo nel Weekend? Uscita per un drink? Uscita per Cena?
1 0 1 0 1

 

Ora, naturalmente, siete in preda ad una crisi: non avete la minima idea se chiederle di uscire o meno, siete confusi, straniti, ingarbugliati in una matassa di 1 e di 0 che non sapete divincolare, e, rei della vostra insicurezza, vi buttate sul divano.

Ma poi, siccome siete degli schifosi nerd brufolosi, vi ricordate di quella volta in cui sentiste parlare della macchina di Boltzmann, e delle reti neurali artificiali, e, in preda ad un’eccitazione adolescenziale, vi gettate di corsa al primo computer che trovate, aprite R (linguaggio di programmazione che potete scaricare gratuitamente) e, con l’aiuto di qualche forum e della cara vecchia Wikipedia, scrivete questi due programmi!

 

 

 

 

Vade retro Satana! Che cos’è sta roba!? Tranquilli, cari amici, scopriremo insieme che in fondo non è nulla di così spaventoso. Per i più nerd, se ancora non l’avessero capito, lavoreremo ad un esperimento didattico riguardo un neurone artificiale.

 

 

 

Signori e signore: il neurone

Questo coso orrendo che vedete in Figura 1 è un neurone, un affare che avete nel vostro cervello.

Praticamente ha una parte centrale, il nucleo, e due parti periferiche, l’assone e i dendriti, con le quali si relaziona con altri neuroni, costituendo, in base ad una magica combinazione che tutt’oggi è oggetto di studio, ciò che noi consideriamo il “pensiero”.

 

Figura 2: un neurone. Fonti: Wikimedia Commons.

Figura 1: Un neurone. Fonti: Wikimedia Commons.

 

Questa combinazione di neuroni è detta “rete neurale”, ed è ciò che noi vogliamo oggi imitare per cercare di capire se la ragazza alla quale chiederemo di uscire ci dirà di sì o di no.

Per ragioni di semplicità, ed anche perché il nostro problema non è così difficile agli occhi di un computer, ci limiteremo a costruire un singolo neurone artificiale!

Dunque, se volessimo disegnare uno schemino di ciò che il nostro neurone dovrebbe fare, perdonando le mie abilità grafico-pittoriche su Word, sarebbe più o meno questo:

 

Figura 3: un neurone artificiale con la nostra domanda

Figura 3: un neurone artificiale con la nostra domanda

 

Dove:

  • I cerchi indicano gli input che sto dando alla macchina, nel nostro caso le informazioni della serata, e sono gli equivalenti dei dendriti;
  • Le varie freccette che collegano i nostri input al corpo principale sono i diversi pesi che la nostra macchina ha dato ad ogni variabile, ed equivalgono alle connessioni tra i neuroni: più forti sono, più quelle determinate variabili sono importanti;
  • Il corpo centrale equivale ad un nucleo, che somma tutte le componenti moltiplicate e ridimensionate con i relativi pesi;
  • L’assone, che nella nostra macchina equivale ad una funzione sigmoide (che vedremo tra poco), risulta essere ciò che restituisce un risultato alla nostra risposta.

Dunque, al nostro consulente personale sarà data in pasto un’informazione (il programma della nostra serata), lui la digerirà senza alcuna fatica e ci darà la soluzione che secondo lui è la più corretta.

Come si fa ad addestrare un cervello elettronico?

Adesso incontriamo però un problema: per capire cosa la nostra ragazza risponderà, il nostro mono-neurone ha bisogno di studiare come ella ha agito in passato! Come si fa ad addestrare un cervello elettronico? Semplice! Con la matematica! E qua molti chiudono l’articolo. Ma, per non spaventarvi, ho riassunto la parte più matematica in un unico paragrafo, il prossimo; sentitevi liberi di saltarlo! In ogni caso ci riferiremo al processo come…

 

 

 

…La Magi-magia

La Magi-magia è relativamente semplice, matematicamente parlando. Di fatto richiederà solo conoscenze di analisi e algebra. Abbiamo detto che il ragionamento viene dato in pasto ad una funzione sigmoide, una funzione che esiste in natura e che regola tantissime cose del mondo fisico (come il tempo di risposta di un neurone reale), e che assume più o meno questa forma:

 

Figura 4: Una funzione Sigmoide

Figura 4: Una funzione Sigmoide

 

Una funzione sigmoide che lavora su intervalli per valori standardizzati

Se cercate online vi accorgerete che però questa curva ha un diverso codominio da quella che viene riportata qui: questo perché, per ragioni di comodità e di semplicità, la macchina che ho riportato lavora su valori standardizzati che si muovono da 0 a 1, pertanto l’output che ci sarà restituito non eccederà quest’intervallo.

La curva, pertanto, ci appare così:funzione1

E ci è data dalle seguenti linee di codice:

 

Ora, come vediamo dallo schemino di sopra, in questa funzione metteremo ogni input ponderato per il relativo peso (le freccette della figura 3), quindi, la nostra x sarà:

 

funzione-2

 

Come fa la nostra macchina ad apprendere i pesi?

Ma come fa la nostra macchina ad apprendere i pesi? Beh, all’inizio sono M numeri casuali, ma poi la macchina li aggiorna con un ciclo, quando gli viene data in input la matrice dei casi precedenti (ovvero quelli che abbiamo collezionato con tanta cura) sulla quale potrà studiare il comportamento della nostra ragazza.

La matrice avrà una dimensione di NxM, dove N le osservazioni che abbiamo, quindi 7, ed M sono le variabili che stiamo considerando, quindi 5.

Oltre i casi precedenti, gli diamo in pasto le risposte che la nostra ragazza ha fornito per ogni caso, e le mettiamo in un altro vettore di dimensione Nx1, ovvero 7×1.

Tenetevi forte e fate un respiro. La nostra macchina, praticamente, proverà ad indovinare con i pesi casuali quello che la nostra ragazza potrebbe rispondere in ogni situazione, la confronterà con la risposta che ha realmente dato, quindi con una differenza calcolerà l’errore e, tramite un processo inverso chiamato backpropagation, rimanderà l’output indietro nella derivata della nostra sigmoide, e, in base a quanto ha sbagliato e a quanto conti quell’errore, aggiusterà i relativi pesi, per poi riprendere il processo. Ho provato, di nuovo, a farvi un disegnino su word.

 

Figura 5: Schema di apprendimento

Figura 5: Schema di apprendimento

 

Ora, se vogliamo proprio entrare nello specifico, il calcolo dell’errore non passa attraverso la derivata della sigmoide, bensì attraverso una funzione che l’approssima, ma che nel nostro caso andrà benissimo, in quanto nel dominio tra 0 e 1 assumerà valori accettabili.

Ecco la nostra funzione:

funzione-3

 

Figura 6: Approssimazione della derivata della funzione sigmoide da noi utilizzata

Figura 6: Approssimazione della derivata della funzione sigmoide da noi utilizzata

 

 

Ve lo spiego con una ballata.

In pratica, quanto più l’output della nostra macchina sarà estremo (vicino a 0 o ad 1), tanto più questo valore sarà basso, e pertanto l’errore che commette verrà contato meno. Ora, visto che sono un amante delle ballate:

E verrà l’output, che moltiplicherà l’errore, che moltiplicherà la matrice degli input, che otterrà M aggiustamenti, che verranno sommati (algebricamente) ai nostri pesi, che saranno migliorati, che al mercato mio padre comprò.

Nel simpatico codice, praticamente, questo processo viene applicato con un ciclo, che restituirà alla fine dei pesi ponderati e corretti in base alle osservazioni precedenti.

 

 

Non rimane nient’altro che prepararci alla risposta finale.

La funzione generale, che contiene tutte le funzioni richiamate nel ciclo, l’ho chiamata neural.train, in quanto il suo scopo è di insegnare i pesi della nostra ragazza al nostro neurone artificiale. Dunque, adesso abbiamo una funzione in grado di pensare, e una funzione in grado di imparare.

 

 

Speriamo che dica di sì!

Dunque, la prima cosa da fare è passare alla nostra macchina i casi precedenti e le relative risposte che la nostra ragazza ha dato così che possa imparare come ella agisce grazie alla Magi-magia.  Diciamo che se li deve studiare per bene, quindi glieli facciamo “rileggere” per un migliaio di volte.

 

codice1


Non le piace andare a cena!

Questi sono i pesi che la nostra ragazza dà alle cose. Vediamo che la nostra donna è estremamente studiosa! Quindi se ha da studiare non verrà sicuramente. E wow! Non le piace andare a cena! È arrivato il momento della verità.

Ci salviamo in un vettore questi pesi e poniamo alla macchina il nostro quesito. Lei, ripeto, non farà nient’altro che moltiplicare le nostre condizioni per i pesi della nostra ragazza e ci fornirà una risposta.

Qui sotto stiamo chiedendo:

Uscirà la nostra ragazza con noi dato che piove, ma so che non ha da studiare e che siamo nel weekend, se la invito per una cena?

codice-2
E, signori e signore, il verdetto finale sarà:
codice-3

Che, arrotondato, sarà uguale a 0, quindi sarà un no.

Bene, mi dispiace per voi, ma forse dovreste rivedere il programma e smettere di essere astemi, così al massimo la invitate per un drink, visto che le piace tanto bere.

Beh, in fin dei conti non vi è andata così male: avrete più tempo per dedicarvi al magico mondo del Machine Learning e della Analisi dei Dati!

 

 

Questa robaccia che ho scritto è nata dal voler mettere in pratica un esempio (pagina 85 versione italiana) di un saggio introduttivo di Pedro Domingos, L’Algoritmo Definitivo.

Oltre a questa macchina ve ne illustrerà molte altre, e con il 95% di formule matematiche in meno! Lui è veramente abile a spiegare, fidatevi, e in quel saggio tratta davvero di tutto a riguardo: dall’aspetto filosofico alle neuroscienze.

Un’altra fonte di questo articolo è stato il video-tutorial di Sirajology, nel quale su Python programma una rete neurale composta da 3 stati nascosti. Lui è molto abile, anche se procede in maniera alquanto rapida nelle spiegazioni e per i non-informatici (quale io sono) è altamente difficile da seguire. Il video è il seguente.