Tutorial sulla rete neurale artificiale con esempi di ANN TensorFlow

Cos'è la rete neurale artificiale?

An Rete neurale artificiale (ANN) è un sistema informatico ispirato alle reti neurali biologiche per la creazione di cervelli artificiali basati sull'insieme di unità connesse chiamate neuroni artificiali. È progettato per analizzare ed elaborare le informazioni come esseri umani. La rete neurale artificiale ha capacità di autoapprendimento per produrre risultati migliori man mano che sono disponibili più dati.

Rete neurale artificiale
Rete neurale artificiale

Una Rete Neurale Artificiale (ANN) è composta da quattro oggetti principali:

  • Livelli: tutto l'apprendimento avviene a strati. Ci sono 3 livelli 1) Ingresso 2) Nascosto e 3) Uscita
  • Caratteristica ed etichetta: dati in ingresso alla rete (funzionalità) e output dalla rete (etichette)
  • Funzione di perdita: Metrica utilizzata per stimare le prestazioni della fase di apprendimento
  • Optimizer: Migliorare l'apprendimento aggiornando la conoscenza in rete

Una rete neurale prenderà i dati di input e li inserirà in un insieme di livelli. La rete deve valutare le proprie prestazioni con una funzione di perdita. La funzione di perdita dà alla rete un'idea del percorso che deve intraprendere prima di impadronirsi della conoscenza. La rete deve migliorare le proprie conoscenze con l'aiuto di un ottimizzatore.

Se dai un'occhiata alla figura sopra, capirai il meccanismo sottostante.

Il programma prende alcuni valori di input e li inserisce in due livelli completamente connessi. Immagina di avere un problema di matematica, la prima cosa che fai è leggere il capitolo corrispondente per risolvere il problema. Applichi le tue nuove conoscenze per risolvere il problema. C'è un'alta probabilità che non otterrai un punteggio molto buono. Per una rete è lo stesso. La prima volta che vede i dati e fa una previsione, questa non corrisponderà perfettamente ai dati effettivi.

Per migliorare la propria conoscenza, la rete utilizza un ottimizzatore. Nella nostra analogia, un ottimizzatore può essere pensato come se rileggesse il capitolo. Ottieni nuove intuizioni/lezioni leggendo di nuovo. Allo stesso modo, la rete utilizza l’ottimizzatore, aggiorna le proprie conoscenze e testa le nuove conoscenze per verificare quanto ha ancora bisogno di imparare. Il programma ripeterà questo passaggio finché non avrà l'errore più basso possibile.

Nella nostra analogia del problema di matematica, significa che leggi il capitolo del libro di testo molte volte finché non comprendi a fondo il contenuto del corso. Anche dopo aver letto più volte, se continui a commettere errori, significa che hai raggiunto la capacità di conoscenza con il materiale attuale. Devi usare un libro di testo diverso o testare un metodo diverso per migliorare il tuo punteggio. Per una rete neurale, è lo stesso processo. Se l'errore è lontano dal 100%, ma la curva è piatta, significa che con l'architettura attuale; non può imparare nient'altro. La rete deve essere ottimizzata meglio per migliorare la conoscenza.

Rete neurale Architectura

La rete neurale artificiale Archila struttura è composta dai seguenti componenti:

  • Livelli
  • Funzione di attivazione
  • Funzione di perdita
  • Optimizer

Livelli

Uno strato è dove avviene tutto l’apprendimento. All'interno di uno strato ci sono una quantità infinita di pesi (neuroni). Una tipica rete neurale viene spesso elaborata da strati densamente connessi (chiamati anche strati completamente connessi). Significa che tutti gli ingressi sono collegati all'uscita.

Una tipica rete neurale prende un vettore di input e uno scalare che contiene le etichette. La configurazione più comoda è una classificazione binaria con solo due classi: 0 e 1.

La rete prende un input, lo invia a tutti i nodi collegati e calcola il segnale con an attivazione funzione.

Rete neurale Architectura
Rete neurale Architectura

La figura sopra traccia questa idea. Il primo livello contiene i valori di input, mentre il secondo livello, chiamato livello nascosto, riceve l'input ponderato dal livello precedente

  1. Il primo nodo sono i valori di input
  2. Il neurone è scomposto nella parte di input e nella funzione di attivazione. La parte sinistra riceve tutto l'input dal livello precedente. La parte destra è la somma degli input che passano in una funzione di attivazione.
  3. Valore di output calcolato dai livelli nascosti e utilizzato per effettuare una previsione. Per la classificazione, è uguale al numero di classe. Per la regressione viene previsto un solo valore.

Funzione di attivazione

La funzione di attivazione di un nodo definisce l'output dato un insieme di input. È necessaria una funzione di attivazione per consentire alla rete di apprendere il modello non lineare. Una funzione di attivazione comune è a Relu, Unità lineare rettificata. La funzione fornisce uno zero per tutti i valori negativi.

Funzione di attivazione

Le altre funzioni di attivazione sono:

  • Lineare a tratti
  • sigmoid
  • Tan
  • Relu che perde

La decisione fondamentale da prendere quando si costruisce una rete neurale è:

  • Quanti strati nella rete neurale
  • Quante unità nascoste per ogni livello

Una rete neurale con molti livelli e unità nascoste può apprendere una rappresentazione complessa dei dati, ma ciò rende i calcoli della rete molto costosi.

Funzione di perdita

Dopo aver definito gli strati nascosti e la funzione di attivazione, è necessario specificare la funzione di perdita e l'ottimizzatore.

Per la classificazione binaria, è pratica comune utilizzare una funzione di perdita di entropia incrociata binaria. Nella regressione lineare si utilizza l'errore quadratico medio.

La funzione di perdita è una metrica importante per stimare le prestazioni dell'ottimizzatore. Durante la formazione, questa metrica verrà ridotta al minimo. È necessario selezionare attentamente questa quantità a seconda del tipo di problema che si sta affrontando.

Optimizer

La funzione di perdita è una misura della performance del modello. L'ottimizzatore aiuterà a migliorare i pesi della rete per diminuire la perdita. Sono disponibili diversi ottimizzatori, ma il più comune è lo Stochastic Gradient Descent.

Gli ottimizzatori convenzionali sono:

  • Momentum ottimizzazione,
  • Gradiente accelerato di Nesterov,
  • AdaGrad,
  • Ottimizzazione di Adamo

Limitazioni della rete neurale

Di seguito sono riportate le limitazioni della rete neurale:

sovradattamento

Un problema comune con la rete neurale complessa è la difficoltà nel generalizzare dati mai visti. Una rete neurale con molti pesi può identificare molto bene dettagli specifici nel train set, ma spesso porta a un overfitting. Se i dati sono sbilanciati all'interno dei gruppi (ad esempio, non ci sono abbastanza dati disponibili in alcuni gruppi), la rete imparerà molto bene durante l'addestramento, ma non avrà la capacità di generalizzare tale schema a dati mai visti prima.

Nell’apprendimento automatico esiste un compromesso tra ottimizzazione e generalizzazione.

Ottimizzare un modello richiede di trovare i parametri migliori che minimizzino la perdita del set di addestramento.

La generalizzazione, tuttavia, indica come si comporta il modello per i dati invisibili.

Per impedire al modello di catturare dettagli specifici o pattern indesiderati dei dati di training, puoi usare tecniche diverse. Il metodo migliore è avere un set di dati bilanciato con una quantità di dati sufficiente. L'arte di ridurre l'overfitting è chiamata regolarizzazione. Rivediamo alcune tecniche convenzionali.

Dimensioni della rete

Una rete neurale con troppi strati e unità nascoste è notoriamente molto sofisticata. Un modo semplice per ridurre la complessità del modello è ridurne le dimensioni. Non esiste una best practice per definire il numero di strati. Devi iniziare con una piccola quantità di strato e aumentarne le dimensioni finché non trovi il modello sovradimensionato.

Regolarizzazione del peso

Una tecnica standard per prevenire l’overfitting consiste nell’aggiungere vincoli ai pesi della rete. Il vincolo impone alla dimensione della rete di assumere solo valori piccoli. Il vincolo viene aggiunto alla funzione di perdita dell'errore. Esistono due tipi di regolarizzazione:

L1: Lazo: Il costo è proporzionale al valore assoluto dei coefficienti di peso

L2: Colmo: Il costo è proporzionale al quadrato del valore dei coefficienti di peso

dropout

Il dropout è una tecnica strana ma utile. Una rete con dropout significa che alcuni pesi verranno impostati casualmente su zero. Immagina di avere una serie di pesi [0.1, 1.7, 0.7, -0.9]. Se la rete neurale ha un dropout, diventerà [0.1, 0, 0, -0.9] con 0 distribuito in modo casuale. Il parametro che controlla il dropout è il tasso di dropout. Il tasso definisce quanti pesi devono essere impostati su zero. Avere un tasso compreso tra 0.2 e 0.5 è comune.

Esempio di rete neurale in TensorFlow

Vediamo un esempio di rete neurale artificiale in azione su come funziona una rete neurale per un tipico problema di classificazione. Ci sono due input, x1 e x2 con un valore casuale. L'output è una classe binaria. L'obiettivo è classificare l'etichetta in base alle due caratteristiche. Per svolgere questo compito, l'architettura della rete neurale è definita come segue:

  • Due strati nascosti
    • Il primo strato ha quattro neuroni completamente connessi
    • Il secondo strato ha due neuroni completamente connessi
  • La funzione di attivazione è un Relu
  • Aggiungi una regolarizzazione L2 con un tasso di apprendimento di 0.003

Rete neurale in TensorFlow

La rete ottimizzerà il peso durante 180 epoche con una dimensione batch di 10. Nel video di esempio ANN riportato di seguito, puoi vedere come si evolvono i pesi e come la rete migliora la mappatura della classificazione.

Innanzitutto la rete assegna valori casuali a tutti i pesi.

  • Con i pesi casuali, cioè senza ottimizzazione, la perdita di output è 0.453. L'immagine sotto rappresenta la rete con diversi colori.
  • In generale, il colore arancione rappresenta i valori negativi mentre i colori blu mostrano i valori positivi.
  • I punti dati hanno la stessa rappresentazione; quelle blu sono le etichette positive e quella arancione quelle negative.

Rete neurale in TensorFlow

All'interno del secondo strato nascosto, le linee sono colorate seguendo il segno dei pesi. Le linee arancioni assegnano pesi negativi e quella blu pesi positivi

Come puoi vedere, nella mappatura dell'output, la rete commette parecchi errori. Vediamo come si comporta la rete dopo l'ottimizzazione.

L'immagine dell'esempio ANN di seguito illustra i risultati della rete ottimizzata. Prima di tutto, noti che la rete ha imparato con successo come classificare il punto dati. Puoi vedere dall'immagine prima; il peso iniziale era -0.43 mentre dopo l'ottimizzazione risulta in un peso di -0.95.

Rete neurale in TensorFlow

L'idea può essere generalizzata per reti con più strati e neuroni nascosti. Puoi giocare in link.

Come addestrare una rete neurale con TensorFlow

Ecco il processo passo passo su come addestrare una rete neurale con TensorFlow ANN utilizzando lo stimatore dell'API DNNClassifier.

Utilizzeremo il set di dati MNIST per addestrare la tua prima rete neurale. Addestrare una rete neurale con TensorFlow non è molto complicato La fase di preelaborazione è esattamente la stessa dei tutorial precedenti. Procederai come segue:

  • Passaggio 1: importa i dati
  • Passaggio 2: trasformare i dati
  • Passaggio 3: costruire il tensore
  • Passaggio 4: costruisci il modello
  • Passaggio 5: addestrare e valutare il modello
  • Passaggio 6: migliorare il modello

Passaggio 1) Importa i dati

Prima di tutto, devi importare la libreria necessaria. Puoi importare il set di dati MNIST utilizzando scikit learn come mostrato nell'esempio di rete neurale TensorFlow di seguito.

Il set di dati MNIST è il set di dati comunemente utilizzato per testare nuove tecniche o algoritmi. Questo set di dati è una raccolta di immagini di 28×28 pixel con una cifra scritta a mano da 0 a 9. Attualmente, l'errore più basso nel test è dello 0.27% con un comitato di 7 reti neurali convoluzionali.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

Puoi scaricare scikit learn temporaneamente a questo indirizzo. Copia e incolla il set di dati in una comoda cartella. Per importare i dati in Python, puoi utilizzare fetch_mldata da scikit learn. Incolla il percorso del file all'interno di fetch_mldata per recuperare i dati.

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

Successivamente, importi i dati e ottieni la forma di entrambi i set di dati.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

Passaggio 2) Trasformare i dati

Nell'esercitazione precedente hai appreso che è necessario trasformare i dati per limitare l'effetto dei valori anomali. In questo tutorial sulle reti neurali trasformerai i dati utilizzando lo scaler min-max. La formula è:

(X-min_x)/(max_x - min_x)

Scikit apprende che ha già una funzione per questo: MinMaxScaler()

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

Passaggio 3) Costruire il tensore

Ora hai familiarità con il modo di creare tensore in Tensorflow. È possibile convertire il set di treni in una colonna numerica.

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

Passaggio 4) Costruisci il modello

L'architettura della rete neurale contiene 2 strati nascosti con 300 unità per il primo strato e 100 unità per il secondo. Utilizziamo questi valori in base alla nostra esperienza. Puoi regolare questi valori e vedere come influenzano l'accuratezza della rete.

Per costruire il modello, si utilizza lo stimatore DNNClassifier. Puoi aggiungere il numero di livelli agli argomenti feature_columns. È necessario impostare il numero di classi su 10 poiché sono presenti dieci classi nel set di formazione. Hai già familiarità con la sintassi dell'oggetto stimatore. Gli argomenti caratteristiche colonne, numero di classi e model_dir sono esattamente gli stessi del tutorial precedente. Il nuovo argomento hidden_unit controlla il numero di strati e quanti nodi connettere alla rete neurale. Nel codice seguente ci sono due livelli nascosti con il primo che collega 300 nodi e il secondo con 100 nodi.

Per costruire lo stimatore, utilizzare tf.estimator.DNNClassifier con i seguenti parametri:

  • feature_columns: definisce le colonne da utilizzare nella rete
  • hidden_units: definisce il numero di neuroni nascosti
  • n_classes: definisce il numero di classi da prevedere
  • model_dir: definisce il percorso di TensorBoard
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

Passaggio 5) Addestrare e valutare il modello

È possibile utilizzare il metodo Numpy per addestrare il modello e valutarlo

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

Produzione:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

L'architettura attuale consente di ottenere una precisione del set di valutazione pari al 96 percento.

Passaggio 6) Migliorare il modello

Puoi provare a migliorare il modello aggiungendo parametri di regolarizzazione.

Utilizzeremo un ottimizzatore Adam con un tasso di dropout di 0.3, L1 di X e L2 di y. In TensorFlow Neural Network, puoi controllare l'ottimizzatore utilizzando l'object train seguito dal nome dell'ottimizzatore. TensorFlow è un'API integrata per l'ottimizzatore Proximal AdaGrad.

Per aggiungere la regolarizzazione alla rete neurale profonda, puoi utilizzare tf.train.ProximalAdagradOptimizer con il seguente parametro

  • Tasso di apprendimento: tasso_diapprendimento
  • Regolarizzazione L1: l1_regolarizzazione_forza
  • Regolarizzazione L2: l2_regolarizzazione_forza
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

Produzione:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

I valori scelti per ridurre l'overfitting non hanno migliorato l'accuratezza del modello. Il tuo primo modello aveva una precisione del 96% mentre il modello con regolarizzatore L2 ha una precisione del 95%. Puoi provare con valori diversi e vedere come influisce sulla precisione.

Sommario

In questo tutorial imparerai come costruire una rete neurale. Una rete neurale richiede:

  • Numero di livelli nascosti
  • Numero di nodi completamente connessi
  • Funzione di attivazione
  • Optimizer
  • Numero di classi

In TensorFlow ANN, puoi addestrare una rete neurale per problemi di classificazione con:

  • tf.estimator.DNNClassifier

Lo stimatore richiede di specificare:

  • colonne_funzionalità=colonne_funzionalità,
  • unità_nascoste=[300, 100]
  • n_classi=10
  • dir_modello

È possibile migliorare il modello utilizzando diversi ottimizzatori. In questo tutorial hai imparato come utilizzare l'ottimizzatore Adam Grad con una velocità di apprendimento e aggiungere un controllo per evitare l'adattamento eccessivo.