Cerca in News Spazio

giovedì 25 luglio 2019

Intelligenza Artificiale #06, imitare il cervello umano, l'apprendimento nelle Reti Neurali Artificiali

(Credit Sergio Sestili)

NEWS SPAZIO :- Vorrei riprendere a parlare di Intelligenza Artificiale (IA), una delle tecnologie esponenziali che più sta influenzando e che sempre più modificherà il nostro modo di vivere.
In questa serie di articoli dedicati, stiamo facendo luce su questa disciplina tanto eterogenea quanto vasta. Ecco il link per la sezione di riferimento


Da alcuni post stiamo esplorando in maggior dettaglio uno dei vari approcci della ricerca in IA, in particolare quello che si basa più di tutti sulle neuroscienze.

Nell'articolo di oggi continuiamo quindi a seguire l'evoluzione delle Reti Neurali, uno dei prodotti di IA che negli ultimissimi anni sta ottenendo grandissimi risultati.



Nel precedente post della serie eravamo giunti ad introdurre una tipica rete neurale composta da 3 strati, la trovate riprodotta nella prima illustrazione in alto.
Uno dei suoi utilizzi più comuni è classificare ciò che riceve in ingresso, ad esempio immagini, catalogandolo in una classe o in un'altra. Significa percepire e riconoscere cosa le viene mostrato, allo scopo ultimo di assegnargli un nome.
E' questa una modalità fondamentale per poter realizzare sistemi in grado di interagire con gli esseri umani in un ambiente non costruito ad hoc per le macchine. E' fondamentale tanto quanto lo è per noi riconoscere cosa abbiamo davanti agli occhi per poter reagire di conseguenza.
Molti altri sono gli utilizzi di una rete neurale, faremo un veloce excursus in uno dei prossimi post della serie.

In questo articolo andiamo un pochino più a fondo e vediamo di comprendere quali sono i principi di funzionamento di una rete neurale artificiale e lo faremo con un esempio concreto. Come al solito il linguaggio usato sarà il più chiaro possibile senza trascurare la rigorosità della materia. E' una promessa!

Diciamo quindi che vogliamo costruire una rete neurale in grado di riconoscere la scrittura a mano, in particolare numeri scritti a mano. Ne vedete alcuni qui sotto

(Credit Yann LeCun, MNIST)

Ogni cifra presente nell'illustrazione in alto è  una singola immagine composta da 28x28 pixel. Potrebbe trattarsi della digitalizzazione di un quaderno in cui sono stati scritti tanti numeri. E' questo un esempio molto famoso, un tipico benchmark, il MNIST dataset. Trovate maggiori dettagli qui.

Bene, come procediamo? La rete neurale deve imparare a riconoscere il concetto che sta dietro alle immagini che le vengono presentate in input, e quando vede l'immagine composta da tanti 1 e 0 che corrisponde al numero X deve riconoscerlo e capire che si tratta del numero X. Attenzione, a complicare la cosa c'è che le cifre sono scritte con calligrafie differenti.

Ogni bambino delle elementari riesce spontaneamente in questo compito, senza il minimo sforzo gli basta guardare una di queste immagini e subito sa dire qual'è il numero corrispondente.

Le reti neurali artificiali sono lo strumento migliore per questo problema. E lo risolvono in un modo totalmente differente rispetto alla programmazione tradizionale, in cui il programmatore che scrive un programma specifica passo per passo tutte le operazioni necessarie per risolvere un problema (il "COME").

Nell'approccio alla computazione basata su reti neurali invece, il programmatore codifica il "COSA". Viene cioè indicato alla rete neurale qual'è l'obiettivo, cosa voglio ottenere, fornendo molti esempi e lasciando alla rete il compito di riuscire a determinare il come.

Gioca un ruolo fondamentale l'architettura della rete che vogliamo costruire, cioè quanti sono i suoi strati di neuroni, di quante cellule è composto in ogni strato, quali sono le connessioni tra neuroni di strati differenti, i pesi che caratterizzano tali collegamenti, le funzioni di attivazione utilizzate. Sembra una cosa stranissima, ma avviene qualcosa di molto simile nel nostro cervello.

Il modo più intuitivo per capire questa cosa è pensare che ogni neurone che appartiene ad ogni strato successivo a quello di input, riesce a codificare (leggi riconoscere) e quindi a rappresentare una particolare e specifica caratteristica dell'input. Ciò permetterà poi allo strato successivo di determinare altre caratteristiche di più alto livello, che alla fine porteranno a catalogare correttamente l'input nella sua interezza.

L'obiettivo è quindi individuare i giusti pesi per tutte le connessioni della rete, per ogni strato, per ogni neurone.

Nel post precedente avevamo visto un semplice esempio, un singolo neurone artificiale che risolve una funzione tipica della logica matematica. I valori da assegnare ai pesi affinché questo piccolo sistema svolga il proprio compito con successo (senza errore) sono facili da determinare.

Ma una rete neurale che non sia un giocattolo è composta da centinaia/migliaia di neuroni con migliaia/decine di migliaia (ed anche di più) di connessioni e quindi di pesi. Non è proprio pensabile di voler determinare manualmente tutti i valori per i pesi.

Quindi che si fa? Come già anticipato, una rete neurale prima di essere utilizzabile per riconoscere, nel nostro esempio la scrittura, deve essere addestrata. In altre parole, le viene insegnato a determinare autonomamente i pesi. Come?

Uno dei metodi più diffusi è applicare l'algoritmo di Backpropagation, un potente metodo per far sì che una rete modifichi i propri pesi autonomamente in modo da diminuire progressivamente il suo errore di calcolo (ne parleremo tra breve), per convergere alla fine ad avere una rete in grado di svolgere con successo il proprio compito. Da anni questo algoritmo è il fondamento dei sistemi di questo tipo.
Siamo nel campo dell'Apprendimento Automatico (Machine Learning), un'area di ricerca di estrema importanza in IA, in cui una rete neurale viene addestrata a risolvere un compito prima di essere chiamata a risolverlo. Dotare le macchine della capacità di imparare è ritenuta praticamente da tutti un passo obbligato per avere sistemi adattivi e reattivi all'ambiente che li circonda, più intelligenti.

Vi sono vari tipi di apprendimento, ma approfondiremo la cosa in un prossimo post dedicato. Per oggi ci basti sapere solo che lo scopo ultimo della fase di addestramento di una rete neurale è quello di trovare i valori "giusti" di tutti i suoi pesi in modo da effettuare correttamente il riconoscimento richiesto.

Ciò che il programmatore deve fare nella fase di addestramento è presentare allo strato di input della rete, due cose: (1) un'immagine ed (2) il risultato che questa rappresenta.

Prendiamo ad esempio la seguente immagine del database MNIST

(Credit Yann LeCun, MNIST)

il "concetto" che questa rappresenta e che la rete deve imparare è banalmente il numero "3".

L'obiettivo finale quindi è che ogni volta che viene presentata quest'immagine in input alla rete, questa dia come risposta il numero 3. L'immagine ed il numero sono quindi l'associazione che la rete deve essere in grado di fare autonomamente dopo che è stata addestrata.
Nel suo utilizzo normale, ad una rete viene presentata un'immagine sconosciuta, mai vista prima, e la rete deve associarla con un numero, sulla base dell'addestramento ricevuto.

Distinguere tra queste piccole immagini potrebbe sembrare un esercizio accademico, una cosa poco utile. Non è così. Classificare immagini tra tipologie differenti può ad esempio portare una rete neurale ad imparare a riconoscere quali immagini-di-radiografie-al-polmone sono normali e quali no. Ed è effettivamente così.

Torniamo all'addestramento del nostro esempio. Questa fase consiste nel presentare in input alla nostra rete tante - tante davvero! - immagini di cifre scritte a mano, ciascuna associata al "concetto" che rappresenta. E tante significa anche decine di migliaia. Pensate che il database MNIST ne ha 70.000. E non basta, tutto l'insieme delle immagini utilizzate per l'addestramento viene presentato più volte alla rete neurale, ciascuna volta è anche detta epoca.
Dopo ogni epoca, o più volte durante ciascuna di esse, vengono aggiornati i pesi di tutti i neuroni della rete, in modo da, epoca dopo epoca, avvicinarsi e sperabilmente raggiungere quella configurazione di pesi che risolve il problema assegnato.

L'idea è che la rete neurale riesca a "generalizzare" e ad imparare il concetto presentato ed associarlo all'immagine, in modo che poi, una volta terminata la fase di addestramento, quando le verrà presentata una nuova immagine mai vista prima, la rete stessa riesca a determinare di quale numero si tratta. Ok, tutto molto bello. Ma come si arriva a tutto ciò?

Occorre introdurre un ultimo concetto nuovo. Ma prima di farlo ripartiamo dalla rete neurale che abbiamo visto e facciamo il punto

(Credit Sergio Sestili)

Dunque, per definire ed addestrare una rete neurale a riconoscere le cifre scritte a mano del database MNIST

  1. si definisce l'architettura della rete, e questo è il mestiere dell'essere umano; pensando al dimensionamento degli strati, nel nostro caso lo strato di INPUT ha 1 cellula per ogni pixel dell'immagine che deve imparare (in totale sono 28x28=784 cellule), lo strato di OUTPUT è la risposta Y della rete ed ha 1 cellula per ogni concetto che si vuole che impari, in questo caso le 10 cifre numeriche
  2. si determina il numero di immagini che vogliamo utilizzare nella fase di addestramento, diciamo 60.000; è bene che siano il più possibile omogenee (se non c'è mai il numero 4 allora non c'è speranza di insegnare alla rete a riconoscerlo)
  3. si inizia il processo di apprendimento impostando ad un valore casuale i pesi di tutte le cellule di ogni strato (meglio un valore piccolo, compreso tra 0 e 1)
  4. si presenta in ingresso alla rete (a) un'immagine nello strato di INPUT X e (b) una rappresentazione del concetto corrispondente, indichiamolo come CC
  5. si effettua quella che viene denominata operazione di feed-forward, cioè si applica per ogni cellula dello strato di INPUT la sua funzione di attivazione (vedi post precedente) e si determina l'output per tutte le cellule dello strato X, che corrisponde all'input dello strato HIDDEN e si continua così in maniera iterativa andando da sinistra a destra, determinando l'output dello strato HIDDEN che corrisponde all'input dello strato di OUTPUT e quindi calcolando l'output Y dello strato di OUTPUT, che corrisponde alla risposta finale della rete
Bene, siamo arrivati qui. Adesso continuiamo.

In una rete già addestrata la risposta finale dello strato Y indica quale concetto corrisponde all'immagine che è stata presentata in input. Se la rete è addestrata bene questo è uguale a CC. Nel nostro caso, presentando l'immagine del numero 3, otterrei che il 3° neurone dello strato Y è "acceso", mentre gli altri no, qualcosa del genere

[0,0,1,0,0,0,0,0,0,0]

Ma in una rete che è all'inizio dell'addestramento, il risultato finale non sarà certamente quello voluto.  Potrebbe addirittura essere questo

[0,1,0,0,1,1,0,1,1,0]

Ecco quindi che dobbiamo variare i pesi affinché il calcolo favorisca l'accensione [1] del neurone finale giusto e lo spegnimento [0] di tutti gli altri. Tali pesi sono aggiornati piano piano, durante tutta la fase di addestramento.

Il concetto nuovo che introduciamo ora è la funzione di Loss, un'indicazione su quanto è l'Errore commesso dalla rete nel fare la sua inferenza feed-forward. E per far questo ripartiamo proprio da Y, la risposta che abbiamo dalla rete dopo aver presentato un'immagine in input.

Nel caso più semplice l'indicazione dell'errore commesso dalla rete è qualcosa di molto simile alla differenza tra Y e CC, cioè tra il risultato ottenuto e quello atteso

E = |Y - CC|

Vi sono varie possibilità per scegliere una buona funzione di Loss, ma per in nostri scopi ci basti sapere che tutte forniscono un'idea di quanto la rete sia in errore.

Ebbene, abbiamo accennato in precedenza al potente metodo del Backprogation, il quale ad ogni iterazione determina di quanto variare i pesi di ogni strato in modo da diminuire l'errore commesso dalla rete. Letteralmente questo metodo procede nella direzione inversa, da Y verso lo strato di INPUT layer, determinando di quanto aggiornare i pesi.

All'inizio l'errore della rete sarà tipicamente grande, mano a mano che l'addestramento procede, tale quantità tenderà sperabilmente a diminuire fino a raggiungere un valore molto piccolo.
Una volta iterato per tutte le epoche l'addestramento termina.

Ma può capitare, è del tutto possibile ed accade davvero, che durante la fase di addestramento si osservi che l'errore non diminuisce più di tanto. Allora occorre ripensare all'architettura dell'intera rete, variando qualche parametro e ripartendo dall'inizio con la fase di addestramento.
Si può provare ad esempio ad aumentare il numero di cellule nello strato HIDDEN, o cambiare la funzione di attivazione per uno strato.

Insomma, alla fine di tutto il processo di addestramento, otteniamo una rete neurale artificiale in grado di associare correttamente i concetti indicati alle immagini presentate. Tutto questo ripeto individuando i giusti valori di tutti i pesi di tutte connessioni di tutte le sue cellule.
Da questo momento in poi i pesi non verranno più variati, resteranno fissi. E la rete verrà usata per riconoscere le immagini che le verranno presentate.

Normalmente vi sono altri passi da fare prima di terminare l'addestramento. La fase più importante è valutare le performance della rete con un nuovo insieme di immagini da presentare. Ma per i nostri fini ci basti sapere che si tratta di una fase importante e che ci darà la bontà della rete su dati non utilizzati per l'addestramento.

Mi fermo qui, questo post è diventato piuttosto lungo, ma non volevo proprio spezzettarlo. Continuiamo nel prossimo articolo della sezione.

(Parte 5 - Parte 6 - Parte 7)

3 commenti:

  1. Bellissimo post!!

    RispondiElimina
  2. Jack Ma ad Elon Musk: "l'IA permetterà agli umani di godersi la vita e vivere 120 anni"

    "consentirà agli umani di godersi la vita e vivere più a lungo. Dobbiamo essere pronti ad entrare nell'era in cui tutti potranno vivere 120 anni".

    URL:https://tech.everyeye.it/notizie/jack-ma-elon-musk-ia-permettera-umani-godersi-vivere-120-anni-396702.html

    RispondiElimina
  3. Vaticano, carta etica su Intelligenza artificiale
    Con Microsoft e Ibm, la firma il 28 febbraio

    "RenAIssance. Per un'Intelligenza Artificiale umanistica" è l'appuntamento del 28 febbraio prossimo, organizzato dalla Pontificia Accademia per la Vita, al quale partecipano Brad Smith, presidente di Microsoft, John Kelly III, vice direttore esecutivo di Ibm, il presidente del Parlamento Europeo David Sassoli, il direttore generale della Fao Qu Dongyu. Microsoft e Ibm firmano una 'Call for Ethics' che vuole aiutare le aziende in un percorso di valutazione degli effetti delle tecnologie collegate all'intelligenza artificiale, dei rischi che comportano, di possibili vie di regolamentazione, anche sul piano educativo.

    "Siamo impegnati in questo settore", spiega mons. Vincenzo Paglia, presidente della Pontificia Accademia per la Vita, perché "con lo sviluppo dell'Intelligenza Artificiale il rischio è che l'accesso e l'elaborazione diventino selettivamente riservate alle grandi holding economiche, ai sistemi di pubblica sicurezza, agli attori della governance politica. In altri termini, è in gioco l'equità nella ricerca di informazioni o nel mantenere i contatti con gli altri, se la sofisticazione dei servizi sarà automaticamente sottratta a chi non appartiene a gruppi privilegiati o non dispone di particolari competenze".

    Previsto nella mattinata, che si svolge nell'Auditorium di via della Conciliazione 4 dalle 8.30 alle 13.00, anche un collegamento con papa Francesco. La giornata conclude i lavori del Workshop organizzato nei due giorni precedenti, il 26 e 27 febbraio, che ha per tema "Il 'buon' algoritmo. Intelligenza artificiale: etica, diritto, salute".

    RispondiElimina

Chiunque può liberamente commentare e condividere il proprio pensiero. La sola condizione è voler contribuire alla discussione con un approccio costruttivo e rispettoso verso tutti. Evitate di andare off-topic e niente pubblicità, grazie.