L'addestramento delle reti neurali viene svolto uno a uno? [duplicare]


9

Sto cercando di imparare le reti neurali guardando questa serie di video e implementando una semplice rete neurale in Python.

Ecco una delle cose che mi chiedo: sto addestrando la rete neurale sui dati di esempio e ho 1.000 campioni. L'addestramento consiste nel modificare gradualmente pesi e distorsioni per far sì che la funzione di costo comporti un costo inferiore.

La mia domanda: dovrei cambiare i pesi / i pregiudizi su ogni singolo campione prima di passare al campione successivo, oppure dovrei prima calcolare le modifiche desiderate per l'intero lotto di 1.000 campioni e solo allora iniziare ad applicarle alla rete?

Risposte:


9

Dovrei cambiare i pesi / i pregiudizi su ogni singolo campione prima di passare al campione successivo,

Puoi farlo, si chiama discesa gradiente stocastica (SGD) e in genere mescolerai il set di dati prima di esaminarlo ogni volta.

o dovrei prima calcolare le modifiche desiderate per l'intero lotto di 1.000 campioni e solo allora iniziare ad applicarle alla rete?

Puoi farlo, si chiama discendenza gradiente batch o in alcuni casi (specialmente nelle risorse più vecchie) appena assunto come approccio normale e chiamato discendenza gradiente.

Ogni approccio offre vantaggi e svantaggi. In generale:

  • SGD effettua prima ogni aggiornamento in termini di quantità di dati che sono stati elaborati. Quindi potresti aver bisogno di meno epoche prima di convergere su valori ragionevoli.

  • SGD esegue più elaborazioni per campione (perché si aggiorna più frequentemente), quindi è anche più lento nel senso che ci vorrà più tempo per elaborare ciascun campione.

  • SGD può trarre meno vantaggio dalla parallelizzazione, poiché i passaggi di aggiornamento indicano che è necessario eseguire ogni elemento di dati in serie (poiché i pesi sono cambiati e i risultati di errore / gradiente vengono calcolati per un set specifico di pesi).

  • I singoli passi della SGD in genere fanno solo ipotesi molto approssimative ai gradienti corretti per modificare i pesi. Questo è sia uno svantaggio (le prestazioni della NN rispetto all'obiettivo sul set di allenamento possono diminuire che aumentare) e un vantaggio (c'è meno probabilità di rimanere bloccati in un punto fermo locale a causa del "jitter" che causano queste differenze casuali).

Quello che succede in pratica è che la maggior parte dei software consente di scendere a compromessi tra l'elaborazione batch e l'elaborazione a campione singolo, per cercare di ottenere le migliori prestazioni e aggiornare le caratteristiche. Questo si chiama elaborazione mini-batch, che comporta:

  • Mescolare il set di dati all'inizio di ogni epoca.

  • Lavorando attraverso i dati mescolati, N elementi per volta in cui N potrebbe variare da forse 10 a 1000, a seconda del problema e di eventuali vincoli sull'hardware. Una decisione comune è quella di elaborare la dimensione batch più grande che l'accelerazione GPU consente di eseguire in parallelo.

  • Calcola l'aggiornamento richiesto per ogni piccolo batch, quindi applicalo.

Questo è oggigiorno il metodo di aggiornamento più comune che la maggior parte delle librerie di reti neurali presume e accetterà quasi universalmente un parametro di dimensione batch nell'API di training. La maggior parte delle librerie chiamerà comunque semplici ottimizzatori che lo fanno SGD; tecnicamente è vero, i gradienti calcolati sono ancora in qualche modo casuali a causa del non utilizzo dell'intero batch, ma potresti trovare questa discesa del gradiente mini-batch in alcuni documenti più vecchi.


"Una decisione comune è quella di elaborare la massima dimensione batch che l'accelerazione GPU consente di eseguire in parallelo." Come lo determini? Non ho visto alcuna risorsa in cui possa essere commentato quando la dimensione del batch è appena sufficiente per il parallelismo di picco
DuttaA


Una domanda simile è stata posta prima su questo sito Web. Penso anche che sia un duplicato (anche se da un'altra prospettiva leggermente). Vedi: ai.stackexchange.com/q/11667/2444 .
nbro

"Una decisione comune è quella di elaborare la dimensione batch più grande che l'accelerazione GPU consente di eseguire in parallelo." - Ce l'hai al contrario! La prima euristica consiste nell'elaborare la dimensione minima del mini-batch che si traduce in prestazioni accettabili. Con molti modelli, tuttavia, si raggiungono i limiti di memoria prima di saturare l'efficienza hardware, quindi si finisce per eseguire il modello più grande che si adatta alla RAM. In genere, tuttavia, lotti di dimensioni inferiori trovano minimi migliori poiché mostrano una maggiore stocastica. Un avvertimento è che la norma del lotto si rompe con lotti molto piccoli.
Aleksandr Dubinsky,

@AleksandrDubinsky RAM è hardware.
DuttaA

0

Idealmente, è necessario aggiornare i pesi esaminando tutti i campioni nel set di dati. Questo è chiamato come Discendente gradiente discendente . Ma, come il no. di esempi di allenamento aumenta, il calcolo diventa enorme e l'allenamento sarà molto lento. Con l'avvento del deep learning, la dimensione dell'allenamento è in milioni e il calcolo usando tutti gli esempi di allenamento è molto poco pratico e molto lento.

È qui che sono diventate importanti due tecniche di ottimizzazione.

  1. Discesa gradiente mini-batch
  2. Discesa gradiente stocastica (SGD)

Nella discesa gradiente mini-lotto, si utilizza una dimensione del lotto notevolmente inferiore al totale no. di esempi di allenamento e aggiornamento dei pesi dopo aver superato questi esempi.

Nella discesa gradiente stocastica, si aggiornano i pesi dopo aver superato ogni esempio di allenamento.

Venendo a vantaggi e svantaggi dei tre metodi che abbiamo discusso.

  • La discesa gradiente in serie converge gradualmente al minimo globale, ma è lenta e richiede un'enorme potenza di calcolo.

  • La discesa stocastica del gradiente converge rapidamente ma non al minimo globale, converge da qualche parte vicino al minimo globale e si aggira attorno a quel punto, ma non converge mai al minimo globale. Ma il punto di convergenza nella discesa del gradiente stocastico è abbastanza buono per tutti gli scopi pratici.

  • Il gradiente mini-batch è un compromesso tra i due metodi precedenti. Ma se hai un'implementazione vettoriale dell'aggiornamento dei pesi e ti
    stai allenando con una configurazione multi-core o inviando l'allenamento a
    più macchine, questo è il metodo migliore sia in termini di tempo per l'allenamento che di convergenza al minimo globale.

È possibile tracciare la funzione di costo, scrivere il no. delle iterazioni per comprendere la differenza tra convergenza in tutti e 3 i tipi di discesa del gradiente.

  • La trama discendente del gradiente discendente cade uniformemente e lentamente e si stabilizza e arriva al minimo globale.

  • Il diagramma di discesa gradiente stocastico avrà oscillazioni, cadrà rapidamente ma si aggira attorno al minimo globale.

Questi sono alcuni blog in cui vi è una spiegazione dettagliata di vantaggi, svantaggi di ciascun metodo e anche grafici su come cambia la funzione di costo per tutti e tre i metodi con iterazioni.

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

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.