In che modo la discesa del gradiente minibatch aggiorna i pesi per ciascun esempio in un batch?


12

Se elaboriamo diciamo 10 esempi in un batch, capisco che possiamo sommare la perdita per ogni esempio, ma come funziona la backpropagation per quanto riguarda l'aggiornamento dei pesi per ogni esempio?

Per esempio:

  • Esempio 1 -> perdita = 2
  • Esempio 2 -> perdita = -2

Ciò si traduce in una perdita media di 0 (E = 0), quindi come si aggiorna ogni peso e converge? È semplicemente attraverso la randomizzazione dei lotti che "speriamo" convergano prima o poi? Inoltre, questo non calcola solo il gradiente per il primo set di pesi per l'ultimo esempio elaborato?

Risposte:


15

La discesa a gradiente non funziona esattamente come hai suggerito, ma può verificarsi un problema simile.

Non calcoliamo la perdita media dal batch, calcoliamo i gradienti medi della funzione di perdita. I gradienti sono la derivata della perdita rispetto al peso e in una rete neurale il gradiente per un peso dipende dagli input di quello specifico esempio e dipende anche da molti altri pesi nel modello.

Se il tuo modello ha 5 pesi e hai una dimensione mini-batch di 2, potresti ottenere questo:

gradienti=(1.5,-2.0,1.1,0.4,-0.9)

gradienti=(1.2,2.3,-1.1,-0.8,-0.7)

(1.35,0.15,0,-0.2,-0.8)

0

modifica in risposta ai commenti:

KLiowj

Lwj=1KΣio=1KLiowj

Il codice tutorial collegato nei commenti utilizza Tensorflow per ridurre al minimo la perdita media.

1KΣio=1KLio

Per minimizzare ciò, calcola i gradienti della perdita media rispetto a ciascun peso e usa la pendenza-gradiente per aggiornare i pesi:

Lwj=wj1KΣio=1KLio

La differenziazione può essere introdotta all'interno della somma, quindi è uguale all'espressione dell'approccio nel mio esempio.

wj1KΣio=1KLio=1KΣio=1KLiowj


Gotcha. Vorresti comunque fare una media della perdita su batch_size corretta? Non sono sicuro che tu abbia familiarità con tensorflow, ma ho cercato di conciliare la mia comprensione con questo tutorial: tensorflow.org/get_started/mnist/beginners Puoi vedere che la perdita è mediata sul batch (codice reduce_mean). Suppongo che tensorflow mantenga un conteggio interno / medie dei pesi?
carboncuted

1
@carboncomputed Oh sì, hai ragione, fanno la media della perdita in modo che quando Tensorflow calcola i gradienti della perdita media stia effettivamente calcolando la media dei gradienti per ogni perdita. Modificherò la mia risposta per mostrare la matematica per questo.
Hugh,

Interessante. Grazie per il chiarimento. Quindi, solo per scavare un po 'più a fondo, i gradienti di peso vengono calcolati per esempio durante il passaggio in avanti e memorizzati o vengono calcolati durante il processo di ottimizzazione in tensorflow? Suppongo che mi manchi solo "dove" sono questi gradienti in tensorflow? Vedo il passaggio in avanti e la perdita, quindi tensorflow sta facendo questi calcoli del gradiente / media sotto il cofano per me?
carbon computato il

1
@carboncomputed Questo è il fascino di Tensorflow, usa la matematica simbolica e può fare la differenziazione sotto il cofano
Hugh

Grazie per una risposta chiara. Tuttavia, non sono riuscito a capire come TF sa come eseguire il propagano con una perdita media, come mostrato in questo esempio , code line 170?
peccatore

-1

La ragione per usare i mini batch è quella di avere una buona quantità di esempi di allenamento in modo tale che il possibile rumore sia ridotto calcolando la media dei loro effetti, ma non è un batch completo che per molti set di dati potrebbe richiedere un'enorme quantità di memoria. Un fatto importante è che l'errore che si valuta è sempre una distanzatra l'output previsto e l'output reale: ciò significa che non può essere negativo, quindi non puoi avere, come hai detto, un errore di 2 e -2 che si annulla, ma diventerebbe invece un errore di 4 Quindi si valuta il gradiente dell'errore rispetto a tutti i pesi, in modo da poter calcolare quale cambiamento nei pesi lo ridurrebbe maggiormente. Una volta fatto ciò, fai un "passo" in quella direzione, in base all'entità del tuo tasso di apprendimento alfa. (Questi sono i concetti di base, non entrerò nei dettagli sulla backpropagation per NN profonda) Dopo aver eseguito questo training sul set di dati per un certo numero di epoche, puoi aspettarti che la tua rete converga se il tuo passo di apprendimento non è troppo grande per farlo divergere. Potresti comunque finire con un minimo locale, questo può essere evitato inizializzando in modo diverso i tuoi pesi, usando diversi ottimizzatori e cercando di regolarizzare.


Solo per aggiungere: usiamo i mini-batch principalmente per l'efficienza computazionale. Abbiamo un compromesso tra accuratezza della discesa e frequenza dei pesi di aggiornamento. I dati devono essere estremamente grandi per non adattarsi alla memoria.
Łukasz Grad

Capisco ciascuno di essi, ma come possiamo aggiornare i nostri pesi per un batch specifico? I gradienti di peso sono anche sommati per ogni esempio?
carbon computato il

No, esiste un solo gradiente, che è un vettore di derivati, sull'errore batch totale. Ciò significa che aggiorniamo una volta che i nostri pesi si basano sul gradiente, ovvero la direzione dell'aggiornamento che fa diminuire maggiormente l'errore su questo mini batch. Il gradiente è costituito da derivate parziali, ovvero la derivata dell'errore mini batch rispetto a ciascun peso: questo ci dice se ogni peso dovrebbe diventare più piccolo o più grande e quanto. Tutti i pesi ottengono un aggiornamento per batch, per ridurre l'errore su quel mini batch, che è indipendente da altri mini batch.
dante,
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.