Home Prodotti Software Deep learning: modelli, metodi ed esempi per creare reti neurali

Deep learning: modelli, metodi ed esempi per creare reti neurali

Negli ultimi dieci anni, con il ritorno delle reti neurali, la comprensione del Deep Learning è diventata essenziale.

Un manuale, Deep Learning – Dalle basi alle architetture avanzate con Python, edito da Tecniche Nuove, fornisce un’introduzione approfondita per i data scientist e gli ingegneri del software con precedenti esperienze nel machine learning e getta le basi del Deep Learning per poi passare rapidamente ai dettagli di importanti architetture avanzate, insegnando a implementare tutto da zero.

Lo ha scritto Seth Weidman e ci mostra come funzionano le reti neurali usando un approccio basato su principi primi. Imparerete come applicare da zero le reti neurali multistrato, le reti neurali convoluzionali e quelle ricorrenti.

Facendo acquisire una comprensione dettagliata di come queste reti funzionino matematicamente, computazionalmente e concettualmente, consente di portare a termine con successo i progetti di Deep Learning.

Si parla dunque di modelli mentali chiari per la comprensione delle reti neurali, accompagnati da esempi di codice funzionanti e spiegazioni matematiche; di metodi per l’implementazione di reti neurali multistrato da zero, utilizzando un framework orientato agli oggetti di facile comprensione; di esempi e spiegazioni chiare di reti neurali convoluzionali e ricorrenti; di implementazione dei concetti di rete neurale mediante il popolare framework PyTorch.

Leggiamo, allora, come Seth Weidman ci introduce al deep learning all’inizio del suo manuale.

Se avete provato a informarvi sulle reti neurali e il deep learning, scrive Weidman, probabilmente avete trovato un sacco di risorse, dai post sui blog ai MOOC (Massive Open Online Course, come quelli disponibili su Coursera e Udacity) di varia qualità e persino alcuni libri (a me è successo quando iniziai a esplorare l’argomento qualche anno fa).

Tuttavia è probabile che le spiegazioni sulle reti neurali trovate finora siano state in qualche modo carenti. A me è successa la stessa cosa quando iniziai a studiare questo argomento: le varie spiegazioni mi davano l’idea di persone cieche che cercavano di descrivere le diverse parti di un elefante, ma nessuna riusciva a descrivere l’intera faccenda. È questo che mi ha spinto a scrivere un libro.

Le risorse esistenti sulle reti neurali si possono suddividere per lo più in due categorie. Alcune sono concettuali e matematiche e contengono gli schemi che generalmente si trovano nelle spiegazioni delle reti neurali, con cerchi collegati da linee e frecce, e ampie spiegazioni matematiche di ciò che sta succedendo per far “capire la teoria”.

Altre risorse contengono densi blocchi di codice che, se eseguito, sembrano mostrare un valore di scarto che decresce nel corso del tempo, a indicare che la rete neurale sta “apprendendo”.

Per esempio, l’esempio seguente tratto dalla documentazione di PyTorch definisce e addestra effettivamente una semplice rete neurale su dati generati in modo casuale:

# N è la dimensione del gruppo; D_in è la dimensione dell’input;
# H è la dimensione nascosta; D_out è la dimensione dell’output. 
N, D_in, H, D_out = 64, 1000, 100, 10
 
# Crea dati di input e output casuali
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)

# Inizializza in modo casuale i pesi
w1 = torch.randn(D_in, H, device=device, dtype=dtype)
w2 = torch.randn(H, D_out, device=device, dtype=dtype)

learning_rate = 1e-6 
for t in range(500):
  # Passaggio in avanti: calcola la previsione y 
  h = x.mm(w1)
  h_relu = h.clamp(min=0) 
  y_pred = h_relu.mm(w2)

  # Calcola e stampa lo scarto
  loss = (y_pred - y).pow(2).sum().item() 
  print(t, loss)

  # Retro propagazione per calcolare i gradienti di w1 e w2 rispetto allo scarto
  grad_y_pred = 2.0 * (y_pred - y) 
  grad_w2 = h_relu.t().mm(grad_y_pred) 
  grad_h_relu = grad_y_pred.mm(w2.t()) 
  grad_h = grad_h_relu.clone() 
  grad_h[h < 0] = 0
  grad_w1 = x.t().mm(grad_h)

  # Aggiorna i pesi usando la discesa del gradiente
  w1 -= learning_rate * grad_w1 
  w2 -= learning_rate * grad_w2

Spiegazioni come questa, naturalmente, non danno molte informazioni su “ciò che sta realmente accadendo”: i principi matematici impliciti, le singole componenti della rete neurale qui contenute, il modo in cui cooperano e così via.

Che cosa dovrebbe contenere una buona spiegazione delle reti neurali? Per trovare una risposta è utile osservare come vengono spiegati altri concetti informatici: se volete studiare gli algoritmi di ordinamento, per esempio, ci sono libri che contengono:

  • una spiegazione dell’algoritmo;
  • una spiegazione visiva di come funziona l’algoritmo, simile a quella che si po- trebbe disegnare su una lavagna durante un’interrogazione di programmazione;
  • qualche spiegazione matematica del “perché l’algoritmo funziona”2;
  • pseudocodice che implementa l’algoritmo.

Raramente (o mai) si trovano tutti questi elementi nella spiegazione delle reti neurali, anche se mi sembra ovvio che una corretta spiegazione delle reti neurali dovrebbe esse- re fatta proprio così; il libro tenta di colmare questa lacuna.

La comprensione delle reti neurali richiede molteplici modelli mentali

Non sono un ricercatore e non ho un dottorato di ricerca, tuttavia ho spiegato scienza dei dati per lavoro: ho insegnato in un paio di campi scuola di scienza dei dati per un’azienda che si chiama Metis, e poi ho viaggiato per un anno in giro per il mondo per conto di Metis svolgendo seminari che duravano da uno a cinque giorni in aziende di svariati settori, spiegando ai loro dipendenti i concetti base del machine learning e dell’ingegneria del software.

Ho sempre amato l’insegnamento e sono sempre stato affascinato dalla questione di come spiegare al meglio i concetti tecnici; più recentemente mi sono concentrato su concetti di machine learning e statistica. Nel caso delle reti neurali ho scoperto che la parte più difficile è trasmettere il “modello mentale” corretto che aiuti a capire che cos’è una rete neurale, soprattutto perché la comprensione delle reti neurali richiede non uno ma diversi modelli mentali, ognuno dei quali chiarisce un aspetto diverso (ma essenziale) del funzionamento delle reti neurali.

Per illustrare il concetto, le frasi seguenti sono tutte risposte corrette alla domanda “Che cos’è una rete neurale?”:

  • una rete neurale è una funzione matematica che riceve un input e produce un output;
  • una rete neurale è un grafo computazionale attraverso il quale scorrono matrici multidimensionali;
  • una rete neurale è costituita da strati, ognuno dei quali può essere pensato come se avesse un certo numero di “neuroni”;
  • una rete neurale è un Universal Function Approximator che in teoria può rappre- sentare la soluzione di qualsiasi problema di apprendimento supervisionato.

Senza dubbio molti di voi potrebbero aver già sentito menzionare una o più di queste spiegazioni e potrebbero avere una conoscenza adeguata del loro significato e delle loro implicazioni riguardo il funzionamento delle reti neurali.

Per comprenderle appieno, però, è necessario comprenderle tutte e vedere come sono connesse: per esempio, come si concilia il concetto degli “strati” con il fatto che sia possibile rappresentare una rete neurale attraverso un grafo computazionale?

Infine, per farlo con precisione, implementeremo tutti questi concetti da zero, in Python, e li cuciremo insieme per creare reti neurali addestrabili su un computer portatile. Tuttavia, nonostante il fatto che dediche- remo molto tempo ai dettagli dell’implementazione, lo scopo di dell’implementazione di questi modelli in Python è consolidare e rendere accurata la comprensione dei concetti; l’obiettivo non è scrivere una libreria di rete neurale concisa o dalle prestazioni più elevate possibile.

Il mio intento è fare in modo che al termine della lettura del libro abbiate una cono- scenza solida di tutti i modelli mentali (e delle loro implicazioni riguardo al modo in cui le reti neurali dovrebbero essere implementate) che vi consenta di imparare concetti correlati o realizzare di ulteriori progetti molto più facilmente.

Deep Learning, il manuale

I primi tre capitoli sono i più importanti e potrebbero formare da soli un libro a sé stante.

Nel Capitolo 1 mostro in che modo le funzioni matematiche possono essere rappresentate attraverso una serie di operazioni collegate tra loro per formare un grafo computazionale, e mostro come tale rappresentazione permetta di calcolare le derivate degli output di queste funzioni rispetto ai loro input utilizzando la regola della catena insegnata nei corsi di calcolo. Alla fine del capitolo introdurrò un’operazione molto importante, la moltiplicazione di matrici, e mostrerò come si può inserire in una funzione matematica rappresentata in questo modo per consentirci di calcolare le derivate che serviranno nel deep learning.

Nel Capitolo 2 useremo gli elementi fondamentali creati nel Capitolo 1 per costruire e addestrare modelli per risolvere un problema reale: in particolare, li useremo per costruire sia modelli a regressione lineare sia modelli di reti neurali in grado di prevedere i prezzi delle abitazioni basati su un dataset reale. Farò vedere che la rete neurale funziona meglio della regressione lineare e cercherò di dare qualche indicazione del perché. L’approccio basato sui “principi fondamentali” usato per costruire i modelli in questo capitolo dovrebbe dare un’idea precisa di come funzionano le reti neurali, ma mostrerà anche le capacità limitate dell’approccio passo passo, basato esclusivamente sui principi fondamentali, per definire i modelli del deep learning; tutto ciò giustificherà il Capitolo 3.

Nel Capitolo 3 prenderemo gli elementi costitutivi dell’approccio basato sui principi fondamentali descritti nei primi due capitoli e li useremo per costruire i componenti di “livello più alto” che costituiscono tutti i modelli di deep learning: Layer, Model, Optimizer e così via. Concluderemo il capitolo addestrando un modello di deep learning, definito da zero, sullo stesso dataset usato nel Capitolo 2 e mostrando che funziona meglio della semplice rete neurale.

A conti fatti, ci sono poche garanzie teoriche che una rete neurale con una data architettura trovi effettivamente una buona soluzione su un determinato dataset quando sarà addestrata con le tecniche di addestramento usate nel libro.

Nel Capitolo 4 descriveremo i più importanti “trucchi di addestramento” che generalmente aumentano la probabilità che una rete neurale trovi una buona soluzione e, ove possibile, daremo qualche indicazione matematica del perché funzionano.

Nel Capitolo 5 esamino le idee alla base delle reti neurali convoluzionali (CNN), una sorta di architettura di rete neurale specializzata in interpretazione delle immagini. Esistono molte spiegazioni in merito alle CNN, quindi mi limiterò a illustrare lo stretto necessario e mostrerò la differenza rispetto alle normali reti neurali: nello specifico, come le CNN fanno sì che ogni strato di neuroni sia organizzato in “mappa di caratteristiche” e come due di questi strati (ognuno composto da molteplici mappe di caratteristiche) siano connessi tramite filtri convoluzionali. Inoltre, proprio come abbiamo codificato da zero gli strati norma- li di una rete neurale, scriveremo il codice degli strati convoluzionali per raffor- zare la comprensione del loro funzionamento.

Nei primi cinque capitoli costruiremo una libreria di reti neurali in miniatura che definisce le reti neurali attraverso una serie di Layer (a loro volta costituiti da una serie di Operation) che inviano input in avanti e gradienti a ritroso. In realtà non è così che la maggior parte delle reti neurali è implementata; al contrario, usano una tecnica chiamata differenziazione automatica.

Farò una breve panoramica della differenziazione automatica all’inizio del Capitolo 6 e la userò per giustificare l’argomento principale del capitolo: le RNN (reti neurali ricorrenti), l’architettura di rete neurale utilizzata normalmente per interpretare  i dati in cui i punti appaiono in sequenza, come i dati delle serie temporali o i dati legati al linguaggio naturale. Spiegherò il funzionamento delle “RNN alla vaniglia” e delle due varianti: GRU e LSTM (e naturalmente le implementere- mo tutte e tre da zero); farò sempre attenzione a distinguere tra gli elementi che sono condivisi in tutte queste RNN e i modi specifici in cui queste varianti differiscono.

Infine, nel Capitolo 7, mostrerò come tutto ciò che abbiamo fatto da zero nei Capitoli da 1 a 6 possa essere implementato utilizzando la rete neurale open source ad alte prestazioni PyTorch. Imparare a usare un framework come questo è essenziale per progredire nell’apprendimento delle reti neurali; ma tuffarsi e studiare un framework senza aver prima acquisito delle basi solide sul come e perché le reti neurali funzionino limiterebbe gravemente la comprensione a lungo termine.

L’obiettivo dell’evoluzione dei capitoli di questo libro è dare al lettore la capacità di costruire reti neurali ad altissime prestazioni (insegnando PyTorch) e contemporaneamente prepararlo all’apprendimento e ai risultati a lungo termine (insegnando i concetti fondamenti prima di spiegare come funzio- na PyTorch). Concluderemo con una breve dimostrazione di come le reti neurali possano essere usate per l’apprendimento non supervisionato.

Come utilizzare il codice di esempio

Il materiale supplementare (esempi di codice, esercizi e così via.) può essere scaricato da GitHub. Questo libro è stato scritto per aiutarvi a svolgere il vostro lavoro. In generale potete usare qualunque codice di esempio presente nel libro per i vostri programmi e la vostra documentazione.

Non si è necessario contattarci per chiedere il permesso, a meno che non si stia riproducendo una parte significativa di codice.

Per esempio, scrivere un programma che utilizza diversi frammenti di codice estrapolati dal testo non richiede alcuna autorizzazione. Vendere o distribuire un CD-ROM contenente gli esempi del libro richiede un permesso. Rispondere a una domanda citando questo libro e il codice di esempio non richiede alcuna autorizzazione. Se volete incorporare una grossa quantità di codice di esempio del libro nella documentazione del vostro prodotto dovete chiedere il permesso.

Apprezziamo, ma non esigiamo, l’attribuzione. Un’attribuzione di solito comprende il titolo, l’autore, l’editore e il codice ISBN. Se ritenete che l’uso degli esempi di codice non rientri nell’uso corretto o nei permessi concessi di cui sopra, non esitate a contattarci a libri@tecnichenuove.com.

Continua a leggere il libro

LASCIA UN COMMENTO

Inserisci il tuo commento
Inserisci il tuo nome

Se questo articolo ti è piaciuto e vuoi rimanere sempre informato sulle novità tecnologiche
css.php