Parar antecipadamente é basicamente parar o treinamento assim que sua perda começar a aumentar (ou em outras palavras, a precisão da validação começa a diminuir). De acordo com os documentos , é usado da seguinte forma;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
Os valores dependem da sua implementação (problema, tamanho do lote etc ...) mas geralmente para evitar overfitting eu usaria;
- Monitore a perda de validação (precisa usar validação cruzada ou, pelo menos, conjuntos de treinamento / teste) definindo o
monitor
argumento como 'val_loss'
.
min_delta
é um limite para quantificar uma perda em alguma época como melhoria ou não. Se a diferença de perda for inferior min_delta
, é quantificada como nenhuma melhoria. Melhor deixar como 0, pois estamos interessados em quando a perda piorar.
patience
argumento representa o número de épocas antes de parar, uma vez que sua perda começa a aumentar (para de melhorar). Isso depende de sua implementação, se você usar lotes muito pequenos
ou uma grande taxa de aprendizado, sua perda zigue-zague (a precisão será mais ruidosa), então é melhor definir um patience
argumento amplo . Se você usar lotes grandes e uma taxa de aprendizado pequena, sua perda será mais suave, então você pode usar um patience
argumento menor . De qualquer forma, deixarei como 2 para dar mais chance ao modelo.
verbose
decide o que imprimir, deixe no padrão (0).
mode
O argumento depende de qual direção sua quantidade monitorada tem (é suposto estar diminuindo ou aumentando), uma vez que monitoramos a perda, podemos usar min
. Mas vamos deixar o keras cuidar disso para nós e definir paraauto
Então, eu usaria algo assim e experimentaria traçando a perda de erro com e sem parada antecipada.
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
Para uma possível ambigüidade sobre como funcionam os retornos de chamada, tentarei explicar mais. Depois que você chama fit(... callbacks=[es])
seu modelo, Keras chama funções predeterminadas de determinados objetos de retorno de chamada. Essas funções podem ser chamados on_train_begin
, on_train_end
, on_epoch_begin
, on_epoch_end
e on_batch_begin
, on_batch_end
. O callback de parada antecipada é chamado em cada final de época, compara o melhor valor monitorado com o atual e para se as condições forem atendidas (quantas épocas se passaram desde a observação do melhor valor monitorado e é mais do que argumento de paciência, a diferença entre o último valor é maior do que min_delta etc.).
Conforme apontado por @BrentFaust nos comentários, o treinamento do modelo continuará até que as condições de Parada Antecipada sejam atendidas ou o epochs
parâmetro (padrão = 10) em fit()
seja satisfeito. Definir um retorno de chamada de Parada Antecipada não fará com que o modelo treine além de seu epochs
parâmetro. Portanto, chamar a fit()
função com um epochs
valor maior se beneficiaria mais com o retorno de chamada de Parada Antecipada.
min_delta
é um limite para quantificar a mudança no valor monitorado como uma melhoria ou não. Então, sim, se dermosmonitor = 'val_loss'
, isso se referirá à diferença entre a perda de validação atual e a perda de validação anterior. Na prática, se você dermin_delta=0.1
uma diminuição na perda de validação (atual - anterior) menor que 0,1 não seria quantificável, assim pararia o treinamento (se tiverpatience = 0
).callbacks=[EarlyStopping(patience=2)]
não tem efeito, a menos que seja dado período paramodel.fit(..., epochs=max_epochs)
.epoch=1
em um loop for (para vários casos de uso) em que esse retorno de chamada falharia. Se houver ambiguidade em minha resposta, tentarei colocá-la de uma maneira melhor.restore_best_weights
argumento (ainda não na documentação), que carrega o modelo com os melhores pesos após o treinamento. Mas, para seus propósitos, eu usariaModelCheckpoint
callback comsave_best_only
argumento. Você pode verificar a documentação, é simples de usar, mas você precisa carregar manualmente os melhores pesos após o treinamento.