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?
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?
Respostas:
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;
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.
callbacks=[EarlyStopping(patience=2)]
não tem efeito, a menos que seja dado período para model.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 usaria ModelCheckpoint
callback com save_best_only
argumento. Você pode verificar a documentação, é simples de usar, mas você precisa carregar manualmente os melhores pesos após o treinamento.
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
).