Articoli

Deep Learning Italia – Meetup Roma- Marzo-

– Cosa faremo
“Deep Learning Italia  torna a Roma con il Meetup itinerante. Venerdì 15 Marzo 2019, dalle ore 19.00 alle ore 21.00 – presso l’Hub di LVenture Group e LUISS EnLabs. Via Marsala 29h 00185. Terzo piano.

Si affronteranno temi legati esclusivamente alla progettazione e implementazione di Reti Neurali e il Deep Learning nell’ Intelligenza Artificiale di oggi.
Il Meetup di DLI nasce dall’esigenza di sopperire alla carenza di meetup tecnici sul Deep Learning in Italia mentre ormai se ne contano molteplici in altre città del mondo come Londra, Amsterdam e San Francisco. Il Meetup sarà orientato sia alla ricerca accademica e che al mondo delle startup.

Entrata totalmente gratuita.

La registrazione su eventbrite è obbligatoria!

https://www.eventbrite.it/e/biglietti-meetup-aperitech-di-deep-learning-italia-56046372208

Vi aspettiamo!!!

Scaletta Talks:

1) Matteo Testi- Founder Deep Learning Italia

“Introduzione alla piattaforma Deep Learning Italia”
Abstract: Illustrazione della community Deep Learning Italia e degli strumenti oggi sviluppati e a disposizione della community. Introduzione alle features del sito www.deeplearningitalia.com con il lancio dei nostri workshop e piattaforma di E-learning ad Aprile 2019.

2) Andrea Mercuri – Docente at Deep Learning Italia

Cosa è il reinforcement learning?”

Nel talk vengono introdotti gli aspetti fondamentali di questo paradigma di apprendimento e viene mostrato in dettaglio il caso di un agente che impara ad interagire con un ambiente molto semplice della libreria Gym di OpenAi utilizzando il metodo Montecarlo.

Guida alle architetture di reti profonde

Autrice: Joyce Xu

Traduttrice: Sabrina Sala

 

 

1

GoogLeNet, 2014

Negli ultimi anni, molto del progresso ottenuto nell’utilizzo del deep learning (apprendimento profondo) per la visione artificiale può essere ricondotto a un gruppo ristretto di architetture di reti neurali. Lasciando da parte la matematica, i codici e i dettagli dell’implementazione, in questo articolo intendiamo analizzare come questi modelli funzionino.

Al momento, Keras domina con sei di questi modelli pre-addestrati già inseriti all’interno della libreria.

  • VGG16
  • VGG19
  • ResNet50
  • Inception v3
  • Xception
  • MobileNet

Le reti VGG, insieme alla precedente AlexNet del 2012, segue lo schema archetipico delle reti convoluzionali classiche: una serie di convoluzioni, max-pooling, strati di attivazione e infine alcuni strati di classificazione completamente connessi. MobileNet è, essenzialmente, una versione semplificata dell’achitettura di Xception, ottimizzata per le applicazioni mobile. Tuttavia, sono stati i rimanenti tre modelli a ridefinire davvero il modo in cui attualmente guardiamo alle reti neurali. Questo articolo si focalizzerà quindi sull’intuizione avuta con le architetture di ResNet, Inception e Xception, e sul perché esse sino diventate il punto di riferimento per i successivi studi di visione artificiale.

ResNet

ResNet è nata da una semplice osservazione: “perché aggiungendo ulteriori strati a reti neurali profonde l’accuratezza non migliora ma, addirittura, peggiora?”

Intuitivamente, reti neurali più profonde non dovrebbero performare peggio di quelle poco profonde, o almeno non durante l’allenamento quando non vi è alcun rischio di overfitting. Prendiamo una rete di esempio con n strati che raggiungono una certa accuratezza. Come minimo, una rete con n+1 strati dovrebbe essere in grado di raggiungere lo stesso grado di accuratezza, copiando i primi n strati ed eseguendo un identity mapping per l’ultimo strato. Allo stesso modo, reti di n+2, n+3 e n+4 strati possono, con lo stesso metodo, ottenere la medesima accuratezza. Tuttavia, al crescere della profondità della rete questo non è sempre vero.

Gli sviluppatori di ResNet hanno ricondotto questo problema all’ipotesi che le mappature dirette sono difficili da allenare. Hanno così proposto un rimedio: a posto che cercare di apprendere da mappature sottostanti da x di H(x), è possibile invece apprendere la differenza tra i due, ovvero il “residuale” e, successivamente, aggiustare quest’ultimo all’input.

Poniamo che il residuale sia F(x)=H(x)-x. Ora la nostra rete cerca di apprendere da F(x)+x.

Ciò ha dato vita a ai famosi blocchi di ResNet (rete residuale):

 

2.jpg

ResNet block

 

Ogni “blocco” di ResNet consiste in una serie di strati e una identity mapping che aggiunge l’input del blocco al su output. Questa operazione di “addizione” viene fatta elemento per elemento. E nel caso in cui l’input e l’output siano di dimensioni differenti, possono essere utilizzate le tecniche di zero-padding o di proiezioni (attraverso convoluzioni 1×1) per creare dimensioni corrispondenti.

Ritornando alla nostra rete esempio, questo metodo può semplificare notevolmente la costruzione di strati di identità di cui è composta. È infatti molto più semplice imparare a spingere F(x) verso 0 e lasciare l’output come x. ResNet fornisce, quindi, agli strati un punto di riferimento x da cui apprendere, piuttosto che partire da zero da una trasformazione di identità.

Questa idea è davvero efficace nella pratica. Prima di questa, nelle reti neurali profonde si riscontrava un problema di annullamento del gradiente, la cui discesa, data dalla minimizzazione della funzione di errore, si riduce esponenzialmente attraverso la retropropagazione degli strati precedenti. In sostanza, la lunga strada attraverso gli strati precedenti rendeva i segni degli errori talmente piccoli da non permettere alla rete di apprendere. Ciò nonostante, grazie all’innovazione introdotta da ResNet, descritta sopra, possiamo ora costruire reti di innumerevoli strati (potenzialmente anche più di mille) che abbiano un elevato grado di accuratezza. Questo è stato un grande passo in avanti, considerato che il modello più profondo creato fino ad allora, era di 22 strati (vincitore della competizione ILSVRC del 2014).

Sono stati pubblicati molti articoli successivi sul deep learning (apprendimento profondo)  ma senza grandi miglioramenti. ResNet rimane, fondamentalmente, il modello che ha cambiato la nostra comprensione delle reti neurali e di come esse apprendano.

La rete di 1000+ strati è open source! La potete travare qui.

Inception

Se ResNet si concentra sulla profondità, Inception Family™ è invece focalizzata sull’estensione. In particolare, gli sviluppatori di Inception erano interessati all’efficienza computazionale dell’allenamento di reti più larghe. In altre parole: come possiamo aumentare la larghezza delle reti neurali senza eccedere la capacità computazionale di un elaboratore?

Il lavoro originario riguardava una componente nota con il nome di “Inception model”. Il cuore di questo modello, racchiudeva due elementi innovativi.

  1. La prima intuizione riguarda operazioni sugli strati. In una tradizionale CNN, ogni strato estrae informazioni dallo strato precedente al fine di trasformare i dati di origine in un differente tipo di informazione. L’output di una convoluzione 5×5 estrae caratteristiche differenti da quelle di un 3×3 o di un max-pooling e così via. Per ogni strato, come possiamo quindi intuire quale kernel fornisca informazioni più rilevanti?

Perché non lasciare quindi che sia il modello a scegliere?

Un modulo Inception elabora molteplici e differenti trasformazioni sugli stessi dati di input, in contemporanea, concatenando i risultati in un singolo output. In altre parole, ogni strato “Inception module” consiste in una convoluzione 5×5, una 3×3 e un max-pool.  È lasciato allo strato successivo la selezione delle features più rilevanti.

3

3

La maggiore densità di informazione dell’architettura di questo modello ha un problema rilevante: il drastico aumento della capacità computazionale necessaria. Non solo i filtri convoluzionali più larghi (es 5×5) sono impegnativi e onerosi da calcolare, ma anche la sovrapposizione di differenti filtri incrementa il numero di mappe delle caratteristiche per ogni strato. Ciò risulta un vero impedimento per il nostro modello.

Vediamola in un altro modo: per ogni filtri che aggiungiamo, dobbiamo eseguire una convoluzione su tutte le mappe di input per calcolare un singolo output. Nell’immagine sottostante vediamo come la creazione di una mappa di output da un singolo filtro implichi la computazione su ogni singola mappa degli strati precedenti.

4

Poniamo che vi siano M mappe di input.  Per ogni filtro aggiuntivo, dobbiamo farlo convolvere lungo tutte le M mappe di input; allo stesso modo, se abbiamo ulteriori N filtri, dovremmo farli convolvere lungo tutte le N*M mappe. In altre parole, “ogni aumento uniforme nel numero di [filtri] risulta in una aumento al quadrato della computazione”. Il nostro modulo Inception ha così triplicato o quadruplicato il numero di filtri. Dal punto di vista computazionale, è un vero guaio.

Ciò porta alla seconda intuizione: usare convoluzioni 1×1 per una riduzione della dimensionalità. Al fine di risolvere la difficoltà computazionale sopra descritta, gli sviluppatori di Inception hanno usato le convoluzioni 1×1 per “filtrare” la profondità degli output. Queste convoluzioni prendo in considerazione un valore alla volta, ma attraverso molteplici canali, e possono inoltre Estrarre informazioni spaziali e comprimerle in una dimensione minore. Per esempio, usando 2° filtri 1×1, un input di dimensione 64x64x100 (con 100 mappe delle caratteristiche) può essere compresso a 64x64x20. Riducendo il numero di mappe di input, gli sviluppatori sono stati in grado di sovrapporre parallelamente differenti trasformazioni di strati, con il risultato di avere reti che erano, al tempo stesso, profonde (avendo numerosi strati) e larghe (con operazioni parallele).

5

5

a) modulo Inception, prima versione b) modulo Inception con riduzione della dimensionalità

la prima versione di Inception, chiamata “GoogLeNet” è quella citata in precedenza da 22 strati che ha vinto la competizione ILSVRC del 2014. Inception v2 e v3, sviluppate un anno dopo, sono migliori rispetto alla versione precedente per diversi fattori: il più rilevante è il refactoring di convoluzioni larghe in altre più piccole e consecutive, che siano quindi più semplici da apprendere. Ad esempio nella Inception v3, la convoluzione 5×5 è stata sostituita da due convoluzione consecutive 3×3.

Inception è diventata rapidamente un riferimento per l’architettura dei modelli successivi. La sua ultima versione, la v4, aggiunge anche connessioni residuale tra ogni modulo, creando un ibrido tra Inception e ResNet. Ciò nonostane, il fattore più importante è che questo modello dimostra la forza di architetture “network-in-network” ben concepite, raggiungendo un nuovo livello nella legittimazione del potere delle reti neurali.

Da notare è che la ricerca sulle versioni successive v2 e v3 è stata pubblicata il giorno immediatamente successivo alla data di uscita della ricerca su ResNet.

Xception

Xception, “extreme inception”, a differenza delle precedenti architetture, ha mutato la nostra comprensione delle reti neurali, in particolare le reti convoluzionali. Come suggerisce il nome, porta il principio di Inception al suo estremo.

L’ipotesi è stata: “le correlazioni spaziali e quelle tra i canali (B/N, RGB) sono sufficientemente svincolati da rendere preferibile non mapparle insieme”

Ciò significa che in una CNN tradizionale, gli stati convoluzionali individuavano correlazioni tra spazio e profondità. Nell’immagine seguente possiamo rivederne il funzionamento.

4

Il filtro considera simultaneamente una dimensione spaziale (ogni quadrato colorato 2×2) e una cross-channel o dimensione di “profondità” (la pila di quattro quadrati). Allo strato di input di un’immagine, questo è l’equivalente di un filtro convoluzionale che esamina un gruppo di pixel 2×2 attraverso tutti i tre canali RGB. Quindi ci poniamo una domanda: che ragione abbiamo di considerare la regione di immagine e i canali simultaneamente?

 

6

Inception comincia a separare questi due elementi: grazie a convoluzioni 1×1 proietta l’input originale in molteplici spazi di input di dimensioni minori, e da ognuno di questi utilizza differenti filtri per trasformare quei piccoli blocchi tridimensionali di dati. Xception va anche oltre: piuttosto che dividere i dati di input in molteplici gruppi compressi, mappa separatamente per eseguire, successivamente, una convoluzione 1×1 in profondità per cogliere le correlazioni cross-channel. Questa operazione è conosciuta con il nome di “depthwise separable convolution” che consiste in una convoluzione spaziale (depthwise convolution) eseguita in modo indipendente per ogni canale, seguita da una convoluzione 1×1 (pointwise convolution) tra i canali. È quindi una ricerca di correlazioni dapprima in uno spazio bidimensionale e, successivamente, in uno spazio unidimensionale. Questa mappatura 2D+1D è più semplice da apprendere, rispetto a una completamente 3D.

 

Xception supera le prestazioni di Inception v3 sui dataset di ImageNet, e lo fa altrettanto bene con dataset per la classificazione di immagini di 17mila classi. In aggiunta, ha lo stesso numero di parametri di modello di Inception, permettendo così un’ottima efficienza. Nonostante Xception sia molto recente, la sua architettura è già entrata a far parte delle applicazioni di Google per la mobile vision, attraverso MobileNet.

Da notare è che lo sviluppatore di Xception, François Chollet, è anche l’autore di Keras.

Prospettive e applicazioni

La conoscenza di ResNet, Inception e Xception è diventata ormai sempre più importante, sia in ambito di ricerca che in quello aziendale. Un’applicazione interessante è il transfer learning, una tecnica del machine learning in cui vengono applicate conoscenze prese da una fonte (prendiamo in esempio un modello ResNet allenato) ad un dominio target . Ciò generalmente comprende due azioni: inizializzare un modello con pesi pre-istruiti da ResNet, Inception ecc, utilizzandolo sia per l’estrazione di caratteristiche, sia per l’ottimizzazione (fine-tuning) degli ultimi strati su un nuovo dataset. Attraverso il transfer learning questi modelli possono essere riutilizzati per qualsiasi operazione ad esso correlata, dal rilevamento di oggetti per veicoli a guida autonoma, alla creazione di didascalie e sottotitoli per registrazioni video.

Potete trovare una guida di Keras ai modelli di fine-tuning qui.

 

Reti Neurali Capsulari

Autore: Matteo Alberti

 

Le reti neurali convoluzionali ottengono grandi performance quando i dati in fase di test risultano esser molto simili a quelli utilizzati in fase di apprendimento ma, in caso di rotazioni, traslazioni o traasformazioni esse risultano soggette a scarsa capacità di generalizzazione. É commune prassi dunque andare a fornire al nostro training set attraverso data augmentation degli esempi di queste possibili variant ottenendo però l’effetto di far imparar mnemonicamente alla nostra rete (con la crescita computazionale legata alla maggior quantità di dati) piuttosto che aver un modello in grado di ben generalizzare una data situazione.

Negl’ultimi anni la ricerca nel campo della computer vision (per quanto riguarda il deep learning o  apprendimento profondo ) si è focalizzato sul come aumentare la profondità di una rete aggiungendo più strati (layers) al fine di reaggiungere un maggior grado di astrazione (partendo dai primi strati convoluzionali in grado di estrarre piccolo forme, angoli o intensità di colore andiamo mano a mano a ricombinare semplici feauter in disegni sempre più complessi)

Per far ciò, al fine di tener sotto controllo il numero di parametri (ed i relativi tempi computazionali) utilizziamo un operatore, commune in tutte le reti profonde, ossia il pooling ( per la precisione la sua versione max-pooling) che ci permette di andar a ridurre il numero di parametri riducendo progressivamente la componente spaziale selezionando I valori più alti andando però a perdere le informazioni spaziali legate alle features estratte.

1

 

Dunque la ricerca sulle architetture di reti neurali si sta progressivamente focalizzando sull’obiettivo di apprendere come generalizzare meglio piuttosto che sul fornire dati sempre più processati. Un primo passo è stato fatto con le reti neurali capsulari dove, il nostro obiettivo risulta esser quello di ottenere un’Equivarianza (invarianza a rototraslazioni) andando a sostituire quell’operatore di pooling con una nuova struttura: il Dynamic Routing

 

 

Introduzione

Una capsula è un gruppo di neuroni. L’attività di un vettore di una capsula rappresenta i parametri di istanziazione quando un oggetto (o parte di esso) viene rilevato dalla rete. La lunghezza di tale vettore rappresenta la probabilità di esistenza della data classe mentre l’orientamento del vettore codifica informazioni spaziali (per esempio rotazioni e traslazioni) all’interno di una matrice di Posa.

 

Matrice di Posa: Una matrice di posa è uno strumento utilizzato nel rendering grafico dove la costruzione di un’immagine parte da una rappresentazione gerarchica di forme geometriche. Nel nostro caso l’obiettivo risulta esser un po’ l’obiettivo opposto; decostruire un’immagine nelle sue componenti di base di cui andremo a salvare la relativa posizione in riferimento alle altre features.

 

2.jpg

Quando una capsula al livello inferiore si attiva produce una predizione al possibile nodo di appartenenza alle capsule di livello superiore attraverso una matrice di trasformazione. Se una capsula di alto livello riceve sufficienti predizioni di appartenenza diviene attiva. Questo processo, chiamato dynamic routing, permette di sostituire il max pooling attraverso una selezione “intelligente” delle features da mantenere durante la fase di allenamento.

 

3

Classificato come viso unicamente la figura a sinistra

 

 

Archiettura

 

La principale differenza nelle reti capsulari dunque consiste in un’architettura non profonda

4

Andiamo ad analizzare i principali strati:

  • Il primo layer convoluzionale (256 kernels, 9×9, stride uguale ad uno, attivazione ReLu)

Nel primo strato convoluzionale andiamo a convertire le intensità dei pixels in features di basso livello di cui non ci importa di mantener la relativa posizione spaziale, anzi vogliamo utilizzare tutte quelle importanti proprietà di condivisione dei parametri utili per ridurre i tempi computazionali.

Il secondo strato dunque riceve in input le features estratte tramite convoluzione:

  • PrimaryCaps consiste in due strati nascosti

Il primo strato corrisponde al processo di rendering inverso prima descritto

Il secondo strato contrariamente è convoluzionale (32 capsule 8 dimensionali) dove ogni capsula rappresenta una features estratta dunque tramite una convoluzione con 9×9 kernels e stride uguale a due.

L’output della PrimaryCaps consiste dunque in 32x6x6 capsule 8 dimensionali.

  • DigitCaps

L’ultimo strato va a riprodurre in forma vettoriale quello che nelle reti convoluzionali faceva FC-Layer ossia andiamo a ridurre il numero di neuroni (in questo caso di capsule) fino ad ottenerne uno per ogni classe del target

 

Riassumendo le principali innovazioni:

  • Rimpiazzare i neuroni con le capsule
  • Sostituzione del max-pooling con il dynamic routing
  • Nuova funzione di attivazione
  • Architettura non profonda

 

 

Funzione di attivazione

 

Come introdotto precedentemente vogliamo che l’activity vector prodotto da una capsula rappresenti la probabilità di esistenza della data feature. Necessitiamo quindi di una nuova funzione di attivazione che non vada più a lavorare con scalari ma con vettori:

.

La seguente funzione, definita “squashing” non fa altro che normalizzare in nostro vettore fra zero ed uno mantenendo invariato l’orientamento del vettore stesso.

Questo ci permette non solo l’Equivarianza ma, nel caso di face-detection, per esempio, possiamo saper se e di quanti gradi il viso risulti ruotato.

5

Dynamic Routing

 

Dynamic Routing non è solo un max-pooling che seleziona il numero di connessioni in maniera più intelligente, esso ci permette di preservare, come descritto in precedenza, la “gerarchia fra le parti”

 

Il Dynamic Routing quindi è un processo iterativo, nella fase di forward, che connette capsule con attività simili

 

2.jpg 1

In ogni iterazione ogni capsula produce una matrice di moltiplicazioni con l’output delle capsule precedenti andando a selezionare unicamente quelle con prodotto scalare maggiore ed orientamento simile, andando ad analizzare:

 

5 1

 

1) Capsule a livello l ed il loro output  , r numero di iterazioni del routing

2)  coefficiente temporaneo necessario per iterazione inizializzato a zero

4)  è peso per capsule di «basso livello», utilizzo del softmax per ottenere uno scalare non negativo con somma ad uno.  Prima iterazione  è uguale per tutte le capsule essendo inizializzato da

5) Per ogni capsula di «alto livello» calcoliamo una combinazione lineare dei dati di input pesati con i coefficienti  ossia andiamo a sommarli e ridimensionarli

6) Applichiamo la funzione di squash per «normalizzare» ad 1 e preservar l’orientamento del vettore

 

 

Allenamento di una rete capsulare

 

Una volta fissato il forward pass attraverso il dynamic routing andiamo ad allenare la nostra rete attraverso una doppia funzione di perdita.

  • La prima parte viene allenata attraverso backpropagation come nelle classiche CNN dunque alleniamo i pesi in modo da massimizzare la norma della capsula relativa alla classe di target (L^i _\mu)
  • Un’altra versione della rete utilizza un’MLP (come Autoencoding) al fine di ricostruire l’immagine di input (L^i _p)

La nostra funzione di perdita sarà dunque data da Loss Funcion =  L^i = L^i_\mu + \rho L^i_p

Dove il termine p non è altro che un termine di penalizzazione al fine di non far incidere eccessivamente la seconda parte.

 

2.jpg 2

 

Questo funzione di autoencoding risulta possibile in quanto all’interno di ogni capsula finale (una per ogni classe del target) sono codificate tutte le informazioni per ricostruire l’immagine. Dunque possiamo creare una sorta di funzione discriminativa che vada a comparare i dati di input con il terget ricostruito mediante le informazioni delle matrice di posa)

 

Accuratezze raggiunte

1 1

 

Oltre alla classica Accuratezza, risulta interessante andare a valutare le proprietà intrinseche di questo modello:

Parametri CNN : 35.4 M (Deep)

Parametri Capsnet (8.2 M)

 

Il numero di parametric risulta sensibilmente minore grazie alla minor quantità di dati. Esso però diverge molto con large-dataset in quant il meccanismo non risulta ancora ottimizzato

 

Robustezza alle Trasformazioni Affini:

CNN 66%

CapsuleNet 79%

 

Alta capacità discriminatoria su oggetti sovrapposti:

 

2.jpg 3

 

Grazie alla sua capacità di ricostruzione possiamo non solo classificare ma segmentare oggetti anche sovrapposti (uno dei grandi limiti delle reti neurali convoluzionali)

 

Capsule Networks – Daniele D’Armiento

Daniele D’Armiento – Physicist presso Samsung
“Analisi di una rete neurale capsulare nella Computer Vision”
L’attuale stato dell’arte per la classificazione d’immagini, introdotte nell’ottobre 2017, sta aprendo nuove strade inesplorate nel mondo del Deep Learning (apprendimento profondo) non più basate sull’ormai comune prassi di aumentare la profondità della rete o aumentare i dati a nostra disposizione per raggiungere performance migliori ma contrariamente su una struttura capsulare ed un processo definito “routing-by-agreement” in grado di superare la perdita delle informazioni spaziali delle reti convoluzionali ed al tempo stesso di ottenere simil-analoghe performance con una quantità di dati inferiore.

Introduzione al calcolo delle Derivate

Autore: Davide Coppola

 

 

Sebbene a volte venga trascurata, la matematica è una parte fondamentale del machine learning  (ML o apprendimento automatico) e del deep learning (DL o  apprendimento profondo )   . Infatti, è la base su cui si fondano entrambe le discipline: senza nozioni di algebra o di analisi non potrebbero esistere. Un elemento chiave nel ML, proveniente dall’analisi matematica, è la nozione di derivata. Ma non devi averne paura; è molto più semplice di quanto tu possa pensare!

Per prima cosa, definiamo cos’è una funzione: può  essere pensata come una scatola nera (Fig. 1): un numero  di valori di input variabili indipendenti entra nella scatola, vengono processati secondo una procedura specifica determinata dall’equazione (o equazioni) che descrivono la funzione, e infine  nuovi valori di outputvariabili dipendenti escono dalla scatola.

Fig. 1: Qualsiasi funzione può essere vista come una scatola nera in cui le variabili indipendenti entrano e ottengono un nuovo valore.

Per il resto di questo tutorial, ci concentreremo su funzioni unidimensionali, ossia funzioni che hanno un solo input e un  solo output. Esempi comuni di questo tipo di funzioni sono:

y = mx + q

y = ax^2 + bx + c

y = ln(x()

Dove m, q, a, c sono solamente coefficienti numerici, puoi considerarli come un qualsiasi numero costante. 1 è l’equazione di una retta, 2 descrive una parabola e 3 è la funzione logaritmo naturale. Come puoi vedere, tutte hanno una variabile indipendente () e una dipendente (): una funzione descrive la relazione che c’è tra le due variabili, pertanto ne determina la “forma” nello spazio.

Ma se una funzione già descrive una curva, allora perché c’è bisogno delle derivate?

In generale, le funzioni non sono così semplici come gli esempi visti sopra e potrebbe essere impossibile o poco pratico provare tutti i possibili valori della variabile indipendente per capire il comportamento della funzione. Quindi, la derivata di una funzione dà informazioni aggiuntive sulla curva che si sta studiando.

 

Cos’è un derivata allora? La derivata di una funzione  è un’altra funzione , ricavata dall’originale, che descrive la variabilità di , ossia come il tasso di cambiamento della funzione si comporta rispetto alla variabile indipendente. La derivata valutata in un punto  descrive come la funzione sta cambiando in un intorno di . Ad esempio, se la derivata è positiva ci possiamo aspettare che che i punti che seguono  abbiano valori maggiori di . Questo significa che la funzione sta crescendo concordemente con l’aumento di . Allo stesso modo, se la derivata è negativa in , il valore della funzione diminuisce all’aumentare di . Pertanto, la derivata in un qualsiasi punto indica l’inclinazione della retta tangente alla curva in quel punto.

 

L’inclinazione (o coefficiente angolare) definisce il rapporto tra l’altezza e la lunghezza orizzontale, ad esempio, di un piano inclinato o di un triangolo rettangolo; avrai sicuramente incontrato questo concetto nei segnali stradali (Fig. 3). In generale, l’inclinazione è data dall’equazione 

Fig. 3: Segnaletica stradale che indica l’inclinazione della strada.

La definizione rigorosa di un derivata, infatti, è il limite del rapporto incrementale:

Questo rapporto descrive l’inclinazione di una retta secante alla curva passante per i punti  e  . Infatti, il numeratore  può essere visto come l’altezza di un piano inclinato, la cui lunghezza orizzontale è proprio  . Il limite dice che  dev’essere un numero infinitamente vicino a zero, il che significa che la distanza tra due punti diventa praticamente inesistente. Di fatto, quella che inizialmente era una secante diventa una tangente alla curava, come esplicato dall’animazione in Fig. 4.

Fig. 4: Quando la distanza tra i due punti diventa zero, i punti di sovrappongono e la retta secante diventa una tangente alla curva.

E’ bene tenere a mente che ci sono dei casi particolari in cui la derivata non può essere definita in uno o più punti della funzione; la funzione deve essere continua nel punto in esame, sebbene la continuità da sola non sia sufficiente affinché esista una derivata.

Prima di guardare un semplice esempio, ricapitoliamo i concetti chiave; la derivata…

  • … rappresenta la variabilità della funzione primitiva rispetto alla variabile indipendente;
  • … di una funzione è una funzione a sua volta;
  • … valutata in un dato punto, rappresenta l’inclinazione della tangente alla curva in quel punto.

Fig. 5: Una parabola e la sua derivata. Le rette di colore verde e blu sono le tangenti alla curva nei punti x=-2 e x=2, rispettivamente.

Nell’esempio (Fig. 5) abbiamo i grafici di una funzione (f) e la sua derivata (f’): la prima è una parabola, mentre la seconda è una retta. Le funzioni e le loro derivate sono generalmente rappresentate con i rispettivi grafici uno sopra l’altro; questo è perché la variabile indipendente è la stessa e questa disposizione rende più semplice capire la loro relazione.

Guardando a x<0, si può vedere che la derivata è positiva, che significa che la funzione sta crescendo con , ossia l’inclinazione di qualsiasi retta tangente a f per x<0 è positiva. Tuttavia, il valore della derivata sta diminuendo con un tasso costante, questo significa che anche la “velocità” di crescita del valore di f sta diminuendo. Di conseguenza, le rette tangenti alla curva tendono più e più ad una retta orizzontale.

La situazione estrema accade per x=0 , che corrisponde all’apice della parabola e al punto di in cui la derivata è 0 . I punti che hanno la derivata pari a  sono detti punti critici punti stazionari. Hanno un ruolo fondamentale sia nell’analisi matematica che nel ML, in quanto rappresentano i punti che corrispondono ai massimi, minimi e punti di sella di una funzione. Molti algoritmi di machine learning ruotano attorno alla ricerca dei minimi di una funzione, motivo per cui è importante avere una minima comprensione delle derivate e del loro significato.

Con x>0 , la derivata è negativa ed il suo valore assoluto continua a crescere. Questo significa che la funzione primitiva decrescerà in valore con x e che la “velocità” con cui ciò accade crescerà ad ogni passo. Di fatto, questo è esattamente ciò che accade alla parabola.

Lo scopo di questo tutorial era di darvi una comprensione generale di come funziona una derivata e del suo significato, senza utilizzare troppe equazioni. Ovviamente, un’analisi più approfondita e rigorosa dell’argomento è necessaria se si vuole pienamente comprendere questioni più complesse che emergono nel machine learning  (Apprendimento Automatico).  Ma non esserne spaventato, non è poi così complicato!

Le Fig. 2,3 and 4 sono state prese da Wikipedia.

 

Metodi Lineari per la Riduzione della Dimensionalità: Analisi delle Componenti Principali

Autore: Matteo Alberti

 

 

Fra le metodologie per la riduzione lineare della dimensionalità le PCA o Componenti Principali sono certamente fra gli strumenti principe dello Statistical Machine Learning ( Apprendimento Automatico) .

Sebbene vi si concentri molto spesso su strumenti in grado di catturare la componente non lineare l’analisi delle componenti principali risulta esser la base di partenza per molte analisi (e come strumento di preprocessing) e la loro conoscenza diventa improrogabile nel caso in cui le condizioni sulla linearità risultano soddisfatte.

In questo tutorial andremo ad introdurre a livello matematico la formazione delle componenti principali in maniera chiara e coincisa, la loro implentazione in python ma soprattutto la loro interpretazione

 

“L’idea alla base è quella di trovar un sistema di riferimento tale che la varianza delle variabili rappresentate ne risulti massimizzata”

 

Ciò avviene dividendo la varianza totale in un numero uguale di variabili di partenza dove però sarà possibile ridurre il numero in base al contributo che ciascuna PC fornisce nella costruzione della nostra varianza totale.

Vogliamo ricordare che l’applicazione della Principal Component Analysis risulta utile quando le variabili di partenza non risultano esser indipendenti

Vediamo di introdurle con il corretto formalismo matematico:

 

Dato un insieme di p variabili quantitative  X1,X2, . . . , Xp (variabili centrate o standardizzate) vogliamo determinare un nuovo insieme di k variabili t.c  k≤p indicate con Ys (s=1,2,…k)  che godano delle seguenti proprietà:

 

Per costruzione le nostre PC sono incorrelate, a media nulla e che riproducano (in ordine crescente la maggior quota di varianza possibile.

Ne risulta che la combinazione lineare sarà:

Dobbiamo quindi trovare dei coefficienti v t.c soddisfino le nostre proprietà. Si tratta di un problema di massimo vincolato dove il primo vincolo è detto di Normalizzazione:

Il nostro sistema diventa cosi:

Dove la prima equazione risulta esser la nostra funzione obiettivo mentre la seconda il nostro primo vincolo.

E si risolve tramite il Metodo dei moltiplicatori di Lagrange:

Calcolo del gradiente di Le del suo annullamento ottenendone:

Ne risulta un sistema lineare omogeneo.

ammette infinite soluzioni (che rispettano il vincolo) abbassando il rango della matrice dei coefficienti del sistema:

che corrispondono a λs dette Autovalori di ∑.

Analogamente per la costruzione della seconda PCA (e cosi per tutte le altre) subentra al nostro sistema il Vincolo di Ortogonalità, dato dalla nostra richiesta che le PC siano incorrelate, esprimibile nel seguente modo:

Quindi impostando la lagrangiana in p+2 variabili otteniamo:

Da cui otteniamo il secondo autovalore Y2  dove ricordiamo vale la seguente proprietà:

Proprietà delle PC:

 

Ogni autovalore di ∑ ha un ruolo nella varianza della rispettiva PC

semidefinite positiva

Varianza Totale

Varianza Generalizzata

 

CRITERI DI SCELTA:

Per la scelta del numero k (con k<p) di PC da mantenere in analisi non esiste un criterio universalmente accettato e valido. Risulta di buona prassi dunque utilizzarli congiuntamente e tener sempre in riferimento le necessità dell’analisi.

Vogliamo esporre i principali:

(1)

                                                                                   

Misura assoluta                Normalizzazione varianza spiegata                  % cumulata

 

(2)

Screen-Plot

Vengono selezionate la prime k PC in base  alla riduzione della pendenza (anche detto criterio del gomito). In questo caso specifico le PC da mantenere in analisi sarebbero le prime due.

 

(3)

Criterio di Kaiser

Anche noto come il criterio dell’autovalore maggiore di 1 (valido unicamente per variabili standardizzate)

 

 

Andiamo a questo punto ad implementare le nostre PCA:

Importiamo i pacchetti necessari da scikit-learn

 

import numpy as np

from sklearn.decomposition import PCA

La classe presenta i seguenti attributi:

Sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

Andiamo a testarlo su nuovi dati reali, prediamo per esempio sui dati Wine importabili attraverso il comandoAndiamo a commentare i parametri principali:
• n_components= numero di component da tenere in analisi. Consigliamo in una fase di scelta di non settare questo valore e di valutare in base ai criteri sopra esposti
• svd_solver= ci mette a disposizione alcune fra le principali alternative (arpack, randomized..) vogliamo ricordare che PCA non supporta sparse data (per il quale occorrerà caricare TruncatedSVD)

from sklearn import datasets

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

from sklearn import decomposition

A questo punto andiamo ad implementare PCA ed a farne un plot

np.random.seed(123)
wine = datasets.load_wine()

X = wine.data

y = wine.target



fig = plt.figure(1, figsize=(5, 4))

plt.clf()

ax = Axes3D(fig, rect=[1, 0, 1, 0.9], elev=30, azim=222)



plt.cla()

pca = decomposition.PCA(n_components=None)

pca.fit(X)

X = pca.transform(X)





for name, label in [('Setosa', 0), ('Versicolour', 1), ('Virginica', 2)]:

ax.text3D(X[y == label, 0].mean(),

X[y == label, 1].mean() + 1.5,

X[y == label, 2].mean(), name,

bbox=dict(alpha=.5, edgecolor='b', facecolor='w'))

# Reorder the labels to have colors matching the cluster results

y = np.choose(y, [1, 2, 0]).astype(np.float)

ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.spectral,

edgecolor='r')



ax.w_xaxis.set_ticklabels([])

ax.w_yaxis.set_ticklabels([])

ax.w_zaxis.set_ticklabels([])



plt.show()

Questo sarà il grafico che andremo ad ottenere: