Por que a precisão da validação está flutuando?

31

Eu tenho uma CNN de quatro camadas para prever a resposta ao câncer usando dados de ressonância magnética. Eu uso as ativações da ReLU para introduzir não-linearidades. A precisão e a perda do trem aumentam e diminuem monotonicamente, respectivamente. Mas, a precisão do meu teste começa a flutuar bastante. Eu tentei mudar a taxa de aprendizagem, reduzir o número de camadas. Mas isso não impede as flutuações. Até li essa resposta e tentei seguir as instruções dessa resposta, mas não tive sorte novamente. Alguém poderia me ajudar a descobrir onde estou errado?

Captura de tela

Raghuram
fonte
Sim, eu li essa resposta. A reprodução aleatória dos dados de validação não ajudou
Raghuram
4
Como você não compartilhou seu snippet de código, não posso dizer muito o que há de errado na sua arquitetura. Mas, na captura de tela, vendo a precisão do treinamento e da validação, é evidente que sua rede está se adaptando demais. Seria melhor se você compartilhar seu snippet de código aqui.
Nain
quantas amostras você tem? talvez a flutuação não seja realmente significativa. Além disso, a precisão é uma medida horrível
rep_ho 02/02
Alguém pode me ajudar a verificar se o uso de uma abordagem de conjunto é bom quando a precisão da validação está flutuando? porque eu fui capaz de gerenciar minha validation_accuracy flutuante por meio de um bom valor.
Sri2110 29/07

Respostas:

27

Se eu entendo a definição de precisão corretamente, a precisão (% dos pontos de dados classificados corretamente) é menos cumulativa do que digamos MSE (erro médio quadrático). É por isso que você vê que lossestá aumentando rapidamente, enquanto a precisão está flutuando.

Intuitivamente, isso basicamente significa que uma parte dos exemplos é classificada aleatoriamente , o que produz flutuações, pois o número de suposições aleatórias corretas sempre flutua (imagine precisão quando a moeda sempre deve retornar "cabeças"). Basicamente, a sensibilidade ao ruído (quando a classificação produz resultados aleatórios) é uma definição comum de sobreajuste (consulte a Wikipedia):

Em estatística e aprendizado de máquina, uma das tarefas mais comuns é ajustar um "modelo" a um conjunto de dados de treinamento, para poder fazer previsões confiáveis ​​sobre dados gerais não treinados. Na super adaptação, um modelo estatístico descreve erro ou ruído aleatório, em vez da relação subjacente

Outra evidência de sobreajuste é que sua perda está aumentando, a perda é medida com mais precisão, é mais sensível à previsão barulhenta se não for esmagada por sigmóides / limiares (que parece ser o seu caso para a própria perda). Intuitivamente, você pode imaginar uma situação em que a rede tem muita certeza sobre a saída (quando está errada), portanto, fornece um valor distante do limite em caso de classificação aleatória incorreta.

Em relação ao seu caso, seu modelo não está devidamente regularizado, possíveis motivos:

  • pontos de dados insuficientes, muita capacidade
  • encomenda
  • dimensionamento / normalização de recurso não / errado
  • ααα

Soluções possíveis:

  • obter mais pontos de dados (ou expandir artificialmente o conjunto de pontos existentes)
  • brincar com hiperparâmetros (aumentar / diminuir capacidade ou termo de regularização, por exemplo)
  • regularização : tente desistência, parada antecipada, etc.
dk14
fonte
Em relação a: "A perda é medida com mais precisão, é mais sensível à previsão barulhenta porque não é esmagada por sigmóides / limites", eu concordo com nenhuma limitação, mas se você estiver usando, por exemplo, entropia cruzada binária como sua função de perda, a sigmóide ainda será reproduzida um papel.
Zhubarb 02/02
11
Em relação à taxa de aprendizagem e SGD faltando os mínimos: atingir o mínimo seria overfitting provavelmente média (porque é o mínimo do conjunto de treinamento)
Jan KUKACKA
@Berkmeister verdade, eu reformulei um pouco (veja editar). Meu pensamento era que o aumento da perda é um sinal de função não esmagada sendo usada.
dk14
@JanKukacka você quer dizer mínimos globais? Eu impliquei os mínimos locais (na verdade, perto dos mínimos locais) - no sentido de que, se estiver muito longe de quaisquer mínimos, seria pouco adequado então. Provavelmente, devo descrevê-lo com mais cuidado (veja editar), obrigado.
dk14 02/02
@ dk14 Presumo que o mínimo global não possa ser atingido na prática, então quero dizer mínimos locais. Se você estiver muito longe, poderá estar mal adaptado, mas se estiver muito próximo, provavelmente estará se adaptando demais. Há um trabalho interessante de Moritz Hardt "Treine mais rápido, generalize melhor: estabilidade da descida do gradiente estocástico" ( arxiv.org/abs/1509.01240 ) colocando limites na relação entre treinamento e teste de erro ao treinar com SGD.
Jan KUKACKA
6

Esta pergunta é antiga, mas está sendo postada como ainda não foi apontada:

Possibilidade 1 : Você está aplicando algum tipo de pré-processamento (significado zero, normalização etc.) ao seu conjunto de treinamento ou validação, mas não o outro .

Possibilidade 2 : se você construiu algumas camadas com desempenho diferente durante o treinamento e a inferência do zero, seu modelo pode ser implementado incorretamente (por exemplo, a média móvel e o desvio padrão móvel para que a normalização do lote seja atualizada durante o treinamento? inferência?). Pode ser esse o caso se o seu código implementar essas coisas do zero e não usar as funções internas do Tensorflow / Pytorch.

Possibilidade 3: Sobreajuste, como todos apontaram. Acho que as outras duas opções são mais prováveis ​​na sua situação específica, pois sua precisão de validação está presa a 50% da época 3. Geralmente, eu ficaria mais preocupado com o ajuste excessivo se isso estivesse acontecendo em um estágio posterior (a menos que você tenha um problema muito específico à mão).

Soroush
fonte
Estou tendo um problema semelhante, mas não completamente, mais detalhes aqui: stackoverflow.com/questions/55348052/… No meu caso, eu realmente tenho uma alta precisão consistente com dados de teste e durante o treinamento, a validação "precisão" "(não perda) é maior que a precisão do treinamento. Mas o fato de nunca convergir e oscilar me faz pensar em excesso de ajustes, enquanto alguns sugerem que não é esse o caso, então eu me pergunto se é e qual é a justificativa se não é.
dusa 26/03
11
Esta é de longe a explicação mais plausível das respostas dadas. Observe que o alto momento de normalização do lote (por exemplo, 0,999, ou mesmo o Keras padrão 0,99) em combinação com uma alta taxa de aprendizado também pode produzir um comportamento muito diferente no treinamento e na avaliação, pois as estatísticas da camada ficam muito atrás. Nesse caso, reduzir o momento para algo como 0,9 deve ser suficiente. Eu tive um problema semelhante ao OP e isso fez o truque.
kristjan
5

Adicionando à resposta por @ dk14. Se você ainda estiver vendo flutuações após regularizar adequadamente seu modelo, estes podem ser os possíveis motivos:

  • Usando uma amostra aleatória do seu conjunto de validação: Significa que seu conjunto de validação em cada etapa da avaliação é diferente, assim como sua perda de validação.
  • Usando uma função de perda ponderada (que é usada em caso de problemas de classe altamente desequilibrados). Na etapa de trem, você pesa sua função de perda com base em pesos de classe, enquanto na etapa de desenvolvimento você apenas calcula a perda não ponderada. Nesse caso, embora sua rede esteja entrando em convergência, você poderá ver muitas flutuações na perda de validação após cada etapa do trem. Mas se você esperar por uma imagem maior, poderá ver que sua rede está realmente convergindo para um mínimo com as flutuações se esgotando (veja as imagens em anexo para um exemplo).insira a descrição da imagem aquiinsira a descrição da imagem aqui
bitspersegundo
fonte
2

Definitivamente excessivo. A diferença entre a precisão dos dados de treinamento e os dados de teste mostra que você se adaptou demais ao treinamento. Talvez a regularização possa ajudar.

keramat
fonte
1

Sua precisão de validação em um problema de classificação binária (presumo) está "flutuando" em torno de 50%, o que significa que seu modelo está fornecendo previsões completamente aleatórias (às vezes adivinha corretamente poucas amostras a mais, às vezes algumas amostras a menos). Geralmente, seu modelo não é melhor do que jogar uma moeda.

{0 0;1 1}

De qualquer forma, como outros já apontaram, seu modelo está passando por um ajuste excessivo. Meu palpite é que seu problema é muito complicado , ou seja, é muito difícil extrair as informações desejadas dos seus dados, e essa simples conv-net de 4 camadas treinada para o end2end não tem chance de aprender .

Jan Kukacka
fonte
0

Existem algumas maneiras de tentar na sua situação. Em primeiro lugar, tente aumentar o tamanho do lote, o que ajuda o mini-lote SGD a vagar descontroladamente. Em segundo lugar, ajustando a taxa de aprendizado, provavelmente a diminua. Em terceiro lugar, tente um otimizador diferente, por exemplo, Adam ou RMSProp, capazes de adaptar as taxas de aprendizado para recursos errados. Se possível, tente aumentar seus dados. Por fim, tente as redes neurais bayesianas por aproximação de dropout, um trabalho muito interessante de Yarin Gal https://arxiv.org/abs/1506.02158

pateheo
fonte
0

Você já tentou uma rede menor? Considerando que a precisão do treinamento pode chegar a> 0,99, sua rede parece ter conexões suficientes para modelar completamente seus dados, mas você pode ter conexões estranhas que estão aprendendo aleatoriamente (ou seja, super ajuste).

Na minha experiência, obtive a precisão da validação de validação para estabilizar com uma rede menor, testando várias redes, como ResNet, VGG e redes ainda mais simples.

teter123f
fonte