Compreendendo a parada precoce em redes neurais e suas implicações ao usar a validação cruzada

8

Estou um pouco preocupado e confuso com a ideia de como a técnica de parada precoce é definida. Se você der uma olhada na Wikipedia , ela será definida da seguinte forma:

  1. Divida os dados de treinamento em um conjunto de treinamento e um conjunto de validação, por exemplo, na proporção de 2 para 1.
  2. Treine apenas no conjunto de treinamento e avalie o erro por exemplo no conjunto de validação de vez em quando, por exemplo, após cada quinta época.
  3. Pare o treinamento assim que o erro no conjunto de validação for superior ao da última vez que foi verificado.
  4. Use os pesos que a rede tinha na etapa anterior como resultado da execução do treinamento.

Eu estava usando o método nas minhas experiências (com 10 vezes a validação cruzada). Estou verificando o erro de validação em cada época (e também calculo a precisão da validação) e defino um parâmetro de paciência de 2. Isso significa que, se o erro de validação aumentar por duas épocas consecutivas -> interrompa o treinamento. Depois, usei os resultados da última época quando o modelo terminou.

Ian Goodfellow usa outra definição em seu livro de aprendizado profundo . Como quarto passo, ele sugere usar os pesos do melhor modelo de trabalho (por exemplo, salve o modelo toda vez que o erro de validação for verificado).

Não preciso do modelo salvo, apenas dos resultados do meu trabalho. Então, para mim, a proposta de parada antecipada da Goodfellow significaria que eu teria a maior precisão de validação que alcancei para o meu resultado final? De alguma forma, isso não parece legítimo. Não tenho essas informações em uma situação do mundo real quando não há um conjunto de desenvolvimento. Mas, nesse caso, qual é o motivo da parada antecipada em primeiro lugar? Determinar o número de épocas, por exemplo, calculando a média do número de épocas para as dobras e usá-lo para o teste mais tarde?

V1nc3nt
fonte
Normalmente, você teria dados de teste separados que usaria para obter uma estimativa imparcial do desempenho do seu modelo.
Aaron
Sim. Eu tenho treinamento, desenvolvimento e teste de divisão. Mas usar a parada antecipada na divisão de teste seria trapaça. Portanto, não posso usar o método de parada antecipada no conjunto de testes para a execução final. Nesse caso, a parada antecipada seria útil apenas para descobrir quantas épocas executar no conjunto de testes (a fim de evitar o ajuste excessivo). Até onde eu entendo agora.
V1nc3nt 28/09
Deve-se salientar que existe uma pergunta semelhante , mas como essa pergunta aqui é sobre um único modelo, enquanto a pergunta anterior se refere a algum tipo de mistura de modelos (ou pelo menos eu acredito - para ser honesto, tanto a pergunta quanto a resposta são bastante difíceis de entender para mim). Portanto, não acho que a pergunta anterior tenha respostas para as questões levantadas pelo OP aqui.
precisa saber é

Respostas:

7

Determinar o número de épocas, por exemplo, calculando a média do número de épocas para as dobras e usá-lo para o teste mais tarde?

Resposta mais curta possível: Sim! Mas deixe-me adicionar algum contexto ...

Acredito que você esteja se referindo à Seção 7.8, páginas 246 e seguintes, sobre Parada precoce no livro Deep Learning. O procedimento descrito lá, no entanto, é significativamente diferente do seu. Goodfellow et al. sugira dividir seus dados em três conjuntos primeiro: um conjunto de treinamento, desenvolvimento e teste. Em seguida, você treina (no conjunto de treinamento) até que o erro desse modelo aumente (no conjunto de desenvolvedores); nesse ponto, você para. Por fim, você usa o modelo treinado que teve o menor erro do conjunto de desenvolvedores e o avalia no conjunto de testes. Nenhuma validação cruzada envolvida.

No entanto, parece que você está tentando fazer a parada antecipada (ES) e a validação cruzada (CV), bem como a avaliação do modelo no mesmo conjunto. Ou seja, você parece estar usando todos os seus dados para CV, treinando em cada divisão com ES e, em seguida, usando o desempenho médio dessas divisões de CV como resultado final da avaliação. Se for esse o caso, isso é realmente um ajuste excessivo (e certamente não é o que é descrito por Goodfellow et al.), E sua abordagem fornece exatamente o resultado oposto ao que se destina a ES - como uma técnica de regularização para evitarsobreajuste. Se não estiver claro o motivo: Como você "atingiu o pico" em suas instâncias finais de avaliação durante o tempo de treinamento para descobrir quando ("cedo") interromper o treinamento; Ou seja, você está otimizando com relação às instâncias de avaliação durante o treinamento, que está (super) ajustando seu modelo (nesses dados de avaliação), por definição.

Então, agora, espero ter respondido às suas outras [duas] perguntas.

A resposta de higgs broson (para sua última pergunta, como citado acima) já oferece uma maneira significativa de combinar CV e ES para poupar algum tempo de treinamento: você pode dividir seus dados completos em apenas dois conjuntos - um desenvolvedor e um conjunto de testes - e use o conjunto de desenvolvedores para fazer o CV enquanto aplica o ES em cada divisão. Ou seja, você treina em cada divisão do seu conjunto de desenvolvedores e para uma vez que o menor erro nas instâncias de treinamento que você separa para avaliar essa divisão foi atingido [1]. Em seguida, você calcula a média do número de épocas necessárias para atingir o menor erro de cada divisão e treina o conjunto completo de desenvolvedores para esse número (médio) de épocas. Por fim, você valida esse resultado no conjunto de testes que você anulou e ainda não o tocou.

[1] Embora, diferentemente do Higgs Bros, eu recomendaria avaliar após cada época. Duas razões para isso: (1), comparativamente ao treinamento, o tempo de avaliação será insignificante. (2), imagine seu min. o erro está na época 51, mas você avalia na época 50 e 60. Não é improvável que o erro na época 60 seja menor do que na época 50; No entanto, você escolheria 60 como seu parâmetro de época, o que claramente é sub-ideal e, de fato, até contraria o propósito de usar o ES em primeiro lugar.

fnl
fonte
Obrigado pela sua resposta. Eu já dividi meus dados em dev e test. Eu nunca toquei no teste. Dividi ainda mais o conjunto de desenvolvimento em 10 dobras e faço o CV nele. 9 dobras de treinamento, 1 dobra de dev. A dobra de desenvolvimento é usada para ES e já é verificada em cada época. Desde que eu não elaborei como faço minha divisão (desculpe!); eu já estou fazendo o que você me sugeriu fazer ou eu entendi errado em algum lugar?
V1nc3nt
Muito bem - você já está fazendo tudo corretamente, eu diria!
precisa saber é
Portanto, no final, a parada precoce é apenas uma maneira de ajustar o hiper-parâmetro "número de épocas". Comecei a usá-lo com a impressão errada e tinha medo de começar de novo e repetir todos os meus testes, porque o usava de maneira errada. Mas posso incorporá-lo sem problemas. Obrigado pela ajuda.
V1nc3nt 30/09
3

A maneira como você pode usar a validação cruzada para determinar o número ideal de épocas para treinar com paradas precoces é a seguinte: suponha que estivéssemos treinando entre 1 a 100 épocas. Para cada dobra, treine seu modelo e registre o erro de validação a cada, digamos, 10 épocas. Salve essas trajetórias de erro de validação versus número de épocas treinadas e calcule a média entre todas as dobras. Isso produzirá uma curva "erro médio de teste versus época". O ponto de parada a ser usado é o número de épocas que minimiza o erro médio de teste. Em seguida, você pode treinar sua rede no conjunto de treinamento completo (sem validação cruzada) para tantas épocas.

O objetivo da parada antecipada é evitar o excesso de ajustes. Você usa a validação cruzada N-fold para estimar o erro de generalização do seu modelo criando N conjuntos de trens / testes sintéticos e (geralmente) calculando a média dos resultados. Felizmente, o conjunto de testes (também conhecido como novos dados do mundo real) que você recebe mais tarde será semelhante o suficiente aos conjuntos de testes sinéticos que você gerou com o CV, de modo que o ponto de parada que você encontrou anteriormente esteja próximo do ideal, com este novo teste dados.

o Higgs Bros.
fonte
O que você descreve em seu primeiro parágrafo não é realmente a "parada antecipada", como proposto, penso, já que você teria que executar seu modelo nessas 100 épocas em cada dobra para comparar os resultados, certo? Mas geralmente você também deseja interromper a validação cruzada, se bem entendi (economiza muito tempo também). De qualquer forma, parece ser uma maneira razoável de descobrir quantas épocas executar no teste final. Mas você não prefere usar a parada antecipada como proposto (também para o CV) e usar o método descrito em seu primeiro parágrafo sobre o melhor modelo final ajustado?
V1nc3nt 28/09
11
Como eu descrevi "parar cedo" é como (acredito) a maioria das pessoas faria isso. Normalmente, quando alguém está gerando erro de teste versus curvas de época no CV, você apenas fixa o número total de épocas para as quais treina. Felizmente, quando você atingir o número máximo de épocas permitidas, a curva de erro se achatará. Caso contrário, volte e repita o processo com um limite máximo de época máximo. Por outro lado, se o seu programa informar que o erro de teste atingiu o nível de 50 épocas, não será necessário treiná-lo para 100. O objetivo é treinar o suficiente para que o erro do teste pare melhorando.
the Higgs Bros 28/09
11
Também quero salientar que outra razão para manter o número máximo de épocas de treinamento consistente entre as dobras é que, enquanto em uma dobra o erro de teste pode parar de melhorar em 60 épocas, mas em outro pode parar em 80 épocas. Quando você calcula a média de todas as curvas de erro de teste entre as dobras para determinar o ponto de parada real, precisará de dados de erro de teste em cada época de cada dobra. A interrupção antecipada do treinamento pode impedir que você o faça.
the higgs broson
Na verdade, comecei a parar cedo, porque o treinamento leva anos. O modelo possui muitos parâmetros e dados. Então, eu queria que ele parasse assim que o erro de validação aumentar (por duas épocas consecutivas, como o chamado parâmetro "paciência"). Então, eu realmente não posso treiná-lo até que o aprendizado pare. Mas ainda posso fazer o que você sugere no modelo final e comparar as trajetórias de erro das épocas de todas as suas dobras e tomar o número de épocas com o menor erro médio. Eu entendi você corretamente? Claro que só posso comparar até o mínimo de épocas computadas de todas as dobras.
V1nc3nt 28/09
11
Vincent, acho que você entendeu corretamente. Ao calcular a média das curvas de erro, você deve realmente parar no número mínimo de épocas entre as dobras. Para estar seguro, recomendo voltar e treinar os modelos em outras dobras até a época máxima de parada encontrada.
the Higgs Bros 28/09