Un percorso commentato per iniziare con il Machine Learning

Il Machine Learning si sta diffondendo sempre di più e, giorno dopo giorno, nuovi scienziati e ingegneri informatici iniziano il loro lungo salto in questo meraviglioso mondo. Purtroppo, il numero di teorie, algoritmi, applicazioni, documenti, libri, video e così via è così grande da disorientare chiunque non abbia un quadro chiaro di ciò che vuole/deve imparare per migliorare le proprie capacità.

In questo breve post, ho voluto condividere le mie esperienze, suggerendo un percorso fattibile per apprendere rapidamente i concetti essenziali ed essere pronti ad approfondire gli argomenti più complessi. Naturalmente, questa è solo una proposta personale: ogni studente può scegliere di dedicare maggiore attenzione ad alcuni argomenti più interessanti in base alla propria esperienza.

“Non vi preoccupate delle vostre difficoltà in matematica. Vi assicuro che le mie sono ancora maggiori”.

(A. Einstein)

Prerequisiti

L’apprendimento automatico si basa sulla matematica. Non si tratta di un approccio teorico opzionale, ma di un pilastro fondamentale che non può essere scartato. Se siete ingegneri informatici e lavorate quotidianamente con UML, ORM, Design Patterns e molti altri strumenti/tecniche di ingegneria del software, chiudete gli occhi e, per un secondo, dimenticate quasi tutto. Questo non significa che tutti questi concetti non siano importanti. Lo sono! Ma il Machine Learning ha bisogno di un approccio diverso. Uno dei motivi per cui Python è diventato sempre più popolare in questo campo è la sua “velocità di prototipazione”. Nel Machine Learning, un linguaggio che permetta di modellare un algoritmo con poche righe di codice (senza classi, interfacce e tutte le altre infrastrutture OO) è assolutamente indispensabile.

Il calcolo, la teoria della probabilità e l’algebra lineare sono competenze matematiche necessarie per quasi tutti gli algoritmi. Se avete già una buona preparazione matematica, potete saltare questa sezione, altrimenti è una buona idea rinfrescare alcuni concetti importanti. Considerando il numero di teorie, sconsiglio di iniziare con grandi manuali: anche se possono essere utilizzati per la ricerca di concetti particolari, all’inizio è meglio concentrarsi su un semplice sottoinsieme di argomenti. Ci sono molte buone risorse online (come Coursera, Khan Academy o Udacity, solo per citarne alcune) che adottano un approccio pragmatico adatto a qualsiasi background. Tuttavia, il mio suggerimento è quello di utilizzare un breve compendio, in cui vengono spiegati i concetti più importanti, e di proseguire con la ricerca e lo studio di nuovi elementi ogni volta che sono necessari. Non si tratta di un approccio molto sistematico, ma l’alternativa ha uno svantaggio drammatico: l’enorme quantità di concetti può scoraggiare e disorientare tutte le persone che non hanno una solida preparazione accademica.

Una “ricetta” di partenza accettabile può essere:

    • Teoria della probabilità
      • Variabili casuali discrete e continue
      • Distribuzioni principali (Bernoulli, Categorica, Binomiale, Normale, Esponenziale, Poisson, Beta, Gamma)
      • Momenti
      • Statistiche di Bayes
      • Correlazione e covarianza
    • Algebra lineare
      • Vettori e matrici
      • Il determinante di una matrice
      • Autovettori e autovalori
      • Fattorizzazione di matrici (come SVD)
    • Calcolo
      • Funzioni reali
      • Derivate, integrali
      • Principali metodi numerici

Ci sono molte risorse gratuite sul web, come ad esempio:

Anche Wikipedia è un’ottima risorsa, e molte formule, teorie e teoremi sono spiegati in modo chiaro e comprensibile.

Pubblicità della Macchina Parlante Intelligente sul Readers Digest di Novembre 1967, un antenato dei moderni sistemi di Machine Learning
Pubblicità della Macchina Parlante Intelligente sul Readers Digest di Novembre 1967

Una proposta di percorso di apprendimento automatico (per i principianti)

Ingegneria delle caratteristiche

Il primo passo per lanciarsi nel Machine Learning è capire come misurare e migliorare la qualità degli insiemi di dati. La gestione delle caratteristiche categoriche e mancanti, la normalizzazione e la riduzione della dimensionalità(PCA, ICA, NMF) sono tecniche fondamentali che possono migliorare notevolmente le prestazioni di ogni algoritmo. È utile anche per studiare come suddividere i dataset in insiemi di addestramento e di test e come adottare la validazione incrociata invece dei metodi di test classici.

Un buon tutorial sull’analisi delle componenti principali è:

Se siete interessati a come è possibile sfruttare l’apprendimento hebbiano per la PCA, ho pubblicato questi articoli:

Numpy: il re della matematica in Python!

Quando si lavora con Python, Numpy è molto più di una libreria. È la base di quasi tutte le implementazioni di apprendimento automatico ed è assolutamente necessario conoscerne il funzionamento, concentrando l’attenzione sui concetti di vettorizzazione e trasmissione. Grazie a queste tecniche, è possibile accelerare il processo di apprendimento della maggior parte degli algoritmi, sfruttando la potenza del multithreading e delle architetture SIMD e MIMD.

La documentazione ufficiale è completa, tuttavia suggerisco anche queste risorse:

Visualizzazione dei dati

Anche se non si tratta di un argomento prettamente di Machine Learning, è importante sapere come visualizzare le serie di dati. Matplotlib è probabilmente la soluzione più diffusa: è facile da usare e permette di tracciare diversi tipi di grafici. Alternative molto interessanti sono offerte da Bokeh e Seaborne. Non è necessario avere una conoscenza completa di tutti i pacchetti, ma è utile conoscere i punti di forza/debolezza di ciascuno di essi, in modo da poter scegliere il pacchetto giusto quando necessario.

Una buona risorsa per imparare i dettagli di Matplotlib è:

Regressione lineare

La regressione lineare è uno dei modelli più semplici e può essere studiata considerandola come un problema di ottimizzazione che può essere risolto minimizzando l’errore quadratico medio. Questo approccio è efficace, ma limita le possibilità che possono essere sfruttate. Suggerisco anche di studiarlo come un problema bayesiano, in cui i parametri sono rappresentati con probabilità precedenti (distribuite in modo gaussiano, per esempio) e l’ottimizzazione diventa un MLE (Maximum Likelihood Estimation). Anche se sembra più complesso, questo approccio offre una nuova visione condivisa da decine di altri modelli più complessi.

Un’introduzione molto utile alla statistica bayesiana è disponibile su Coursera:

Suggerisco anche questi libri:

Classificazione lineare

La regressione logistica è normalmente il miglior punto di partenza. È anche una buona occasione per studiare un po’ di teoria dell’informazione, per capire la potenza di concetti come entropia, cross-entropia e informazione reciproca (ho anche scritto il post: Algoritmi di ML addendum: L’informazione reciproca nei compiti di classificazione). L’entropia incrociata categoriale è la funzione di costo più stabile e diffusa nella classificazione dell’apprendimento profondo e una semplice regressione logistica può mostrare come possa accelerare il processo di apprendimento (rispetto all’errore quadratico medio). Un altro argomento importante è la regolarizzazione (in particolare, Ridge, Lasso ed ElasticNet). Troppe volte viene considerato un modo “esoterico” per migliorare l’accuratezza di un modello, ma il suo vero significato è molto più preciso e va compreso con alcuni esempi concreti. Suggerisco anche di iniziare a considerare una Regressione Logistica come una semplice rete neurale, visualizzando (per gli esempi 2D) come si muove il vettore dei pesi durante il processo di apprendimento.

Suggerisco di includere in questa sezione anche i metodi di ricerca a griglia iperparametrica. Invece di provare diversi valori senza una completa consapevolezza, la Grid Search permette di valutare le prestazioni di diversi insiemi di iperparametri. L’ingegnere può quindi concentrare la sua attenzione solo sulle combinazioni che producono la massima precisione.

Se siete interessati ad alcuni concetti importanti riguardanti l’Informazione Fisher, ho scritto questo post:

Macchine vettoriali di supporto

Le macchine a vettori di supporto offrono un approccio diverso alla classificazione (sia lineare che non lineare). L’algoritmo è molto semplice e può essere appreso da ogni studente con una conoscenza di base della geometria. Tuttavia, è molto utile capire come funzionano le kernel-SVM, perché la loro reale potenza si manifesta in compiti in cui i metodi lineari falliscono.

Alcune utili risorse gratuite:

Alberi decisionali

Un altro approccio alla classificazione e alla regressione è offerto dagli alberi decisionali. In generale, non sono la prima scelta per problemi molto complessi, ma offrono un approccio completamente diverso, che può essere facilmente compreso anche da persone non tecniche e può essere visualizzato durante riunioni o presentazioni ufficiali.

Un buon tutorial (facile) sugli alberi decisionali è:

Metriche di classificazione

Valutare le prestazioni di un classificatore può essere più difficile del previsto. L’accuratezza complessiva è una buona misura, ma spesso è necessario valutare il comportamento con falsi positivi e falsi negativi. Suggerisco di dedicare un po’ di tempo allo studio di precisione, richiamo, F-Score e curve ROC. Possono cambiare radicalmente il modo in cui un modello viene considerato accettabile o meno. Prestare attenzione al richiamo, che misura l’impatto dei falsi negativi sull’accuratezza. Avere una buona precisione, ma un cattivo richiamo significa che il modello sta generando molti falsi negativi (si pensi a questo in ambito medico). Il punteggio F(beta) è un buon compromesso tra precisione e richiamo.

La maggior parte degli algoritmi di classificazione lineare, SVM e le metriche di classificazione sono spiegate in:

Un rapido sguardo all’Apprendimento Ensemble

Dopo aver compreso la dinamica di un albero decisionale, è utile studiare metodi in cui insiemi (ensemble) di alberi vengono addestrati insieme per migliorare l’accuratezza complessiva. Random Forests, Gradient Tree Boosting e AdaBoost sono potenti algoritmi la cui complessità è ragionevolmente bassa. È interessante confrontare il processo di apprendimento di un albero semplice con quello adottato dai metodi boosting e bagging. Scikit-Learn fornisce le implementazioni più comuni, ma se volete sfruttare tutta la potenza di questi approcci, vi suggerisco di dedicare un po’ di tempo allo studio di XGBoost, un framework distribuito che può funzionare sia con CPU che con GPU, velocizzando il processo di addestramento anche con dataset molto grandi.

Due validi tutorial sull’Ensemble Learning sono:

Clustering

Quando si inizia con i metodi di clustering, a mio parere, la cosa migliore da fare è considerare l’algoritmo Gaussian Mixture (basato su EM, Expectation-Maximization). Anche se K-Means è molto più semplice (e deve essere studiato), le miscele gaussiane offrono un approccio bayesiano puro, utile per molti altri compiti simili. Altri algoritmi da studiare sono il clustering gerarchico, il clustering spettrale e DBSCAN. È utile anche comprendere l’idea dell’apprendimento basato sulle istanze studiando l’algoritmo k-Nearest Neighbors (che può essere adottato sia per compiti supervisionati che non supervisionati).

Una buona introduzione a KMeans è Introduzione al raggruppamento K-Means

Un’utile risorsa gratuita sulla clusterizzazione spettrale è:

Metriche di clustering

Le metriche di clustering sono un po’ più empiriche perché la loro semantica può cambiare a seconda del contesto. Tuttavia, suggerisco di studiare i diagrammi Silhouette e alcuni metodi di verità di base (come il punteggio Rand aggiustato). Possono fornire una visione completa della struttura del processo di clustering, mostrando tutte le situazioni in cui è probabilmente necessaria la regolazione degli iperparametri.

Una risorsa molto interessante sulla stabilità dei cluster è:

La maggior parte degli algoritmi e delle metriche di clustering sono esposti in:

Reti neurali per principianti

Le reti neurali sono la base del Deep Learning e dovrebbero essere studiate in un corso separato. Tuttavia, ritengo sia utile comprendere i concetti di Perceptron, Perceptron multistrato e algoritmo di retropropagazione. Scikit-Learn offre un’implementazione molto semplice delle reti neurali, tuttavia potrebbe essere una buona idea iniziare l’esplorazione di Keras, un framework di alto livello basato su Tensorflow, PyTorch o CNTK, che consente di modellare e addestrare reti neurali con uno sforzo iniziale minimo.

Alcune buone risorse per iniziare a lavorare con le reti neurali sono:

Il miglior libro sul Deep Learning (avanzato) disponibile sul mercato è probabilmente:

    • Goodfellow I., Bengio Y., Courville A., Deep Learning, The MIT Press

Inoltre, suggerisco di “giocare” con il Tensorflow Playground, dove è possibile simulare una rete neurale complessa, regolare i suoi parametri e osservare l’output risultante.


Path image copyright by TheRitters.


Se ti piace l’articolo, puoi sempre fare una donazione per supportare la mia attività. Basta un caffè!


 

Share this post on:
FacebookTwitterPinterestEmail