7 Lezioni dal Corso di Deep Learning di Fast.AI

7 Lezioni Fast.AI Corso Deep Learning

Foto di Sincerely Media su Unsplash

Recentemente ho completato il corso di Deep Learning pratico di Fast.AI. Ho frequentato molti corsi di Machine Learning in passato, quindi posso fare dei confronti. Questo è sicuramente uno dei più pratici e ispiratori. Quindi, vorrei condividere con voi le mie principali conclusioni.

Riguardo al corso

Il corso Fast.AI è guidato da Jeremy Howard, un ricercatore fondatore di Fast.AI. In passato era anche il primo nella classifica di Kaggle. Quindi puoi sicuramente fidarti della sua competenza in Machine Learning e Deep Learning.

Il corso copre le basi del Deep Learning e delle Reti Neurali e spiega anche gli algoritmi degli Alberi Decisionali. La versione attuale è del 2022, quindi suppongo che i contenuti siano cambiati rispetto alle recensioni precedenti su TDS.

Questo corso è progettato per persone con una certa esperienza di programmazione. Nella maggior parte dei casi vengono utilizzati esempi di codice anziché formule. Devo confessare che per me è più facile capire il codice dopo averlo scritto per anni, anche se ho una laurea magistrale in Matematica.

Un’altra caratteristica interessante di questo corso è l’approccio top-down. Si parte con un modello di Machine Learning funzionante. Ad esempio, ho creato la mia prima app basata su Deep Learning durante la seconda settimana del corso. È un classificatore di immagini che può riconoscere le mie razze di cani preferite. Successivamente, nelle settimane successive, si approfondisce e si comprende come funziona tutto.

Passiamo ora alle mie principali conclusioni da questo corso.

Lezione n. 1: Matematica necessaria per comprendere il Deep Learning

Iniziamo con qualcosa di semplice. Prometto che le conclusioni seguenti saranno meno banali.

Credo sia importante parlarne perché molte persone sono intimidite dal Deep Learning. Il DL è considerato una scienza complicata, ma si basa su pochi concetti matematici che potresti imparare in un giorno.

Una Rete Neurale è una combinazione di funzioni lineari e attivazioni. Ecco una funzione lineare.

Dato che una combinazione di funzioni lineari è ancora lineare, abbiamo bisogno di attivazioni che aggiungano non linearità.

La funzione di attivazione più comune è ReLU (Rectified Linear Unit). Può sembrare spaventosa, ma in realtà è solo una funzione come questa.

Puoi pensarla come una barriera che i segnali devono superare. Se un segnale è al di sotto della soglia (0 nel nostro caso), le sue informazioni non passeranno al livello successivo della Rete Neurale.

Grafico dell'autore

Alcuni altri concetti matematici utilizzati:

  • SGD (Stochastic Gradient Descent) – un approccio di ottimizzazione basato sul calcolo del gradiente. Puoi leggere un articolo per avere una comprensione generale di come funziona.
  • Moltiplicazione di matrici aiuta a eseguire calcoli più rapidamente in batch. C’è anche un ottimo articolo a riguardo.

Se desideri imparare tutti i dettagli, consulta la lezione sulle fondamenta delle reti neurali del corso Fast.AI.

Lezione n. 2: Come pulire i tuoi dati

Siamo abituati a iniziare l’analisi pulendo i dati. Abbiamo tutti sentito il mantra “spazzatura dentro – spazzatura fuori” molte volte. Sorprendentemente, addestrare un modello semplice e poi usarlo per pulire i tuoi dati potrebbe essere più efficace.

Puoi addestrare un modello semplice e poi osservare i casi con la perdita più alta per individuare eventuali problemi. Nel mio articolo precedente, questo approccio mi ha aiutato a individuare immagini con etichette errate.

Foto di Benjamin Vang su Unsplash | Foto di Xennie Moore su Unsplash | Foto di Alvan Nee su Unsplash

Crea la tua prima applicazione di Deep Learning in meno di un’ora

Deploy di un Modello di Classificazione delle Immagini utilizzando HuggingFace Spaces e Gradio

towardsdatascience.com

Lezione n. 3: Come scegliere un modello di Visione Artificiale

Oggi esistono molti modelli pre-addestrati. Ad esempio, PyTorch Image Models (timm) ha 1.242 modelli.

import timmpretrained_models = timm.list_models(pretrained=True)print(len(pretrained_models))print(pretrained_models[:5])1242['bat_resnext26ts.ch_in1k', 'beit_base_patch16_224.in22k_ft_in22k', 'beit_base_patch16_224.in22k_ft_in22k_in1k', 'beit_base_patch16_384.in22k_ft_in22k_in1k', 'beit_large_patch16_224.in22k_ft_in22k']

Come principiante, ci si sente spesso bloccati di fronte a molte opzioni. Per fortuna, esiste uno strumento utile per scegliere l’architettura di Deep Learning.

Questo grafico mostra la relazione tra il tempo di inferenza (quanto tempo impiega per elaborare un’immagine) e l’accuratezza su ImageNet.

Immagine da Kaggle Notebook, fonte

Come ci si potrebbe aspettare, c’è un compromesso tra velocità e accuratezza, quindi è necessario decidere quale è più importante. Dipende molto dal tuo compito. Hai bisogno che il tuo modello sia più veloce o più preciso?

È meglio iniziare con un modello piccolo ed iterare. La regola generale è creare il primo modello il primo giorno. In questo modo, puoi utilizzare modelli semplici come Resnet18 o Resnet34 per provare diverse tecniche di data augmentation o dataset esterni. Poiché stai lavorando con un modello semplice, le iterazioni saranno rapide. Puoi passare ad architetture di modelli più lente quando trovi la versione migliore.

Consiglio di Jeremy Howard: “Prova le architetture complesse solo alla fine”.

Lezione n. 4: Come allenare modelli grandi su Kaggle

Molti principianti utilizzano i notebook di Kaggle per il Machine Learning. Le GPU di Kaggle hanno una memoria limitata, quindi potresti esaurire la memoria, specialmente quando si utilizzano modelli grandi.

C’è un trucco utile che può risolvere questo problema. Si chiama Accumulo dei Gradienti (Gradient Accumulation). Con l’Accumulo dei Gradienti, non aggiorniamo i pesi dopo ogni batch, ma sommiamo i gradienti per K batch. Quindi, aggiorniamo i pesi del modello con questo gradiente accumulato per il batch totale uguale a K * batch_size, in modo che per ogni iterazione abbiamo una dimensione del batch K volte più piccola.

L’Accumulo dei Gradienti è assolutamente matematicamente identico a meno che la normalizzazione del batch (batch normalization) venga utilizzata nell’architettura del modello. Ad esempio, convnext non utilizza la normalizzazione del batch, quindi non c’è differenza.

Con questo approccio, utilizziamo significativamente meno memoria. Ciò significa che non è necessario acquistare GPU giganti, puoi adattare il tuo modello anche sul tuo laptop.

Puoi trovare l’esempio completo su Kaggle.

Lezione n. 5: Quali algoritmi di Machine Learning utilizzare

Oggi ci sono molte tecniche di Machine Learning diverse. Ad esempio, la documentazione di scikit-learn ha almeno una dozzina di approcci per il Machine Learning Supervisionato.

Jeremy Howard suggerisce di concentrarsi solo su un paio di tecniche essenziali:

  • Se hai dati strutturati, dovresti iniziare con gli insiemi di alberi decisionali (Random Forest o algoritmi di Gradient Boosting).
  • La migliore soluzione per dati non strutturati (come testi naturali, audio, video o immagini) è una rete neurale multistrato.

Le reti neurali sono applicabili anche ai dati strutturati, ma gli alberi decisionali sono spesso più facili da usare:

  • Puoi addestrare un insieme di alberi decisionali molto più velocemente.
  • Hanno meno parametri da regolare.
  • Non è necessaria una GPU speciale per addestrarli.
  • Inoltre, gli alberi decisionali sono spesso più facili da interpretare e capire il motivo per cui si ottiene un certo risultato per ogni oggetto, ad esempio, quali caratteristiche sono i predittori più forti e quali possiamo tranquillamente ignorare.

Se confrontiamo gli insiemi di alberi decisionali, Random Forest è più facile da usare (perché è quasi impossibile sovradattare). Tuttavia, Gradient Boosting di solito fornisce risultati leggermente migliori.

Lezione n. 6: Funzioni utili di Python

Anche se uso Python e Pandas da quasi dieci anni, ho scoperto anche un paio di trucchi utili di Pandas.

Il famoso dataset del Titanic è stato utilizzato per mostrare la potenza di Pandas. Diamo un’occhiata.

Il primo esempio ci mostra come convertire una colonna in una stringa, ottenere la prima lettera e convertirla usando un dizionario. Nota che se un valore non è menzionato nel dizionario, verrà restituito NaN.

# mio approccio abitualedecks_dict = {'A': 'ABC', 'B': 'ABC', 'C': 'ABC',             'D': 'DE', 'E': 'DE', 'F': 'FG', 'G': 'FG'}df['Deck'] = df.Cabin.map(    lambda x: decks_dict.get(str(x)[0]))# versione dal corso df['Deck'] = df.Cabin.str[0].map(dict(A="ABC", B="ABC", C="ABC",     D="DE", E="DE", F="FG", G="FG"))

Il prossimo esempio mostra come calcolare la frequenza utilizzando la funzione di trasformazione. Questa versione è più concisa rispetto alla merge che di solito uso.

# mio approccio abitualedf = df.merge(    df.groupby('Ticket', as_index = False).PassengerId.count()\        .rename(columns = {'PassengerId': 'TicketFreq'}))# versione dal corso df['TicketFreq'] = df.groupby('Ticket')['Ticket'].transform('count')

L’ultimo esempio è il più complesso su come analizzare i titoli.

# mio approccio abitualedf['Title'] = df.Name.map(lambda x: x.split(', ')[1].split('.')[0])df['Title'] = df.Title.map(    lambda x: x if x in ('Mr', 'Miss', 'Mrs', 'Master') else None)# versione dal corso df['Title'] = df.Name.str.split(', ', expand=True)[1]\    .str.split('.', expand=True)[0]df['Title'] = df.Title.map(dict(Mr="Mr",Miss="Miss",Mrs="Mrs",Master="Master"))

Vale la pena guardare la prima parte df per capire come funziona. Puoi eseguire il codice:df.Name.str.split(‘, ‘, expand=True) e vedere un dataframe in cui i nomi sono suddivisi da virgole su due colonne.

Quindi, selezioniamo colonna 1 e facciamo una divisione simile in base al punto. La seconda riga sostituisce tutti i casi diversi da Mr, Mrs, Miss o Master con NaN.

A dir la verità, continuerei a usare il mio approccio abituale per l’ultimo caso perché secondo me è più facile da capire.

Lezione n. 7: Trucchi di Machine Learning

Ci sono molti trucchi e tecniche utili o strumenti menzionati in questo corso. Ecco quelli che ho trovato utili.

Modello multi-target

Sorprendentemente, aggiungere un altro obiettivo alla Rete Neurale può aiutarti a migliorare la qualità del tuo modello.

Jeremy ha mostrato un esempio di un modello multi-target per la competizione di Classificazione delle Malattie del Riso. L’obiettivo di questa competizione è prevedere le malattie del riso attraverso le foto. Possiamo prevedere non solo la malattia, ma anche la varietà di riso, il che potrebbe aiutare il modello a imparare caratteristiche preziose. Le caratteristiche utili per prevedere la varietà di riso potrebbero essere utili anche per la rilevazione delle malattie.

Trovare un tasso di apprendimento ottimale

Il tasso di apprendimento definisce la dimensione del passo per ogni iterazione di SGD (Stochastic Gradient Descent). Se il tasso di apprendimento è troppo piccolo, il modello si adatterà molto lentamente. Se è troppo alto, il modello potrebbe non convergere mai all’ottimo. Ecco perché è così importante scegliere il tasso di apprendimento corretto.

Fast.AI fornisce uno strumento che ti aiuta a farlo con una sola riga di codice learn.lr_find(suggest_funcs=(valley, slide)).

Immagine dell'autore

Test Time Augmentation

Le augmentations sono modifiche alle immagini (ad esempio, miglioramenti del contrasto, rotazioni o ritagli). Le augmentations vengono spesso utilizzate durante l’addestramento per ottenere immagini leggermente diverse ad ogni epoca. Ma possiamo utilizzare le augmentations anche durante la fase di inferenza. Questa tecnica si chiama Test Time Augmentation.

Esempio di augmentations | Foto iniziale di Charles Postiaux su Unsplash

Funziona in modo molto semplice. Generiamo diverse versioni di ogni immagine utilizzando le augmentations e otteniamo le previsioni per ognuna di esse. Successivamente, calcoliamo il risultato aggregato utilizzando il massimo o la media. L’idea è simile al Bagging.

Arricchimento delle date

Puoi ottenere ulteriori informazioni dal tuo dataset se hai delle date nel tuo dataset. Ad esempio, invece di avere solo 2023–09–01, puoi considerare le caratteristiche separate: mese, giorno della settimana, anno, ecc.

Fast.AI ha una funzione add_datepart appositamente per questo, quindi non è necessario implementarla da soli.

Domanda senza risposta: Perché il sigmoid?

Durante il corso, ho avuto solo una domanda teorica che non è stata completamente trattata. Come in molti altri corsi di ML, non c’è spiegazione del motivo per cui utilizziamo la funzione sigmoid e non un’altra per convertire l’output del modello lineare in probabilità. Fortunatamente, c’è una lettura approfondita in cui puoi trovare tutte le risposte.

Per riassumere, il corso Fast.AI ha molti tesori nascosti che possono stimolare la tua riflessione anche se hai esperienza in data science. Quindi, ti consiglio sicuramente di ascoltarlo.

Grazie mille per aver letto questo articolo. Spero che sia stato illuminante per te. Se hai domande o commenti da fare, ti prego di lasciarli nella sezione dei commenti.