Validação mostrando grandes flutuações. O que poderia ser a causa?


8

Estou treinando uma CNN para um problema de classificação de imagem de 3 classes. Minha perda de treinamento diminuiu sem problemas, que é o comportamento esperado. No entanto, minha perda de validação mostra muita flutuação.

insira a descrição da imagem aqui

É algo com que eu deveria me preocupar ou devo escolher o modelo com a melhor pontuação na minha medida de desempenho (precisão)?

Informações adicionais: Estou ajustando a última camada de um Resnet-18 pré-treinado em dados ImageNet no PyTorch. Devo observar que estou usando uma função de perda ponderada para a fase de treinamento, pois meus dados são altamente desequilibrados. Para plotar as perdas, no entanto, utilizo a perda não ponderada para poder comparar a perda de validação e treinamento. Eu usaria a perda não ponderada, não fosse que as distribuições do conjunto de dados de treinamento e de validação sejam um pouco diferentes (no entanto, elas são altamente desequilibradas).


Confira esta pergunta em crossvalidated. O autor tem um problema semelhante ao seu. stats.stackexchange.com/questions/255105/…
Nord112

Respostas:


3

Com a simples inspeção do seu enredo, eu poderia tirar algumas conclusões e listar as coisas a tentar. (Isso sem você saber mais sobre sua configuração: parâmetros de treinamento e hiperparâmetros do modelo).

Parece que a perda está diminuindo (coloque uma linha de melhor ajuste na perda de validação). Também parece que você pode treinar por mais tempo para melhorar os resultados, pois a curva ainda está voltada para baixo.

Primeiro, tentarei responder à sua pergunta do título:

qual é a causa da flutuação na perda de validação?

Eu posso pensar em três possibilidades:

  1. Regularização - para ajudar a suavizar o processo de aprendizado e tornar os pesos do modelo mais robustos. Adicionar / aumentar sua regularização impedirá a introdução de grandes atualizações nos pesos.
  2. Tamanho do lote - é relativamente pequeno (por exemplo, <20?). Isso significa que o erro médio medido no final da rede é calculado usando apenas algumas amostras. Com um tamanho de lote de, digamos 8, a 4/8correção e a comparação com a 6/8correção têm uma grande diferença relativa ao observar a perda. Tomar a média dos erros com lotes tão pequenos levará a uma curva de perda não tão suave. Se você tiver memória / RAM GPU suficientes, tente aumentar o tamanho do lote.
  3. Taxa de aprendizado - pode ser muito grande. Isso é semelhante ao primeiro ponto em relação à regularização. Para fazer melhorias mais suaves, pode ser necessário diminuir o ritmo do aprendizado ao se aproximar de um mínimo de perda. Você pode fazer isso, talvez, ser executado de acordo com um cronograma, em que é reduzido por algum fator (por exemplo, multiplique-o por 0,5) toda vez que a perda de validação não melhorar depois, digamos as 6épocas. Isso impedirá que você dê grandes passos e, talvez, ultrapasse um mínimo e apenas salte ao redor dele.

Específico à sua tarefa, eu também sugeriria tentar descongelar outra camada , para aumentar o escopo do seu ajuste fino. Isso dará ao Resnet-18 um pouco mais de liberdade para aprender, com base em seus dados.

Em relação à sua última pergunta:

É algo com que eu deveria me preocupar ou devo escolher o modelo com a melhor pontuação na minha medida de desempenho (precisão)?

Você deveria estar preocupado? Em suma, não. Uma curva de perda de validação como a sua pode ser perfeitamente adequada e fornecer resultados razoáveis; no entanto, eu tentaria algumas das etapas mencionadas acima antes de me decidir.

Você deve apenas escolher o modelo com melhor desempenho? Se você quer dizer tomar o modelo no seu ponto com a melhor perda de validação (precisão da validação), então eu diria para ter mais cuidado. No seu gráfico acima, isso pode ser equivalente à época 30, mas eu pessoalmente consideraria um ponto que treinou um pouco mais, em que a curva fica um pouco menos volátil. Novamente, depois de ter tentado algumas das etapas descritas acima.


Obrigado pela sua resposta Dexter! De fato, notei que diminuir a taxa de aprendizado ao longo do tempo torna a curva de perda de validação muito menos volátil nas épocas posteriores. Agora, tenho uma pergunta de acompanhamento sobre o descongelamento de outra camada. Eu já estava pensando em fazer isso, mas realmente não sei como fazer isso. Devo primeiro treinar o classificador por várias épocas e, depois, o classificador E a camada convolucional, ou posso começar imediatamente a treinar os dois (talvez com taxas de aprendizado diferentes)? Não quero desperdiçar a pequena quantidade de recursos computacionais que tenho.
Tim

@ Tim - Se possível, geralmente é preferível treinar de ponta a ponta, ou seja, ambos ao mesmo tempo. Então, descongelaria outra camada (a mais próxima da saída que ainda está congelada) e depois treinava tudo. Se isso não lhe der o impulso necessário, talvez você possa reinicializar os pesos das camadas descongeladas (nem todas!) E treinar por mais tempo, mas isso traria outros riscos e talvez piorasse as coisas. Considere isso como último recurso.
N1k31t4

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.