Lavoriamo con reti neurali: checklist per il debug

Lavoriamo con reti neurali: checklist per il debug

Il codice dei prodotti software per l'apprendimento automatico è spesso complesso e piuttosto contorto. L'individuazione e la risoluzione dei bug sono un compito che richiede molte risorse. Anche le più semplici 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 problemi indesiderati.

Questo articolo è dedicato all'algoritmo per il debugging delle vostre reti neurali.

Skillbox consiglia: Corso pratico Sviluppatore Python da zero.

Ricordiamo: per tutti i lettori di «Habr» — sconto di 10.000 rubli per l'iscrizione a qualsiasi corso Skillbox con il codice promozionale «Habr».

L'algoritmo consiste in cinque fasi:

  • partenza semplice;
  • conferma della perdita;
  • verifica dei risultati intermedi e delle connessioni;
  • diagnosi dei parametri;
  • monitoraggio del funzionamento.

Se qualcosa vi sembra più interessante rispetto ad altro, potete passare direttamente a queste sezioni.

Partenza semplice

E' più complicato fare il debugging di una rete neurale con un'architettura complessa, regolarizzazione e scheduler della velocità di apprendimento rispetto a una normale. Qui stiamo un po' ingannando, poiché questo punto ha una relazione indiretta con il debugging, ma è comunque un consiglio importante.

La partenza semplice consiste nel creare un modello semplificato e addestrarlo su un singolo set (punto) di dati.

Iniziamo creando un modello semplificato

Per una partenza rapida, creiamo una piccola rete con un unico strato nascosto e verifichiamo che tutto funzioni correttamente. Poi, aumentiamo gradualmente la complessità del modello, controllando ogni nuovo aspetto della sua struttura (strato aggiuntivo, parametro, ecc.) e proseguiamo.

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

Come verifica rapida del funzionamento del vostro progetto, potete utilizzare uno o due punti di dati per confermare se il sistema funziona correttamente. La rete neurale dovrebbe mostrare il 100% di accuratezza nell'addestramento e nella verifica. Se non è così, allora o il modello è troppo piccolo, o avete già un bug.

Anche se tutto sembra andare bene, preparate il modello per passare attraverso una o più epoche prima di andare oltre.

Valutazione della perdita

La valutazione della perdita è il metodo principale per affinare le prestazioni del modello. È necessario assicurarsi che la perdita corrisponda al compito e che le funzioni di perdita siano valutate su una scala corretta. Se utilizzate più di un tipo di perdita, assicuratevi che tutte siano dello stesso ordine e correttamente scalate.

È importante prestare attenzione alle perdite iniziali. Controlla quanto il risultato reale si avvicina a quello atteso, se il modello è partito da una supposizione casuale. In il lavoro di Andrey Karpati si propone quanto segue: «Assicurati che il risultato che ottieni sia quello previsto all'inizio del lavoro con un numero ridotto di parametri. È meglio controllare subito la perdita dati (impostando il grado di regolarizzazione a zero). Ad esempio, per CIFAR-10 con classificatore Softmax ci aspettiamo che le perdite iniziali siano 2.302, poiché la probabilità diffusa attesa è 0,1 per ogni classe (dato che ci sono 10 classi), e la perdita Softmax è la probabilità logaritmica negativa della classe corretta, cioè –ln (0.1) = 2.302».

Per un esempio binario, si esegue un calcolo analogo per ciascuna delle classi. Ecco, ad esempio, i dati: 20% di 0 e 80% di 1. La perdita iniziale attesa sarà fino a –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Se il risultato è superiore a 1, ciò potrebbe indicare che i pesi della rete neurale non sono equilibrati correttamente oppure che i dati non sono normalizzati.

Controlliamo i risultati intermedi e le connessioni

Per il debug della rete neurale è necessario comprendere la dinamica dei processi all'interno della rete e il ruolo dei singoli strati intermedi, poiché sono collegati. Ecco alcuni errori tipici con cui potresti imbatterti:

  • espressioni errate per gli aggiornamenti del gradiente;
  • aggiornamenti dei pesi non applicati;
  • gradienti che scompaiono o esplodono (exploding gradients).

Se i valori del gradiente sono nulli, significa che la velocità di apprendimento nell'ottimizzatore è troppo bassa, oppure che ti sei imbattuto in un'espressione errata per l'aggiornamento del gradiente.

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

Esiste un fenomeno noto come “Dying ReLU” o «problema del gradiente scomparso», quando i neuroni ReLU producono zero dopo aver appreso un valore negativo elevato (bias) per i loro pesi. Questi neuroni non si attiveranno mai più in nessun dato.

Puoi utilizzare il controllo del gradiente per identificare questi errori approssimando il gradiente con un approccio numerico. Se è vicino ai gradienti calcolati, allora la retropropagazione è stata implementata correttamente. Per creare un controllo del gradiente, consulta queste risorse sorprendenti da CS231 qui e qui, insieme a una lezione di Andrew Ng su questo tema.

Faizan Sheikh indica tre principali metodi di visualizzazione delle reti neurali:

  • Preliminari — metodi semplici che ci mostrano la struttura generale del modello addestrato. Questi includono l'output delle forme o dei filtri dei singoli strati della rete neurale e dei parametri in ogni strato.
  • Basati sull'attivazione. Qui decodifichiamo le attivazioni di singoli neuroni o gruppi di neuroni per comprendere le loro funzioni.
  • Basati sui gradienti. Questi metodi tendono a manipolare i gradienti che si formano dal passaggio avanti e indietro durante l'addestramento del modello (inclusi le mappe di importanza e le mappe di attivazione di classe).

Esistono diversi strumenti utili per visualizzare le attivazioni e le connessioni dei singoli strati, come ConX e Tensorboard.

Lavoriamo con reti neurali: checklist per il debug

Diagnostica dei parametri

Le reti neurali hanno un gran numero di parametri che interagiscono tra loro, complicando l'ottimizzazione. In effetti, questa sezione è oggetto di attivi studi da parte degli esperti, quindi le indicazioni seguenti devono essere considerate solo come suggerimenti, punti di partenza su cui basarsi.

Dimensione del batch (batch size) — se necessario, affinché la dimensione del batch sia sufficientemente grande per ottenere stime accurate del gradiente di errore, ma sufficientemente piccola affinché il gradiente stocastico discendente (SGD) possa ordinare la tua rete. Piccole dimensioni del batch porteranno a una rapida convergenza grazie al rumore durante il processo di addestramento e, in seguito, a difficoltà di ottimizzazione. Maggiori dettagli sono descritti qui.

Tasso di apprendimento — troppo basso porterà a una lenta convergenza o al rischio di rimanere bloccati in minimi locali. Allo stesso tempo, un alto tasso di apprendimento causerà divergenza nell'ottimizzazione, poiché rischi di 'saltare' attraverso una parte profonda ma stretta della funzione di perdita. Prova a usare la pianificazione del tasso per abbassarlo durante l'addestramento della rete neurale. Nel corso CS231n c'è una grande sezione dedicata a questo problema.

Taglio del gradiente  — il taglio dei gradienti dei parametri durante la retropropagazione rispetto al valore massimo o alla norma limite. Utile per affrontare problemi con i gradienti esplosivi che potresti incontrare nel terzo punto.

Normalizzazione batch — è usata per normalizzare i dati in ingresso di ogni strato, risolvendo così il problema del cambio di covarianza interno. Se stai usando Dropout e Batch Normalization insieme, dai un'occhiata a questo articolo.

Discesa del gradiente stocastica (SGD) — ci sono diverse varianti di SGD che utilizzano impulso, velocità di apprendimento adattive e metodo di Nesterov. Nessuna di queste offre un chiaro vantaggio in termini di efficienza di apprendimento o generalizzazione (i dettagli qui).

Regolarizzazione — è fondamentale per costruire un modello generalizzabile, in quanto aggiunge una penalità per la complessità del modello o per i valori estremi dei parametri. È un modo per ridurre la varianza del modello senza aumentare significativamente il suo bias. Ulteriori informazioni dettagliate — qui.

Per valutare tutto da solo, è necessario disattivare la regolarizzazione e controllare autonomamente il gradiente della perdita dei dati.

Dropout — è un altro metodo per regolare la tua rete per prevenire l'overfitting. Durante l'addestramento, il dropout avviene solo mantenendo attivo un neurone con una certa probabilità p (iperparametro) o impostandolo a zero in caso contrario. Di conseguenza, la rete deve utilizzare un altro sottoinsieme di parametri per ogni lotto di addestramento, riducendo le variazioni di determinati parametri che diventano dominanti.

Importante: se stai utilizzando sia il dropout che la normalizzazione batch, fai attenzione all'ordine di queste operazioni o anche al loro utilizzo combinato. Tutto ciò è ancora attivamente discusso e ampliato. Ecco due importanti discussioni su questo tema su Stackoverflow e Arxiv.

Controllo del lavoro

Si tratta della documentazione dei processi lavorativi e degli esperimenti. Se non si documenta nulla, è facile dimenticare, ad esempio, quale sia la velocità di apprendimento utilizzata o il peso delle classi. Grazie al controllo, è possibile rivedere e riprodurre senza problemi gli esperimenti precedenti. Questo consente di ridurre il numero di esperimenti duplicati.

Tuttavia, la documentazione manuale può diventare un compito difficile in caso di un gran numero di attività. In questo caso, strumenti come Comet.ml possono aiutare ad automatizzare il logging dei set di dati, delle modifiche al codice, della storia degli esperimenti e dei modelli di produzione, inclusi i dati chiave sul tuo modello (iperparametri, metriche delle prestazioni del modello e informazioni sull'ambiente).

Una rete neurale può essere piuttosto sensibile a piccole variazioni, il che porta a un calo delle prestazioni del modello. Monitorare e documentare il lavoro è il primo passo da intraprendere per standardizzare l'ambiente e il modellamento.

Lavoriamo con reti neurali: checklist per il debug

Spero che questo post possa diventare un punto di partenza da cui iniziare a mettere a punto la tua rete neurale.

Skillbox consiglia:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster