• Non ci sono risultati.

Reti neurali probabilistiche

N/A
N/A
Protected

Academic year: 2021

Condividi "Reti neurali probabilistiche"

Copied!
61
0
0

Testo completo

(1)

Studente/i

Marco Maccarini

Relatore

Gambardella Luca Maria

Correlatore

Laura Azzimonti

Committente

Gambardella Luca Maria

Corso di laurea

Ingegneria informatica

(Informatica TP)

Modulo

Progetto di Laurea

Anno

2018/2019

(2)
(3)

Indice

1 Abstract e Obiettivi 1

1.1 Abstract . . . 1

1.2 Abstract (english version) . . . 1

1.3 Obiettivi . . . 2

2 Introduzione 3 2.1 Stato dell’arte . . . 3

2.2 Reti neurali . . . 4

2.2.1 Cenno Storico . . . 4

2.3 Reti neurali probabilistiche [BNN] . . . 6

2.3.1 Differenze dalle reti neurali "normali" . . . 6

2.3.2 Incertezza . . . 9

3 Nozioni teoriche 11 3.1 Machine Learning . . . 12

3.2 Deep Learning . . . 12

3.3 Come lavora il deep learning? . . . 13

3.4 Layers . . . 14

3.5 Loss function . . . 15

3.6 Datasets . . . 15

3.7 Software utilizzato e linguaggio di programmazione . . . 15

3.7.1 Keras . . . 15 3.7.2 TensorFlow . . . 16 3.7.3 TensorFlow probability . . . 16 4 Esperimenti 17 4.1 Mnist . . . 17 4.1.1 Descrizione dell’obiettivo . . . 17

4.1.2 Descrizione del dataset . . . 18

(4)

ii INDICE

4.1.3.2 Creazione del modello . . . 19

4.1.4 Fitting e Accuratezza . . . 20

4.1.5 Performance della rete: accuratezza e funzione di loss . . . 21

4.1.6 Modifica nel dataset . . . 22

4.1.7 Classificazione istanza con label non presente nel training set . . . 24

4.1.8 Rappresentazione visiva . . . 25

4.1.9 Risultati . . . 26

4.2 BNN . . . 30

4.2.1 Codice . . . 30

4.2.1.1 Creazione del modello . . . 30

4.2.1.2 Analisi dei layers . . . 30

4.2.1.3 Fitting e Accuratezza . . . 31

4.2.2 Scelta dell’istanza da classificare . . . 34

4.2.3 Analisi delle distribuzioni di frequenza . . . 35

4.2.4 Istogramma delle probabilità di appartenenza alla classe predetta . . . 38

4.2.5 Distribuzione di probabilità per ogni classe. . . 40

4.3 Considerazioni . . . 41

4.4 Darpa . . . 43

4.4.1 Descrizione del dataset . . . 43

4.4.2 Labels presenti nel dataset . . . 43

4.4.3 Sotto-datasets . . . 44

4.4.4 Caricamento del dataset . . . 44

4.4.5 Creazione del modello . . . 44

4.4.6 Fitting e accuratezza . . . 45

4.4.7 Classificazione istanza con label non presente nel training set . . . 45

4.4.8 Risultati . . . 46

4.4.9 BNN . . . 47

4.4.10 Analisi delle distribuzioni di frequenza . . . 47

4.5 Distribuzione di probabilità per ogni classe. . . 48

4.6 Considerazioni . . . 49

(5)

Elenco delle figure

2.1 Instogramma delle probabilità: ad ogni classe viene assegnato un valore probabilistico di appartenenza, in questo caso la classe "0" ha maggiore

probabilità . . . 7

2.2 Distribuzioni di probabilità. . . 9

3.1 I campi dell’intelligenza artificiale . . . 11

3.2 Input e output di una rete neurale. Fonte: Deep Learning with Python . . . 13

3.3 Input e output di una rete neurale 2. Fonte: Deep Learning with Python . . . . 13

3.4 I layers e i loro pesi. Fonte: Deep Learning with Python . . . 14

4.1 Alcune istanze presenti nel dataset MNIST. . . 18

4.2 Distribuzioni di probabilità. . . 22

4.3 Alcune istanze di due e la loro rispettiva classe predetta. . . 25

4.4 Rappresentazione grafica del vettore di probabilità in output. . . 26

4.5 Rappresentazione grafica del vettore di probabilità in output. . . 27

4.6 Istogrammi delle probabilità di appartenenza. . . 28

4.7 Rappresentazione visiva della matrice Probes. . . 33

4.8 Istanza presa in considerazione. . . 34

4.9 Metodo di selezione delle probabilità da plottare nel boxplot . . . 35

4.10 Box plot delle distribuzioni delle probabilità di appartenenza per ogni classe. . 36

4.11 Probabilità media di appartenenza per ogni classe presente nel dataset. . . . 37

4.12 Istogramma delle probabilità di appartenenza alla classe predetta per tutto il test set. . . 38

4.13 Distribuzione di probabilità per ogni classe . . . 41

4.14 Plot delle probabilità di apparteneza assegnate dalla rete . . . 46

4.15 Distribuzioni di frequenza per le classi presenti nel dataset. . . 47

(6)
(7)
(8)
(9)

Capitolo 1

Abstract e Obiettivi

1.1

Abstract

Nel corso di questo progetto di laurea sono state studiate e analizzate le reti neurali clas-siche [NN] e quelle probabilistiche [BNN]. In particolare, al fine di stabilire quando è più vantaggioso usare le BNN rispetto alle NN, è stato analizzato il comportamento di queste due reti nella risoluzione di un problema di classificazione e nella valutazione dell’incertezza. Per fare ciò sono stati risolti due problemi di classificazione sui dataset:

• mnist: raccolta di cifre decimali scritte a mano e scansionate in bitmap con una risoluzione di 28x28,

• darpa: raccolta di risorse utilizzate dai principali attacchi informatici.

Dopo aver valutato l’accuratezza delle due reti (sia NN che BNN), si è valutato il loro com-portamento quando vengono commessi errori di classificazione, analizzando gli output delle istanze classificate in modo errato. Sono state tratte infine delle conclusioni sull’attività delle reti probabilistiche.

1.2

Abstract (english version)

During this degree project classical neural networks [NN] and probabilistic ones [BNN] have been studied and analyzed.

In particular, in order to establish when it is more advantageous to use BNNs compared to NNs, the behavior of these two networks was analyzed in the resolution of a classification problem and in the evaluation of uncertainty.

To do this, two classification problems have been solved:

(10)

resolu-2 Abstract e Obiettivi

• darpa: collection of resources used by the main cyber attacks.

After assessing the accuracy of the two networks (both NN and BNN), their behavior was assessed when classification errors were made, analyzing the outputs of the erroneously classified instances. Finally, conclusions have been drawn on the activity of probabilistic networks.

1.3

Obiettivi

Gli obiettivi di questo progetto sono:

• risolvere un problema di classificazione per mezzo di una rete neurale probabilistica e confrontare i risultati con quelli ottenuti per mezzo di metodi di classificazione più classici, tra cui reti neurali non probabilistiche;

• valutare il valore aggiunto delle reti probabilistiche e capire quando ha senso che vengano utilizzate.

(11)

Capitolo 2

Introduzione

Questo capitolo ha lo scopo di introdurre il lettore nel mondo delle reti neurali, spiegando i concetti teorici basilari e analizzando la loro storia, il loro ruolo nell’informatica e nella vita quotidiana.

2.1

Stato dell’arte

L’intelligenza artificiale (AI) è l’intelligenza dimostrata dalle macchine, in contrasto con l’in-telligenza naturale mostrata dagli umani. Colloquialmente, il termine "inl’in-telligenza artificiale" è spesso usato per descrivere macchine (o computer) che imitano le funzioni "cognitive" che gli esseri umani associano alla mente umana, come "apprendimento" e "risoluzione dei problemi". Essa può essere classificata in tre diversi tipi di sistemi:

• intelligenza artificiale analitica,

• intelligenza artificiale di ispirazione umana,

• intelligenza artificiale umanizzata.

L’AI analitica ha solo caratteristiche coerenti con l’intelligenza cognitiva: generare una rap-presentazione cognitiva del mondo e utilizzare l’apprendimento basato sull’esperienza pas-sata per informare le decisioni future. L’intelligenza artificiale di ispirazione umana ha menti dell’intelligenza cognitiva ed emotiva: comprendere le emozioni umane, oltre agli ele-menti cognitivi, e considerarle nel loro processo decisionale. L’intelligenza artificiale uma-nizzata mostra le caratteristiche di tutti i tipi di competenze (ad es. Intelligenza cognitiva, emotiva e sociale), è in grado di essere autocosciente nelle interazioni.

Sepur negli ultimi anni l’intelligenza artificiale abbia avuto dei grandi miglioramenti e molti finzanziamenti per quanto riguarda la ricerca e lo sviluppo, non fu sempre così. L’intelligenza artificiale è stata fondata come disciplina accademica nel 1956 e negli anni successivi ha subito diverse ondate di ottimismo, seguita da delusione e perdita di fondi (nota come "AI

(12)

4 Introduzione

Per gran parte della sua storia, la ricerca sull’intelligenza artificiale è stata suddivisa in sottocampi che spesso non riescono a comunicare tra loro. Questi sottocampi si basano su considerazioni tecniche, come obiettivi particolari (ad es. "Robotics" o "Deep Learning"), l’uso di strumenti particolari ("logica" o reti neurali artificiali) o profonde differenze filosofiche. I problemi (o gli obiettivi) tradizionali della ricerca AI includono:

• ragionamento,

• rappresentazione,

• rappresentazione della conoscenza,

• pianificazione,

• apprendimento,

• elaborazione del linguaggio naturale,

• percezione,

• capacità di muovere e manipolare oggetti.

L’intelligenza generale è tra gli obiettivi a lungo termine del campo. Gli approcci includono metodi statistici, intelligenza computazionale e AI simbolici tradizionali. Nell’AI vengono utilizzati molti strumenti, tra cui versioni di ricerca e ottimizzazione matematica, reti neurali artificiali e metodi basati su statistica, probabilità ed economia.

Il campo AI si basa su informatica, ingegneria dell’informazione, matematica, psicologia, linguistica, filosofia e molti altri campi.

Nel ventunesimo secolo, le tecniche di intelligenza artificiale hanno subito una rinascita a seguito di progressi simultanei nella potenza del computer, grandi quantità di dati e com-prensione teorica; e le tecniche di AI sono diventate una parte essenziale del settore tecno-logico, contribuendo a risolvere molti problemi impegnativi nell’informatica, nell’ingegneria del software e nella ricerca operativa.

2.2

Reti neurali

2.2.1

Cenno Storico

Gli esseri artificiali capaci di pensiero sono apparsi come strumenti narrativi nell’antichità e sono stati comuni nella narrativa, come nel Frankenstein di Mary. Questi personaggi e le lo-ro sorti hanno sollevato molte delle stesse questioni ora discusse nell’etica dell’intelligenza artificiale. Lo studio del ragionamento meccanico o "formale" iniziò con filosofi e matematici nell’antichità. Lo studio della logica matematica ha portato direttamente alla teoria del cal-colo di Alan Turing, secondo la quale una macchina, “mescolando simboli semplici come "0"

(13)

e "1"”, potrebbe simulare qualsiasi atto concepibile di deduzione matematica. Questa intui-zione, secondo cui i computer digitali possono simulare qualsiasi processo di ragionamento formale, è nota come tesi Church-Turing. Insieme alle scoperte simultanee in neurobiologia, teoria dell’informazione e cibernetica, questo ha portato i ricercatori a considerare la pos-sibilità di costruire un “cervello elettronico”. Turing ha proposto che “se un essere umano non fosse in grado di distinguere tra le risposte di una macchina e un essere umano, la macchina potrebbe essere considerata intelligente”. Il primo lavoro che ora è generalmen-te riconosciuto come AI era il design formale di McCullouch e Pitts del 1943 per “Neuroni artificiali” completi di Turing.

Il campo della ricerca sull’intelligenza artificiale è nato in un seminario presso il Dartmouth College nel 1956. I partecipanti Allen Newell , Herbert Simon , John McCarthy, Marvin Min-sky e Arthur Samuel sono diventati i fondatori e i leader della ricerca AI. Loro e i loro studenti produssero programmi che la stampa descrisse come “stupefacenti”: i computer stavano im-parando le strategie degli ispettori (e, a quanto si dice, nel 1959 stavano giocando meglio dell’umano medio), problemi in algebra, dimostrando teoremi logici e parlando inglese. A metà degli anni ’60, la ricerca negli Stati Uniti fu fortemente finanziata dal Dipartimento della Difesa e furono istituiti laboratori in tutto il mondo.

Non sono riusciti a riconoscere la difficoltà di alcuni dei compiti rimanenti. I progressi sono rallentati e nel 1974, in risposta alle critiche di Sir James Lighthill e alle continue pressioni del Congresso degli Stati Uniti per finanziare progetti più produttivi, sia il governo degli Stati Uniti che quello britannico hanno interrotto la ricerca esplorativa sull’intelligenza artificiale. I prossimi anni sarebbero stati chiamati "AI winter", un periodo in cui era difficile ottenere finanziamenti per i progetti AI.

All’inizio degli anni ’80, la ricerca sull’intelligenza artificiale è stata ripresa dal successo com-merciale di sistemi esperti, una forma di programma di intelligenza artificiale che simulava le conoscenze e le capacità analitiche degli esperti umani. Nel 1985, il mercato dell’IA aveva raggiunto oltre un miliardo di dollari. Allo stesso tempo, il progetto informatico giapponese di quinta generazione ha ispirato gli Stati Uniti e i governi britannici a ripristinare i finanzia-menti per la ricerca accademica. Tuttavia, a partire dal crollo del mercato di Lisp Machine nel 1987, l’IA è nuovamente caduto in discredito e ha avuto inizio una seconda pausa più duratura.

Alla fine degli anni ’90 e all’inizio del 21 secolo, l’IA ha iniziato a essere utilizzata per la logistica, il data mining, la diagnosi medica e altre aree. Il successo era dovuto all’aumento del potere computazionale, a una maggiore enfasi sulla risoluzione di problemi specifici, a nuovi legami tra IA e altri campi (come statistica, economia e matematica) e all’impegno dei ricercatori nei confronti di metodi matematici e standard scientifici. Deep Blue è diventato il primo sistema di gioco degli scacchi per computer a battere un campione mondiale di scacchi in carica, Garry Kasparov, l’11 maggio 1997.

(14)

6 Introduzione

consentito progressi nell’apprendimento automatico e nella percezione; I metodi di Deep Learning "affamati" di dati hanno iniziato a dominare i parametri di riferimento di precisione intorno al 2012. Kinect, che fornisce un’interfaccia body-motion 3D per Xbox 360 e Xbox One, utilizza algoritmi emersi da lunghe ricerche sull’intelligenza artificiale così come gli as-sistenti personali intelligenti negli smartphone. Nel marzo 2016, AlphaGo ha vinto 4 partite su 5 di Go in una partita con il campione di Go Lee Sedol, diventando il primo sistema di gioco per computer a battere un giocatore di Go professionista senza handicap. Nel Vertice Future of Go del 2017, AlphaGo ha vinto una partita a tre partite con Ke Jie, che all’epoca occupava continuamente la posizione numero 1 al mondo per due anni. Ciò ha segnato il completamento di una pietra miliare significativa nello sviluppo dell’intelligenza artificiale poiché Go è un gioco relativamente complesso, più che di scacchi.

Secondo Jack Clark di Bloomberg, il 2015 è stato un anno di riferimento per l’intelligenza artificiale, con il numero di progetti software che utilizzano AI Google Google da un "uso sporadico" nel 2012 a oltre 2.700 progetti. Clark presenta anche dati fattuali che indicano i miglioramenti dell’intelligenza artificiale dal 2012 supportati da tassi di errore più bassi nelle attività di elaborazione delle immagini. Lo attribuisce a un aumento delle reti neurali convenienti, a causa di un aumento dell’infrastruttura di cloud computing e di un aumento degli strumenti di ricerca e dei set di dati. Altri esempi citati includono lo sviluppo di Microsoft di un sistema Skype in grado di tradurre automaticamente da una lingua all’altra e il sistema di Facebook in grado di descrivere le immagini ai non vedenti. In un sondaggio del 2017, una società su cinque ha riferito di aver "incorporato l’AI in alcune offerte o processi". Intorno al 2016, la Cina ha notevolmente accelerato i finanziamenti del governo; data la sua grande quantità di dati e il suo rapido risultato di ricerca, alcuni osservatori ritengono che potrebbe essere sulla buona strada per diventare una "superpotenza AI".

2.3

Reti neurali probabilistiche [BNN]

2.3.1

Differenze dalle reti neurali "normali"

La differenza tra le reti normali e quelle probabilistiche si concentra sui pesi dei livelli, nel caso delle NN essi sono numeri assegnati ad ogni layer, nel caso delle BNN essi sono delle variabili aleatorie aventi una distribuzione; per merito di questo particolare, le BNN sono in grado di effettuare la valutazione dell’incertezza.

Come verrà discusso più approfonditamente nei prossimi capitoli, le reti neurali classificano una nuova istanza (ovvero un oggetto presente nel test set), valutandolo in base alle istanze presenti nel training set;

dopo una serie di operazioni la rete ottiene una serie di probabilità di appartenenza: ogni classe avrà una probabilità che l’oggetto appartiene ad essa, la sommatoria delle probabilità di tutte le classe è pari ad 1. Nel seguito è riportato un esempio.

(15)

1 i m p o r t n u m p y as np 2 i m p o r t m a t p l o t l i b . m l a b as m l a b 3 i m p o r t m a t p l o t l i b . p y p l o t as plt 4 5 x = n e t w o r k . p r e d i c t _ p r o b a ( t e s t _ i m a g e s [ : 1 ] ) [0] 6 y =[0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9] 7 sa = plt . bar ( y , x ) 8 plt . s a v e f i g (" p r o b a b i l i t a . pdf ") 9 plt . s h o w ()

Dal sovrastante codice otteniamo il seguente output. Come si può notare, attraverso la funzione predict_proba si ottiene un vettore contentente le probabilità di appartenenza per ogni classe. Al fine di avere una rappresentazione visiva di questo esempio sono state plottate le probabilità di appartenenza per ogni classe. In questo caso, la classe con maggior probabilità è la "7".

0

2

4

6

8

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

Figura 2.1: Instogramma delle probabilità: ad ogni classe viene assegnato un valore probabilistico di appartenenza, in questo caso la classe "0" ha maggiore probabilità

(16)

8 Introduzione

Ma cosa succede se l’istanza che si vuole far predirre al classificatore ha un label che non è mai stato visto dalla rete neurale? La rete dirà che quell’oggetto appartiene alla classe con maggior probabilità (attraverso la funzione argMax()). Con le reti probabilistiche è in-vece possibile ottenere una stima dell’incertezza. Attraverso la "funzione di Montecarlo" è possibile allenare un numero "N" di reti neurali ("N" conosciuto come "numero di montecar-lo"), questo permette di avere più reti che classificano l’oggetto preso in considerazione e quindi di avere una stima di tutte le "N" reti. Con l’insieme di tutte queste stime viene quindi generata una distribuzione di probabilità per ogni classe; essa, essendo una distribuzione, viene rappresentata quindi come una funzione: più la funzione sarà "larga", maggiore sarà l’incertezza.

(17)

0.25 0.00 0.25 0.50 0.75 1.00 1.25 0 2 4 6 8

(a) Caso in cui la quasi tutte le reti sono certe che l’istanza X appartenga alla classe Y

0.25 0.00 0.25 0.50 0.75 1.00 1.25 0 2 4 6 8

(b) Caso in cui la quasi tutte le reti sono certe che l’istanza X non appartenga alla classe Y

Figura 2.2: Distribuzioni di probabilità.

2.3.2

Incertezza

Dai precedenti grafici è possibile notare l’enorme differenza tra una NN e una BNN. Aven-do a disposizione molteplici reti e funzioni mirate è possibile ottenere una distribuzione di probabilità di appartenenza per ogni classe del dataset, cosa non possbile in una NN(in quanto, non essendoci funzioni appropriate nella libreria di keras/tensorflow, l’operazione risulterebbe molto complessa e "lenta").

(18)
(19)

Capitolo 3

Nozioni teoriche

Al fine di apparire chiaro e coinciso, questo capitolo è dedicato alle nozioni teoriche sulle tecniche utilizzate e su tutti gli elementi che appariranno nel codice del prossimo capitolo. Come prima cosa è doveroso fare chiarezza sull’AI. A primo impatto infatti si pensa che l’AI sia un solo ed unico blocco, in realtà non è così. Questa brancia dell’informatica si divide in molti sotto insiemi, quelli più comuni sono il Machine Learning e il Deep Learning, i quali verranno esaminati nei prossimi sotto-capitoli.

(20)

12 Nozioni teoriche

3.1

Machine Learning

Il Machine Learning è lo studio scientifico di algoritmi e modelli statistici che i sistemi in-formatici utilizzano per eseguire un compito specifico, senza utilizzare istruzioni esplicite, schemi o inferenze. Gli algoritmi di Machine Learning costruiscono un modello matema-tico basato su dati di esempio, noti come "training set", al fine di effettuare previsioni o decisioni senza essere esplicitamente programmati per eseguire l’attività. Gli algoritmi di Machine Learnning sono utilizzati in un ampia varietà di applicazioni, come il filtraggio della posta elettronica, in cui è difficile o impossibile sviluppare un algoritmo convenzionale per eseguire efficacemente l’attività.

Per fare machine learning, si necessita di tre cose:

• Input: normalmente training set;

• Classi di appartenenza: ogni tupla nel dataset di training rappresenta un elemento. Ad ogni elemento appartiene ad una classe, detta anche label;

• Un modo per misurare l’errore: è necessario per determinare la distanza tra l’output corrente dell’algoritmo e l’output previsto. La misurazione viene utilizzata come se-gnale di feedback per regolare il funzionamento dell’algoritmo. Questo passaggio di adattamento è ciò che viene definito apprendimento.

3.2

Deep Learning

Il Deep Learning è un sotto-campo specifico del Machine Learning, esso non è un riferi-mento a nessun tipo di comprensione più profonda raggiunta dall’approccio; piuttosto, rap-presenta questa idea di strati successivi di raprap-presentazioni. Il numero di livelli che contri-buiscono a un modello dei dati è chiamato profondità del modello. Nell’apprendimento pro-fondo, queste rappresentazioni stratificate sono (quasi sempre) apprese attraverso modelli chiamati reti neurali, strutturati in strati sovrapposti uno sull’altro. Il termine rete neurale è un riferimento alla neurobiologia, ma sebbene alcuni dei concetti centrali nell’apprendimen-to profondo siano stati sviluppati in parte ispirandosi alla nostra comprensione del cervello, i modelli di apprendimento profondo non sono modelli del cervello. Non ci sono prove che il cervello implementi qualcosa di simile ai meccanismi di apprendimento utilizzati nei moderni modelli di apprendimento profondo.

Come è possibile notare dalla figura 3.3, la rete trasforma l’immagine della cifra in rappre-sentazioni sempre più diverse dall’immagine originale e sempre più informative sul risultato finale. Si può pensare a una rete profonda come un’operazione di distillazione di informa-zioni a più stadi, in cui le informainforma-zioni passano attraverso filtri successivi ed esce sempre più purificato.

(21)

Figura 3.2: Input e output di una rete neurale. Fonte: Deep Learning with Python

Figura 3.3: Input e output di una rete neurale 2. Fonte: Deep Learning with Python

3.3

Come lavora il deep learning?

Ogni nodo della rete ha parametri detti “pesi”. In questo contesto, apprendere significa trovare un insieme di valori per i pesi di tutti i livelli in una rete, in modo tale che la rete mapperà correttamente gli input di esempio ai loro label associati. Ma ecco il punto: una Deep Neural Network può contenere decine di milioni di parametri. Trovare il valore corretto per tutti loro può sembrare un compito scoraggiante, soprattutto dato che la modifica del valore di un parametro influenzerà il comportamento di tutti gli altri.

(22)

14 Nozioni teoriche

Figura 3.4: I layers e i loro pesi. Fonte: Deep Learning with Python

è lontano da quello che ci si aspettava. Questo è il compito della funzione nominata “loss” della rete, chiamata anche “objective function”. La funzione di loss prende le previsioni della rete e il “true target” (ciò che volevi che la rete emettesse) e calcola un punteggio di distanza, catturando quanto bene ha fatto la rete in questo esempio specifico. Il trucco fondamentale nel Deep Learning è utilizzare questo “score” come segnale di feedback per aggiustare il valore dei pesi in una direzione che ridurrà il punteggio di loss per l’esempio corrente. Questa regolazione è il lavoro dell’ottimizzatore, il quale implementa quello che viene chiamato l’algoritmo Backpropagation: l’algoritmo centrale nel deep learning.

Inizialmente, ai pesi della rete vengono assegnati valori casuali, quindi inizialmente la rete implementa una serie di trasformazioni casuali. Naturalmente,il suo output è lontano da come dovrebbe idealmente essere, e il punteggio di loss è di conseguenza molto alto. Ma con ogni esempio vengono fatti variare i pesi e lo “score” della loss diminuisce. Questo è il ciclo di training, che, ripetuto un numero sufficiente di volte, produce pesi che minimizzano la funzione di loss.

3.4

Layers

"Layer" è un termine generale che si applica a una raccolta di "nodi" che operano insieme a una profondità specifica all’interno di una rete neurale.

Il layer di input contiene i dati non elaborati (puoi considerare ogni variabile come un ’nodo’). Gli strati nascosti, ovvero gli "hidden layers", vengono usati al fine di eseguire molteplici ope-razioni nelle reti neurali. Ogni livello cerca di apprendere aspetti diversi dei dati, riducendo al minimo una funzione di errore/costo.

(23)

Il modo più intuitivo e naif per comprendere questi livelli è nel contesto del "riconoscimento di immagini" come un volto.

• Il primo strato può apprendere il rilevamento dei tratti somatici,

• il secondo può rilevare feature più complesse come gli occhi,

• il terzo invcece feature ancora più complesse come il naso, e così via.

3.5

Loss function

La funzione di loss è una parte importante nelle reti neurali, la quale viene utilizzata per misurare l’incoerenza tra il valore previsto (ˆy) e l’etichetta effettiva (y). Ha valori non negativi, in cui l’accuratezza del modello aumenta insieme alla diminuzione del valore della funzione di loss.

3.6

Datasets

Un dataset è una raccolta di dati. Nel caso di dati tabulari, un set di dati corrisponde a una o più tabelle del database, in cui ogni colonna di una tabella rappresenta una particolare variabile e ogni riga corrisponde a un dato record del set di dati in questione. Il set di dati elenca i valori per ciascuna delle variabili, come altezza e peso di un oggetto, per ciascun membro del set di dati. Ogni valore è noto come dato. I set di dati possono anche consistere in una raccolta di documenti o file. Tra i dataset più noti vi sono

• Iris flower data set,

• MNIST database,

• Categorical data analysis,

• Robust statistics,

• Anscombe’s quartet.

3.7

Software utilizzato e linguaggio di programmazione

3.7.1

Keras

Keras è una libreria di reti neurali open source scritta in Python. È in grado di funzionare su TensorFlow, Microsoft Cognitive Toolkit, Theano o PlaidML. Progettato per consentire una rapida sperimentazione con reti neurali profonde, si concentra sull’essere intuitivo, modulare

(24)

16 Nozioni teoriche

(Sistema operativo robot intelligente neuro-elettronico aperto) e il suo autore e manutentore principale è François Chollet, un ingegnere di Google. Chollet è anche l’autore del modello di rete neurale profonda XCeption. Nel 2017, il team TensorFlow di Google ha deciso di supportare Keras nella libreria principale di TensorFlow. Chollet ha spiegato che Keras è stato concepito come un’interfaccia piuttosto che un framework di Machine Learning auto-nomo. Offre un set di astrazioni di livello superiore e più intuitivo che semplifica lo sviluppo di modelli di Machine Learning indipendentemente dal back-end computazionale utilizzato.

3.7.2

TensorFlow

TensorFlow è una libreria software gratuita e open source per il flusso di dati e la pro-grammazione differenziabile in una vasta gamma di attività. È una biblioteca matematica simbolica e viene anche utilizzata per applicazioni di Machine Learning come le reti neurali. TensorFlow è stato sviluppato dal team di Google Brain per uso interno di Google.

3.7.3

TensorFlow probability

TensorFlow Probability (TFP) è una libreria Python costruita su TensorFlow che semplifi-ca la combinazione di modelli probabilistici e Deep Learning su hardware moderno (TPU, GPU). È per data scientist, statistici, ricercatori ML e professionisti che vogliono codificare le conoscenze del dominio per comprendere i dati e fare previsioni.

(25)

Capitolo 4

Esperimenti

In questo capitolo vengono riportati gli esperimenti eseguiti durante lo svolgimento del pro-getto di laurea. Essi sono stati utili per comprendere meglio le reti neurali probabilistiche [BNN] e compararle con le reti "classiche"[NN].

4.1

Mnist

Il primo esperimento prevedeva la classificazione del dataset "MNIST": una raccolta di nu-meri scritti a mano, scannerizzate e riportati sottoforma di bitmap con risoluzione 28x28 in scala di grigio.

4.1.1

Descrizione dell’obiettivo

Gli obiettivi di questo esperimento erano:

1. prendere dimestichezza e applicare i principali concetti teorici delle NN e delle BNN, 2. capire le potenzialità delle BNN,

3. osservare il comportamento delle reti nel caso in cui l’istanza da classificare apparte-neva ad una classe non presente nel training set,

4. trarre conclusioni dei risultati ottenuti e stabilire la rete più adatta per risolvere un problema di classificazione di questo tipo.

Al fine di conseguire l’obiettivo numero 3, è stato necessario modificare il training e il test set ufficiale del mnist. Come riportato più dettagliatamente nella sezione 4.1.6, è stato creato un training set contentente istanze con classe di appartenenza diverse da "2" e un test set contenente solo istanze con classe di appartenenza uguali a "2".

Il tutto è stato utile per analizzare il comportamento delle reti in fase di classificazione delle istanze presenti nel test set, soffermeando in particolare l’attenzione sulle probabilità di

(26)

18 Esperimenti

4.1.2

Descrizione del dataset

Come riportato dal sito ufficiale del MNIST (http://yann.lecun.com/exdb/mnist/): "Il databa-se MNIST contiene cifre scritte a mano, contiene 60.000 istanze per il training databa-set ed altre 10.000 per il test set test. Le cifre sono state normalizzate per dimensione (28x28) e cen-trate in un’immagine a dimensione fissa (20x20). È un ottimo database per le persone che vogliono provare tecniche di machine learning e metodi di riconoscimento dei modelli sui dati del mondo reale, spendendo sforzi minimi per la preelaborazione e la formattazione dei dati."

Label: 7

Label: 3

Label: 4

Label: 6

Label: 1

Label: 8

Label: 1

Label: 0

Label: 9

Label: 8

Figura 4.1: Alcune istanze presenti nel dataset MNIST.

4.1.3

Codice

Al fine di conseguire lo scopo previsto da questo esperimento, è stata implementata una rete neurale convoluzionale [CNN]. Come riportato successivamente, la rete ha un’accuratezza del 98.4%.

4.1.3.1 Caricamento del dataset

É possibile caricare il dataset del mnist importandolo direttamente attraverso la libreria di keras.datasets; in questa libreria si possono trovare diversi datasets, tra cui:

(27)

• Imdb: raccolta di recensioni positive e negative su films;

• Boston_housing: raccolta di informazioni relative a case situate a Boston.

1 f r o m k e r a s . d a t a s e t s i m p o r t m n i s t

2 i m p o r t m a t p l o t l i b . p y p l o t as plt

3 ( t r a i n _ i m a g e s , t r a i n _ l a b e l s ) , ( t e s t _ i m a g e s , t e s t _ l a b e l s ) = m n i s t . l o a d _ d a t a ()

4.1.3.2 Creazione del modello

É noto in letteratira che la rete neurale più consona a classificare immagini è una rete convoluzionale [CNN]. Si è scelto quindi di implentare la rete sottostante avente 7 livelli, successivamente descritti.

1 i n p u t _ s h a p e = (28 , 28 , 1)

2 i m p o r t t e n s o r f l o w as tf

3 f r o m k e r a s . m o d e l s i m p o r t S e q u e n t i a l

4 f r o m k e r a s . l a y e r s i m p o r t Dense , Conv2D , Dropout , Flatten , M a x P o o l i n g 2 D

5 n e t w o r k = S e q u e n t i a l () 6 n e t w o r k . add ( C o n v 2 D (6 , 7 k e r n e l _ s i z e =5 , 8 p a d d i n g =" S A M E ", 9 i n p u t _ s h a p e = i n p u t _ s h a p e 10 11 12 ) 13 ) 14 n e t w o r k . add ( M a x P o o l i n g 2 D ( p o o l _ s i z e =(2 , 2) ) ) 15 n e t w o r k . add ( C o n v 2 D (12 , k e r n e l _ s i z e =(3 ,3) , i n p u t _ s h a p e = i n p u t _ s h a p e ) ) 16 17 n e t w o r k . add ( F l a t t e n () ) 18 n e t w o r k . add ( D e n s e (128 , a c t i v a t i o n = tf . nn . r e l u ) ) 19 # n e t w o r k . add ( D r o p o u t ( 0 . 2 ) ) 20 n e t w o r k . add ( D e n s e (10 , a c t i v a t i o n = tf . nn . s o f t m a x ) ) 21 22 n e t w o r k .c o m p i l e( 23 o p t i m i z e r =’ a d a m ’, 24 l o s s =’ c a t e g o r i c a l _ c r o s s e n t r o p y ’, 25 m e t r i c s =[’ a c c u r a c y ’] 26 )

• Conv2D: applica un ridimensionamento del dato in input, ai valori è applicata una convoluzione al fine di convertirli con uno shape minore. Più dettagliatamente un kernel/maschera viene applicato su tutti i patch e riduce le dimensioni delle matrici in

(28)

20 Esperimenti

• MaxPooling2D: filtro usato nelle CNN, riduce la dimensione di ogni input;

• Flatten: layers che converte l’input, in questo caso, essendo un immagine, 2-D in un vettore 1-D;

• Dense: layer con una serie di nodi tutti strettamente collegati con i nodi precedenti e successivi.

4.1.4

Fitting e Accuratezza

Una volta caricato il dataset e creato il modello, è possibile eseguire il fitting della rete, ovvero allenare la rete con i dati presenti nel training set.

In questa procedura le istanze viene ottimizzata la funzione di loss facendo variare i pesi della rete sulla base dei dati del training set.

1 h i s t o r y = n e t w o r k . fit ( t r a i n _ i m a g e s , t r a i n _ l a b e l s , v a l i d a t i o n _ s p l i t =0.33 , e p o c h s =10 , b a t c h _ s i z e =100 , v e r b o s e =1)

2 t e s t _ l o s s , t e s t _ a c c = n e t w o r k . e v a l u a t e ( t e s t _ i m a g e s , t e s t _ l a b e l s )

3 p r i n t(’ t e s t _ a c c : ’, t e s t _ a c c ) La rete ottiene un’accuratezza del 98.4%.

(29)

4.1.5

Performance della rete: accuratezza e funzione di loss

Nel grafico a della figura 4.2, è possibile notare l’aumento dell’accuratezza al variare delle epoche; in alcune situazioni, è possibile che in fase di training la rete vada in over fitting e perda accuratezza. Questa situazione più essere evitata con metodi di early stopping. Dal grafico si evince che la rete non sia andata in overfitting. Nel grafico b della figura 4.2 è possibile notare la funzione di loss al variare delle epoche.

(30)

22 Esperimenti

0

2

4

6

8

epoch

0.93

0.94

0.95

0.96

0.97

0.98

0.99

accuracy

model accuracy

train

test

(a) Distribuzione della probabilità di appartenenza della classe X generata dalle N reti. Caso in cui la rete è certa

0

2

4

6

8

epoch

0.05

0.10

0.15

0.20

0.25

0.30

loss

model loss

train

test

(b) Distribuzione della probabilità di appartenenza della classe Y generata dalle N reti. Caso in cui la rete è incerta

Figura 4.2: Distribuzioni di probabilità.

4.1.6

Modifica nel dataset

Al fine di conseguire l’obiettivo prestabilito, ovvero di verificare il comportamento delle NN nella fase di classificazione di un’istanza con label non presente nel test set, si sono ap-portate modifiche al training e al test set. Dopo aver deciso di classificare le istanze aventi come label "2", attraverso una serie di operazioni, si è ottenuto un training set contentente

(31)

tutte le istanze diverse da "2", mentre nel test set sono state immagazzinate solo istanze con label pari a "2".

Per eseguire questa operazione è stato necessaro:

• cercare tutte le istanze presenti nel dataset avente come label la classe "2" (linea 2b del codice),

• memorizzare le posizioni di esse in un array (linea 2a del codice),

• eliminare queste posizioni dal train set e, rispettivamente, aggiungerle nel test set(rispettivamente linea 3 e 7).

Per riassumere, la rete neurale presa in considerazione averà un training set contentente 54042 istanze, tutte diverse da "2", mentre nel test set (nominato nel codice "vettore_due"), contiene 5958 istanze tutte con label pari a "2".

Anche se il modello è rimasto invariato dal precedente, usando un training set senza istanze di un determinato label, ogni volta che la rete cercherà di classificare un’istanza di quel label non potrà fare altro che sbagliare.

1 i n d i c i _ p o s i z i o n i _ d i v e r s e _ d a = [ i for i in r a n g e(len( t r a i n _ i m a g e s ) ) if t r a i n _ l a b e l s [ i ] != c l a s s e _ e s c l u s a ] 2 i n d i c i _ p o s i z i o n i _ u g u a l _ a = [ i for i in r a n g e(len( t r a i n _ i m a g e s ) ) if t r a i n _ l a b e l s [ i ] == c l a s s e _ e s c l u s a ] 3 v e t t o r e _ d u e = t r a i n _ i m a g e s [ i n d i c i _ p o s i z i o n i _ u g u a l _ a [ : ] ] 4 v e t t o r e _ d u e _ l a b e l s = t r a i n _ l a b e l s [ i n d i c i _ p o s i z i o n i _ u g u a l _ a [ : ] ] 5 i n d i c i _ p o s i z i o n e _ d u e _ n e l _ t e s t = [ i for i in r a n g e(len( t e s t _ i m a g e s ) ) if t e s t _ l a b e l s [ i ] == c l a s s e _ e s c l u s a ] 6 7 t r a i n _ i m a g e s = t r a i n _ i m a g e s [ i n d i c i _ p o s i z i o n i _ d i v e r s e _ d a [ : ] ] 8 t r a i n _ l a b e l s = t r a i n _ l a b e l s [ i n d i c i _ p o s i z i o n i _ d i v e r s e _ d a [ : ] ] 9 10 v e t t o r e _ d u e = v e t t o r e _ d u e . r e s h a p e ( v e t t o r e _ d u e . s h a p e [0] , 28 , 28 , 1) 11 v e t t o r e _ d u e = v e t t o r e _ d u e . a s t y p e (’ f l o a t 3 2 ’) / 255

(32)

24 Esperimenti

4.1.7

Classificazione istanza con label non presente nel training set

Keras offre due metodi utili per la classificazione di un’istanza e per visualizzare le rispettive probabilità di appartenenza, iquesti metodi sono:

• predict_classes: riceve in input l’elemento da classificare, restituisce come output la classe di appartenenza predetta;

• predict_proba: riceve in input l’elememnto da classificare, restituisce come output un vettore di probabilità, della dimensione del numero di classi presenti nel dataset. La somma di queste probabilità è pari ad 1.

Il seguente codice fornisce una rappresentazione pratica dei metodi descritti precendente-mente. 1 p r i n t(’ p r e d i c t i o n : ’) 2 p r i n t( n e t w o r k . p r e d i c t _ c l a s s e s ( v e t t o r e _ d u e [ : 1 0 0 ] ) ) 3 4 p r i n t(’ p r o b a b i l i t i e s : ’) 5 p r i n t( n e t w o r k . p r e d i c t _ p r o b a ( v e t t o r e _ d u e [ : 1 0 0 ] ) ) 6 7 o u t p u t : 8 9 p r e d i c t i o n : 10 [8 7 3 8 3 8 7 3 7 3 7 7 1 7 0 1 3 3 1 7 4 3 3 7 3 3 7 3 8 8 7 8 3 3 1 3 3 11 3 3 3 8 3 1 1 3 1 3 8 1 4 8 8 8 7 8 8 8 7 8 8 7 0 7 8 8 8 3 3 8 7 3 1 3 7 12 3 8 8 3 3 1 8 4 4 7 3 3 8 7 7 4 7 3 7 8 3 8 1 8 8 1] 13 p r o b a b i l i t i e s : 14 [ [ 1 . 2 5 5 9 1 4 1 0 e -04 1 . 0 9 1 7 4 8 4 2 e -04 1 . 3 0 3 9 2 0 9 7 e -09 6 . 0 4 2 3 5 7 9 1 e -02 15 1 . 8 2 0 4 8 9 1 2 e -04 9 . 5 0 7 9 2 5 2 8 e -05 3 . 1 5 5 2 8 2 9 7 e -07 4 . 2 1 1 7 3 7 8 1 e -01 16 5 . 1 7 8 8 9 3 2 1 e -01 1 . 0 4 0 7 1 4 7 8 e - 0 6 ] 17 [ 5 . 8 2 6 1 4 9 1 6 e -08 3 . 5 4 5 9 9 6 1 5 e -06 4 . 9 5 4 5 0 3 4 7 e -11 1 . 9 5 2 9 2 8 3 0 e -01 18 4 . 5 7 0 4 6 0 0 8 e -06 2 . 0 1 4 1 5 0 2 3 e -05 4 . 0 1 1 1 1 4 6 4 e -08 7 . 9 9 7 0 5 3 8 6 e -01 19 4 . 9 7 2 2 1 4 3 4 e -03 1 . 2 9 0 3 0 7 4 1 e - 0 6 ]

(33)

4.1.8

Rappresentazione visiva

E’ stato deciso di plottare alcune istanze di "2" e la rispettiva classe predetta. Si possono a volte notare alcune analogie tra l’istanza classificata e la classe predetta.

predicted: 8

predicted: 7

predicted: 3

predicted: 8

predicted: 3

predicted: 8

predicted: 7

predicted: 3

predicted: 7

predicted: 3

predicted: 7

predicted: 7

predicted: 1

predicted: 7

predicted: 0

predicted: 1

predicted: 3

predicted: 3

predicted: 1

predicted: 7

(34)

26 Esperimenti

4.1.9

Risultati

Si consideri la seguente immagine come istanza presa in riferimento all’interno di questo esperimento.

Figura 4.4: Rappresentazione grafica del vettore di probabilità in output.

Nel capitolo 4.1.8 si è introdotto l’utilizzo della funzione predict_proba, attraverso la quale è possibile ottenere le probabilità di appartenenza per ogni classe presente nel dataset, ovvero, data un’istanza, è possibile ottenere la classe predetta dalla rete e che probabilità è associata ad essa.

E’ quindi possibile attraverso il seguente codice ottenere il seguente grafico.

1 p r o b a b = n e t w o r k . p r e d i c t _ p r o b a ( v e t t o r e _ d u e [ 1 : 2 ] ) [0]

2 y =[0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9]

3 plt . bar ( y , p r o b a b )

4 plt . s a v e f i g (’ p r o b a b i l i t a . pdf ’)

5 plt . s h o w ()

Come atteso, viene predetta la classe sbagliata. Da notare che la rete associa una proba-bilità molto alta a tale classe, ciò vuol dire che la rete è sicura (qualsi al 100%) di quello che prevede.

Per fare una valutazione più generale applicare un’analisi del tipo precedente su tutte le istanze del test set, al fine di capire con quanta percentuale di appartenenza la NN classi-ficava istanze con label non presente nel train set, ovvero con quanta certezza la rete ha classificato istanza sbagliate.

1 arr = []

2 for w in r a n g e(len( v e t t o r e _ d u e ) ) :

3 arr . a p p e n d ( n e t w o r k . p r e d i c t _ p r o b a ( v e t t o r e _ d u e [ w : w + 1 ] ) [ 0 ] [ n e t w o r k . p r e d i c t _ c l a s s e s ( v e t t o r e _ d u e [ w : w + 1 ] ) ] [ 0 ] )

(35)

0

2

4

6

8

Classi

0.0

0.2

0.4

0.6

0.8

1.0

Probabilità di appartenenza

Figura 4.5: Rappresentazione grafica del vettore di probabilità in output.

4 i m p o r t n u m p y as np 5 i m p o r t m a t p l o t l i b . m l a b as m l a b 6 i m p o r t m a t p l o t l i b . p y p l o t as plt 7 len( arr ) 8 n u m _ b i n s = 500 9 n , bins , p a t c h e s = plt . h i s t ( arr , n u m _ b i n s , f a c e c o l o r =’ b l u e ’, a l p h a = 0 . 5 ) 10 plt . s a v e f i g (" p l o t _ 0 _ 1 0 0 . pdf ") 11 plt . s h o w () 12 13 a r r 2 = [] 14 for w in r a n g e(len( v e t t o r e _ d u e ) ) : 15 if arr [ w ] >= 0 . 9 : 16 a r r 2 . a p p e n d ( arr [ w ] ) 17 n u m _ b i n s = 500 18 n , bins , p a t c h e s = plt . h i s t ( arr2 , n u m _ b i ns , f a c e c o l o r =’ b l u e ’, a l p h a = 0 . 5 ) 19 plt . s a v e f i g (" p l o t _ 9 0 _ 1 0 0 . pdf ") 20 plt . s h o w ()

Nel codice viene crato l’array nominato "arr", il quale contiene, per ogni istanza classificata nel test set, la percentuale di appartenenza della classe predetta.

(36)

28 Esperimenti

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

0

100

200

300

400

500

600

700

800

(a) Istogramma delle probabilità di appartenenza alla classe predetta (errata) per tutto il test set.

0.90

0.92

0.94

0.96

0.98

1.00

0

50

100

150

200

250

300

350

(b) Istogramma delle probabilità di appartenenza alla classe predetta (errata) per tutto il test "zoommato" dal 90% al 100%

Figura 4.6: Istogrammi delle probabilità di appartenenza.

In figura 4.5 è possibile notare che nella maggior parte dei casi, la rete classifica un oggetto con un label non presente nel test set con una probabilità di appartenenza molto alta. Que-sta considerazine conferma il fatto che le NN non sono in grado di identificare casi molto diversi dai dati del training set.

(37)

Riassunto dei grafici

Start range End range Numero di istanze Percentuale

0% 10% 0 0.0% 10% 20% 0 0.0% 20% 30% 2 0.03% 30% 40% 40 0.67% 40% 50% 160 2.68% 50% 60% 422 7.08% 60% 70% 426 7.15% 70% 80% 474 7.95% 80% 90% 666 11.17% 90% 100% 3725 62.52%

Riassumendo, più del 60% delle istanze di "2" classificate avevano una probabilità di ap-partenza alla classe predetta compresa tra [0.9 e 1.0). Questo dato fa intendere che le NN sono molto sicure della loro stima, anche se stanno classificando un’istanza avente un label non presente nel training set. Nella prossima sezione si è replicato l’esperimento per mezzo di una BNN.

(38)

30 Esperimenti

4.2

BNN

4.2.1

Codice

Sono successivamente riportati i codici relativi alla creazione del modello BNN e al fitting della rete. É stata implementata una rete convoluzionale analoga a quella delle NN al fine di rendere confrontabili i risultati.

4.2.1.1 Creazione del modello

Il modello della BNN rispecchia molto il precedente. E stato necessario ricreare lo stesso tipo di modello al fine di avere risultati più concreti e confrontabili. Il seguente layer contiene 5 layers probabilistici e 3 layers non probabilistici.

1 w i t h tf . c o m p a t . v1 . n a m e _ s c o p e (" b a y e s i a n _ n e u r a l _ n e t ", v a l u e s =[ i m a g e s ]) : 2 n e u r a l _ n e t = tf . k e r a s . S e q u e n t i a l ([ 3 tfp . l a y e r s . C o n v o l u t i o n 2 D F l i p o u t (6 , 4 k e r n e l _ s i z e =5 , 5 p a d d i n g =" S A M E ", 6 a c t i v a t i o n = tf . nn . r e l u ) , 7 tf . k e r a s . l a y e r s . M a x P o o l i n g 2 D ( p o o l _ s i z e =[2 , 2] , 8 s t r i d e s =[2 , 2] , 9 p a d d i n g =" S A M E ") , 10 tfp . l a y e r s . C o n v o l u t i o n 2 D F l i p o u t (16 , 11 k e r n e l _ s i z e =5 , 12 p a d d i n g =" S A M E ", 13 a c t i v a t i o n = tf . nn . r e l u ) , 14 tf . k e r a s . l a y e r s . M a x P o o l i n g 2 D ( p o o l _ s i z e =[2 , 2] , 15 s t r i d e s =[2 , 2] , 16 p a d d i n g =" S A M E ") , 17 tfp . l a y e r s . C o n v o l u t i o n 2 D F l i p o u t (120 , 18 k e r n e l _ s i z e =5 , 19 p a d d i n g =" S A M E ", 20 a c t i v a t i o n = tf . nn . r e l u ) , 21 tf . k e r a s . l a y e r s . F l a t t e n () , 22 tfp . l a y e r s . D e n s e F l i p o u t (84 , a c t i v a t i o n = tf . nn . r e l u ) , 23 tfp . l a y e r s . D e n s e F l i p o u t ( 1 0 ) 24 ])

4.2.1.2 Analisi dei layers

I layers utilizzati in questa parte del progetto hanno le stesse funzioni di quelli della sezio-ne 4.1.3.2. I layer che terminano con "FlipOut" non sono frequentisti, bensì probabilistici, ovvero contengono pesi, i quali sono delle variabili aleatorie aventi una distribuzione.

(39)

4.2.1.3 Fitting e Accuratezza

Attraverso il seguente codice è possibile eseguire il training della rete; non avviene un vero e proprio test sulla rete, bensì ogni 400 steps viene eseguita una sessione che calcola le probabilità di appartenenza a posteriori (riga numero 18). Questa sessione si occupa di al-lenare molteplici reti al fine di avere per ogni istanza non più un array contenente probabilità di appartenenza alle classi, bensì una matrice avente il numero di righe pari al numero di reti allenate e il numero di colonne pari al numero di classi.

1 w i t h tf . c o m p a t . v1 . S e s s i o n () as s e s s : 2 s e s s . run ( i n i t _ o p ) 3 t r a i n _ h a n d l e = s e s s . run ( t r a i n i n g _ i t e r a t o r . s t r i n g _ h a n d l e () ) 4 h e l d o u t _ h a n d l e = s e s s . run ( h e l d o u t _ i t e r a t o r . s t r i n g _ h a n d l e () ) 5 for s t e p in r a n g e( 3 0 0 0 ) : 6 _ = s e s s . run ([ t r a in _ o p , a c c u r a c y _ u p d a t e _ o p ] , 7 f e e d _ d i c t ={ h a n d l e : t r a i n _ h a n d l e }) 8 9 if s t e p % 100 == 0: 10 l o s s _ v a l u e , a c c u r a c y _ v a l u e = s e s s . run ( 11 [ e l b o _ l o s s , a c c u r a c y ] , f e e d _ d i c t ={ h a n d l e : t r a i n _ h a n d l e }) 12 p r i n t(" S t e p : {: >3 d } L o s s : { : . 3 f } A c c u r a c y : { : . 3 f } ".f o r m a t( 13 step , l o s s _ v a l u e , a c c u r a c y _ v a l u e ) ) 14 15 if ( s t e p +1) % 400 == 0: 16 p r o b s = np . a s a r r a y ([ 17 s e s s . run ( 18 ( l a b e l s _ d i s t r i b u t i o n . p r o b s ) , 19 f e e d _ d i c t ={ h a n d l e : h e l d o u t _ h a n d l e } 20 ) 21 for _ in r a n g e( k _ n u m _ m o n t e _ c a r l o ) 22 ]) 23 24 m e a n _ p r o b s = np . m e an ( probs , a x i s =0) 25 i m a g e _ v a l s , l a b e l _ v a l s = 26 s e s s . run (( images , l a b e l s ) , 27 f e e d _ d i c t ={ h a n d l e : h e l d o u t _ h a n d l e }) 28 29 h e l d o u t _ l p = np . m e an ( np . log ( 30 m e a n _ p r o b s [ np . a r a n g e ( m e a n _ p r o b s . s h a p e [ 0 ] ) , 31 l a b e l _ v a l s . f l a t t e n () ]) )

Nel codice sovrastante viene creata la matrice delle distribuzioni di probabilità, da essa si riuscirà successivamente a valutare l’incertezza della rete.

Alla riga 18 del codice sovrastante, si può notare una List Comprehension, la quale genera un array nominato probs con shape pari a (50, 5000, 10).

(40)

32 Esperimenti

• num_montecarlo: in questo caso pari a 50;

• numero_istanze_testset: in questo caso pari a 5000;

• numero_classi: in questo caso pari a 10.

La funzione "sess.run" restituisce una matrice con dimensione 5000x10, dove 5000 sono le istanze presenti nel test set, mentre 10 sono il numero di classi presenti; in poche parole "sess.run" restituisce una matrice, la quale indica, per ogni istanza presente nel test set, la probabilità di apparteneza ad ogni classe.

Come è possibile notare, alla riga 20 è presente un loop, il quale cicla da 0 fino a "k_ num_monte_carlo". Il ciclo ripete l’operazione tante volte quante il k_num_monte_carlo , sempre con una rete diversa (stesso modello ma pesi differenti sui layers).

In questo modo, ogni istanza non avrà più una sola lista di probabilità di appartenenza alle diverse classi, avrà bensi un numero di liste di probabilità di appartenzenza alle classi pari al contenuto della variabile nominata montecarlo.

Avendo un numero di osservazioni sufficiente, è possibile:

• stimare la distribuzione a posteriori della probabilità in uscita,

• studiare l’incertezza della rete.

Al fine di avere una rappresentazione visiva della matrice nominata probes, successivamen-te è stato plottato uno schema di essa.

(41)

10 Classi

Numero istanze testSet

num_montecarlo Matrici

(42)

34 Esperimenti

4.2.2

Scelta dell’istanza da classificare

Attraverso il seguente codice

1 f r o m m a t p l o t l i b . p y p l o t i m p o r t i m s h o w

2 % m a t p l o t l i b i n l i n e 3 w , h = 28 , 28

4 i m a g e = i m a g e _ v a l s [ n _ i s t a n z a ]. r e s h a p e ( w , h )

5 i m s h o w ( image , c m a p =’ g r a y ’)

è stata presa in considerazione la seguente istanza.

(43)

4.2.3

Analisi delle distribuzioni di frequenza

Il seguente codice plotta le distribuzioni di probabilità per l’ottava classe del test set.

1 n _ i s t a n z a =8

2 w = sns . b o x p l o t ( d a t a = p r o b s [: , n _ i s t a n z a , : ] ) 3 w . f i g u r e . s a v e f i g (" b o x P l o t . pdf ")

E’ stato possibile ottenere le seguenti distribuzioni fissando la seconda dimensione della matrice, come riportato visivamente.

10 Classi

Numero istanze testSet

num_montecarlo Matrici

(44)

36 Esperimenti

0

1

2

3

4

5

6

7

8

9

0.0

0.2

0.4

0.6

0.8

1.0

Figura 4.10: Box plot delle distribuzioni delle probabilità di appartenenza per ogni classe. Dal box plot sovrastante si può notare l’indecisione delle reti, particolarmente su tre classi: "1","3" e "8". Ora è possibile, attraverso il seguente codice, calcolare la media a posteriori della probabilità di appartenza ad ogni classe.

1 x = np . m e a n ( p r o b s [: , n _ i s t a n z a ,:] , a x is =0)

2 y =[0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9]

3 plt . bar ( y , x )

4 plt . s a v e f i g (’ p l ot . pdf ’)

5 plt . s h o w ()

(45)

0

2

4

6

8

0.0

0.1

0.2

0.3

0.4

Figura 4.11: Probabilità media di appartenenza per ogni classe presente nel dataset.

Come è possibile notare in figura 4.10, il grafico della media di appartenenza per ogni classe è molto diverso dal grafico delle reti neurali (Capitolo 4.5). La distribuzione di probabilità sulle 10 classi è molto più larga, ovvero dispersa su più classi. Non è presente una classe preponderante, la rete, anche scegliendo la classe con probabilità più alta, prende una decisione meno certa.

(46)

38 Esperimenti

4.2.4

Istogramma delle probabilità di appartenenza alla classe predetta

Al fine di comparare meglio i risultati ottenuti attraverso le BNN con quelli delle NN, si è deciso di replicare l’istogramma delle probabilità di appartenenza alla classe predetta.

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

0

20

40

60

80

100

Figura 4.12: Istogramma delle probabilità di appartenenza alla classe predetta per tutto il test set.

Come si evince dal grafico in figura 4.11, la BNN classifica le istanze con label non presente nel test set con una probabilità media di appartenenza molto più bassa rispetto alle NN. Inoltre, il grafico non si concentra in un unico valore (come succedeva per le NN nel grafico della figura 4.6 delle NN).

(47)

Riassunto dei grafici

Start range End range Numero di istanze Percentuale

0% 10% 0 0.0% 10% 20% 0 0.0% 20% 30% 66 1.1% 30% 40% 481 8.07% 40% 50% 1027 17.23% 50% 60% 1152 19.33% 60% 70% 940 15.77% 70% 80% 752 12.62% 80% 90% 588 9.86% 90% 100% 464 7.78%

(48)

40 Esperimenti

4.2.5

Distribuzione di probabilità per ogni classe.

1 f , a x e s = plt . s u b p l o t s (2 , 2 , f i g s i z e =(18 , 18) , s h a r e x = T r u e ) 2 3 n _ c l a s s e = 8 4 5 sns . d i s t p l o t ( p r o b s [: , n _ i s t a n z a , n _ c l a s s e ] , 6 c o l o r =" s k y b l u e ", ax = a x e s [0 ,0] 7 ) . s e t _ t i t l e (" C l a s s e {0} ".f o r m a t( g r a f i c o ) )

Attraverso il codice riportato è possibile ricavare le distribuzioni di appartenenza per ogni classe. Dalle distribuzioni presenti in figura 4.13 è possibile ricavare molte informazioni. La distribuzione delle classi "0","4","5","6","7","9" è molto stretta, ciò vuol dire che tutte le reti sono sicure della loro valutazione. In altre parole, tutte le reti allenate con il metodo montecarlo sono sicure che l’istanza presa in considerazione non appartenga alle classi sopra citate.

Per le classi "1", "3" e "6", il ragionamento è diverso. Infatti le reti allenate con il metodo montecarlo non esprimono un giudizio univoco sulla probabilità di appartenenza, creando quindi una distribuzione di frequenza molto larga, come è possibile vedere in figura 4.13 b, c ,h.

(49)

0.0 0.2 0.4 0.6 0.8 1.0 0 200 400 600 800 1000 1200 1400 Classe 0 (a) Classe 0 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 Classe 1 (b) Classe 1 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.5 1.0 1.5 2.0 2.5 Classe 3 (c) Classe 3 0.0 0.2 0.4 0.6 0.8 1.0 0 10 20 30 40 50 60 70 Classe 4 (d) Classe 4 0.0 0.2 0.4 0.6 0.8 1.0 0 20 40 60 80 100 120 140 Classe 5 (e) Classe 5 0.0 0.2 0.4 0.6 0.8 1.0 0 10 20 30 40 50 60 Classe 6 (f) Classe 6 0.0 0.2 0.4 0.6 0.8 1.0 0 100 200 300 400 500 600 700 800 Classe 7 (g) Classe 7 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 Classe 8 (h) Classe 8 0.0 0.2 0.4 0.6 0.8 1.0 0 100 200 300 400 Classe 9 (i) Classe 9

Figura 4.13: Distribuzione di probabilità per ogni classe

4.3

Considerazioni

In base a quanto riportato dai grafici in figura 4.10 e 4.11, la classe che si dovrebbe preve-dere per l’istanza presa in analisi è "8", in quanto è la classe avente la probabilità media più alta.

Se però oltre a guardare i grafici citati precendentemente si osserva il grafico riportato nella figura 4.13, ci si accorge che la distribuzione di probabilità di questa classe è molto larga, vi è molta incertezza sulla previsione.

Riassumento, in questo esperimento si è dedotto che:

• La NN classifica le istanze fornendo una probabilità di appartenenza molto alta, ciò vuol dire che la NN è certa della sua classificazione;

(50)

42 Esperimenti

(51)

4.4

Darpa

Una volta concluso l’esperimento del mnist, si è iniziato l’esperimento sul dataset darpa. Gli obiettivi di questo esperiemto sono:

• osservare il comportamento delle reti nel caso in cui l’istanza da classificare apparte-neva ad una classe non presente nel training set,

• trarre conclusioni dei risultati ottenuti e stabilire la rete più adatta per risolvere un problema di classificazione di questo tipo.

Gli obiettivi sono analoghi ai quelli dell’esperimento precedente ma con una differenza: il modello utilizzato. In questo esperiemento verrà infatti utilizzato un modello denso, mentre nell’esperimento precedente veniva utilizzato un modello convoluzionale.

4.4.1

Descrizione del dataset

Come è possibile leggere dal sito:

"La valutazione del rilevamento delle intrusioni DARPA del 1999 comprendeva due parti: una valutazione off-line e una valutazione in tempo reale. I sistemi di rilevamento delle intrusioni sono stati testati nella valutazione off-line utilizzando il traffico di rete e i log di audit raccolti su una rete di simulazione. I sistemi hanno elaborato questi dati in modalità batch e hanno tentato di identificare sessioni di attacco nel mezzo di normali attività. I sistemi di rilevamento delle intrusioni sono stati consegnati all’Air Force Research Laboratory (AFRL) per la valutazione in tempo reale. Questi sistemi sono stati inseriti nel banco di prova della rete AFRL e hanno tentato di identificare le sessioni di attacco in tempo reale durante le normali attività. I sistemi di rilevamento delle intrusioni sono stati testati nell’ambito della valutazione off-line, della valutazione in tempo reale o di entrambi.".

4.4.2

Labels presenti nel dataset

Il dataset originale contiene 20 classi, come spiegato successivamente, l’esperimento si è svolto su un sotto dataset, ovvero una raccolta minore di informazioni. Il il sotto-dataset classificato in questo esperimento contiene i labels:

• smurf: causa un denial of service;

• neptune: causa un SYN flood;

• normal: situazione di normalità;

(52)

44 Esperimenti

4.4.3

Sotto-datasets

Al fine di ridurre la potenza computazionale, sono stati creati dei sotto-datasets, ovvero da-tasets con meno classi e dati. Tra questi, il più importante è nominato "DARPA_training_set_ 6classi", il quale ha i tre labels più frequenti ("smurf", "neptune", "normal”) e i tre labels meno frequenti ("satan", "ipsweep", "portsweep”).

4.4.4

Caricamento del dataset

Dopo aver letto il dataset con la libreria nominata "pandas", è stato necessario modificare alcune colonne, in quanto essendo qualitative recavano problemi alla rete;

1 i m p o r t p a n d a s as pd 2 i m p o r t m a t p l o t l i b . p y p l o t as plt 3 i m p o r t n u m p y as np 4 5 n _ c l a s s i =7 6 d s T r a i n = pd . r e a d _ c s v (’ ds / D A R P A _ t r a i n i n g _ s e t _ 6 c l a s s i . csv ’) 7 d s T e s t = pd . r e a d _ c s v (’ ds / D A R P A _ t e s t _ s e t _ e x t r a 1 . csv ’) 8 9 t r a i n _ i m a g e s = 10 d s T r a i n . d r o p ( c o l u m n s =[’ C l a s s V a l u e s ’,’ p r o t o c o l _ t y p e ’,’ s e r v i c e ’,’ f l a g ’]) 11 t r a i n _ l a b e l s = d s T r a i n [[’ C l a s s V a l u e s ’]] 12 13 v a l _ i m a g e s = 14 d s T e s t . d r op ( c o l u m n s =[’ C l a s s V a l u e s ’,’ p r o t o c o l _ t y p e ’,’ s e r v i c e ’,’ f l a g ’]) 15 v a l _ l a b e l s = pd . r e a d _ c s v (’ ds / d . csv ’) [[’ C l a s s V a l u e s ’]]

Al fine di ricreare una situazione analoga a quella dell’esperimento precedente, il train set conterrà istanze con label compreso tra "1" e "6", mentre il test set contiene solo valori con label pari a "7".

4.4.5

Creazione del modello

Il modello scelto per la classificazione del dataset Darpa è di tipo denso, con 512 neuroni al primo livello e un variabile numero di classi di uscita (il quale dipende dal numero di labels presenti nel dataset selezionato).

1 n e t w o r k = k e r a s . S e q u e n t i a l ([ 2 k e r a s . l a y e r s . D e n s e (512 , a c t i v a t i o n =’ r e l u ’, i n p u t _ s h a p e = ( 3 8 ,) ) , 3 k e r a s . l a y e r s . D e n s e ( n _c l a s s i , a c t i v a t i o n =’ s o f t m a x ’) ]) 4 n e t w o r k .c o m p i l e( 5 o p t i m i z e r =’ r m s p r o p ’, 6 l o s s =’ c a t e g o r i c a l _ c r o s s e n t r o p y ’, 7 m e t r i c s =[’ a c c u r a c y ’] 8 )

(53)

4.4.6

Fitting e accuratezza

Una volta creato il modello si è effettuato il training della rete. Avendo un test set contente istanze con label non presente nel test set, l’accuratezza della rete è superflua in quanto la rete sbaglierebbe a classificare tutte le istanze.

1 n e t w o r k . fit ( t r a i n _ i m a g e s , t r a i n _ l a b e l s , e p o c h s =5 , b a t c h _ s i z e =100 , v e r b o s e =1)

4.4.7

Classificazione istanza con label non presente nel training set

Keras offre due metodi utili per la classificazione di un’istanza e per visualizzare le rispettive probabilità di appartenenza, i quali:

• predict_classes: riceve in input l’elememnto da classificare, torna come output la classe di appartenenza predetta;

• predict_proba: riceve in input l’elememnto da classificare, torna come output un array contentente delle probabilità, una per ogni classe presente nel dataset. La sommato-ria di queste probabilità è pari ad 1.

1 p r i n t(’ p r e d i c t i o n : ’) 2 p r i n t( n e t w o r k . p r e d i c t _ c l a s s e s ( v a l _ i m a g e s [ : ]) ) 3 4 p r i n t(’ p r o b a b i l i t i e s : ’) 5 p r i n t( n e t w o r k . p r e d i c t _ p r o b a ( v a l _ i m a g e s [ : ] ) ) 6 7 p r e d i c t i o n : 8 [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 9 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ] 10 p r o b a b i l i t i e s : 11 [ [ 0 . 0. 1. 0. 0. 0.] 12 [0. 0. 1. 0. 0. 0.] 13 [0. 0. 1. 0. 0. 0.] 14 [0. 0. 1. 0. 0. 0.] 15 [0. 0. 1. 0. 0. 0.] 16 [0. 0. 1. 0. 0. 0.] 17 [0. 0. 1. 0. 0. 0.] 18 [0. 0. 1. 0. 0. 0.] 19 [0. 0. 1. 0. 0. 0.] 20 [0. 0. 1. 0. 0. 0.] 21 [0. 0. 1. 0. 0. 0.] 22 [0. 0. 1. 0. 0. 0.] 23 [0. 0. 1. 0. 0. 0.] 24 ..]

(54)

46 Esperimenti

4.4.8

Risultati

É deducibile dal grafico che tutte le istanze presenti nel test set vengono classificate dalla rete, assegnando ad ogni istanza una probabilità di appartenenza pari a 1.

1 arr = [] 2 for w in r a n g e(len( v a l _ i m a g e s ) ) : 3 arr . a p p e n d ( n e t w o r k . p r e d i c t _ p r o b a ( v a l _ i m a g e s [ w : w + 1 ] ) [ 0 ] [ n e t w o r k . p r e d i c t _ c l a s s e s ( v a l _ i m a g e s [ w : w + 1 ] ) ] [ 0 ] ) 4 5 i m p o r t n u m p y as np 6 i m p o r t m a t p l o t l i b . m l a b as m l a b 7 i m p o r t m a t p l o t l i b . p y p l o t as plt 8 len( arr ) 9 n u m _ b i n s = 100 10 n , bins , p a t c h e s = plt . hi s t ( arr , 1000 , f a c e c o l o r =’ b l u e ’, a l p h a = 0 . 5 ) 11 plt . s a v e f i g (" p l o t D i Q u a n t o S b a g l i a L a R e t e N o r m a l e D A R P A . pdf ") 12 plt . x l a b e l (" P r o b a b i l i t a ") 13 plt . y l a b e l (" F r e q u e n z a ") 14 plt . s h o w ()

0.6

0.8

1.0

1.2

1.4

Probabilità

0

10

20

30

40

50

Frequenza

(55)

4.4.9

BNN

Per la parte probabilistica si è deciso di apportare una modifica ai layers del modello pre-dente. Come spiegato nell’esperimento precedente, i layers utilizzati per le BNN sono simili ai layers delle NN, con la sola differenza che usano delle variabili aleatorie sui pesi.

1 w i t h tf . c o m p a t . v1 . n a m e _ s c o p e (" b a y e s i a n _ n e u r a l _ n e t ", v a l u e s =[ i m a g e s ]) :

2 n e u r a l _ n e t = tf . k e r a s . S e q u e n t i a l ([

3 tfp . l a y e r s . D e n s e F l i p o u t (516 , a c t i v a t i o n = tf . nn . r e l u ) ,

4 tfp . l a y e r s . D e n s e F l i p o u t ( n _ c l a s s i )

5 ])

4.4.10

Analisi delle distribuzioni di frequenza

1 n _ i s t a n z a =8

2 w = sns . b o x p l o t ( d a t a = p r o b s [: , n _ i s t a n z a , : ] ) 3 w . f i g u r e . s a v e f i g (" b o x P l o t . pdf ")

Dal grafico in figura 4.15 è possiibiile notare che le reti allenate con il metodo montecarlo sono abbastanza insicure. La decisione varia tra la classe "1" e la classe "3".

0

1

2

3

4

5

0.0

0.2

0.4

0.6

0.8

1.0

(56)

48 Esperimenti

(57)

0.0 0.2 0.4 0.6 0.8 1.0 0 50 100 150 200 250 Classe 1 (a) Classe 1 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 1.2 Classe 2 (b) Classe 2 0.0 0.2 0.4 0.6 0.8 1.0 0 200 400 600 800 1000 1200 1400 1600 Classe 3 (c) Classe 3 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 1.2 Classe 4 (d) Classe 4 0.0 0.2 0.4 0.6 0.8 1.0 0 100 200 300 400 500 Classe 5 (e) Classe 5 0.0 0.2 0.4 0.6 0.8 1.0 0 10 20 30 40 50 60 70 80 Classe 6 (f) Classe 6

Figura 4.16: Distribuzione di probabilità per ogni classe

4.6

Considerazioni

L’esperimento ha dato risultati molto simili a quello precedente. Si può quindi evincere che le BNN hanno un valore aggiunto, ovvero quello della valutazione dell’incertezza. Anche in questo caso si è dimostrato cle le NN classificano le istanze con label non presente nel

(58)

trai-50 Esperimenti

caso 100%). Le BNN hanno dimostrato, anche in questo caso, il loro valore aggiunto: la va-lutazione dell’incertezza. Come riportato in figura 4.16 le distribuzioni di proprietà indicano che la rete è incerta: le classi "2" e "4" hanno una distribuzione molto larga, ciò vuol dire che le reti allenate con il metodo montecarlo esprimono classificazioni contrastanti.

(59)

Capitolo 5

Conclusioni

Negli esempi visti, le reti normali non sono in grado di accorgersi che le istanze sono diverse da quelle viste in precedenza nel training set e quindi sbaglieranno. Le reti probabilistiche invece riescono a capire che le istanze sono "diverse" da quelle viste nel training set e che non hanno sufficienti informazioni per prevedere in modo accurato. Sono quindi in grado di identificare grazie alla valutazione dell’incertezza i casi critici da sottoporre a giudizio esterno.

(60)
(61)

Bibliografia

[1] Dipartimento Tecnologie Innovative SUPSI

http://progettistudio.dti.supsi.ch/index.php

[2] TensorFlow

https://www.tensorflow.org/

[3] TensorFlow Probability

https://www.tensorflow.org/probability

[4] Deep Learning with Python

[5] Learning Tensorflow A Guide to Building Deep Learning Systems [6] Latex https://www.latex-project.org/ [7] WeTransfer https://wetransfer.com [8] StackOverflow https://stackoverflow.com [9] AskUbuntu https://askubuntu.com [10] GitHub https://github.com/

Riferimenti

Documenti correlati

[r]

- nelle sole residenze sociosanitarie sono ospitate circa 12.000 persone (anziani, salute mentale, disabilità) e la tutela della loro qualità di vita deve essere

[r]

Oggetto: Assicurazione obbligatoria dei medici contro le malattie e le lesioni causate dall'azione dei raggi X e delle sostanze radioattive. Alcune Sedi dell'Istituto hanno

Comunque, al fine di evitare, per quanto possibile, errori nella indicazione del numero di codice fiscale sulle denunce stesse e quindi successive rettifiche, sarà

Per le posizioni assicurative istituite successivamente alla data della presente circolare l'addizionale 2,20 per mille dovrà essere richiesta unitamente al

Al 10 viene detto di consolarsi, in fondo e’ rimasto sempre un

- :l (A.T.R.) Alluvioni sciolte di rocce palcozoichc delle sponde occidcutu li della rossa tcuonica, sopra banchi sino a 40150 metri di spessore di argille plastiche bianche o grigie