Eu tenho uma rede neural simples (NN) para a classificação MNIST. Inclui 2 camadas ocultas, cada uma com 500 neurônios. Portanto, as dimensões do NN são: 784-500-500-10. ReLU é usado em todos os neurônios, softmax é usado na saída e entropia cruzada é a função de perda.
O que me intriga é por que o excesso de ajustes não parece devastar o NN?
Considere o número de parâmetros (pesos) do NN. É aproximadamente No entanto, em meu experimento, usei apenas exemplos (um décimo do conjunto de treinamento MNIST) para treinar o NN. (Isso é apenas para manter o tempo de execução curto. O erro de treinamento e teste diminuiria consideravelmente se eu usasse mais exemplos de treinamento.) Repeti o experimento 10 vezes. É utilizada uma descida de gradiente estocástico simples (sem suporte ou momento RMS); nenhuma regularização / abandono / parada precoce foi usada. O erro de treinamento e o erro de teste relatados foram:
Observe que nas 10 experiências (cada uma com inicialização aleatória independente dos parâmetros), o erro de teste diferiu do erro de treinamento apenas em aprox. 4%, embora eu tenha usado exemplos de 6K para treinar parâmetros de 647K. A dimensão VC da rede neural é da ordem de pelo menos, ondeé o número de arestas (pesos). Então, por que o erro de teste não foi miseravelmente maior (por exemplo, 30% ou 50%) do que o erro de treinamento? Eu apreciaria muito se alguém pudesse apontar onde eu errei. Muito obrigado!
[EDITOS 2017/6/30]
Para esclarecer os efeitos da parada precoce, fiz os 10 experimentos novamente, cada um agora com 20 épocas de treinamento. As taxas de erro são mostradas na figura abaixo:
A diferença entre o teste e o erro de treinamento aumentou à medida que mais épocas são usadas no treinamento. No entanto, a cauda do erro de teste permaneceu quase plana após o erro de treinamento ser zerado. Além disso, vi tendências semelhantes para outros tamanhos do conjunto de treinamento. A taxa de erro média no final de 20 épocas de treinamento é plotada contra o tamanho do treinamento definido abaixo:
Portanto, o excesso de ajustes ocorre, mas não parece devastar o NN. Considerando o número de parâmetros (647K) que precisamos para o trem e o número de exemplos de treinamento que temos (<60K), a questão permanece: por que o overfitting facilmente torna inútil o NN? Além disso, isso é verdade para o ReLU NN para todas as tarefas de classificação com função softmax output e objetivo de entropia cruzada? Alguém viu um contra-exemplo?
Respostas:
Eu repliquei seus resultados usando Keras e obtive números muito semelhantes, então não acho que você esteja fazendo algo errado.
Por interesse, corri por muitas outras épocas para ver o que aconteceria. A precisão dos resultados dos testes e trens permaneceu bastante estável. No entanto, os valores de perda se afastaram ainda mais ao longo do tempo. Depois de 10 épocas, eu estava obtendo 100% de precisão no trem, 94,3% no teste - com valores de perda em torno de 0,01 e 0,22, respectivamente. Após 20.000 épocas, as precisões mal mudaram, mas eu tive perda de treinamento 0,000005 e perda de teste 0,36. As perdas também foram divergentes, embora muito lentamente. Na minha opinião, a rede é claramente excessiva.
Portanto, a questão poderia ser reformulada: por que, apesar do excesso de ajustes, uma rede neural treinada para o conjunto de dados MNIST ainda generaliza aparentemente razoavelmente bem em termos de precisão?
Vale a pena comparar essa precisão de 94,3% com o que é possível usando abordagens mais ingênuas.
Por exemplo, uma regressão linear simples softmax (essencialmente a mesma rede neural sem as camadas ocultas) fornece uma precisão rápida e estável de 95,1% de trem e 90,7% de teste. Isso mostra que muitos dados se separam linearmente - você pode desenhar hiperplanos nas dimensões 784 e 90% das imagens dos dígitos ficarão dentro da "caixa" correta, sem a necessidade de refinamentos adicionais. Com isso, você pode esperar que uma solução não linear com excesso de ajuste obtenha um resultado pior que 90%, mas talvez não seja pior que 80% porque forma intuitivamente um limite excessivamente complexo em torno de, por exemplo, um "5" encontrado dentro da caixa para "3" atribuirá incorretamente apenas uma pequena quantidade desse coletor ingênuo 3. Mas somos melhores do que essa estimativa de estimativa de limite de 80% do modelo linear.
Outro possível modelo ingênuo é a correspondência de modelos, ou o vizinho mais próximo. Essa é uma analogia razoável com o que o ajuste excessivo está fazendo - ele cria uma área local próxima a cada exemplo de treinamento em que preverá a mesma classe. Problemas com excesso de ajuste ocorrem no espaço intermediário em que os valores de ativação seguem o que quer que a rede "naturalmente" faça. Observe o pior caso, e o que você costuma ver nos diagramas explicativos seria uma superfície quase caótica altamente curva que viaja por outras classificações. Mas, na verdade, pode ser mais natural para a rede neural interpolar mais suavemente entre os pontos - o que realmente faz depende da natureza das curvas de ordem superior que a rede combina em aproximações e de quão bem elas já se ajustam aos dados.
Peguei emprestado o código para uma solução KNN deste blog no MNIST com o K Nearest Neighbors . Usar k = 1 - ou seja, escolher o rótulo do mais próximo dos 6000 exemplos de treinamento, apenas combinando os valores de pixel, fornece uma precisão de 91%. Os 3% a mais que a rede neural super treinada obtém não parecem tão impressionantes, dada a simplicidade da contagem de correspondências de pixels que o KNN com k = 1 está realizando.
Tentei algumas variações da arquitetura de rede, diferentes funções de ativação, diferentes números e tamanhos de camadas - nenhuma usando regularização. No entanto, com 6000 exemplos de treinamento, eu não consegui super-ajustar nenhum de uma maneira em que a precisão do teste caiu drasticamente. Mesmo reduzir para apenas 600 exemplos de treinamento reduziu o platô, com ~ 86% de precisão.
Minha conclusão básica é que os exemplos do MNIST têm transições relativamente suaves entre as classes no espaço de recursos e que as redes neurais podem se ajustar a elas e interpolar entre as classes de uma maneira "natural", dados os blocos de construção da NN para a aproximação de funções - sem adicionar componentes de alta frequência a elas. a aproximação que pode causar problemas em um cenário de excesso de ajuste.
Pode ser um experimento interessante tentar com um conjunto "MNIST ruidoso", em que uma quantidade de ruído ou distorção aleatória é adicionada aos exemplos de treinamento e teste. Espera-se que os modelos regularizados tenham um bom desempenho neste conjunto de dados, mas talvez nesse cenário o excesso de ajuste cause problemas mais óbvios de precisão.
Isso é anterior à atualização com mais testes pelo OP.
Nos seus comentários, você diz que todos os resultados dos testes são obtidos após a execução de uma única época. Você usou essencialmente a parada precoce, apesar de escrever que não o fez, porque interrompeu o treinamento o mais cedo possível, considerando seus dados de treinamento.
Eu sugeriria a execução por muito mais épocas, se você quiser ver como a rede está realmente convergindo. Comece com 10 épocas, considere subir até 100. Uma época não é muita para esse problema, especialmente em 6000 amostras.
Embora o número crescente de iterações não seja garantido para piorar a sua rede do que já foi, você não teve muita chance e seus resultados experimentais até agora não são conclusivos.
De fato, eu meio que esperaria que os resultados dos seus dados de teste melhorassem após uma segunda, terceira época, antes de começar a se afastar das métricas de treinamento à medida que os números da época aumentam. Eu também esperaria que seu erro de treinamento se aproximasse de 0% à medida que a rede se aproximasse da convergência.
fonte
Em geral, as pessoas pensam sobre o ajuste excessivo em função da complexidade do modelo. O que é ótimo, porque a complexidade do modelo é uma das coisas que você pode controlar. Na realidade, existem muitos outros fatores relacionados ao problema de ajuste excessivo: - número de amostras de treinamento - número de iterações - a dimensão da entrada (no seu caso, acredito que essa é a razão pela qual você não está ajustando demais) - o dificuldade do problema: se você tiver um problema simples, linearmente separável, não se preocupe muito com o ajuste excessivo.
Existe uma demonstração visual fornecida pelo google tensorflow que permite alterar todos esses parâmetros. http://playground.tensorflow.org Você pode alterar o problema de entrada, o número de amostras, a dimensão de sua entrada, a rede, o número de iterações.
Eu gosto de pensar em sobreajuste como Sobreajuste = modelos grandes + recursos não relacionados
fonte