Por que o ajuste excessivo não devasta redes neurais para a classificação MNIST?

8

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:

784×500+500×500+500×10=647000.
6000

No.12345678910Etrain(%)7.810.39.111.08.79.29.38.310.38.6Etest(%)11.713.913.214.112.113.213.311.913.412.7

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!O(|E|log(|E|))|E|

[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:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

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?

syeh_106
fonte
Não vejo nenhum comentário sobre o número de épocas usadas. Você já tentou correr por mais ou menos épocas para ver o efeito que isso tem? Você mencionou não usar a parada antecipada, mas presumivelmente está decidindo parar de alguma forma? Você está concorrendo a um grande número de épocas, de modo que a rede pareça ter convergido?
Neil Slater
@NeilSlater Eu usei apenas uma época no experimento e encerrei o SGD depois dele. (Isso é para manter o tempo de execução curto, já que estou fazendo isso no Matlab para melhor controle e visibilidade). Observando o valor da função de perda no SGD (tamanho do lote mini = 1), no entanto, ele parecia convergente, ou seja, a saída máxima do softmax estava pairando perto de 1. Tentei também exemplos de 60 mil (1 época) e vi uma tendência semelhante, ou seja, erro de treinamento ~ 3% e erro de teste ~ 4%.
2141717 sylv
Acho que a resposta após suas experiências prolongadas é uma combinação entre a minha e a resposta de Bashar. Pode ser útil se você pensar em termos de teste da taxa de erro: trem - um erro de treinamento de 0% com um erro de teste de 7% não é um bom desempenho - essa é uma grande adaptação excessiva. Mesmo sua taxa de erro de 2,5% em exemplos de treinamento de 60k é 10 vezes pior do que as taxas de erro de ponta neste problema. No entanto, acho que sua pergunta é "por que a rede não regressou a taxas de erro de 50% ou mesmo 90%"? Que é coberto A resposta de Bashar, embora eu ainda me pergunto se erros de teste subiria com ainda mais épocas
Neil Slater
1
@NeilSlater Claro, tamanho da etapa SGD = 0,001. Os pesos são inicializados de forma aleatória e uniforme em [-0,2, +0,2] nas 2 primeiras camadas, [-1, + 1] na camada de saída.
3051717 sysh_106
1
Atualizei minha resposta com alguma investigação adicional. Ele basicamente concorda com suas descobertas e oferece algum contexto e explicação-mão de ondulação
Neil Slater

Respostas:

7

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.

Neil Slater
fonte
Você está certo. Ao executar apenas uma época, implementei implícita a parada antecipada, inadvertidamente. Vou tentar sua sugestão e, possivelmente, atualizar minha pergunta, se necessário.
syeh_106
Suas respostas atualizadas e os resultados da investigação são muito úteis, esclarecendo mais essa questão. Eu aprecio muito isso. Redes neurais artificiais parecem bonitas e fascinantes para mim. É que, quando tentei definir por que / como / quando funcionou, a análise / teoria quantitativa e rigorosa não pareceu abundar.
syeh_106
3

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

Bashar Haddad
fonte