Oggi iniziamo una nuova e interessantissima serie: il Deep Learning, ovvero algoritmi e software che sono in grado di apprendere come eseguire al meglio un programma. Ultimamente, il deep learning è un argomento ricorrente e di interesse crescente.

I nostri PC sono in grado di imparare, e lo fanno, seguendo alcune caratteristiche che ci ricorderanno come evolve un essere vivente… i programmatori si sono ispirati a Madre Natura.

Per introdurci allo studio del deep learning, faremo un gioco da Nerd.  Quando la connessione è assente, e lanciate google chrome, Vi apparirà un dinosauro stilizzato in alto a destra, premendo la barra spaziatrice inizierete un gioco in B/N a due dimensioni in cui dovete saltare dei cactus e schivare gli attacchi degli pterodattili… Quanti di chi non è Nerd lo conosce? Per i Nerd non vale (o per quelli che hanno la connessione scarsa…)

Ora noi implementeremo un software che in maniera del tutto autonoma giocherà al posto nostro portandoci ad un punteggio stratosferico. Il programma è stato fatto da Ivan Seidel. Noi in questi tutorial ci limiteremo a spiegare come funziona.

Le informazioni che Vi riporto sono recuperate da uno youtuber Brasiliano che, ovviamente, parla in portoghese. 
Come in un robot, anche il “giochino” di Chrome, ha degli input e degli output. Quindi nel caso del robot gli input gli arriverebbero dai sensori, mentre gli output sarebbero motori e attuatori. Nel caso del giochino di chrome possiamo schematizzare tre input, come elenco a seguire:

DISTANZA la distanza che passa tra il dinosauro e il cactus successivo.
DIMENSIONE del cactus, visto che ci sono di diverse dimensioni
VELOCITA’ a quanto viaggia il cactus che mi viene incontro, salendo di livello sale anche la velocità.

Come output abbiamo soltanto due possibilità,  freccia su per saltare e freccia giù per schivare gli pterodattili. Di fatto sono tre input e due output… Beh semplici operazioni Booleane (if, while, for ecc) quindi operazioni che danno come risultato o vero o falso, operazioni discrete i cui risultati possono essere o 0 o 1. Ma così apprende come un bullo a matematica, cioè niente!

Madre Natura come farebbe? Innanzi tutto, Lei, lavora in modo analogico e non digitale. Analogico può cioè acquisire valori infiniti tra 0 ed 1,  digitale intende valori finiti.

Per ogni input avremo una funzione che trasforma l’output. Ogni input darà un output. Ma così ci siamo solo confusi le idee.

Prendiamo in considerazione un input alla volta, iniziamo con la distanza. Potremmo dire che: per ogni valore maggiore di un numero dato sarà premuta la freccia su, per valori intermedi nulla, e per valori sotto una certa soglia sarà premuta la freccia giù. Lavorando in maniera analogica dobbiamo creare una funzione matematica:

F(x) = g(A+B*input)

dove:
F(x) è il nostro output (il valore che vogliamo impostare come soglia per l’azione).
g è la funzione 
A e B sono le variabili che cambieranno valore per farla funzionare sempre meglio.

Input  può essere velocità, dimensione o distanza.

Quindi molto semplicemente per ottenere un output (quale tasto premere) calcolerò una funzione (g) di due valori A e B, che possono variare per funzionare meglio, di cui uno è moltiplicato per il valore di input.

Ne deriva che per associare un input al nostro output possiamo avere alcune funzioni che associano il nostro input al nostro output. Ora come fare per implementare gli altri due input? 
La cosa si fa interessante, vero? 

Per rispondere dobbiamo far entrare in gioco quello che si chiama rete neurale, una sorta di cervello digitale. Al momento, possiamo costruire reti neurali molto meno connesse, se confrontate con gruppi di neuroni animali. Ma è interessante considerare che la struttura è quanto meno molto simile... E stiamo parlando di evoluzione.


Nello schema vediamo due dei tre possibili input per facilità, come si può facilmente intuire più è strutturata la rete, più sarà connessa ed elaborata e di conseguenza poco chiara.

A sinistra gli input forniscono valori A o B che sono collegati ai nodi della rete neurale, che a sua volta è collegato con un altro nodo della rete neurale e che alla fine è funzionale all’output. 

Ne deriva che ad ogni collegamento di nodi neurali c’è sia una funzione che lavora sui valori A o B,  sia certi valori che sono associati ad ogni arco. Ognuno comunica con una certa forza con l’altro neurone o nodo.

Il software migliorerà sia la funzione F(x) che i valori A o B da solo, migliorando automaticamente seguendo il seguente principio evolutivo.

Immaginiamo funzioni e variabili in sequenza. Partendo dal principio che non vi può essere evoluzione con un solo individuo il software genera gruppi di funzioni e dati simulando la biodiversità (fattore essenziale per l’evoluzione).

Ma quali valori devono assumere per poter saltare i cactus?

Nerd, ingegneri, matematici e geni vari hanno stabilito che la cosa più intelligente da fare è: sparare numeri e funzioni a caso… E non è uno scherzo.

Quindi, il software eseguirà i gruppi di funzioni con dati a caso.

Attraverso il processo della selezione artificiale, il software assegna un punteggio e coglie, alla fine di ogni ciclo, la miglior sequenza genetica.

Per esempio nel nostro caso coglierà il codice che ha fatto saltare più cactus, eliminando gli altri.

Proprio come nella selezione Darwiniana, i codici “genitori” trasmettono la caratteristica ai figli, ma modificata, implementata cioè con almeno un’altra sequenza.

Il software quindi sceglie due genomi con le migliori caratteristiche. Effettua tagli e raggruppamenti di caratteristiche. Alla fine assembla tra loro le caratteristiche diverse di entrambi i codici considerando sottogruppi di informazioni e funzioni “vincenti” dando di fatto vita ad una nuova generazione di codici da provare. 

Ma c’è un problema… L’evoluzione sarebbe finita, se così fosse. Nessun nuovo valore sarebbe possibile. In parole povere, specie estinta al primo cambiamento ambientale, in natura. Per questo Madre Natura ci ha fornito le mutazioni genetiche casuali… Se mangiamo il pane lo dobbiamo ad una mutazione casuale del grano. 

Il software agisce cambiando in maniera random valori e codici su alcuni individui a caso. Questo figlio mutato potrà essere avvantaggiato oppure no. Applicando diverse mutazioni su tutti i figli generazione dopo generazione la linea evolutiva è sempre in crescita.

Quindi, attraverso la raccolta, la selezione del genoma migliore, e la virtualizzazione di migliaia di dati il software inizierà a comportarsi secondo le sequenze di maggior successo mentre col passare del tempo quelle di più scarso valore sono via via eliminate dalla replicazione. Dando sempre più vita ad individui sani e di alto punteggio. Nel nostro caso, avremo più dinosauri che saltano cactus uno dopo l’altro rispetto a prima. E comunque avremo salvato il codice del dinosauro in grado di fare il record di punti. Quindi seguiteci che il prossimo video… sarà fighissimo!

 

Bene, abbiamo spiegato la teoria. E' il momento di passare all'azione!

I meriti per lo sviluppo del software vanno a Ivan Seidel, un Vlogger Brasiliano di cui abbiamo parlato anche nell’ultimo video. Vi mostrerò come scaricare, installare e usare questo programmino, veramente simpatico.

Per prima cosa scarichiamo dal repository di github il programma, che si chiama “IAMDinosaur”.
Dopo aver eseguito il download, va installato secondo le prescrizioni del proprio sistema operativo.

Il programma funziona su tutti i sistemi operativi (poiché è scritto in Java).
Scaricheremo anche NodeJS per poter eseguire il programma.

Apriamo il terminale e installiamo nodeJS, quando ha finito di installare affianchiamo il terminale a Chrome. Stacchiamo internet, e… VIA!! 
Purtroppo gli sviluppatori Google hanno inserito una feature che, ad un certo punto, inverte il bianco e nero (il dinosauro da nero diventa bianco e viceversa per lo sfondo); conseguenza: il programma non riconosce più lo schermo e il dinosauro si schianta al primo ostacolo.
 
Questo video è molto interessante, in quanto vedremo e capiremo facilmente come impara un computer, e lo vedremo apprendere.