Interpretazione di epoch_size, minibatch_size_in_samples e MinibatchSource.next_minibatch in CNTK
In questo articolo verranno chiarite l'interpretazione e l'utilizzo dei parametri e delle funzioni seguenti in Python:
epoch_size
Numero di esempi di etichette (tensori lungo un asse dinamico) in ogni epoca. In epoch_size
CNTK è il numero di esempi di etichette dopo cui vengono eseguite azioni aggiuntive specifiche, tra cui
- salvataggio di un modello di checkpoint (il training può essere riavviato da qui)
- convalida incrociata
- controllo della frequenza di apprendimento
- minibatch-scaling
Si noti che la definizione del numero di esempi di etichette è simile al numero di campioni usati per minibatch_size_in_samples. La definizione di differisce dalla definizione di epoch_size
minibatch_size_in_samples
nel senso che epoch_size
è esempi di etichette , non esempi di input.
Quindi, importante, per i dati sequenziali, un esempio è un singolo elemento di una sequenza.
Di conseguenza, CNTK epoch_size
non fa riferimento a un numero di sequenze, ma il numero di elementi di sequenza tra leetichette della sequenza che costituiscono il minibatch.
Altrettanto importante, epoch_size
si riferisce agli esempi di etichetta , non agli esempi di input e al numero di etichette per sequenza non è necessariamente il numero di esempi di input. È possibile, ad esempio, disporre di un'etichetta per sequenza e per ogni sequenza di avere molti campioni (in tal caso agisce come il numero di sequenze) e è possibile avere un'etichetta per ogni esempio in una sequenza, in cui in questo caso epoch_size
epoch_size
viene eseguito esattamente come minibatch_size_in_samples
in tale esempio (non sequenza) viene conteggiato.
Per dimensioni più piccole del set di dati, epoch_size
spesso è impostato uguale alla dimensione del set di dati. In Python è possibile specificare cntk.io.INFINITELY_REPEAT
per questo. In Python è anche possibile impostarlo su cntk.io.FULL_DATA_SWEEP
, in cui l'elaborazione si arresterà dopo un passaggio dell'intera dimensione dei dati.
Per set di dati di grandi dimensioni, è possibile guidare la scelta per epoch_size
il checkpoint. Ad esempio, se si desidera perdere al massimo 30 minuti di calcolo in caso di interruzione di alimentazione o di interruzione della rete, si vuole creare un checkpoint circa ogni 30 minuti (da cui è possibile riprendere il training). Scegliere epoch_size
di essere il numero di campioni che richiedono circa 30 minuti per il calcolo.
minibatch_size_in_samples
Nota: per gli utenti di BrainScript, il parametro per le dimensioni del minibatch è minibatchSize
; per gli utenti Python, è minibatch_size_in_samples
.
CNTK ha una definizione molto specifica del minibatch_size_in_samples
parametro: indica il numero di esempi tra gli aggiornamenti del modello.
Un esempio qui è definito come un vettore o un tensore che scorre attraverso il sistema.
Ad esempio, in un'attività di riconoscimento delle immagini, un'immagine è un esempio.
Le dimensioni minibatch per ogni epoca vengono fornite in campioni (tensori lungo un asse dinamico). Il valore predefinito è 256
. È possibile usare valori diversi per diversi periodi; Ad esempio, 128*2 + 1024
(in Python) significa usare una dimensione minibatch di 128 per le prime due epoche e quindi 1024 per il resto.
Si noti che "dimensioni minibatch" in CNTK significa il numero di campioni elaborati tra gli aggiornamenti del modello. Questa definizione contiene anche quando si esegue la parallelizzazione tra i lavoratori, ad esempio per K
i lavoratori, il numero di campioni che ogni lavoratore elabora è minibatch_size_in_samples/K
).
Nel caso di input a lunghezza variabile, minibatch_size_in_samples
si riferisce al numero di elementi in queste sequenze, non al numero di sequenze.
SGD tenterà di adattarsi al maggior numero possibile di sequenze nel minibatch che non superano minibatch_size_in_samples
i campioni totali.
Se vengono specificati diversi input, i tensori vengono aggiunti al minibatch corrente fino a quando uno degli input supera .minibatch_size_in_samples
Importante, per i dati sequenziali, un esempio è un singolo elemento di una sequenza.
Di conseguenza, CNTK minibatch_size_in_samples
non fa riferimento al numero di sequenze nel minibatch, ma il numero aggregato di elementi/token di sequenza tra le sequenze che costituiscono il minibatch.
CNTK ha il supporto nativo per le sequenze a lunghezza variabile, ovvero può ospitare sequenze di lunghezze altamente variabili all'interno dello stesso minibatch, senza bisogno di soluzioni alternative come bucketing.
Insieme alla nozione di CNTK di specificare la frequenza di apprendimento per campione (anziché una media minibatch), ogni elemento di sequenze di qualsiasi lunghezza contribuisce alla stessa sfumatura, portando alla convergenza coerente.
Molti altri toolkit definiscono le dimensioni minibatch per i dati sequenziali come numero di sequenze nel minibatch. Questo è problematico, soprattutto se le sfumature sono definite anche come medie minibatch anziché CNTK le somme minibatch, perché il contributo alla sfumatura da ogni token o passaggio in una sequenza sarebbe inversamente proporzionale alla lunghezza della sequenza. l'approccio di CNTK evita questo.
Quando vengono usati più input, è possibile che non tutti gli input abbiano la stessa lunghezza della sequenza.
Ad esempio, nella classificazione della sequenza l'etichetta di ogni sequenza è un singolo token.
In questo caso, l'input con il maggior numero di campioni controlla le dimensioni del minibatch. È possibile modificare questo comportamento specificando defines_mb_size=True
per alcuni input, quindi le dimensioni minibatch verranno conteggiate in base alle sequenze di questo particolare input. Quando vengono specificati diversi input, è possibile impostare defines_mb_size
True
solo uno su .)
Nonostante la definizione chiara di minibatch_size_in_samples
essere il numero di esempi tra gli aggiornamenti del modello, ci sono due occasioni in cui è necessario rilassare la definizione:
- dati sequenziali: le sequenze a lunghezza variabile non sommano in genere esattamente le dimensioni di minibatch richieste. In questo caso, quante sequenze possono essere raggruppate in un minibatch senza superare le dimensioni di minibatch richieste (con un'eccezione: se la sequenza successiva nel corpus casuale supera la lunghezza della dimensione minibatch, le dimensioni minibatch saranno costituite da questa sequenza).
- parallelismo dei dati: in questo caso, le dimensioni del minibatch sono approssimative, poiché l'algoritmo di casualità basato su blocchi non può garantire che ogni lavoratore riceva esattamente lo stesso numero di campioni.
Tutte le considerazioni precedenti si applicano anche a epoch_size
, ma epoch_size
presenta alcune differenze, vedere sopra.
MinibatchSource.next_minibatch
Il metodo MinibatchSource.next_minibatch() legge un minibatch che contiene dati per tutti i flussi di input. Quando viene chiamato durante il training, MinibatchSource.next_minibatch(minibatch_size_in_samples, input_map)
selezionerà un subset casuale di campioni dal set di k
dati di training, dove k=minibatch_size_in_samples
.
L'implementazione garantisce che quando next_minibatch
viene chiamato N
time (dove N = number_of_training_samples/minibatch_size_in_samples
), l'intero set di dati di training viene coperto alla fine delle N
chiamate di next_minibatch
.
Ciò significa anche che quando next_minibatch
viene chiamato 2*N
il tempo, l'intero set di dati viene coperto due volte.
Altre informazioni:
- Ogni ciclo attraverso i dati avrà un ordine casuale diverso.
- Se si doppia la dimensione minibatch, un minibatch ora conterrà esattamente gli esempi che, prima, i due minibatches consecutivi corrispondenti avrebbero contenuto (questo può essere approssimativo se si hanno sequenze a lunghezza variabile). Ad esempio, due esecuzioni che differiscono solo in dimensioni minibatch elaborano i dati nello stesso ordine.
- Se si interrompe e si riavvia dal checkpoint, si otterrà lo stesso ordine casuale come se non si fosse interrotto il training. Questa operazione viene implementata in base al processo di lettura/casualizzazione su un asse temporale nominale, con questo semplice algoritmo:
- Il training procede su un asse temporale infinito nominale. Se si recupera un minibatch di dimensioni 256, il tempo nominale è in corso per 256.
- Il corpus di training viene replicato un numero infinito di volte sull'asse temporale. Se sono presenti
M
esempi, la prima replica si estende sul tempo0..M-1
nominale; la secondaM..2M-1
e così via. - Ogni replica è casuale-shuffled all'interno, ma non tra limiti di replica. Ad esempio, dopo aver elaborato esempi precisamente
M
, è stato visto ogni campione esattamente una volta. - La chiamata
next_minibatch(K)
offre gli esempi successiviK
in questa sequenza temporale infinita riguagliata. È lo stesso di chiamarenext_minibatch(1)
K
per i tempi. - Questo è tutto fatto in modo pigri.
- Il riavvio dal checkpoint è semplice come reimpostare l'ora nominale all'ora nominale in cui è stato creato il checkpoint.