Lavorare con le reti neurali: lista di controllo per il debug

Lavorare con le reti neurali: lista di controllo per il debug

Il codice dei prodotti software di machine learning è spesso complesso e piuttosto confuso. Rilevare ed eliminare i bug al suo interno è un compito ad alta intensità di risorse. Anche il più semplice reti neurali feedforward richiedono un approccio serio all'architettura di rete, all'inizializzazione dei pesi e all'ottimizzazione della rete. Un piccolo errore può portare a spiacevoli problemi.

Questo articolo riguarda un algoritmo per il debug delle tue reti neurali.

Skillbox consiglia: Corso pratico Sviluppatore Python da zero.

Ti ricordiamo: per tutti i lettori di "Habr" - uno sconto di 10 rubli al momento dell'iscrizione a qualsiasi corso Skillbox utilizzando il codice promozionale "Habr".

L’algoritmo è composto da cinque fasi:

  • inizio facile;
  • conferma delle perdite;
  • verifica dei risultati intermedi e dei collegamenti;
  • diagnostica dei parametri;
  • controllo del lavoro.

Se qualcosa ti sembra più interessante del resto, puoi passare immediatamente a queste sezioni.

Inizio facile

È più difficile eseguire il debug di una rete neurale con un'architettura complessa, regolarizzazione e uno scheduler della velocità di apprendimento rispetto a una rete normale. Siamo un po' complicati qui, poiché il punto stesso è indirettamente correlato al debug, ma questa è comunque una raccomandazione importante.

Un inizio semplice consiste nel creare un modello semplificato e addestrarlo su un set (punto) di dati.

Per prima cosa creiamo un modello semplificato

Per iniziare velocemente, creiamo una piccola rete con un unico livello nascosto e controlliamo che tutto funzioni correttamente. Quindi complichiamo gradualmente il modello, controllando ogni nuovo aspetto della sua struttura (strato aggiuntivo, parametro, ecc.) e andiamo avanti.

Addestriamo il modello su un singolo set (punto) di dati

Come rapido controllo di integrità del tuo progetto, puoi utilizzare uno o due punti dati per la formazione per confermare se il sistema funziona correttamente. La rete neurale deve mostrare una precisione del 100% nell'addestramento e nei test. Se così non fosse, o il modello è troppo piccolo o hai già un bug.

Anche se tutto va bene, prepara il modello per una o più epoche prima di proseguire.

Valutazione delle perdite

La stima delle perdite è il modo principale per affinare le prestazioni del modello. È necessario assicurarsi che la perdita sia adeguata al problema e che le funzioni di perdita siano valutate sulla scala corretta. Se utilizzi più di un tipo di perdita, assicurati che siano tutti dello stesso ordine e dimensionati correttamente.

È importante prestare attenzione alle perdite iniziali. Controlla quanto il risultato effettivo è vicino al risultato atteso se il modello è iniziato con un'ipotesi casuale. IN Il lavoro di Andrey Karpathy suggerisce quanto segue:: “Assicurati di ottenere il risultato che ti aspetti quando inizi con un numero limitato di parametri. È meglio verificare subito la perdita di dati (con il grado di regolarizzazione impostato a zero). Ad esempio, per CIFAR-10 con un classificatore Softmax, ci aspettiamo che la perdita iniziale sia 2.302 perché la probabilità diffusa prevista è 0,1 per ciascuna classe (poiché ci sono 10 classi) e la perdita Softmax è la probabilità logaritmica negativa della classe corretta come − ln (0.1) = 2.302.”

Per l'esempio binario, viene semplicemente effettuato un calcolo simile per ciascuna classe. Ecco, ad esempio, i dati: 20% 0 e 80% 1. La perdita iniziale prevista sarà fino a –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Se il risultato è maggiore di 1, potrebbe indicare che i pesi della rete neurale non sono adeguatamente bilanciati o che i dati non sono normalizzati.

Controllo dei risultati intermedi e delle connessioni

Per eseguire il debug di una rete neurale, è necessario comprendere la dinamica dei processi all'interno della rete e il ruolo dei singoli strati intermedi quando sono collegati. Ecco gli errori comuni che potresti riscontrare:

  • espressioni errate per gli aggiornamenti Gradle;
  • non vengono applicati aggiornamenti del peso;
  • gradienti esplosivi.

Se i valori del gradiente sono zero, significa che la velocità di apprendimento nell'ottimizzatore è troppo lenta o che stai riscontrando un'espressione errata per l'aggiornamento del gradiente.

Inoltre, è necessario monitorare i valori delle funzioni di attivazione, i pesi e gli aggiornamenti di ciascuno degli strati. Ad esempio, l’entità degli aggiornamenti dei parametri (pesi e distorsioni) dovrebbe essere 1-e3.

Esiste un fenomeno chiamato "Dying ReLU" o "problema del gradiente evanescente", quando i neuroni ReLU emetteranno zero dopo aver appreso un ampio valore di bias negativo per i suoi pesi. Questi neuroni non vengono mai più attivati ​​in nessun punto dei dati.

È possibile utilizzare il controllo del gradiente per identificare questi errori approssimando il gradiente utilizzando un approccio numerico. Se è vicino ai gradienti calcolati, la propagazione inversa è stata implementata correttamente. Per creare un controllo del gradiente, dai un'occhiata a queste fantastiche risorse da CS231 qui и quiCosì come lezione Andrew Nga su questo argomento.

Faizan Sheikh indica tre metodi principali per visualizzare una rete neurale:

  • I preliminari sono metodi semplici che ci mostrano la struttura generale del modello addestrato. Questi includono l'output di forme o filtri dei singoli strati della rete neurale e i parametri all'interno di ogni strato.
  • Basato sull'attivazione. In essi decifriamo le attivazioni di singoli neuroni o gruppi di neuroni per comprenderne le funzioni.
  • Basato sui gradienti. Questi metodi tendono a manipolare i gradienti che si formano dai passaggi avanti e indietro dell'addestramento del modello (comprese le mappe di salienza e le mappe di attivazione delle classi).

Esistono diversi strumenti utili per visualizzare le attivazioni e le connessioni dei singoli livelli, ad es. ConX и Tensorboard.

Lavorare con le reti neurali: lista di controllo per il debug

Diagnostica dei parametri

Le reti neurali hanno molti parametri che interagiscono tra loro, il che complica l'ottimizzazione. In realtà questa sezione è oggetto di ricerca attiva da parte di specialisti, quindi i suggerimenti che seguono devono essere considerati solo come consigli, punti di partenza su cui costruire.

Dimensioni del pacchetto (dimensione batch): se si desidera che la dimensione batch sia sufficientemente grande da ottenere stime accurate del gradiente di errore, ma sufficientemente piccola da consentire la discesa del gradiente stocastico (SGD) per regolarizzare la rete. Lotti di piccole dimensioni porteranno ad una rapida convergenza a causa del rumore durante il processo di formazione e successivamente a difficoltà di ottimizzazione. Questo è descritto in modo più dettagliato qui.

Tasso di apprendimento - troppo basso porterà ad una convergenza lenta o al rischio di rimanere bloccati nei minimi locali. Allo stesso tempo, un tasso di apprendimento elevato causerà divergenze di ottimizzazione perché si rischia di saltare attraverso la parte profonda ma ristretta della funzione di perdita. Prova a utilizzare la pianificazione della velocità per ridurla durante l'addestramento della rete neurale. Aggiornato con CS231n c'è un'ampia sezione dedicata a questo problema.

Ritaglio gradiente  — tagliare i gradienti dei parametri durante la backpropagation al valore massimo o alla norma marginale. Utile per risolvere eventuali gradienti esplosivi che potresti incontrare al punto tre.

Normalizzazione batch - utilizzato per normalizzare i dati di input di ciascun livello, che ci consente di risolvere il problema dello spostamento della covariata interna. Se utilizzi Dropout e Batch Norma insieme, dai un'occhiata a questo articolo.

Discesa stocastica del gradiente (SGD) — Esistono diverse varietà di SGD che utilizzano lo slancio, i tassi di apprendimento adattivo e il metodo Nesterov. Tuttavia, nessuno di essi presenta un chiaro vantaggio sia in termini di efficienza dell’apprendimento che di generalizzazione (dettagli qui).

Regolarizzazione - è cruciale per costruire un modello generalizzabile, poiché aggiunge una penalità per la complessità del modello o per i valori estremi dei parametri. Questo è un modo per ridurre la varianza del modello senza aumentarne significativamente la distorsione. Di più informazioni dettagliate - qui.

Per valutare tutto da soli, è necessario disattivare la regolarizzazione e verificare personalmente il gradiente di perdita dei dati.

Abbandonare è un altro metodo per semplificare la rete e prevenire la congestione. Durante l'allenamento il dropout si effettua solo mantenendo l'attività del neurone con una certa probabilità p (iperparametro) o azzerandola nel caso opposto. Di conseguenza, la rete deve utilizzare un diverso sottoinsieme di parametri per ciascun batch di addestramento, il che riduce i cambiamenti in alcuni parametri che diventano dominanti.

Importante: se si utilizzano sia l'eliminazione che la normalizzazione batch, prestare attenzione all'ordine di queste operazioni o addirittura utilizzarle insieme. Tutto ciò è ancora attivamente discusso e integrato. Ecco due discussioni importanti su questo argomento su Stackoverflow и ArXiv.

Controllo del lavoro

Si tratta di documentare flussi di lavoro ed esperimenti. Se non documenti nulla, potresti dimenticare, ad esempio, quale tasso di apprendimento o peso delle classi vengono utilizzati. Grazie al controllo è possibile visualizzare e riprodurre facilmente gli esperimenti precedenti. Ciò consente di ridurre il numero di esperimenti duplicati.

Tuttavia, la documentazione manuale può diventare un compito difficile in caso di grandi volumi di lavoro. È qui che entrano in gioco strumenti come Comet.ml per aiutarti a registrare automaticamente set di dati, modifiche al codice, cronologia sperimentale e modelli di produzione, comprese le informazioni chiave sul tuo modello (iperparametri, metriche sulle prestazioni del modello e informazioni ambientali).

Una rete neurale può essere molto sensibile a piccoli cambiamenti e ciò porterà a un calo delle prestazioni del modello. Monitorare e documentare il tuo lavoro è il primo passo che puoi compiere per standardizzare l'ambiente e la modellazione.

Lavorare con le reti neurali: lista di controllo per il debug

Spero che questo post possa essere un punto di partenza per iniziare a eseguire il debug della tua rete neurale.

Skillbox consiglia:

Fonte: habr.com

Aggiungi un commento