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?
machine-learning
python
deep-learning
Raghuram
fonte
fonte
Respostas:
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
loss
está 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):
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:
Soluções possíveis:
fonte
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).
fonte
Adicionando à resposta por @ dk14. Se você ainda estiver vendo flutuações após regularizar adequadamente seu modelo, estes podem ser os possíveis motivos:
fonte
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.
fonte
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.
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 .
fonte
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
fonte
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.
fonte