Domanda

Aggiornamento:una migliore formulazione della questione.

Sto cercando di comprendere l'algoritmo di backpropagation con una rete neurale XOR come esempio.In questo caso ci sono 2 neuroni di input + 1 bias, 2 neuroni nello strato nascosto + 1 bias e 1 neurone di output.

 A   B  A XOR B
 1    1   -1
 1   -1    1
-1    1    1
-1   -1   -1

A sample XOR neural network
(fonte: wikimedia.org)

sto usando propagazione stocastica all'indietro.

Dopo aver letto un po' di più ho scoperto che l'errore dell'unità di output si propaga agli strati nascosti...inizialmente questo creava confusione, perché quando si arriva allo strato di input della rete neurale, ogni neurone riceve una correzione dell'errore da entrambi i neuroni nello strato nascosto.In particolare, il modo in cui è distribuito l’errore è inizialmente difficile da comprendere.

Passo 1 calcolare l'output per ciascuna istanza di input.
Passo 2 calcolare l'errore tra il/i neurone/i di output (nel nostro caso ce n'è solo uno) e il/i valore/i target:
Step 2
Passaggio 3 utilizziamo l'errore del passaggio 2 per calcolare l'errore per ciascuna unità nascosta h:
Step 3

Il "peso kh" è il peso tra l'unità nascosta h e l'unità di output k, beh questo crea confusione perché l'unità di input non ha un peso diretto associato all'unità di output.Dopo aver fissato la formula per alcune ore, ho iniziato a pensare a cosa significhi la sommatoria e sto iniziando a giungere alla conclusione che il peso di ciascun neurone di input che si collega ai neuroni dello strato nascosto viene moltiplicato per l'errore di output e sommato .Questa è una conclusione logica, ma la formula sembra un po' confusa poiché indica chiaramente il "peso kh" (tra lo strato di output k e lo strato nascosto h).

Ho capito tutto correttamente qui?Qualcuno può confermarlo?

Qual è O(h) dello strato di input?La mia comprensione è che ogni nodo di input ha due output:uno che entra nel primo nodo dello strato nascosto e uno che entra nel secondo strato nascosto del nodo.Quale delle due uscite deve essere collegata a O(h)*(1 - O(h)) parte della formula?
Step 3

È stato utile?

Soluzione

Il tutorial che hai pubblicato qui in realtà lo fa in modo sbagliato.L'ho ricontrollato confrontandolo con i due libri standard di Bishop e con due delle mie implementazioni funzionanti.Di seguito indicherò dove esattamente.

Una cosa importante da tenere a mente è che stai sempre cercando le derivate della funzione di errore rispetto a un'unità o un peso.I primi sono i delta, il secondo è ciò che usi per aggiornare i tuoi pesi.

Se vuoi comprendere la propagazione inversa, devi comprendere la regola della catena.Qui è tutta una questione di regola della catena.Se non sai come funziona esattamente, controlla su Wikipedia: non è così difficile.Ma non appena si comprendono le derivazioni, tutto va a posto.Promettere!:)

∂E/∂W può essere composto in ∂E/∂o ∂o/∂W tramite la regola della catena.∂o/∂W si calcola facilmente, poiché è proprio la derivata dell'attivazione/produzione di un'unità rispetto ai pesi.∂E/∂o è in realtà ciò che chiamiamo delta.(Sto presupponendo che E, o e W siano vettori/matrici qui)

Li abbiamo per le unità di output, poiché è lì che possiamo calcolare l'errore.(Per lo più abbiamo una funzione di errore che si riduce al delta di (t_k - o_k), ad esempio per la funzione di errore quadratico nel caso di output lineari e di entropia incrociata nel caso di output logistici.)

La domanda ora è: come otteniamo i derivati ​​per le unità interne?Bene, sappiamo che l'output di un'unità è la somma di tutte le unità in entrata pesate dai loro pesi e dalla successiva applicazione di una funzione di trasferimento.Quindi o_k = f(sum(w_kj * o_j, per tutti j)).

Quindi quello che facciamo è derivare o_k rispetto a o_j.Poiché delta_j = ∂E/∂o_j = ∂E/∂o_k ∂o_k/∂o_j = delta_k ∂o_k/o_j.Quindi, dato delta_k, possiamo calcolare delta_j!

Facciamolo.o_k = f(sum(w_kj * o_j, per tutti j)) => ∂o_k/∂o_j = f'(sum(w_kj * o_j, per tutti j)) * w_kj = f'(z_k) * w_kj.

Nel caso della funzione di trasferimento sigmoidale, questa diventa z_k(1 - z_k) * w_kj.(Ecco l'errore nel tutorial, l'autore dice o_k(1 - o_k) * w_kj!)

Altri suggerimenti

Non sono sicuro di ciò che la vostra domanda è, ma Io sono andato attraverso questo tutorial di me e vi posso assicurare, che non sia un ovvio errore di battitura, non c'è nulla di scorretto su di esso.

I farà l'ipotesi che la tua domanda è perché siete confusi su come il backpropagation nascosto delta è derivato. Se questa è davvero la tua domanda allora perche

alt text
(fonte: pandamatak.com )

Probabilmente si sta confuso su come l'autore deriva questa equazione. Questo è in realtà una semplice applicazione della regola della catena multivariata. Vale a dire, (Quello che segue è tratto da wikipedia )

"Supponiamo che ogni argomento di z = f (u, v) è una funzione di due variabili tale che u = H (x, y) e V = g (x, y), e che queste funzioni sono tutti differenziabile . Poi la regola della catena sarà simile:

alt text

alt text "

Ora immaginate che si estende la regola della catena da un argomento ad induzione a

E (z ' 1 , z' 2 , .., z ' n ) dove z ' k è l'uscita dello strato di uscita kth pre-attivazione, e z ' k (w ji ), vale a dire che E è una funzione della z' z' stessa è una funzione di w ji (se questo non ha senso per voi in un primo momento pensare con molta attenzione su come un NN è stato configurato.) Applicando la regola della catena direttamente estesa a n variabili:

AE (z ' 1 , z' 2 , .., z ' n ) / < sub> AW ji = Σ k AE / Az ' k Az ' k / AW ji

che è il passo più importante, l'autore applica la regola della catena, questa volta all'interno della somma per espandere il Az ' k / AW < sub> ji termine, che è

Az ' k / AW ji = Az' k / δo j δo j / Az j Az j / AW ji .

Se avete difficoltà a capire la regola della catena, potrebbe essere necessario fare un corso sul calcolo multivariato, o leggere un tale sezione in un libro di testo.

In bocca al lupo.

Quello che ho letto dall'equazione Fase 3 è il seguente:

  1. O_h = ultima uscita di questa unità nascosta (O_h sullo strato ingresso è il valore di ingresso effettivo)
  2. w_kh = peso di collegamento tra l'unità nascosta e un'unità dello strato successivo (verso uscita)
  3. delta_k = errore di unità dello strato successivo (verso l'uscita, stessa unità come punto precedente)

Ogni unità ha una sola uscita, ma ogni collegamento tra l'uscita e il successivo strato è ponderata. Quindi l'uscita è lo stesso, ma sul lato di ricezione, ogni unità riceverà un valore diverso se il peso dei collegamenti è differente. O_h si riferisce sempre al valore di questo neurone per l'ultima iterazione. Errore non si applica a livello di input, come per definizione, l'ingresso non ha alcun 'errore' di per sé.

L'errore deve essere calcolato strato per strato, partendo dal lato di uscita, poiché occorre i valori di errore di livello N + 1 a strato calcolare N. Hai ragione, non v'è alcuna connessione diretta tra ingresso e uscita in backpropagation .

Credo che l'equazione è corretta, se controintuitivo. Ciò che è probabilmente confusione è che nella propagazione in avanti per ogni unità dobbiamo considerare tutte le unità e link sulla sinistra dell'unità (valori di input), ma per la propagazione degli errori (backpropagation) era necessario prendere in considerazione le unità a destra (in uscita valore) dell'unità in lavorazione.

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