Quais parâmetros devem ser usados ​​para parada antecipada?

97

Estou treinando uma rede neural para meu projeto usando Keras. Keras forneceu uma função de parada precoce. Posso saber quais parâmetros devem ser observados para evitar que minha rede neural se ajuste excessivamente usando a parada antecipada?

AizuddinAzman
fonte

Respostas:

156

parando cedo

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;

  1. 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'.
  2. 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.
  3. patienceargumento 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 patienceargumento amplo . Se você usar lotes grandes e uma taxa de aprendizado pequena, sua perda será mais suave, então você pode usar um patienceargumento menor . De qualquer forma, deixarei como 2 para dar mais chance ao modelo.
  4. verbose decide o que imprimir, deixe no padrão (0).
  5. modeO 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_ende 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 epochsparâ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 epochsparâmetro. Portanto, chamar a fit()função com um epochsvalor maior se beneficiaria mais com o retorno de chamada de Parada Antecipada.

umutto
fonte
3
@AizuddinAzman close, min_deltaé um limite para quantificar a mudança no valor monitorado como uma melhoria ou não. Então, sim, se dermos monitor = '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ê der min_delta=0.1uma diminuição na perda de validação (atual - anterior) menor que 0,1 não seria quantificável, assim pararia o treinamento (se tiver patience = 0).
umutto de
3
Observe que callbacks=[EarlyStopping(patience=2)]não tem efeito, a menos que seja dado período para model.fit(..., epochs=max_epochs).
Brent Faust,
1
@BrentFaust Esse é o meu entendimento também, escrevi a resposta pressupondo que o modelo está sendo treinado com pelo menos 10 épocas (como padrão). Após seu comentário, percebi que pode haver um caso em que o programador está chamando fit com epoch=1em 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.
umutto de
4
@AdmiralWen Desde que escrevi a resposta, o código mudou um pouco. Se estiver usando a versão mais recente do Keras, você pode usar o restore_best_weightsargumento (ainda não na documentação), que carrega o modelo com os melhores pesos após o treinamento. Mas, para seus propósitos, eu usaria ModelCheckpointcallback com save_best_onlyargumento. Você pode verificar a documentação, é simples de usar, mas você precisa carregar manualmente os melhores pesos após o treinamento.
umutto
1
@umutto Olá, obrigado pela sugestão do restore_best_weights, no entanto, não consigo usá-lo, `es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, pacience = patience_, verbose = 1, restore_best_weights = True) TypeError: __init __ () obteve um argumento de palavra-chave inesperado 'restore_best_weights'`. Alguma ideia? keras 2.2.2, tf, 1.10 qual é a sua versão?
Haramoz