Dieci modelli e antipattern dell’esperimentazione di deep learning

Dieci modelli e antipattern dell'esperimentazione nel campo del deep learning

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Introduzione

In questo articolo, presento un elenco di modelli e antipattern che ho raccolto durante 10 anni di esperienza come ingegnere di deep learning. L’ingegneria del deep learning riguarda soprattutto l’esperimento. L’ottenimento del primo prodotto minimale e funzionante spesso avviene molto rapidamente. Al contrario, la maggior parte del ciclo di vita di un progetto di deep learning è dedicata al miglioramento iterativo del codice e delle metriche/punteggi. Molte volte, il percorso verso il punteggio più alto si compone di numerosi miglioramenti marginali scoperti in ampie sperimentazioni. Nella mia pratica, solo uno su 5 o persino uno su 10 esperimenti migliora il punteggio. È fondamentale razionalizzare il processo di sperimentazione, specialmente quando si lavora in team.

Prima di tutto, chiariremo i termini usati. Nel materiale seguente, considero la massimizzazione di una singola metrica, a cui faccio riferimento come “la metrica”. Con “linea di base” intendo lo stato del codice e il valore della metrica che non ha subito alcuna modifica presa in considerazione. Con “regressione” intendo una diminuzione della metrica, ovvero un esito indesiderato. Al contrario, con “progressione” intendo un aumento della metrica, ovvero un esito desiderato.

Modelli e Antipattern

#1 Affidabilità dei risultati

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Eseguire la linea di base e un esperimento una sola volta e trarre conclusioni basate sul confronto. Se i risultati presentano una varianza significativa, ad esempio a causa della scarsa convergenza dell’addestramento dovuta alla scelta di un tasso di apprendimento elevato o all’overfitting, potresti trarre una conclusione errata su se si sta osservando una progressione o una regressione.

Modello:

Eseguire più cicli di addestramento per stimare la varianza dei risultati. Eseguire più cicli di addestramento di deep learning può richiedere risorse e tempo, ma è fondamentale per comprendere la varianza dei risultati e ottenere una progressione affidabile dei cambiamenti. Se necessario, analizzare le misurazioni con il test-T di Student a due o una coda.

#2 Pensiero desideroso

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Supporre che un certo cambiamento sia garantito per migliorare la metrica e procedere con la fusione. Sia i cambiamenti software che quelli algoritmici possono introdurre una regressione, evidente o sottile.

Modello:

Dopo qualsiasi cambiamento, eseguire nuovamente l’addestramento per assicurarsi che non ci siano regressioni. Una regressione evidente, come un arresto anomalo dell’addestramento, può essere facile da individuare, anche nelle prime iterazioni dell’addestramento. Una regressione sottile può essere rilevata solo alla fine del ciclo di addestramento.

#3 Ombra di regressione

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Eseguire diversi cambiamenti in un’unica combinazione che, secondo il ricercatore, migliora tutti la metrica. Può verificarsi un’ombra di regressione, ovvero il cambiamento A provoca una leggera regressione, mentre il cambiamento B offre un’importante progressione. Insieme, i due possono mostrare un miglioramento nella metrica. In questo modo, la lieve regressione viene oscurata da un miglioramento significativo. Tuttavia, si desidera solo il cambiamento che porta a un miglioramento, eliminando il cambiamento che diminuisce la metrica.

Modello:

Misura i cambiamenti separatamente. Se hai due possibili miglioramenti in mente, eseguili separatamente:

  1. Cambia A
  2. Cambia B
  3. Cambi A e B insieme

In questo modo si eviteranno problemi di regressione.

#4 C’è un legame

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Lanciare l’addestramento dalla copia di lavoro di Git. In questo caso, non ci sarà modo di ripetere l’esperimento in futuro o analizzare la differenza precisa tra gli esperimenti.

Modello:

Tutti i cambiamenti, inclusi quelli temporanei, devono essere committati in modo che la copia di lavoro di Git sia pulita. Il commit deve essere etichettato. Come alternativa all’etichettatura, gli artefatti dell’esperimento devono memorizzare l’hash del commit del codice eseguito.

#5 Ciclo veloce

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Lanciare sempre la versione pesante (finale) dell’addestramento. Poiché la versione pesante è lenta, richiede molto tempo per ottenere i risultati dell’esperimento e potrebbe scoraggiare lo studio sui piccoli cambiamenti.

Modello:

Mantenere una versione veloce del ciclo di addestramento. La versione veloce deve essere 2-10 volte più veloce e in grado di riflettere l’effetto dei cambiamenti in valutazione. Spesso, la versione veloce ha meno iterazioni per l’addestramento e una rete neurale più rapida e ridotta in dimensioni. La versione veloce può fungere sia da test di integrazione che come modo rapido per valutare la promettente.

#6 Senza rami

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Non utilizzare rami per funzionalità separate e conservare tutte le modifiche nel ramo principale.

Modello:

Avere un ramo separato per ogni cambiamento. Conservando i cambiamenti in un ramo diverso, eviteremo di unire il codice che mostra una regressione in modo che il codice non sia appesantito da opzioni, modalità e blocchi if-else. A volte, richiede uno sforzo mentale eliminare un sacco di codice che supporta un esperimento che, sfortunatamente, non mostra alcun progresso.

#7 Abitudini di codifica

L'immagine è generata da DALL-E 3 dalla richiesta dell'autore.

Antipattern:

Non utilizzare pratiche di ingegneria del software per sviluppare il codice. Troppo spesso sento argomenti a favore di codice improvvisato e ad hoc del tipo “non siamo un team/progetto di ingegneria del software” e “nella ricerca, le cose vengono fatte in modo diverso”. Tuttavia, quando la sfida è ottenere il punteggio più alto, perdere anche una frazione di percentuale a causa di banali errori di software può essere fatale.

Modello:

Scrivere codice ben strutturato dal punto di vista architettonico, senza duplicazione di codice, con tutti i “numeri magici” nominati e con test di unità e integrazione. Test estesi e una copertura del codice possono essere proibitivi per un progetto di ricerca applicata in movimento rapido. Tuttavia, i test di unità per le funzioni compatte e densamente algoritmiche come un codificatore-decodificatore delle caratteristiche forniscono notevoli benefici alla luce di possibili esperimenti fallati, conclusioni errate e intuizioni del ricercatore fuorviate.

#8 Non-invasiva

L'immagine è generata da DALL-E 3 dall'input dell'autore.

Antipattern:

Eseguire modifiche “invasive” e unirle. Per modifiche invasive, si intendono le modifiche che alterano il comportamento degli altri modi anche se migliorano la modalità mirata. Prendiamo in considerazione il seguente esempio. Il codice supporta il training di due reti neurali di base: backbone X e backbone Y. Il training su ogni backbone è una modalità separata. Si desidera modificare il tasso di apprendimento per il backbone X per migliorare la sua metrica. Si modifica il tasso di apprendimento per entrambe le modalità, si esegue l’esperimento per il backbone X e si osserva il miglioramento della metrica. Unire il codice “così com’è” è un antipattern poiché il tasso di apprendimento viene modificato per il backbone Y, per il quale non è stato eseguito alcun esperimento e, una volta eseguito, potrebbe comportare una regressione.

Pattern:

Effettuare modifiche non invasive che non alterino il comportamento del codice in tutte le altre modalità di funzionamento. Realizzare un cambiamento non invasivo può essere noioso e richiedere tempo. Per una sperimentazione più rapida, si può considerare di effettuare prima una modifica invasiva, eseguire l’esperimento e, solo se mostra risultati promettenti, riscrivere il codice in modo non invasivo. È importante notare che l’esperimento deve essere rieseguito dopo che la modifica non invasiva è pronta. Questo passaggio aiuterà a evitare potenziali regressioni dovute a bug nella preparazione del codice da unire nel ramo principale.

#9 Riesegui la baseline

L'immagine è generata da DALL-E 3 dall'input dell'autore.

Antipattern:

Utilizzare un vecchio valore storico della metrica di base e confrontare i nuovi risultati dell’esperimento con esso.

Pattern:

Rieseguire occasionalmente la baseline (dal ramo principale), che sia una volta a settimana nel weekend o persino insieme a ogni esperimento. Anche se il codice di base può cambiare, un fattore esterno può influenzare la baseline. Tale fattore esterno può essere:

  1. Esecuzione di esperimenti su macchine diverse
  2. Aggiornamento del software: toolkit CUDA, pacchetti Conda
  3. La baseline e l’esperimento sono stati eseguiti da diversi membri del team, che potrebbero avere diverse modalità non documentate per avviare gli esperimenti.

#10 Versioning della metrica

L'immagine è generata da DALL-E 3 dall'input dell'autore.

Antipattern

Modificare i dati/procedura/metrica di convalida e confrontare la nuova metrica dell’esperimento con i valori storici della metrica è un antipattern. Ad esempio, se i dati di convalida sono stati puliti insieme ai dati di addestramento, si potrebbe supporre che la pulizia dei dati sia sempre un miglioramento. Potrebbe essere il caso in generale; tuttavia, la metrica è cambiata e non è più confrontabile con i risultati storici.

Pattern

Dopo aver modificato il modo in cui viene calcolata la metrica, riesegui la baseline per determinare il valore della nuova metrica.

Conclusioni

L'immagine è generata da DALL-E 3 dall'input dell'autore.

Avoiding the described ten antipatterns and by following the ten patterns, you will be able to bring your deep learning experimentation to the next level.