In che modo è possibile eseguire il debug e ridurre gli errori di ottimizzazione?
Riepilogo: se nel modello si verificano problemi di ottimizzazione, è importante correggerli prima di provare altre cose. La diagnosi e la correzione degli errori di addestramento è un'area di ricerca attiva.
Osserva quanto segue in merito alla Figura 4:
- Cambiare l'andatura non influisce negativamente sulle prestazioni con tassi di apprendimento bassi.
- Tassi di apprendimento elevati non vengono più addestrati correttamente a causa dell'instabilità.
- L'applicazione di 1000 passaggi di riscaldamento del tasso di apprendimento risolve questa particolare istanza di instabilità, consentendo un addestramento stabile con un tasso di apprendimento massimo di 0,1.
Identificazione di carichi di lavoro instabili
Qualsiasi carico di lavoro diventa instabile se il tasso di apprendimento è troppo elevato. L'instabilità è un problema solo quando ti costringe a utilizzare un tasso di apprendimento troppo ridotto. Vale la pena distinguere almeno due tipi di instabilità di addestramento:
- Instabilità all'inizializzazione o all'inizio dell'addestramento.
- Instabilità improvvisa nel corso dell'addestramento.
Puoi adottare un approccio sistematico per identificare i problemi di stabilità nel tuo carico di lavoro procedendo nel seguente modo:
- Esegui una scansione del tasso di apprendimento per trovare il tasso di apprendimento migliore lr*.
- Traccia le curve di perdita di addestramento per tassi di apprendimento appena superiori a lr*.
- Se i tassi di apprendimento > lr* mostrano instabilità della perdita (la perdita non diminuisce durante i periodi di addestramento), la correzione dell'instabilità in genere migliora l'addestramento.
Registra la norma L2 dell'intero gradiente di perdita durante l'addestramento, poiché i valori outlier possono causare instabilità falsa durante l'addestramento. Questo può indicare l'aggressività con cui ritagliare gradienti o aggiornamenti di peso.
NOTA: alcuni modelli mostrano un'instabilità molto precoce, seguita da un recupero che determina un addestramento lento ma stabile. Le pianificazioni di valutazione comuni possono non rilevare questi problemi se non effettuano valutazioni abbastanza frequenti.
Per verificare, puoi addestrare un'esecuzione abbreviata di soli 500 passaggi utilizzando lr = 2 * current best
, ma valuta ogni passaggio.
Potenziali correzioni di pattern di instabilità comuni
Considera le seguenti possibili correzioni per i pattern di instabilità comuni:
- Applica il riscaldamento del tasso di apprendimento. Questa è la soluzione migliore per l'instabilità dell'addestramento iniziale.
- Applica il ritaglio a gradiente. Questo è un buon metodo per l'instabilità sia nelle fasi iniziali che in fase di addestramento e potrebbe correggere alcune inizializzazioni errate che non possono essere utilizzate con il warmup.
- Prova un nuovo ottimizzatore. A volte Adam è in grado di gestire instabilità che Momentum non riesce a gestire. Questa è un'area di ricerca attiva.
- Assicurati di utilizzare best practice e inizializzazioni per l'architettura del modello (esempi che seguono). Aggiungi connessioni residue e normalizzazione, se il modello non le contiene già.
- Normalizza come ultima operazione prima del residuo. Ad esempio:
x + Norm(f(x))
. Tieni presente cheNorm(x + f(x))
può causare problemi. - Prova a inizializzare i rami residui su 0. (vedi ReZero is All You Need: convergenza rapida a grande profondità).
- Ridurre il tasso di apprendimento. Questa è l'ultima risorsa.
Riscaldamento tasso di apprendimento
Quando applicare il riscaldamento del tasso di apprendimento
La Figura 7a mostra il grafico dell'asse degli iperparametri che indica che un modello sta subendo instabilità di ottimizzazione, perché il miglior tasso di apprendimento si trova proprio sul limite dell'instabilità.
La Figura 7b mostra come verificare questo aspetto esaminando la perdita di addestramento di un modello addestrato con un tasso di apprendimento 5 o 10 volte superiore a questo picco. Se il grafico mostra un aumento improvviso della perdita dopo un calo costante (ad es.a un passaggio di ~10. 000 nella figura sopra), è probabile che il modello soffra di instabilità dell'ottimizzazione.
Come applicare il riscaldamento del tasso di apprendimento
Consenti a unstable_base_learning_rate
di essere il tasso di apprendimento a cui il modello
diventa instabile, utilizzando la procedura precedente.
Il riscaldamento prevede che venga anticipata una pianificazione del tasso di apprendimento che aumenti il tasso di apprendimento da 0 a un valore base_learning_rate
stabile, ovvero maggiore di un ordine di grandezza rispetto a unstable_base_learning_rate
.
L'impostazione predefinita prevede di provare base_learning_rate
10x
unstable_base_learning_rate
. Anche se tieni presente che sarebbe possibile eseguire di nuovo l'intera procedura per 100xunstable_base_learning_rate
. La pianificazione specifica è:
- Aumenta da 0 a base_learning_rate tramite warmup_steps.
- Allenati a una velocità costante per il post_warmup_steps.
Il tuo obiettivo è trovare il numero più breve di warmup_steps
che ti consente di
accedere a tassi di apprendimento di picco molto superiori a
unstable_base_learning_rate
.
Quindi, per ogni base_learning_rate
, devi regolare warmup_steps
e
post_warmup_steps
. In genere va bene impostare post_warmup_steps
su
2*warmup_steps
.
Il riscaldamento può essere regolato indipendentemente da una programmazione di decadimento esistente. warmup_steps
dovrebbe essere spostato con alcuni ordini di grandezza diversi. Ad esempio, uno
studio di esempio potrebbe provare [10, 1000, 10,000, 100,000]
. Il punto di accesso massimo consentito non deve essere superiore al 10% di max_train_steps
.
Una volta stabilito un warmup_steps
che non potenzia l'addestramento alle ore base_learning_rate
, deve essere applicato al modello di riferimento.
Essenzialmente, anteponi questa pianificazione alla pianificazione esistente e utilizza la selezione ottimale del checkpoint di cui sopra per confrontare questo esperimento con la base di riferimento. Ad esempio, se originariamente avevamo 10.000 max_train_steps
e abbiamo fatto warmup_steps
per 1000 passaggi, la nuova procedura di addestramento dovrebbe
essere eseguita per 11.000 passi in totale.
Se per l'addestramento stabile sono necessari warmup_steps
lunghi (> 5% di max_train_steps
), potrebbe essere necessario aumentare max_train_steps
per tenere conto di ciò.
Non esiste un valore "tipico " nell'intera gamma di carichi di lavoro. Alcuni modelli richiedono solo 100 passaggi, mentre altri (in particolare i trasformatori) possono richiedere più di 40.000 passaggi.
Ritaglio sfumatura
Il ritaglio con gradiente è utile soprattutto quando si verificano problemi di gradiente di grandi dimensioni o anomali. La funzionalità di ritaglio con sfumatura consente di risolvere uno dei seguenti problemi:
- Instabilità di addestramento precoce (norma a elevato gradiente all'inizio)
- Instabilità durante l'addestramento (improvvisi picchi di gradiente durante l'allenamento).
A volte periodi di riscaldamento più lunghi possono correggere instabilità che il ritagli non riscontra. Per maggiori dettagli, consulta la sezione Riscaldamento del tasso di apprendimento.
🤖 E se vuoi tagliare i tuoi piatti durante il riscaldamento?
Le soglie ideali per i clip sono appena al di sopra della norma del gradiente "tipica".
Ecco un esempio di come utilizzare il ritaglio con gradiente:
- Se la norma del gradiente $\left | g\right |$ è maggiore della soglia di ritaglio del gradiente $\lambda$, esegui ${g}'= \lambda \times \frac{g}{\left | g\right |}$ dove ${g}'$ è il nuovo gradiente.
Registra la norma del gradiente non ritagliato durante l'addestramento. Per impostazione predefinita, genera:
- Un grafico tra la norma del gradiente e il passo
- Un istogramma di norme del gradiente aggregate per tutti i passaggi
Scegli una soglia di ritaglio del gradiente in base al 90° percentile delle norme del gradiente. La soglia dipende dal carico di lavoro, ma il 90% è un buon punto di partenza. Se il 90% non funziona, puoi ottimizzare questa soglia.
🤖 Hai mai pensato di adottare una strategia adattiva?
Se provi il ritaglio del gradiente e i problemi di instabilità persistono, puoi provare a risolvere il problema, ovvero ridurre la soglia.
Il ritaglio del gradiente estremamente aggressivo (ovvero oltre il 50% degli aggiornamenti viene troncato), in sostanza è un modo strano per ridurre il tasso di apprendimento. Se ti capita spesso di usare clip molto aggressivi, probabilmente dovresti semplicemente ridurre il tasso di apprendimento.
Perché si chiamano iperparametri per il tasso di apprendimento e altri parametri di ottimizzazione? Non sono parametri di alcuna distribuzione precedente.
Il termine "iperparametro" ha un significato preciso nel machine learning bayesiano, quindi fare riferimento al tasso di apprendimento e alla maggior parte degli altri parametri di deep learning ottimizzabili come "iperparametri" è probabilmente un abuso di terminologia. Preferiremmo usare il termine "metaparametro" per indicare i tassi di apprendimento, i parametri dell'architettura e tutti gli altri aspetti regolabili del deep learning. Questo perché il metaparametro evita la confusione generata dall'uso improprio della parola "iperparametro". Questa confusione è particolarmente probabile quando si parla di ottimizzazione bayesiana, in cui i modelli di superficie di risposta probabilistica hanno i propri iperparametri veri.
Sfortunatamente, sebbene possa generare confusione, il termine "iperparametro" è diventato estremamente comune nella community del deep learning. Pertanto, per questo documento, rivolto a un vasto pubblico che include molte persone che difficilmente sono a conoscenza di questo tecnicismo, abbiamo scelto di contribuire a una fonte di confusione in questo campo nella speranza di evitarne un'altra. Detto questo, potremmo fare una scelta diversa quando pubblichiamo un articolo di ricerca e incoraggiamo gli altri a usare invece il "metaparametro" nella maggior parte dei contesti.
Perché le dimensioni del batch non devono essere ottimizzate per migliorare direttamente le prestazioni del set di convalida?
La modifica delle dimensioni del batch senza modificare altri dettagli della pipeline di addestramento spesso influisce sulle prestazioni del set di convalida. Tuttavia, in genere la differenza nelle prestazioni del set di convalida tra due dimensioni batch scompare se la pipeline di addestramento viene ottimizzata in modo indipendente per ogni dimensione del batch.
Gli iperparametri che interagiscono maggiormente con le dimensioni del batch, quindi più importanti da ottimizzare separatamente per ogni dimensione del batch, sono gli iperparametri di ottimizzazione (ad esempio tasso di apprendimento, momentum) e gli iperparametri di regolarizzazione. Dimensioni del batch più piccole introducono più rumore nell'algoritmo di addestramento a causa della varianza del campione. Questo rumore può avere un effetto regolarizzante. Pertanto, batch di dimensioni maggiori possono essere più soggetti a overfitting e potrebbero richiedere una regolarizzazione più forte e/o ulteriori tecniche di regolarizzazione. Inoltre, quando modifichi le dimensioni del batch, potrebbe essere necessario modificare il numero di passaggi di addestramento.
Una volta presi in considerazione tutti questi effetti, non ci sono prove convincenti del fatto che le dimensioni del batch influiscano sul rendimento massimo raggiungibile per la convalida. Per i dettagli, consulta Shallue et al. 2018.
Quali sono le regole di aggiornamento per tutti gli algoritmi di ottimizzazione più diffusi?
Questa sezione fornisce regole di aggiornamento per diversi algoritmi di ottimizzazione più diffusi.
Discesa del gradiente stocastico (SGD)
\[\theta_{t+1} = \theta_{t} - \eta_t \nabla \mathcal{l}(\theta_t)\]
Dove $\eta_t$ è il tasso di apprendimento al passaggio $t$.
Anticipazione
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t v_{t+1}\]
dove $\eta_t$ è il tasso di apprendimento al passaggio $t$ e $\gamma$ è il coefficiente di slancio.
Nesterov
\[v_0 = 0\]
\[v_{t+1} = \gamma v_{t} + \nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - \eta_t ( \gamma v_{t+1} + \nabla \mathcal{l}(\theta_{t}) )\]
dove $\eta_t$ è il tasso di apprendimento al passaggio $t$ e $\gamma$ è il coefficiente di slancio.
RMSProp
\[v_0 = 1 \text{, } m_0 = 0\]
\[v_{t+1} = \rho v_{t} + (1 - \rho) \nabla \mathcal{l}(\theta_t)^2\]
\[m_{t+1} = \gamma m_{t} + \frac{\eta_t}{\sqrt{v_{t+1} + \epsilon}}\nabla \mathcal{l}(\theta_t)\]
\[\theta_{t+1} = \theta_{t} - m_{t+1}\]
ADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l}(\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{m_{t+1}}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]
NADAM
\[m_0 = 0 \text{, } v_0 = 0\]
\[m_{t+1} = \beta_1 m_{t} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)\]
\[v_{t+1} = \beta_2 v_{t} + (1 - \beta_2) \nabla \mathcal{l} (\theta_t)^2\]
\[b_{t+1} = \frac{\sqrt{1 - \beta_2^{t+1}}}{1 - \beta_1^{t+1}}\]
\[\theta_{t+1} = \theta_{t} - \alpha_t \frac{\beta_1 m_{t+1} + (1 - \beta_1) \nabla \mathcal{l} (\theta_t)}{\sqrt{v_{t+1}} + \epsilon} b_{t+1}\]