RNN: quando applicare BPTT e / o aggiornare i pesi?


15

Sto cercando di capire l'applicazione ad alto livello di RNN per l'etichettatura in sequenza tramite (tra gli altri) il documento di Graves del 2005 sulla classificazione dei fonemi.

Riassumendo il problema: disponiamo di un ampio set di formazione costituito da file audio (di input) di singole frasi e orari di inizio, output e etichette con etichetta di esperti (output) per singoli fonemi (inclusi alcuni fonemi "speciali" come silenzio, in modo tale che ogni campione in ogni file audio sia etichettato con un simbolo di fonema.)

La spinta del foglio è applicare a questo problema un RNN con celle di memoria LSTM nello strato nascosto. (Applica diverse varianti e diverse altre tecniche come confronto. Per il momento sono SOLO interessato all'LSTM unidirezionale, per semplificare le cose.)

Credo di comprendere l'architettura della rete: un livello di input corrispondente a 10 ms di finestre dei file audio, preelaborato in modo standard rispetto all'audio; uno strato nascosto di celle LSTM e uno strato di output con una codifica a caldo di tutti i possibili 61 simboli del telefono.

Credo di comprendere le equazioni (complesse ma semplici) del passaggio in avanti e del passaggio all'indietro attraverso le unità LSTM. Sono solo calcolo e la regola della catena.

Ciò che non capisco, dopo aver letto più volte questo articolo e molti altri simili, è quando applicare esattamente l'algoritmo di backpropagation e quando aggiornare esattamente i vari pesi nei neuroni.

Esistono due metodi plausibili:

1) Backprop e aggiornamento a livello di frame

Load a sentence.  
Divide into frames/timesteps.  
For each frame:
- Apply forward step
- Determine error function
- Apply backpropagation to this frame's error
- Update weights accordingly
At end of sentence, reset memory
load another sentence and continue.

o,

2) Backprop e aggiornamento frase-saggio:

Load a sentence.  
Divide into frames/timesteps.  
For each frame:
- Apply forward step
- Determine error function
At end of sentence:
- Apply backprop to average of sentence error function
- Update weights accordingly
- Reset memory
Load another sentence and continue.

Si noti che questa è una domanda generale sull'allenamento RNN usando il documento Graves come esempio appuntito (e personalmente rilevante): Quando si allena RNN su sequenze, il backprop viene applicato ad ogni momento? I pesi sono regolati ad ogni intervallo di tempo? Oppure, in un'analogia libera con l'addestramento in lotti su architetture strettamente feed-forward, gli errori vengono accumulati e calcolati in media su una sequenza particolare prima che vengano applicati gli aggiornamenti di backprop e di peso?

O sono ancora più confuso di quanto pensi?

Risposte:


25

Presumo che stiamo parlando di reti neurali ricorrenti (RNN) che producono un output in ogni momento (se l'output è disponibile solo alla fine della sequenza, ha senso eseguire backprop alla fine). Gli RNN in questa impostazione sono spesso addestrati usando la backpropagation troncata nel tempo (BPTT), operando in sequenza su 'blocchi' di una sequenza. La procedura è simile alla seguente:

  1. Forward forward: passa attraverso i successivi time step, calcolando gli stati di input, nascosto e output.k1
  2. Calcola la perdita, riepilogata nelle fasi temporali precedenti (vedi sotto).
  3. Passaggio all'indietro: calcola il gradiente della perdita rispetto a tutti i parametri, accumulandosi nei precedenti passi temporali (ciò richiede di aver memorizzato tutte le attivazioni per questi passi temporali). Clip gradients per evitare il problema del gradiente di esplosione (succede raramente).k2
  4. Parametri di aggiornamento (ciò si verifica una volta per blocco, non in modo incrementale ad ogni passaggio temporale).
  5. Se si elaborano più blocchi di una sequenza più lunga, memorizzare lo stato nascosto nell'ultima fase (verrà utilizzato per inizializzare lo stato nascosto per l'inizio del blocco successivo). Se abbiamo raggiunto la fine della sequenza, reimposta la memoria / lo stato nascosto e passa all'inizio della sequenza successiva (o all'inizio della stessa sequenza, se ce n'è solo una).
  6. Ripetere dal passaggio 1.

Come viene sommata la perdita dipende da e . Ad esempio, quando , la perdita viene sommata negli ultimi intervalli di tempo, ma la procedura è diversa quando (vedere Williams e Peng 1990).k 2 k 1 = k 2 k 1 = k 2 k 2 > k 1k1k2k1=k2k1=k2k2>k1

Il calcolo e gli aggiornamenti della pendenza vengono eseguiti ogni passaggi temporali perché è più economico dal punto di vista computazionale rispetto all'aggiornamento in ogni passaggio. L'aggiornamento più volte per sequenza (ovvero l'impostazione di meno della lunghezza della sequenza) può accelerare l'allenamento perché gli aggiornamenti del peso sono più frequenti.k 1k1k1

La backpropagation viene eseguita solo per fasi temporali perché è computazionalmente più economica rispetto alla propagazione all'inizio della sequenza (che richiederebbe la memorizzazione e l'elaborazione ripetuta di tutte le fasi temporali). I gradienti calcolati in questo modo sono un'approssimazione al gradiente "vero" calcolato su tutti i passaggi temporali. Ma, a causa del problema del gradiente che sta scomparendo, i gradienti tenderanno ad avvicinarsi allo zero dopo un certo numero di passi temporali; propagarsi oltre questo limite non darebbe alcun beneficio. L'impostazione di troppo corto può limitare la scala temporale su cui la rete può apprendere. Tuttavia, la memoria della rete non si limita a intervalli temporali poiché le unità nascoste possono memorizzare informazioni oltre questo periodo (ad esk 2 k 2k2k2k2).

Oltre alle considerazioni computazionali, le impostazioni appropriate per e dipendono dalle statistiche dei dati (ad es. La scala temporale delle strutture che sono rilevanti per produrre buoni risultati). Probabilmente dipendono anche dai dettagli della rete. Ad esempio, esistono numerose architetture, trucchi di inizializzazione, ecc. Progettati per mitigare il problema del gradiente in decomposizione.k 2k1k2

L'opzione 1 ("backprop frame-wise") corrisponde all'impostazione di su e sul numero di passi temporali dall'inizio della frase al punto corrente. L'opzione 2 ("backprop saggio frase") corrisponde all'impostazione di e sulla lunghezza della frase. Entrambi sono approcci validi (con considerazioni computazionali / prestazionali come sopra; il n. 1 sarebbe abbastanza intensivo dal punto di vista computazionale per sequenze più lunghe). Nessuno di questi approcci verrebbe chiamato "troncato" perché la backpropagazione si verifica sull'intera sequenza. Sono possibili altre impostazioni di e ; Elencherò alcuni esempi di seguito. 1 k 2 k 1 k 2 k 1 k 2k11k2k1k2k1k2

Riferimenti che descrivono la BPTT troncata (procedura, motivazione, questioni pratiche):

  • Sutskever (2013) . Formazione di reti neurali ricorrenti.
  • Mikolov (2012) . Modelli linguistici statistici basati su reti neurali.
    • Utilizzando RNN vaniglia per elaborare i dati di testo come una sequenza di parole, consiglia di impostare su 10-20 parole e su 5 parolek 2k1k2
    • L'esecuzione di più aggiornamenti per sequenza (ovvero meno della lunghezza della sequenza) funziona meglio dell'aggiornamento alla fine della sequenzak1
    • Eseguire gli aggiornamenti una volta per blocco è meglio che in modo incrementale (che può essere instabile)
  • Williams e Peng (1990) . Un algoritmo efficiente basato sul gradiente per l'addestramento online delle traiettorie di rete ricorrenti.
    • Proposta originale (?) Dell'algoritmo
    • Discutono della scelta di e (che chiamano e ). Considerano solo .k 2 h h k 2k 1k1k2hhk2k1
    • Nota: usano la frase "BPTT (h; h ')" o "l'algoritmo migliorato" per riferirsi a ciò che gli altri riferimenti chiamano "BPTT troncato". Usano la frase "BPTT troncato" per indicare il caso speciale in cui .k1=1

Altri esempi che utilizzano BPTT troncato:

  • (Karpathy 2015). char-RNN.
    • Descrizione e codice
    • Vanilla RNN elabora il testo documenta un carattere alla volta. Addestrato per predire il prossimo personaggio. caratteri. Rete utilizzata per generare nuovo testo nello stile del documento di formazione, con risultati divertenti.k1=k2=25
  • Graves (2014) . Generazione di sequenze con reti neurali ricorrenti.
    • Vedi la sezione sulla generazione di articoli di Wikipedia simulati. Rete LSTM che elabora i dati di testo come sequenza di byte. Istruito per prevedere il byte successivo. byte. La memoria LSTM si reimposta ogni byte.10 , 000k1=k2=10010,000
  • Sak et al. (2014) . Architetture di reti neurali ricorrenti basate su memoria a lungo termine per il riconoscimento vocale di grandi vocaboli.
    • Reti LSTM modificate, elaborazione di sequenze di caratteristiche acustiche. .k1=k2=20
  • Ollivier et al. (2015) . Formazione delle reti ricorrenti online senza backtracking.
    • Il punto di questo documento era di proporre un diverso algoritmo di apprendimento, ma lo hanno confrontato con BPTT troncato. Utilizzato RNN vaniglia per prevedere sequenze di simboli. Solo menzionandolo qui per dire che hanno usato .k1=k2=15
  • Hochreiter e Schmidhuber (1997) . Memoria a lungo termine.
    • Descrivono una procedura modificata per gli LSTM

Questa è una risposta eccezionale, e vorrei avere la posizione in questo forum per premiarlo in modo sostanziale. Particolarmente utili sono la discussione concreta di k1 vs k2 per contestualizzare i miei due casi rispetto a un uso più generale, ed esempi numerici degli stessi.
Novak,
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.