Gradienti sintetici: qual è il vantaggio pratico?


8

Riesco a vedere due motivi per usare i gradienti sintetici in RNN:

  1. Per accelerare l'allenamento, correggendo immediatamente ogni strato con gradiente previsto
  2. Essere in grado di apprendere sequenze più lunghe

Vedo problemi con entrambi. Tieni presente che mi piacciono molto i gradienti sintetici e vorrei implementarli. Ma devo capire dove la mia scia di pensiero non è corretta.

Ora mostrerò perché il punto 1 e il punto 2 non sembrano essere utili e ho bisogno che tu mi corregga, se sono effettivamente utili:


Punto 1:

I gradienti sintetici ci dicono che possiamo fare affidamento su un'altra "mini-helper-network" (chiamata DNI) per avvisare il nostro attuale livello su quali gradienti arriveranno dall'alto, anche durante il futuro prop.

Tuttavia, tali gradienti arriveranno solo diverse operazioni in seguito. La stessa quantità di Backprop dovrà essere eseguita senza DNI, tranne per il fatto che ora dobbiamo anche addestrare il nostro DNI.

L'aggiunta di questa asincronizzazione non dovrebbe far sì che i layer si allenino più velocemente rispetto alla tradizionale sequenza "bloccata" full fwdprop -> full back prop, poiché il dispositivo deve eseguire lo stesso numero di calcoli. È solo che i calcoli verranno fatti scorrere in tempo

Questo mi fa pensare che il punto 1) non funzionerà. La semplice aggiunta di SG tra ogni livello non dovrebbe migliorare la velocità di allenamento.

Punto 2:

Ok, che ne dici di aggiungere SG solo sull'ultimo livello per prevedere "gradiente dal futuro" e solo se è il timestep finale durante il prop di andata .

In questo modo, anche se il nostro LSTM deve smettere di prevedere e deve retropropagare, può comunque prevedere il gradiente futuro che avrebbe ricevuto (con l'aiuto di DNI seduto sull'ultimo timestep).


Prendi in considerazione diverse sessioni di allenamento (sessione A, sessione B):

fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ----> stop e bkprop!

fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ----> stop e bkprop!

Abbiamo appena costretto la nostra rete a "analizzare" 6 timestep in due metà: 3 timestep, quindi ancora 3 timestep rimanenti.

Notate, abbiamo il nostro DNI seduto alla fine della "Sessione A" e predicendo "quale gradiente mi farebbe fluire dall'inizio della Sessione B (dal futuro)". Per questo motivo, timestep_3A sarà dotato del gradiente "che sarebbe venuto da timestep_1B", quindi le correzioni apportate durante A saranno più affidabili.

Ma hey! Questi previsti "gradienti sintetici" saranno molto piccolo (trascurabile) in ogni caso - dopo tutto, è per questo che iniziamo un nuovo backprop sessione di B . Se non fossero troppo piccoli, analizzeremmo tutti e 6 i timestep in una singola "sessione A" bkprop lunga.

Quindi penso che anche il punto 2) non dovrebbe dare benefici. L'aggiunta di SG all'ultimo timestep di fwdprop consente di allenare efficacemente sequenze più lunghe, ma i gradienti di fuga non sono andati da nessuna parte.


Ok. Forse possiamo trarre vantaggio dall'allenamento "sessione A" , "sessione B" ecc. Su macchine separate? Ma allora come è diverso semplicemente allenarsi con i soliti minibatch in parallelo? Ricorda, è stato menzionato al punto 2: le cose sono peggiorate dalla sessione A, prevedendo gradienti che stanno svanendo comunque.

Domanda: Per favore, aiutami a capire i vantaggi del Gradiente sintetico, perché i 2 punti sopra non sembrano essere utili


Perché pensi che questo non accelererà l'allenamento? L'unica giustificazione che vedo è la semplice affermazione che questo "non dovrebbe migliorare la velocità di allenamento" ma non fornisci il tuo ragionamento. Inoltre non è chiaro cosa intendi per "passaggio 1)" poiché non hai descritto alcun passaggio nella domanda. In ogni caso, il documento dimostra che fornisce accelerazioni. I dati battono la teoria ogni giorno. Hai letto il giornale?
DW,

I dati battono la teoria ogni giorno, sono d'accordo, ma il miglior esempio di contatore che posso fare è GPU vs CPU. Ovunque la gente continua a dire che la GPU esegue ordini di grandezza più velocemente della CPU e fornisce confronti. Tuttavia, una CPU multithread correttamente codificata è solo 2-3 volte più lenta della sua stessa GPU di categoria ed è più economica della GPU. larsjuhljensen.wordpress.com/2011/01/28/… Ancora una volta, non vado contro i gradienti sintetici, - sembrano fantastici, è solo fino a quando non avrò la risposta al mio post, non sarò in grado di riposare: D
Kari,

Non sono sicuro che un post di 7 anni su BLAST sia terribilmente rilevante qui.
DW,

Quello che sto cercando di dire è "ci sono modi per far sembrare il parallelismo migliore di quello che potrebbe effettivamente essere", in qualsiasi scenario
Kari,

Risposte:


2

Ma hey! Questi "gradienti sintetici" previsti saranno comunque molto piccoli (trascurabili) - dopotutto, ecco perché iniziamo una nuova sessione di backprop B. Se non fossero troppo piccoli, analizzeremmo tutti e 6 i timestep in una singola sessione di bkprop lungo " ".

-Non è necessariamente corretto. Generalmente tronciamo e avviamo un nuovo backprop a causa di vincoli hardware, come la memoria o la velocità computazionale. Il gradiente di sparizione può essere migliorato con altri mezzi, come la normalizzazione del gradiente: ridimensionare il vettore gradiente se diventa troppo piccolo oltre determinati livelli o ridimensionare se sta per esplodere. O anche usando la normalizzazione batch


È importante capire come aggiornare qualsiasi modulo DNI. Per chiarire le cose, considera un esempio di rete con più livelli e 3 moduli DNI:

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

Il DNI_0 è sempre allenato con un gradiente sintetico che arriva da DNI_3 (che scorre attraverso Layer_2 e ovviamente Layer_1), collocando ulteriormente diversi strati.

Allo stesso modo, DNI_3 è sempre allenato con un gradiente sintetico che arriva da DNI_5

DNI_0 o DNI_3 non vedranno mai il gradiente vero, perché il grad vero viene consegnato solo a DNI_5 e non prima.

Per chiunque abbia ancora difficoltà a capirli, leggi questo fantastico post sul blog , parte 3

I livelli precedenti dovranno accontentarsi di gradienti sintetici, perché loro o il loro DNI non assisteranno mai al "gradiente reale".


Per quanto riguarda l'allenamento in parallelo con i minibatch anziché il parallelismo tramite i laureati sintetici:

Le sequenze più lunghe sono più precise dei minibatch, tuttavia i minibatch aggiungono un effetto di regolazione . Ma, data una tecnica per impedire l'esplosione o la sparizione del gradiente, l'allenamento di sequenze più lunghe può fornire una visione molto migliore del contesto del problema. Questo perché la rete genera l'output dopo aver considerato una sequenza più lunga di input, quindi il risultato è più razionale.

Per il confronto dei vantaggi concessi da SG fare riferimento ai diagrammi a pagina 6 del documento , potendo principalmente risolvere sequenze più lunghe, che ritengo più vantaggiose (possiamo già parallelizzare comunque tramite i minibatch, e quindi SG non dovrebbe accelerare il processo quando eseguito sulla stessa macchina, anche se in effetti propaghiamo solo fino al DNI successivo).


Tuttavia, più moduli DNI abbiamo, più rumoroso dovrebbe essere il segnale. Quindi potrebbe valere la pena allenare i livelli e il DNI tutti dal backprop legacy, e solo dopo che sono trascorse alcune epoche iniziamo a utilizzare il bootstrap DNI discusso sopra.

In questo modo, il primo DNI acquisirà almeno un senso di cosa aspettarsi all'inizio dell'allenamento. Questo perché i seguenti DNI non sono sicuri di come appaia il vero gradiente, quando inizia l'allenamento, quindi inizialmente consiglieranno il gradiente "immondizia" a chiunque sia seduto prima di loro.

Non dimenticare che gli autori hanno anche sperimentato la previsione degli input effettivi per ogni livello.


Se i tuoi layer hanno backprop costosi (forse hai la normalizzazione in batch o alcune funzioni di attivazione fantasiose), la correzione con DNI potrebbe essere molto più economica, una volta sufficientemente addestrata. Ricorda solo che DNI non è gratuito: richiede la moltiplicazione della matrice e probabilmente non fornirà molta velocità su un semplice strato denso.


I minibatch ci velocizzano (tramite la parallelizzazione) e ci danno anche la regolarizzazione. I gradienti sintetici ci consentono di dedurre meglio lavorando con sequenze più lunghe e un gradiente (potenzialmente) meno costoso. Tutti insieme questo è un sistema molto potente.


0

I gradienti sintetici rendono l'allenamento più veloce, non riducendo il numero di epoche necessarie o accelerando la convergenza della discesa del gradiente, ma piuttosto rendendo ogni epoca più veloce da calcolare. Il gradiente sintetico è più veloce da calcolare rispetto al gradiente reale (calcolare il gradiente sintetico è più veloce della backpropagation), quindi ogni iterazione della discesa del gradiente può essere calcolata più rapidamente.


Da quanto ho capito, nel tempo i gradienti non dovrebbero raggiungere il DNI più velocemente, è solo che ora sono fatti scorrere nel tempo e calcolati in modo asincrono mentre si sta verificando l'elica in avanti. Il DNI dovrà ancora ottenere il vero gradiente di allenarsi in sé . Pertanto, i gradienti sintetici dovrebbero richiedere lo stesso numero di calcoli da eseguire in parallelo rispetto a quelli con BPTT standard. È corretto?
Kari,

Quindi non ci sarebbe alcun aumento di velocità semplicemente introducendo la SG tra i livelli. Sì, otteniamo il gradiente previsto immediato dal DNI, ma per ciascuno di questi pronostici dovremo eventualmente pagare il prezzo con la propagazione asincrona del terzino verso quel DNI, un po 'più tardi
Kari

@Kari, no, non mi sembra giusto. Se hai bisogno dello stesso numero di iterazioni, ma ora ogni iterazione richiede lo stesso 50% di tempo in meno sulla GPU, quindi il calcolo risultante verrà eseguito in precedenza. Anche se hai bisogno del 10% in più di iterazioni / epoche (perché i gradienti sono ritardati o i gradienti sintetici non corrispondono perfettamente ai gradienti effettivi), è comunque una vittoria: l'accelerazione di poter calcolare il gradiente sintetico più velocemente del gradiente reale supera gli altri effetti. Sembri sicuro che questo non possa aiutare, ma i dati nel documento mostrano che aiuta.
DW,

Hm, beh per esempio, abbiamo 4 strati seduti dopo il nostro DNI; Nel backprop normale, avremmo 4 scambi "forward" tra i layer, e quindi 4 "scambi backward", e mentre ciò si verifica il sistema è bloccato. Con DNI possiamo correggere subito i nostri pesi, ma in seguito avremo bisogno di gradienti reali, ma ora il sistema non è bloccato, permettendo nel frattempo che passino più passaggi in avanti. Ma dobbiamo ancora il vero gradiente di prima, al nostro DNI ... Per ottenere e consegnare questo gradiente al DNI ci vorrà il 100% del tempo (stessi 4 passi avanti, stessi 4 passi indietro).
Kari,

È solo che il nostro DNI dice "bene, dagli quando possibile, in seguito", ma dobbiamo comunque pagare l'intero prezzo, quindi non vedo l'aumento delle prestazioni. Sono d'accordo, i documenti mostrano grandi risultati, ma come mai? Siamo già in grado di addestrare mini-parallel in parallelo comunque: /
Kari
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.