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.