Rete neurale divergente invece di convergere


9

Ho implementato una rete neurale (usando CUDA) con 2 livelli. (2 neuroni per strato). Sto cercando di far apprendere 2 semplici funzioni polinomiali quadratiche usando la backpropagation .

Ma invece di convergere, è divergente (l'output sta diventando infinito)

Ecco alcuni dettagli in più su ciò che ho provato:

  • Avevo impostato i pesi iniziali su 0, ma poiché era divergente ho randomizzato i pesi iniziali (intervallo: da -0,5 a 0,5)
  • Ho letto che una rete neurale potrebbe divergere se il tasso di apprendimento è troppo alto, quindi ho ridotto il tasso di apprendimento a 0,000001
  • Le due funzioni che sto cercando di ottenere per aggiungere sono: 3 * i + 7 * j + 9 e j * j + i * i + 24 (sto dando il livello i e j come input)
  • Lo avevo implementato come un singolo strato in precedenza e questo poteva approssimare le funzioni polinomiali meglio di quanto non faccia ora
  • Sto pensando di implementare lo slancio in questa rete, ma non sono sicuro che possa aiutarlo a imparare
  • Sto usando una funzione di attivazione lineare (come in no)
  • All'inizio c'è un'oscillazione ma l'uscita inizia a divergere nel momento in cui uno qualsiasi dei pesi diventa maggiore di 1

Ho controllato e ricontrollato il mio codice ma non sembra esserci alcun problema con esso.

Quindi, ecco la mia domanda: cosa non va qui?

Qualsiasi puntatore sarà apprezzato.

Risposte:


8
  1. Con le reti neurali, è sempre necessario inizializzare in modo casuale i propri pesi per interrompere la simmetria.
  2. Se non si utilizza una funzione di attivazione non lineare nelle unità nascoste, è possibile che sia rimasto con un singolo livello. La tua rete ora è solo una composizione di due funzioni lineari, che è ovviamente solo un'altra funzione lineare.
  3. Quel tasso di apprendimento sembra eccessivamente piccolo. Se sto usando una frequenza di apprendimento fissa, di solito trovo un valore compreso tra 0,1 e 0,0001 che funzioni bene per la maggior parte dei problemi. Questo ovviamente dipende dal problema, quindi prendi la mia esperienza per quello che è.
  4. Oltre a verificare il tuo codice rispetto alla matematica che hai appreso, quando si esegue l'ottimizzazione basata sul gradiente, può essere molto utile calcolare analiticamente i gradienti richiesti utilizzando differenze finite e confrontarli con i valori che stai calcolando nel tuo codice. Vedi qui per una discussione su come puoi farlo. Ho rilevato molti errori in questo modo e vedere passare questi tipi di test mi aiuta sempre a sentirmi molto più sicuro della correttezza del codice.
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.