Ricerca nel sito web

Come valutare l'abilità dei modelli di deep learning


Vedo spesso professionisti esprimere confusione su come valutare un modello di deep learning.

Ciò è spesso evidente da domande come:

  • Quale seme casuale dovrei usare?
  • Ho bisogno di un seme casuale?
  • Perché non ottengo gli stessi risultati nelle esecuzioni successive?

In questo post scoprirai la procedura che puoi utilizzare per valutare i modelli di deep learning e le motivazioni per utilizzarla.

Scoprirai anche utili statistiche correlate che puoi calcolare per presentare l'abilità del tuo modello, come deviazione standard, errore standard e intervalli di confidenza.

Avvia il tuo progetto con il mio nuovo libro Deep Learning With Python, che include tutorial passo passo e i file codice sorgente Python per tutti esempi.

Cominciamo.

L’errore del principiante

Adatta il modello ai tuoi dati di addestramento e valutalo sul set di dati di test, quindi segnala l'abilità.

Forse usi la convalida incrociata k-fold per valutare il modello, quindi segnalare l'abilità del modello.

Questo è un errore commesso dai principianti.

Sembra che tu stia facendo la cosa giusta, ma c'è un problema chiave di cui non hai tenuto conto:

I modelli di deep learning sono stocastici.

Le reti neurali artificiali utilizzano la casualità pur essendo adattate a un set di dati, come pesi iniziali casuali e mescolamento casuale di dati durante ogni epoca di addestramento durante la discesa del gradiente stocastico.

Ciò significa che ogni volta che lo stesso modello è adattato agli stessi dati, può fornire previsioni diverse e, a sua volta, avere competenze complessive diverse.

Stima delle competenze del modello
(Controllo della varianza del modello)

Non disponiamo di tutti i dati possibili; se lo facessimo, non avremmo bisogno di fare previsioni.

Disponiamo di un campione limitato di dati e da esso dobbiamo scoprire il miglior modello possibile.

Utilizzare una suddivisione Train-Test

Lo facciamo dividendo i dati in due parti, adattando un modello o una configurazione specifica del modello sulla prima parte dei dati e utilizzando il modello di adattamento per fare previsioni sul resto, quindi valutando l'abilità di tali previsioni. Questa è chiamata suddivisione train-test e utilizziamo l'abilità come stima di quanto bene pensiamo che il modello funzionerà nella pratica quando fa previsioni su nuovi dati.

Ad esempio, ecco alcuni pseudocodici per valutare un modello utilizzando una suddivisione train-test:

train, test = split(data)
model = fit(train.X, train.y)
predictions = model.predict(test.X)
skill = compare(test.y, predictions)

Una suddivisione train-test è un buon approccio da utilizzare se si hanno molti dati o un modello molto lento da addestrare, ma il punteggio di abilità risultante per il modello sarà rumoroso a causa della casualità dei dati (varianza del modello) .

Ciò significa che lo stesso modello adattato a dati diversi fornirà punteggi di abilità del modello diversi.

Utilizza la convalida incrociata k-Fold

Spesso possiamo rafforzare questo aspetto e ottenere stime più accurate delle competenze del modello utilizzando tecniche come la convalida incrociata k-fold. Questa è una tecnica che suddivide sistematicamente i dati disponibili in k-fold, adatta il modello su k-1 fold, lo valuta sulla piega tenuta fuori e ripete questo processo per ogni piega.

Ciò si traduce in k modelli diversi che hanno k diversi insiemi di previsioni e, a loro volta, k punteggi di abilità diversi.

Ad esempio, ecco alcuni pseudocodici per valutare un modello utilizzando una convalida incrociata k-fold:

scores = list()
for i in k:
	train, test = split_old(data, i)
	model = fit(train.X, train.y)
	predictions = model.predict(test.X)
	skill = compare(test.y, predictions)
	scores.append(skill)

Una popolazione di punteggi di abilità è più utile in quanto possiamo prendere la media e riportare la prestazione media prevista del modello, che probabilmente sarà più vicina alla prestazione effettiva del modello nella pratica. Per esempio:

mean_skill = sum(scores) / count(scores)

Possiamo anche calcolare una deviazione standard utilizzando mean_skill per avere un'idea della distribuzione media dei punteggi attorno a mean_skill:

standard_deviation = sqrt(1/count(scores) * sum( (score - mean_skill)^2 ))

Stima dell'abilità di un modello stocastico
(Controllo della stabilità del modello)

I modelli stocastici, come le reti neurali profonde, aggiungono un’ulteriore fonte di casualità.

Questa casualità aggiuntiva conferisce al modello maggiore flessibilità durante l'apprendimento, ma può renderlo meno stabile (ad esempio risultati diversi quando lo stesso modello viene addestrato sugli stessi dati).

Ciò è diverso dalla varianza del modello che fornisce risultati diversi quando lo stesso modello viene addestrato su dati diversi.

Per ottenere una stima attendibile della capacità di un modello stocastico, dobbiamo tenere conto di questa ulteriore fonte di varianza; dobbiamo controllarlo.

Correggi il seme casuale

Un modo è utilizzare la stessa casualità ogni volta che il modello è adatto. Possiamo farlo fissando il seme dei numeri casuali utilizzato dal sistema e quindi valutando o adattando il modello. Per esempio:

seed(1)
scores = list()
for i in k:
	train, test = split_old(data, i)
	model = fit(train.X, train.y)
	predictions = model.predict(test.X)
	skill = compare(test.y, predictions)
	scores.append(skill)

Ciò è utile per esercitazioni e dimostrazioni quando è necessario lo stesso risultato ogni volta che viene eseguito il codice.

Questo è fragile e non consigliato per la valutazione dei modelli.

Vedi il post:

  • Abbraccia la casualità nel machine learning
  • Come ottenere risultati riproducibili con Keras

Ripetere gli esperimenti di valutazione

Un approccio più efficace consiste nel ripetere più volte l’esperimento di valutazione di un modello non stocastico.

Per esempio:

scores = list()
for i in repeats:
	run_scores = list()
	for j in k:
		train, test = split_old(data, j)
		model = fit(train.X, train.y)
		predictions = model.predict(test.X)
		skill = compare(test.y, predictions)
		run_scores.append(skill)
	scores.append(mean(run_scores))

Nota: calcoliamo la media della competenza media stimata del modello, la cosiddetta grande media.

Questa è la procedura consigliata per stimare l'abilità di un modello di deep learning.

Poiché le ripetizioni sono spesso >=30, possiamo facilmente calcolare l'errore standard della competenza media del modello, ovvero quanto la media stimata del punteggio della competenza del modello differisce dalla competenza media effettiva sconosciuta del modello (ad esempio, quanto potrebbe essere errata mean_skill)

standard_error = standard_deviation / sqrt(count(scores))

Inoltre, possiamo utilizzare standard_error per calcolare un intervallo di confidenza per mean_skill. Ciò presuppone che la distribuzione dei risultati sia gaussiana, che è possibile verificare osservando un istogramma, un grafico Q-Q o utilizzando test statistici sui punteggi raccolti.

Ad esempio, l'intervallo del 95% è (1,96 * errore_standard) attorno all'abilità media.

interval = standard_error * 1.96
lower_interval = mean_skill - interval
upper_interval = mean_skill + interval

Esistono altri metodi forse più robusti dal punto di vista statistico per calcolare gli intervalli di confidenza rispetto all'utilizzo dell'errore standard della media generale, come ad esempio:

  • Calcolo dell'intervallo di confidenza della proporzione binomiale.
  • Utilizzo del bootstrap per stimare un intervallo di confidenza empirico.

Quanto sono instabili le reti neurali?

Dipende dal problema, dalla rete e dalla sua configurazione.

Consiglierei di eseguire un'analisi di sensibilità per scoprirlo.

Valuta lo stesso modello sugli stessi dati più volte (30, 100 o migliaia) e varia solo il seme per il generatore di numeri casuali.

Quindi rivedere la media e la deviazione standard dei punteggi di abilità prodotti. La deviazione standard (distanza media dei punteggi dal punteggio medio) ti darà un'idea di quanto sia instabile il tuo modello.

Quante ripetizioni?

Ne consiglierei almeno 30, forse 100, anche migliaia, limitati solo dal tempo e dalle risorse del computer e dai rendimenti decrescenti (ad esempio errore standard su mean_skill).

In modo più rigoroso, consiglierei un esperimento che esaminasse l'impatto sull'abilità stimata del modello rispetto al numero di ripetizioni e al calcolo dell'errore standard (quanto la prestazione media stimata differisce dalla vera media della popolazione sottostante).

Ulteriori letture

  • Abbraccia la casualità nel machine learning
  • Come addestrare un modello finale di machine learning
  • Confronto tra diverse specie di convalida incrociata
  • Metodi empirici per l'intelligenza artificiale, Cohen, 1995.
  • Errore standard su Wikipedia

Riepilogo

In questo post hai scoperto come valutare la capacità dei modelli di deep learning.

Nello specifico, hai imparato:

  • L'errore comune commesso dai principianti quando valutano i modelli di deep learning.
  • La logica per l'utilizzo ripetuto della convalida incrociata k-fold per valutare i modelli di deep learning.
  • Come calcolare le statistiche sulle competenze del modello correlato, come deviazione standard, errore standard e intervalli di confidenza.

Hai domande sulla stima della capacità dei modelli di deep learning?
Pubblica le tue domande nei commenti e farò del mio meglio per rispondere.

Articoli correlati