Domanda

Qualcuno può consigliare un sito Web o darmi una breve descrizione di come viene implementata la backpropagation in una NN?Capisco il concetto di base, ma non sono sicuro di come scrivere il codice.

Molte delle fonti che ho trovato mostrano semplicemente le equazioni senza fornire alcuna spiegazione del motivo per cui lo fanno, e i nomi delle variabili rendono difficile scoprirlo.

Esempio:

void bpnn_output_error(delta, target, output, nj, err)
double *delta, *target, *output, *err;
int nj;
{
  int j;
  double o, t, errsum;

  errsum = 0.0;
  for (j = 1; j <= nj; j++) {
    o = output[j];
    t = target[j];
    delta[j] = o * (1.0 - o) * (t - o);
    errsum += ABS(delta[j]);
  }
  *err = errsum;

}

In quell'esempio, qualcuno può spiegare lo scopo di

delta[j] = o * (1.0 - o) * (t - o);

Grazie.

È stato utile?

Soluzione

Lo scopo di

  

delta [j] = o * (1,0 - o) * (t - o);

è quello di trovare l'errore di un nodo di uscita in una rete backpropagation.

o rappresenta l'uscita del nodo, t è il valore atteso di uscita per il nodo.

Il termine (o * (1,0 -. O), è la derivata di una funzione di trasferimento comune utilizzata, la funzione sigmoide (Altre funzioni di trasferimento non sono infrequenti, e richiederebbe una riscrittura del codice che deve prima sigma derivato invece. una mancata corrispondenza tra funzione e derivato probabilmente significa che la formazione non convergono.) il nodo ha un valore di "attivazione" che viene alimentato attraverso una funzione di trasferimento per ottenere la portata o, come

  

o = f (attivazione)

La cosa principale è che utilizza backpropagation discesa del gradiente, e l'errore diventa all'indietro propagato da applicazione la regola della catena. Il problema è uno di cessione di credito, o la colpa se si vuole, per i nodi nascosti la cui uscita non è direttamente paragonabile al valore atteso. Iniziamo con ciò che è noto e comparabili, i nodi di uscita. L'errore è considerato proporzionale alla derivata prima dei tempi di uscita il valore di errore grezzo tra i risultati attesi e di uscita effettiva.

Quindi più simbolicamente, saremmo scriviamo quella linea come

  

delta [j] = f '(activation_j) * (t_j - o_j)

dove f è la funzione di trasferimento, e f' è la derivata prima di esso.

Più indietro negli strati nascosti, l'errore in un nodo è il suo contributo stimato per gli errori trovati al livello successivo. Così i delta del strato successivo vengono moltiplicati per i pesi di collegamento, e questi prodotti vengono sommati. Tale somma è moltiplicato per la derivata prima della attivazione del nodo nascosto per ottenere il delta di un nodo nascosto, o

  

delta [j] = f '(activation_j) * Somma (delta [k] * w_jk)

dove j ora fa riferimento a un nodo nascosto e k un nodo in uno strato successivo.

Altri suggerimenti

(t-o) è l'errore in uscita della rete dal t è l'uscita di destinazione e o rappresenta l'uscita effettiva. Esso viene memorizzato in forma normalizzata nella matrice delta. Il metodo utilizzato per normalizzare dipende l'attuazione e il o * ( 1.0 - o ) sembra fare che (potrei sbagliarmi su questo assunto).

Questo errore normalizzato viene accumulato per l'intero set di formazione per giudicare quando la formazione è completa:. Di solito quando errsum è al di sotto di una certa soglia di destinazione

In realtà, se conosci la teoria, i programmi dovrebbero essere facili da capire.Puoi leggere il libro ed eseguire alcuni semplici esempi utilizzando a matita per capire il passaggi esatti di propagazione.Questo è un principio generale per l'implementazione dei programmi numerici, è necessario conoscere i dettagli nei casi più piccoli.

Se conosci Matlab, ti suggerisco di leggere del codice sorgente Matlab (ad es. Qui), che è più facile da comprendere rispetto a C.

Per il codice nella tua domanda, i nomi sono abbastanza autoesplicativi, l'output potrebbe essere l'array della tua previsione, target potrebbe essere l'array di etichette di addestramento, delta è l'errore tra previsione e valori veri, serve anche come valore per essere aggiornato nel vettore dei pesi.

Essenzialmente, ciò vuol backprop viene eseguito rete ai dati di addestramento, osservare l'uscita, quindi regolare i valori dei nodi, passando dai nodi di uscita ritorna all'ingresso nodi iterativamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top