
L'arresto anticipato è fondamentalmente l'interruzione dell'allenamento una volta che la perdita inizia ad aumentare (o in altre parole l'accuratezza della convalida inizia a diminuire). Secondo i documenti è usato come segue;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
I valori dipendono dalla tua implementazione (problema, dimensione del batch ecc ...) ma generalmente per evitare l'overfitting userei;
- Monitorare la perdita di convalida (è necessario utilizzare la convalida incrociata o almeno set di addestramento / test) impostando l'
monitor
argomento su 'val_loss'.
min_deltaè una soglia per quantificare o meno una perdita in un'epoca come miglioramento. Se la differenza di perdita è inferiore min_delta, viene quantificata come nessun miglioramento. Meglio lasciarlo a 0 poiché siamo interessati a quando la perdita peggiora.
patiencel'argomento rappresenta il numero di epoche prima di fermarsi una volta che la perdita inizia ad aumentare (smette di migliorare). Questo dipende dalla tua implementazione, se usi lotti molto piccoli
o un grande tasso di apprendimento la tua perdita a zig-zag (la precisione sarà più rumorosa), quindi è meglio impostare un patienceargomento ampio . Se utilizzi lotti di grandi dimensioni e una bassa velocità di apprendimento, la perdita sarà più agevole, quindi puoi utilizzare un patienceargomento più piccolo . In ogni caso, lo lascerò come 2 in modo da dare più possibilità al modello.
verbose decide cosa stampare, lasciarlo al valore predefinito (0).
model'argomento dipende dalla direzione che ha la quantità monitorata (dovrebbe diminuire o aumentare), poiché monitoriamo la perdita, possiamo usarla min. Ma lasciamo che sia Keras a gestirlo per noi e lo impostiauto
Quindi userei qualcosa di simile e sperimenterei tracciando la perdita di errore con e senza arresto anticipato.
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
Per possibili ambiguità su come funzionano i callback, cercherò di spiegare di più. Una volta richiamato fit(... callbacks=[es])il modello, Keras chiama funzioni predeterminate di oggetti callback dati. Queste funzioni possono essere chiamati on_train_begin, on_train_end, on_epoch_begin, on_epoch_ende on_batch_begin, on_batch_end. La richiamata anticipata viene richiamata alla fine di ogni epoca, confronta il miglior valore monitorato con quello attuale e si ferma se le condizioni sono soddisfatte (quante epoche sono trascorse dall'osservazione del miglior valore monitorato ed è più di un argomento di pazienza, la differenza tra l'ultimo valore è maggiore di min_delta ecc ..).
Come indicato da @BrentFaust nei commenti, l'addestramento del modello continuerà fino a quando non vengono soddisfatte le condizioni di arresto anticipato o il epochsparametro (predefinito = 10) in fit(). L'impostazione di un callback di arresto anticipato non farà sì che il modello si alleni oltre il suo epochsparametro. Quindi chiamare una fit()funzione con un epochsvalore maggiore trarrebbe maggiori benefici dal callback di arresto anticipato.
min_deltaè una soglia per quantificare o meno la variazione del valore monitorato come miglioramento. Quindi sì, se diamomonitor = 'val_loss', si riferirebbe alla differenza tra l'attuale perdita di convalida e la precedente perdita di convalida. In pratica, se si dàmin_delta=0.1una diminuzione della perdita di convalida (corrente - precedente) inferiore a 0,1 non si quantifica, quindi si interromperà l'allenamento (se si hapatience = 0).