Formazione di una rete neurale
Ora impareremo come addestrare una rete neurale. Impareremo anche l'algoritmo di propagazione all'indietro e il passaggio all'indietro in Python Deep Learning.
Dobbiamo trovare i valori ottimali dei pesi di una rete neurale per ottenere l'output desiderato. Per addestrare una rete neurale, utilizziamo il metodo iterativo della discesa del gradiente. Iniziamo inizialmente con l'inizializzazione casuale dei pesi. Dopo l'inizializzazione casuale, facciamo previsioni su alcuni sottoinsiemi di dati con un processo di propagazione in avanti, calcoliamo la corrispondente funzione di costo C e aggiorniamo ogni peso w di una quantità proporzionale a dC / dw, cioè la derivata delle funzioni di costo rispetto al peso. La costante di proporzionalità è nota come tasso di apprendimento.
I gradienti possono essere calcolati in modo efficiente utilizzando l'algoritmo di retro propagazione. L'osservazione chiave della propagazione all'indietro o dell'elica all'indietro è che, a causa della regola della catena di differenziazione, il gradiente in ogni neurone nella rete neurale può essere calcolato utilizzando il gradiente nei neuroni, ha bordi in uscita a. Quindi, calcoliamo i gradienti all'indietro, ovvero calcoliamo prima i gradienti del livello di output, quindi il livello nascosto più in alto, seguito dal livello nascosto precedente e così via, terminando nel livello di input.
L'algoritmo di retro propagazione viene implementato principalmente utilizzando l'idea di un grafo computazionale, in cui ogni neurone viene espanso a molti nodi nel grafo computazionale ed esegue una semplice operazione matematica come addizione, moltiplicazione. Il grafo computazionale non ha pesi sui bordi; tutti i pesi vengono assegnati ai nodi, quindi i pesi diventano i propri nodi. L'algoritmo di propagazione all'indietro viene quindi eseguito sul grafo computazionale. Una volta completato il calcolo, per l'aggiornamento sono necessari solo i gradienti dei nodi di peso. Il resto dei gradienti può essere scartato.
Tecnica di ottimizzazione della discesa del gradiente
Una funzione di ottimizzazione comunemente utilizzata che regola i pesi in base all'errore che hanno causato è chiamata "discesa del gradiente".
Gradiente è un altro nome per pendenza e la pendenza, su un grafico xy, rappresenta il modo in cui due variabili sono correlate tra loro: la salita durante la corsa, la variazione della distanza sulla variazione del tempo, ecc. In questo caso, la pendenza è il rapporto tra l'errore della rete e un singolo peso; cioè, come cambia l'errore al variare del peso.
Per dirla più precisamente, vogliamo trovare quale peso produce il minimo errore. Vogliamo trovare il peso che rappresenti correttamente i segnali contenuti nei dati di input e li traduca in una corretta classificazione.
Man mano che una rete neurale apprende, regola lentamente molti pesi in modo che possano mappare correttamente il segnale al significato. Il rapporto tra l'errore di rete e ciascuno di questi pesi è una derivata, dE / dw, che calcola la misura in cui una leggera variazione di un peso provoca una leggera variazione dell'errore.
Ogni peso è solo un fattore in una rete profonda che coinvolge molte trasformazioni; il segnale del peso passa attraverso attivazioni e somme su più strati, quindi usiamo la regola del calcolo a catena per lavorare a ritroso attraverso le attivazioni e le uscite della rete. Questo ci porta al peso in questione e alla sua relazione con l'errore complessivo.
Date due variabili, errore e peso, sono mediate da una terza variabile, activation, attraverso il quale viene passato il peso. Possiamo calcolare come una variazione di peso influisce su una variazione di errore calcolando prima come una variazione di attivazione influisce su una variazione di Errore e come una variazione di peso influisce su una variazione di attivazione.
L'idea di base nel deep learning non è altro che questa: regolare i pesi di un modello in risposta all'errore che produce, fino a quando non è più possibile ridurre l'errore.
La rete profonda si allena lentamente se il valore del gradiente è piccolo e veloce se il valore è alto. Eventuali imprecisioni nella formazione portano a risultati imprecisi. Il processo di addestramento delle reti dall'output all'input è chiamato back propagation o back prop. Sappiamo che la propagazione in avanti inizia con l'input e funziona in avanti. Il sostegno posteriore esegue il calcolo inverso / opposto del gradiente da destra a sinistra.
Ogni volta che calcoliamo un gradiente, utilizziamo tutti i gradienti precedenti fino a quel punto.
Cominciamo da un nodo nel livello di output. Il bordo utilizza il gradiente in quel nodo. Man mano che torniamo agli strati nascosti, diventa più complesso. Il prodotto di due numeri compresi tra 0 e 1 ti dà un numero più piccolo. Il valore del gradiente continua a ridursi e di conseguenza il puntello posteriore richiede molto tempo per allenarsi e la precisione ne risente.
Sfide negli algoritmi di deep learning
Ci sono alcune sfide sia per le reti neurali superficiali che per le reti neurali profonde, come l'overfitting e il tempo di calcolo. I DNN sono influenzati dall'overfitting perché l'uso di livelli di astrazione aggiuntivi che consentono loro di modellare dipendenze rare nei dati di addestramento.
Regularizationmetodi come l'abbandono scolastico, l'arresto anticipato, l'aumento dei dati e l'apprendimento del trasferimento vengono applicati durante la formazione per combattere l'overfitting. La regolarizzazione del drop out omette casualmente le unità dagli strati nascosti durante l'addestramento, il che aiuta a evitare rare dipendenze. I DNN prendono in considerazione diversi parametri di allenamento come la dimensione, ovvero il numero di livelli e il numero di unità per livello, il tasso di apprendimento e i pesi iniziali. Trovare parametri ottimali non è sempre pratico a causa dell'elevato costo in termini di tempo e risorse computazionali. Diversi hack come il batching possono accelerare il calcolo. La grande potenza di elaborazione delle GPU ha notevolmente aiutato il processo di addestramento, poiché i calcoli di matrice e vettoriale richiesti sono ben eseguiti sulle GPU.
Buttare fuori
Il dropout è una tecnica di regolarizzazione popolare per le reti neurali. Le reti neurali profonde sono particolarmente inclini all'overfitting.
Vediamo ora cos'è il dropout e come funziona.
Nelle parole di Geoffrey Hinton, uno dei pionieri del Deep Learning, "Se hai una rete neurale profonda e non è overfitting, probabilmente dovresti usarne una più grande e usare il dropout".
Il dropout è una tecnica in cui durante ogni iterazione della discesa del gradiente, rilasciamo una serie di nodi selezionati casualmente. Ciò significa che ignoriamo alcuni nodi in modo casuale come se non esistessero.
Ogni neurone viene mantenuto con una probabilità di q e lasciato cadere a caso con probabilità 1-q. Il valore q può essere diverso per ogni strato nella rete neurale. Un valore di 0,5 per i livelli nascosti e 0 per il livello di input funziona bene su un'ampia gamma di attività.
Durante la valutazione e la previsione, non viene utilizzato alcun dropout. L'output di ogni neurone viene moltiplicato per q in modo che l'input allo strato successivo abbia lo stesso valore atteso.
L'idea alla base di Dropout è la seguente: in una rete neurale senza regolarizzazione del dropout, i neuroni sviluppano una co-dipendenza tra loro che porta all'overfitting.
Trucco di implementazione
Dropout viene implementato in librerie come TensorFlow e Pytorch mantenendo l'output dei neuroni selezionati casualmente a 0. Ovvero, sebbene il neurone esista, il suo output viene sovrascritto come 0.
Arresto anticipato
Addestriamo reti neurali utilizzando un algoritmo iterativo chiamato discesa del gradiente.
L'idea alla base dell'arresto anticipato è intuitiva; interrompiamo l'allenamento quando l'errore inizia ad aumentare. Qui, per errore, si intende l'errore misurato sui dati di convalida, che è la parte dei dati di addestramento utilizzati per l'ottimizzazione degli iperparametri. In questo caso, l'iperparametro è il criterio di arresto.
Aumento dei dati
Il processo in cui aumentiamo il quantum di dati che abbiamo o lo aumentiamo utilizzando i dati esistenti e applicandovi alcune trasformazioni. Le esatte trasformazioni utilizzate dipendono dal compito che intendiamo realizzare. Inoltre, le trasformazioni che aiutano la rete neurale dipendono dalla sua architettura.
Ad esempio, in molte attività di visione artificiale come la classificazione degli oggetti, una tecnica di aumento dei dati efficace consiste nell'aggiungere nuovi punti dati che sono versioni ritagliate o tradotte dei dati originali.
Quando un computer accetta un'immagine come input, accetta un array di valori di pixel. Diciamo che l'intera immagine viene spostata a sinistra di 15 pixel. Applichiamo molti spostamenti diversi in direzioni diverse, ottenendo un set di dati aumentato molte volte la dimensione del set di dati originale.
Trasferimento dell'apprendimento
Il processo di prendere un modello pre-addestrato e "mettere a punto" il modello con il nostro set di dati è chiamato apprendimento di trasferimento. Esistono diversi modi per farlo, alcuni dei quali sono descritti di seguito:
Addestriamo il modello pre-addestrato su un set di dati di grandi dimensioni. Quindi, rimuoviamo l'ultimo livello della rete e lo sostituiamo con un nuovo livello con pesi casuali.
Quindi congeliamo i pesi di tutti gli altri livelli e addestriamo la rete normalmente. Qui il congelamento degli strati non cambia i pesi durante la discesa o l'ottimizzazione del gradiente.
Il concetto alla base di questo è che il modello pre-addestrato agirà come un estrattore di funzionalità e solo l'ultimo livello verrà addestrato sull'attività corrente.