Riesco a vedere due motivi per usare i gradienti sintetici in RNN:
- Per accelerare l'allenamento, correggendo immediatamente ogni strato con gradiente previsto
- 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