Convergenza dei pesi delle reti neurali


10

Sono arrivato a una situazione in cui i pesi della mia rete neurale non convergono anche dopo 500 iterazioni. La mia rete neurale contiene 1 livello di input, 1 livello nascosto e 1 livello di output. Sono circa 230 nodi nel livello di input, 9 nodi nel livello nascosto e 1 nodo di output nel livello di output. Volevo sapere se faccio una condizione di arresto anticipato (diciamo di interrompere l'allenamento della mia rete neurale dopo 100 iterazioni). Che effetto avrà questo sul modello?

Volevo anche sapere qual è lo standard industriale di lavoro in giro se i pesi nella rete neurale non convergono?


I tuoi dati sono correttamente normalizzati? Questo è di solito il motivo di tale comportamento.
sashkello,

Di solito il numero di neuroni nel livello nascosto dovrebbe avere le stesse dimensioni rispetto al livello di input. Penso che 9 neuroni siano troppo piccoli. Hai provato ad aumentare a 200-300 neuroni?
Gio

@sashkello Sì, i dati sono normalizzati correttamente.
Principiante

1
@juampa Non c'è motivo per avere 9 nodi nel livello nascosto. abbiamo ritenuto che avere più nodi nel livello nascosto aumentasse la complessità della rete e si adattasse troppo ai dati.
Studente

3
Devi dare qualche spiegazione in più. Qual è il problema che stai risolvendo? Quanti punti dati di allenamento hai? Cosa intendi per non convergere? - intendi solo che le prestazioni (sul set di allenamento) sono cattive o che i tuoi pesi non stanno convergendo ... se si converte il peso, è necessario utilizzare un tasso di apprendimento più basso o un tasso di apprendimento ridotto. È inoltre possibile utilizzare la regressione logistica / lineare come linea di base. infine, quanto sono correlati i tuoi input? Se sono molto correlati, la normalizzazione non sarà sufficiente e dovresti considerare la diagonalizzazione (nota anche come PCA).
seanv507,

Risposte:


13

Ci sono una serie di domande da porre:

  • hai il numero appropriato di neuroni in ogni strato?
  • stai usando i tipi appropriati di funzioni di trasferimento?
  • stai usando il tipo appropriato di algoritmo di apprendimento
  • hai una dimensione del campione abbastanza grande?
  • puoi confermare che i tuoi campioni hanno i giusti rapporti tra loro per essere informativi? (non ridondante, di dimensione pertinente, ecc ...)

Cosa puoi dare in termini di effemeridi? Puoi dirci qualcosa sulla natura dei dati?

Potresti creare un albero a gradiente di reti neurali.

Hai chiesto cosa succede se ti fermi presto.

Puoi provare te stesso. Esegui 300x dove inizi con pesi inizializzati casuali, quindi fermati a un numero specificato di iterazioni, diciamo 100. A quel punto calcola l'errore dell'insieme, l'errore del sottoinsieme di addestramento e l'errore del set di test. Ripetere. Dopo che hai 300 valori per dirti qual è l'errore, puoi avere un'idea della distribuzione dell'errore dati 100 iterazioni di apprendimento. Se lo desideri, puoi quindi campionare quella distribuzione su diversi altri valori dell'apprendimento. Suggerisco 200, 500 e 1000 iterazioni. Questo ti darà un'idea di come il tuo SNR cambi nel tempo. Un diagramma del conteggio SNR vs iterazione può darti un'idea di "scogliere" o "abbastanza buono". A volte ci sono scogliere in cui l'errore collassa. A volte l'errore è accettabile a quel punto.

Ci vogliono dati "relativamente semplici" o fortuna "abbastanza buona" perché il tuo sistema converga costantemente in meno di 100 iterazioni. Entrambi non riguardano la ripetibilità né sono generalizzabili.

Perché stai pensando in termini di pesi convergenti e non errore al di sotto di una determinata soglia. Hai mai sentito parlare di un paradosso del voto? ( link ) Quando hai interazioni cicliche nel tuo sistema (come il feedback nelle reti neurali), allora puoi avere paradossi di voto - cambiamenti accoppiati. Non so se i pesi da soli siano un indicatore sufficiente per la convergenza della rete.

Puoi pensare ai pesi come a uno spazio. Ha più di 3 dimensioni, ma è ancora uno spazio. Nel "centroide" di quello spazio c'è la tua regione "più adatta". Lontano dal centroide è una misura meno adatta. Puoi pensare all'attuale impostazione dei tuoi pesi come a un singolo punto in quello spazio.

Ora non sai dove sia effettivamente il "buono". Quello che hai è una "pendenza" locale. È possibile eseguire la discesa gradiente verso il "migliore" locale dato dove si trova il punto in questo momento. Non ti dice "universale" meglio, ma locale è meglio di niente.

Quindi inizi a iterare, camminando in discesa verso quella valle di bellezza. Iterate fino a quando pensate di aver finito. Forse il valore dei tuoi pesi è grande. Forse rimbalzano dappertutto. Forse il calcolo sta "impiegando troppo tempo". Vuoi essere fatto.

Quindi, come fai a sapere se dove sei è "abbastanza buono"?

Ecco un breve test che potresti fare:

Prendi 30 sottoinsiemi casuali uniformi di dati (come una percentuale di dati ciascuno) e riqualifica la rete su di essi. Dovrebbe essere molto più veloce. Osserva quanto tempo impiegano a convergere e confrontarlo con la storia di convergenza del grande set. Testare l'errore della rete per tutti i dati su questi sottoinsiemi e vedere come quella distribuzione di errori si confronta con il tuo grande errore. Ora aumenta le dimensioni del sottoinsieme fino a forse il 5% dei tuoi dati e ripeti. Guarda cosa ti insegna.

Questa è una variazione sull'ottimizzazione dello sciame di particelle (vedi riferimento) modellata su come le api mellifere prendono decisioni basate sullo scouting.

Hai chiesto cosa succede se i pesi non convergono.

Le reti neurali sono uno strumento. Non sono l'unico strumento. Ce ne sono altri Vorrei usare uno di loro.

Lavoro in termini di criteri informativi, quindi guardo sia i pesi (conteggio dei parametri) sia l'errore. Potresti provare uno di quelli.

Esistono alcuni tipi di preelaborazione che possono essere utili. Centra e scala. Ruota usando i componenti principali. Se osservi gli autovalori nei componenti principali, puoi utilizzare le regole del diagramma skree per stimare la dimensione dei tuoi dati. Ridurre la dimensione può migliorare la convergenza. Se conosci qualcosa sulla "fisica sottostante", puoi lisciare o filtrare i dati per rimuovere il rumore. A volte la convergenza riguarda il rumore nel sistema.

Trovo interessante l'idea del rilevamento compresso . Può consentire un sottocampionamento radicale di alcuni sistemi senza perdita di generalizzazione. Vorrei esaminare alcune statistiche ricampionate bootstrap e le distribuzioni dei tuoi dati per determinare se ea quale livello di sottocampionamento l'insieme di addestramento diventa rappresentativo. Questo ti dà una misura della "salute" dei tuoi dati.

A volte è una buona cosa non convergere

Hai mai sentito parlare di un paradosso del voto? Potresti pensarlo come un cugino di grado superiore in un vicolo cieco a due vie. È un ciclo. In un paradosso del voto di 2 persone la prima persona vuole il candidato "A" mentre la seconda vuole il candidato "B" (o non-A o simile). La parte importante è che puoi pensarlo come un ciclo.

I loop sono importanti nelle reti neurali. Risposta. Ricorsione. Ha reso il percettrone in grado di risolvere problemi simili a XOR. Crea loop e, a volte, i loop possono agire come il paradosso del voto, dove continueranno a cambiare peso se avessi infinite iterazioni. Non sono destinati a convergere perché non è il peso individuale che conta, ma l'interazione dei pesi nel circuito.

Nota:

L'uso di solo 500 iterazioni può essere un problema. Ho avuto NN in cui 10.000 iterazioni erano a malapena sufficienti. Il numero di iterazioni da "abbastanza" dipende, come ho già indicato, da dati, topologia NN, funzioni di trasferimento dei nodi, funzione di apprendimento / addestramento e persino hardware del computer. Devi avere una buona comprensione di come interagiscono tutti con il conteggio delle iterazioni prima di dire che ci sono state "abbastanza" o "troppe" iterazioni. Altre considerazioni come il tempo, il budget e cosa vuoi fare con la NN quando hai finito la formazione dovrebbero essere prese in considerazione.

Chen, RB, Chang, SP, Wang, W., & Wong, WK, (2011, settembre). Disegni sperimentali ottimali tramite i metodi di ottimizzazione dello sciame di particelle (prestampa), recuperati il ​​25 marzo 2012 da http://www.math.ntu.edu.tw/~mathlib/preprint/2011-03.pdf


2

Per me è difficile dire quale potrebbe essere il tuo problema. Un punto da considerare è l'implementazione concreta che usi. Concretamente, quale algoritmo di ottimizzazione. Se la tua rete impiega molto tempo a convergere e stai usando una qualche forma di discesa gradiente stocastica (o mini-batch), allora potrebbe essere il caso che la tua rete sia in un altopiano (una regione in cui la funzione di energia / errore è molto piatta in modo che i gradienti siano molto bassi e quindi la convergenza).

In tal caso, controlla l'entità dei gradienti per vedere se questo è il caso. Esistono diverse tecniche per affrontare questo problema, come aggiungere un impulso al gradiente.

Per una panoramica dettagliata delle tecniche e dei trucchi del mestiere, dai un'occhiata a questo (deve leggere) articolo di Yann LeCun .


1

Assicurati che i tuoi gradienti non vadano oltre i limiti o è anche possibile che i gradienti diventino zero. Questo è popolarmente noto come esplosione di pendenze e problemi di sfumature sfumate.

Una possibile soluzione è utilizzare un ottimizzatore adattivo come AdaGrad o Adam.

Avevo affrontato un problema simile durante l'addestramento di una semplice rete neurale quando stavo iniziando con le reti neurali.

Pochi riferimenti: https://en.wikipedia.org/wiki/Vanishing_gradient_problem https://www.youtube.com/watch?v=VuamhbEWEWA


0

Ho avuto molti set di dati che convergevano lentamente, probabilmente perché gli input erano altamente correlati.

Ho scritto il mio analizzatore C ++ NN e con esso posso variare il tasso di apprendimento per ciascun peso. Per ogni peso su ciascun bordo faccio due cose che aiutano alcuni.

Innanzitutto, moltiplico ciascun tasso di apprendimento per un numero casuale uniformemente distribuito da [0,1]. Immagino che questo aiuti con il problema della correlazione.

L'altro trucco è quello di confrontare il gradiente corrente con il gradiente precedente su ciascun bordo. Se il gradiente si riduce a malapena in percentuale, allora moltiplico il tasso di apprendimento per quel bordo fino a 5.

Non ho alcuna giustificazione particolare per nessuno di questi trucchi, ma sembrano funzionare abbastanza bene.

Spero che sia di aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.