Tensorflow AI

Tensorflow AI logo

Tensorflow è un framework open source messo a disposizione da Google per risolvere specifiche classi di problemi mediante l’utilizzo di reti neurali artificiali. Esistono altri framework molto noti come Caffe e Torch ma riteniamo preferibile la soluzione di Mountain View perché gode di ottima popolarità, dispone di documentazione molto curata ed è seguita da gruppi di discussione attivi.

Reti neurali e AI

E’ da qualche anno che gli operatori del mondo dell’informatica, in particolare gli addetti allo sviluppo software, sentono parlare di intelligenza artificiale e reti neurali come strumenti per risolvere classi complesse di problemi. In realtà “intelligenza artificiale” sta diventando uno slogan piuttosto popolare dal momento che elettronica di consumo, automobili a guida autonoma ed elettrodomestici vengono equipaggiati con sistemi in grado di simulare il comportamento umano. L’argomento era già stato preso in esame il secolo scorso ma, a causa della scarsa disponibilità di GPU a basso costo, è rimasto relegato all’ambito accademico fino ai giorni nostri. L’hardware di cui disponiamo oggi permette di “allenare” e rendere disponibile per la produzione una rete neurale in un tempo ragionevole. Le schede grafiche utilizzate per gestire in parallelo calcoli in virgola mobile e operazioni tra tensori hanno assunto un ruolo sempre più centrale tant’è che Tensorflow mette a disposizione metodi specifici per schede Nvidia e Amd. Nonostante ciò, siccome le reti neurali sono ancora oggetto di studio, l’utilizzo delle schede grafiche non è vincolante ma fortemente consigliato in contesti produttivi. Questo significa che chiunque può definire un modello di rete, allenarlo e testare l’affidabilità dei risultati senza disporre di hardware specifico. La differenza sta nel tempo di calcolo non nel risultato!

Reti neurali intelligenti?

Anatomia neurone

Spesso parliamo di intelligenza artificiale e reti neurali intendendo la stessa cosa, probabilmente perché le reti neurali sono state concepite prendendo a modello la struttura del cervello umano fatto di neuroni composti a loro volta da nucleo, assoni, dendriti e bottoni sinaptici. In effetti si parla di cervello umano per dare maggiore enfasi al concetto di “intelligenza”, ma si potrebbe prendere come modello qualsiasi cervello animale. Il punto fondamentale è che di intelligente non c’è proprio nulla perché, come ha ampiamente argomentato Federico Faggin, l’intelligenza prevede un certo grado di consapevolezza che le macchine non hanno. Semplificando, le reti neurali possono essere viste come enormi e complesse strutture dati capaci di evolvere e restituire in tempi rapidi un output avente un certo grado di attinenza all’input dato. Per intelligenza artificiale invece si intende l’insieme delle soluzioni digitali, tra cui le reti neurali, volte a simulare il comportamento cognitivo umano. Quest’ultimo viene riprodotto soprattutto nei risultati: quando la complessità dei problemi supera una certa soglia l’unico modo per risolverli è affidarli alla statistica ed è questo che le reti neurali fanno. I risultati non sono più certi, ma molto probabili! Tipici esempi di applicazioni che utilizzano tecniche di intelligenza artificiale sono i classificatori di immagini, i traduttori linguistici e gli assistenti vocali. La differenza tra l’approccio tradizionale e quello basato su reti neurali si può apprezzare pensando alle applicazioni di dettatura vocale chiamate comunemente text-to-speech. I veterani del settore ricorderanno all’inizio degli anni ‘90 programmi di dettatura che richiedevano una fase iniziale di allenamento della durata di circa 30 minuti basata sulla lettura di un testo. Al termine l’applicazione era in grado di riconoscere, con un certo grado di affidabilità, la voce del padrone, l’utente cioè che aveva addestrato la macchina. Altre voci non erano riconosciute se non ripetendo la fase di training. Le applicazioni moderne utilizzano reti neurali che, similmente a quanto accade per l’uomo, vengono allenate a riconoscere le parole indipendentemente dal timbro di voce e dalla cadenza dell’interlocutore. La fase di addestramento viene fatta prima del rilascio dell’applicazione e questo permette di ricevere un prodotto finito e pronto all’uso.

Framework

Tensorflow, così come gli altri framework, mette a disposizione una serie di strumenti che aiutano a definire, allenare, testare ed utilizzare una rete neurale. Sono disponibili le API per i seguenti linguaggi (ma non solo):

  • java utilizzato solitamente per realizzare applicazioni cross platform
  • python utilizzato in ambito accademico e R&D per semplicità di realizzazione
  • c++ da preferire per ottenere il massimo in termini di prestazioni

In genere si utilizza python per la fase di ricerca e successivamente c++ per la fase di sviluppo e messa in produzione. Tensorflow mette a disposizione molti strumenti per l’elaborazione e la presentazione delle immagini, ma vedremo che in molti casi è preferibile separare le competenze ed utilizzare programmi di image processing come OpenCV al fine di gestire la rete come un componente isolato.

Definizione di una rete neurale

mnist deep learning

Prima di definire una rete bisogna avere chiaro il tipo di problema che si vuole risolvere perché da questo dipende la classe di appartenenza della stessa. Tra le architetture più note citiamo le feedforward e le feedback (o ricorrenti). Una volta chiarita la classe di appartenenza possiamo cominciare a definire il modello di rete. Il risultato di questa fase è un grafo che descrive la struttura della rete neurale fatta tipicamente di strati di “neuroni” connessi tra loro e di elementi specifici appartenenti alla classe stessa. Per esempio le reti convoluzionali hanno alcuni strati preposti a ridurre la dimensione dell’input in modo da creare pattern e dei filtri chiamati Softmax volti a trasformare linearmente l’input mediante funzioni tipo sigmoidi o logits. Tensorflow mette a disposizione tutti gli strumenti per descrivere i vari stadi della rete che possiamo immaginare avere uno sviluppo pressoché lineare. Il risultato è un file di testo più o meno complesso che può essere editato direttamente ma che in genere viene creato mediante gli strumenti del framework. Se questa prima prima fase appare molto ostica non preoccupatevi, lo è davvero! La definizione di una rete neurale è un processo molto complesso e richiede una conoscenza approfondita della materia. Questo è il motivo per cui esistono modelli pronti ed open source applicabili a specifiche classi di problemi. Per esempio AlexNet è il modello di riferimento utilizzato per risolvere problemi di pattern recognition, mentre MobileNets è un modello ottimizzato per i dispositivi mobili. Quindi, tornando al punto iniziale, una volta individuata la classe di appartenenza si sceglie il modello che meglio si adatta al problema ed infine si passa alla fase di allenamento. La descrizione dei modelli è disponibile in forma testuale e la maggior parte di essi è presente in forma procedurale. Una volta presa confidenza con la struttura delle reti l’approccio migliore è quello di partire un modello noto e se necessario apportare piccole modifiche in modo da adattarlo perfettamente al problema che si sta cercando di risolvere.

Allenamento della rete

Il risultato dello step precedente è un file di testo che descrive la struttura della rete in termini di strati, filtri e tipologia di collegamento tra strati. Lo scopo della fase di training consiste nel modificare i collegamenti tra i “neuroni” dei vari strati in modo da ottenere una struttura dati in grado di risolvere efficientemente e con un buon grado di affidabilità il problema per cui la rete è stata progettata. In questa fase torna ancora la similitudine con il cervello umano che evolve e crea nuovi collegamenti tra i neuroni. I neuroni hanno un numero variabile di collegamenti e ciascun collegamento ha un’importanza diversa a seconda del tipo di esperienza a cui è associato. Allo stesso modo la fase di allenamento di una rete artificiale ha lo scopo di modificare i collegamenti tra i “neuroni” ed assegnare un peso ai collegamenti in modo da creare percorsi che generano un output il più attinente possibile all’input dato. La fase di allenamento, così come quella di test, è specifica per il tipo di rete che si sta utilizzando e il tipo di problema che si sta affrontando. In generale si dovranno sottoporre alla rete dei campioni attinenti all’input che verrà fornito in produzione tenendo in considerazione due grandezze fondamentali: - numero: il limite inferiore ufficioso è di 1000 campioni, mentre il limite superiore teorico non esiste anche se qualche centinaio di migliaia di campioni sono sufficienti a raggiungere un grado di affidabilità maggiore del 98%. Come si può comprendere l’abilità di chi allena la rete consiste nel trovare il giusto equilibrio tra numero di campioni e affidabilità del risultato. Se ad esempio servono 600.000 campioni per ottenere un’affidabilità di riconoscimento del 98% forse non ha senso aggiungerne altri 400.000 per ottenere 0,2% punti percentuali in più. - qualità: con questo termine si possono intendere diversi aspetti quali risoluzione, varietà, immunità al rumore. Dovendo ad esempio allenare una rete a riconoscere un set di immagini (CNN MNIST Classifier) dobbiamo disporre di campioni con una risoluzione sufficiente, almeno pari all’input richiesto, e il più possibili diversi tra loro. Tecniche più raffinate consistono nel proporre le stesse immagini in versione originale e versione distorta, con l’aggiunta cioè di filtri (gaussiani per esempio) che rendono l’immagine più difficile da riconoscere in modo da abituare la rete a interpretare correttamente anche immagini reali non del tutto nitide. Questa sofisticazione, oltre ad aumentare l’affidabilità del risultato, rende l’effetto “intelligenza” ancora più sorprendete. Tensorflow mette a disposizione gli strumenti per allenare le reti mediante l’utilizzo o meno di GPU. In questa fase infatti è richiesta un’elevata potenza computazionale e solo la presenza di una o più unità grafiche di calcolo permette di per concludere l’allenamento in un tempo ragionevole. Sottolineiamo ancora una volta che la qualità della rete ottenuta è indipendente dal tipo di hardware utilizzato per generarla e quindi la presenza della GPU ha solo un effetto positivo sul tempo. L’output della fase di allenamento è costituito da una serie di “checkpoint files” che contengono informazioni riguardo l’evoluzione del modello necessarie per completare lo step successivo.

Test del modello

La fase di test viene utilizzata per valutare la qualità del modello che abbiamo utilizzato per allenare la rete. Lo scopo è capire se il grado di affidabilità che otteniamo è adeguato all’applicazione che vogliamo realizzare. Questa fase è simile alla precedente perché consiste nel fornite campioni della stessa natura di quelli elaborati nella fase di allenamento. L’importante è fornire campioni diversi in modo da simulare una situazione reale in cui difficilmente si presenteranno le stesse occorrenze viste durante l’apprendimento. Se prendiamo ad esempio una rete allenata a riconoscere i numeri da 0 a 9, la fase di valutazione consisterà nel fornire immagini diverse dalle precedenti ed etichettate con il numero corretto in modo da verificare se la previsione coincide con il valore reale. Per la qualità dei campioni valgono le stesse considerazioni fatte al passo precedente, mentre per il numero di campioni si può considerare un rapporto 10:1 dal momento che la fase di test serve a generare un valore che rappresenta il grado di affidabilità ma non contribuisce a modificare la struttura della rete. Anche in questo caso Tensorflow mette a disposizione tutti gli strumenti per verificare la qualità del modello mediante hardware con o senza GPU. L’output varia a seconda del modello utilizzato e dal tipo di rete. Se consideriamo un problema di classificazione di immagini e quindi una rete convoluzionale, tipicamente il risultato della fase di test saranno due file, uno di dimensioni considerevoli che descrive il modello allenato (.pb) e uno di dimensioni più esigue (.txt) contenente le etichette che identificano gli elementi da riconoscere. Quello che succede in questa fase è impercettibilmente straordinario perché realizza ciò che tante volte abbiamo visto nei film di fantascienza e che abbiamo creduto potesse esistere solo al di là dello schermo. Ricordiamo il film Matrix dove i protagonisti vengono allenati alle arti marziali o alla guida di un elicottero da assalto con il semplice trasferimento di dati tra computer e mente. Non vengono duplicate semplicemente delle informazioni, ma l’esperienza e soprattutto l’abilità acquisita in precedenza da altri. Duplicare una rete neurale realizza in parte questo sogno perché permette di rendere disponibile ad ogni utente non dei semplici dati, ma l’abilità della rete allenata in origine. Questo punto di vista aiuta a giustificare l’impegno di tempo e di calcolo necessari per creare il modello da cui ricavare i successivi cloni.

Tensorboard

Prima di capire come utilizzare i file prodotti durante la fase di verifica è interessante sapere che Tensorflow mette a disposizione uno strumento grafico chiamato Tensorboard volto a monitorare i parametri della rete durante le fasi di apprendimento e test. Tensorboard viene presentato sotto forma di applicazione web. Una volta fatto partire il server mediante linea di comando, l’interfaccia client è accessibile tramite browser e può essere visualizzata anche su una macchina diversa da quella sulla quale si sta definendo il modello. Il valore delle variabili può essere visualizzato in forma numerica o grafica in modo da rendere immediatamente chiaro l’evolversi della rete e la qualità dei risultati restituiti. Tensorboard viene considerato uno strumento di debugging e come tale risulta essere utile agli utenti che hanno un livello di conoscenza del framework sufficiente da permette la definizione e la modifica dei modelli.

Utilizzo della rete

Lo scopo finale di ogni progetto è quello fornire una soluzione ad un problema noto, obiettivo che fino ad ora non è stato raggiunto dal momento che tutti gli sforzi compiuti nei passi precedenti sono serviti a preparare la rete a svolgere un lavoro non ancora dichiarato. E’ come uno studente che sceglie un percorso formativo, si specializza negli anni di università, ma riesce ad applicare ciò che ha imparato solo nel mondo del lavoro, quando entra nello specifico di un progetto.

Intelligenza artificiale e machine learning

Una rete può essere impiegata in mille ambiti ragion per cui anche in questo caso non ci sono delle linee guida generali, ma bisogna calarsi nello specifico del modello utilizzato per capire come muoversi. Per riprendere alcune considerazioni fatte in precedenza, utilizzare una rete statica non è lo stesso che utilizzarne una in evoluzione dal momento che a quest’ultima dovrà essere aggiunto uno stadio di retroazione assente nella prima. Volendo scendere un po’ più nel concreto, una rete convoluzionale statica può essere utilizzata mediante gli strumenti messi a disposizione da Tensorflow oppure mediante strumenti di terze parti come ad esempio OpenCV. Questa seconda soluzione in molti casi è preferibile perché permette di gestire la rete come un componente, in modo da spostare l’attenzione sulla soluzione del problema piuttosto che sulla gestione della rete stessa e rendere quindi accessibile lo strumento anche a team di lavoro che non hanno famigliarità con la definizione delle reti neurali artificiali.

Conclusioni

Abbiamo visto come una rete neurale possa essere definita, allenata ed utilizzata mediante le librerie di Tensorflow. Abbiamo visto che la definizione del modello è un’operazione molto complicata ragion per cui esistono dei modelli già pronti e liberamente utilizzabili che possono soddisfare esigenze di carattere generale. Abbiamo visto Tensorboard, lo strumento di debug messo a disposizione dal framework. Abbiamo infine valutato la possibilità di utilizzare framework di computer vision tipo OpenCV per avere una maggiore modularità e divisione delle competenze. Ciò che è stato presentato in questo articolo è solo la punta dell’iceberg di un mondo vasto ed in continua evoluzione, che richiede una conoscenza approfondita dell’argomento per poter essere manipolato.

17 Luglio 2018

Questo sito utilizza cookies tecnici al fine di migliorare la tua esperienza di navigazione   HO CAPITO

Maggiori informazioni sono disponibili   QUI