Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Gradient Descent
Voglio imparare i parametri in modo da massimizzare la likelihood o minimizzare la negative binary cross entropy. Per fare questo ho bisogno di usare il gradient descent.
Il Gradient Descent è un metodo iterativo che migliora i parametri attraverso il gradiente. Siccome abbiamo un input e output multi-dimensionali, dobbiamo calcolare il Jacobiano, cioè il vettore (matrice in generale) delle derivate parziali.
Nel caso generale abbiamo un vettore di parametri per ogni funzione, quindi una matrice. Nel caso binario è la derivata della Loss function rispetto ai parametri uno alla volta.
Considero solo funzioni convesse, il Gradient Descent è un algoritmo di ottimizzazione iterativo usato per trovare il minimo di una funzione in un numero finito di step (la funzione ha un'unica soluzione).
L'idea
è di partire da un punto della funzione e seguire la direzione del gradiente nel verso negativo, esso infatti è un vettore tangente alla superficie, che punta verso il minimo. Data una funzione generica il gradient descent update mi dà una regola che cambia iterativamente i parametri muovendomi verso la direzione del minimo della funzione: Inizio con un set random di parametri e li cambio in base alla direzione del gradiente del set di parametri che sto considerando. Nella formula c'è l'iperparametro detto learning rate. Esso mi dà la grandezza dello step che sto seguendo nella direzione negativa del gradiente. Se è troppo piccolo mi porterà ad una convergenza molto lenta in troppe iterazioni. Se è troppo grande l'ottimizzatore può andare in overshoot (eccedere) o anche divergere. Se ho una funzione convessa, il gradient descent convergerà nel minimo globale. Ci sarà un unico punto in cui lagradiente è 0 e mi fermo. Se ho una funzione non-convessa, esso potrebbe convergere nel minimo locale. - Ci saranno diversi punti in cui il gradiente è molto vicino a 0. Se con le stesse righe di codice riesco a trovare un minimo locale migliore, allora avrò un neural network che funziona meglio. Machine Learning and DL Pagina 18 network che funziona meglio. Anche se una funzione è convessa, mettendola nel computer essa non sarà convessa perché il computer lavora solo con numeri discreti, non continui. Esso calcola la versione discreta della derivata e quindi ottengo un vettore approssimato che punterà al minimo. Nel caso della logistic regression, usiamo il gradient descent per minimizzare una cost function (detta anche loss function), nel nostro caso la cross entropy (o massimizzare la likelihood), iterativamente un parametro alla volta. Mi fermo quando ho gradiente nullo oppure quando il valore della cross entropy o della likelihood rimane.costante.Stochastic Gradient DescentCi sono tre strategie per applicare il gradient descent in un problema di classificazione:
- Batch Gradient Descent: ad ogni step valuto la mia funzione per tutti i punti del dataset.
- Passo nel dataset, faccio il gradiente per tutti i punti, faccio la media della direzione del gradiente e la uso per cambiare i parametri.
- Minibatch Gradient Descent: se non voglio andare su tutto il dataset, ma solo su una parte,
- scelgo punti e ad ogni step considero un gruppo random di punti.
- Stochastic Gradient Descent: caso estremo, considero un singolo elemento.
- Prendo un punto, faccio il gradiente e applico l'update ad ogni step.
La versione Batch ha come pro che ho un confronto di tutto il dataset e vado contro la "sfiga" di trovare pochi punti che puntano al minimo, infatti la maggior parte dei punti punterà verso il minimo e avrò un classificatore più robusto. Con lo Stochastic potrei essere sfortunato e trovare un punto che ha un
gradiente nella direzione sbagliata. Esistono ottimizzatori avanzati che permettono di cambiare durante il training.
Trade-Offs
- Velocità: la LR è più veloce di NB e LDA, ma il training time della LR è più alto delle altre.
- Storage: il numero dei parametri dipende dal numero delle classi e dalla dimensione dell'input. Ho bisogno di memorizzare parametri. È più basso di LDA, perché LDA ha bisogno di memorizzare la covariance matrix.
- Interpretabilità: molto interpretabile, perché ho un prodotto lineare tra parametri e input, guardo i parametri e le componenti del vettore dei parametri, quelle con score più alto sono collegate con le features che sono più importanti per il mio problema.
- Accuracy: se il numero di features aumenta, l'accuracy della LR è migliore della LDA, perché la gaussiana multivariata quando il numero di features aumenta molto è difficile da computare.
Il fatto della covariance matrix e poi la distribuzione potrebbe non essere più gaussiana. Con pochi dati si comporta peggio della KNN e non-linear decision boundaries. Machine Learning and DL Pagina 19
SVM (Support-Vector Machines)
mercoledì 9 ottobre 2019 10:34
Support Vector Machines è un classificatore discriminativo lineare, perché la relazione fra i parametri el'input vector è lineare, infatti è un prodotto scalare. In seguito vedremo che può essere generalizzato al caso non lineare usando il Kernel trick.
Consideriamo un classificatore lineare, ad esempio una retta:
Se sostituiamo i valori nell'equazione mettendo dei numeri, possiamo sapere se il punto si trova sopra, sotto o sulla linea:
Vogliamo sapere se c'è solo una retta che è quella ottima o se esistono diverse rette che mi classificano i punti in perfetto modo. In realtà ce ne sono diverse che mi classificano i punti in modo ottimale.
Con la SVM
Voglio trovare tra le rette, quella che mi massimizza la distanza tra i punti e la retta.
La retta ottima è quella che ha la maggiore distanza dal punto più vicino.
La distanza di un punto dalla retta in forma vettoriale è:
Voglio trovare la retta che mi massimizza
In particolare, sono interessato ai punti molto vicini alla retta e non a cambiare l'inclinazione (slope) della retta, attraverso parametri.
Quindi voglio risolvere due problemi:
- Classificare tutti i punti nel modo corretto.
- Massimizzare la distanza dei punti più vicini alla retta.
Considero un dataset e due classi.
Detto il margine, cioè il doppio della distanza, vogliamo che l'equazione della retta sia maggiore o uguale alla metà del margine, ovvero che il punto si trovi almeno a distanza dalla retta.
Se allora
Se allora
Posso mettere le due equazioni insieme in questo modo:
Non conosco , ma mi interessa solo massimizzarlo.
Per tutti i punti
che hanno distanza dal boundary la disequazione diventa un uguaglianza e questi punti sono detti Support Vectors (ci servono a massimizzare il margine del classificatore). Questa distanza la chiamo margin e ricordando la definizione di margin ottengo: Siccome è una quantità sconosciuta, posso dividere tutte le componenti di w per ||w|| senza cambiare la quantità di margin, ma solo il modulo. Questo perché, ad esempio, se prendo una retta e divido tutti i coefficienti per una costante, la retta resterà la stessa. Quindi assorbendo ||w|| in b, questi ultimi diventeranno dei coefficienti divisi da una costante. Posso scrivere l'espressione del margine: Voglio trovare il set di parametri che massimizza il margine e allo stesso tempo voglio che sia soddisfatta per ogni punto del mio dataset, cioè che sto assegnando le label giuste ai miei punti. Quindi l'obiettivo del SVM è di avere allo stesso tempo: Maximization formula: Oppure equivalentemente MinimizationLa seconda viene detta Quadratic Programming Problem, cioè voglio minimizzare la quantità della prima riga soggetta alle condizioni (constraint) della seconda riga, una per ogni elemento.
Constrained Optimization Problem
Il Constrained Optimization Problem consiste nell'avere un problema di minimizzazione, soggetto a constraints (vincoli) positivi. Nella forma generale:
Machine Learning and DL Pagina 21
Nel caso della SVM:
La Lagrangiana è la funzione originale meno la somma degli per i constraints, con l'ipotesi che gli devono essere maggiori o uguali di 0:
Possiamo
avere due casi:- Se per x abbiamo che f'(x) = 0, allora x si dice che il constraint è inattivo. La soluzione sarà un tale che f(x) = 0.
- Se per x abbiamo che f'(x) ≠ 0, allora x si dice che il constraint è attivo. La soluzione sarà un tale che f(x) = 0.
Derivata della Lagrangiana uguale a 0
Queste condizioni sono necessarie per l'esistenza di un'unica soluzione, ma non sono sufficienti.
cioè può esserci una soluzione, ma non sono sicuro che questa sia quella ottimale. Se almeno una condizione non è verificata, allora non può esserci una soluzione. Queste condizioni diventano sufficienti solo nel caso in cui i constraint sono funzioni affini cioè lineari (affine functions, es. retta, piano...). Nel nostro caso i constraint sono sempre funzioni affini perché sono dei prodotti scalari tra i parametri e . Quindi nel caso in cui sono funzioni affini, è convessa ed e sono continuously differentiable (esiste la derivata prima ed è continua), allora esiste un'unica soluzione che soddisfa le KKT, che diventano necessarie e sufficienti.
Linear SVM Separable Case
Considerando il Constrained Optimization Problem per l'SVM abbiamo:
Con un dataset di elementi, la Lagrangiana e le condizioni diventano:
Machine Learning and DL Pagina 22
Se faccio le derivate di rispetto a e e le pongo uguali a 0 (prima condizione KKT), considerando,