Cheguei a uma situação em que os pesos da minha rede neural não estão convergindo, mesmo após 500 iterações. Minha rede neural contém 1 camada de entrada, 1 camada oculta e 1 camada de saída. São cerca de 230 nós na camada de entrada, 9 nós na camada oculta e 1 nó de saída na camada de saída. Eu queria saber se faço a condição de parada precoce (por exemplo, interromper o treinamento da minha rede neural após 100 iterações). Que efeito isso terá no modelo?
Também queria saber qual é o padrão de trabalho do setor, se os pesos na rede neural não estão convergindo?
machine-learning
neural-networks
Aprendiz
fonte
fonte
Respostas:
Há várias perguntas a serem feitas:
O que você pode dar no caminho das efemérides? Você pode nos dizer algo sobre a natureza dos dados?
Você poderia criar uma árvore de redes neurais com aumento de gradiente.
Você perguntou o que acontece se você parar cedo.
Você pode tentar a si mesmo. Execute 300x onde você inicia com pesos inicializados aleatórios e, em seguida, para em um número especificado de iterações, digamos 100. Nesse ponto, calcule seu erro de conjunto, seu erro de subconjunto de treinamento e o erro do conjunto de testes. Repetir. Depois de ter 300 valores para informar qual é o erro, você pode ter uma idéia da sua distribuição de erros, com 100 iterações de aprendizado. Se desejar, você pode experimentar essa distribuição em vários outros valores de aprendizado. Sugiro 200, 500 e 1000 iterações. Isso lhe dará uma idéia de como o seu SNR muda com o tempo. Um gráfico da contagem de iteração e SNR pode fornecer uma idéia sobre "falésias" ou "bom o suficiente". Às vezes, existem falésias onde o erro entra em colapso. Às vezes, o erro é aceitável nesse ponto.
São necessários dados "relativamente simples" ou sorte "muito boa" para o seu sistema convergir consistentemente em menos de 100 iterações. Ambos não têm a ver com repetibilidade nem são generalizáveis.
Por que você está pensando em termos de pesos convergentes e não erro abaixo de um determinado limite? Você já ouviu falar de um paradoxo de votação? ( link ) Quando você tem interações cíclicas em seu sistema (como feedback nas redes neurais), pode ter paradoxos de votação - mudanças acopladas. Não sei se os pesos por si só são um indicador suficiente para a convergência da rede.
Você pode pensar nos pesos como um espaço. Tem mais de 3 dimensões, mas ainda é um espaço. No "centróide" desse espaço está a sua região "mais adequada". Longe do centróide é menos adequado. Você pode pensar na configuração atual de seus pesos como um ponto único nesse espaço.
Agora você não sabe onde está o "bom". O que você tem é uma "inclinação" local. Você pode realizar uma descida gradiente em direção ao local "melhor", considerando onde está o seu ponto agora. Não diz a você o "universal" melhor, mas o local é melhor que nada.
Então você começa a iterar, caminhando ladeira abaixo em direção àquele vale de amargura. Você itera até pensar que está pronto. Talvez o valor de seus pesos seja grande. Talvez eles estejam pulando por todo o lugar. Talvez a computação esteja "demorando muito". Você quer ser feito.
Então, como você sabe se onde você está é "suficientemente bom"?
Aqui está um teste rápido que você pode fazer:
Pegue 30 subconjuntos aleatórios uniformes dos dados (como alguns por cento dos dados cada) e treine novamente a rede neles. Deve ser muito mais rápido. Observe quanto tempo leva para convergir e compará-lo com o histórico de convergência do grande conjunto. Teste o erro da rede para obter todos os dados nesses subconjuntos e veja como essa distribuição de erros se compara ao seu grande erro. Agora aumenta os tamanhos dos subconjuntos até 5% dos seus dados e repita. Veja o que isso ensina a você.
Essa é uma variação da otimização de enxame de partículas (consulte a referência) modelada em como as abelhas tomam decisões com base no escotismo.
Você perguntou o que acontece se os pesos não convergirem.
Redes neurais são uma ferramenta. Eles não são a única ferramenta. Há outros. Eu usaria um deles.
Eu trabalho em termos de critérios de informação e, portanto, analiso os pesos (contagem de parâmetros) e o erro. Você pode tentar um desses.
Existem alguns tipos de pré-processamento que podem ser úteis. Centro e Escala. Gire usando os componentes principais. Se você observar os autovalores em seus componentes principais, poderá usar as regras de plotagem do skree para estimar a dimensão dos seus dados. Reduzir a dimensão pode melhorar a convergência. Se você conhece alguma coisa sobre a 'física subjacente', pode suavizar ou filtrar os dados para remover o ruído. Às vezes, a convergência é sobre ruído no sistema.
Acho interessante a ideia do sensor comprimido . Pode permitir sub-amostragem radical de alguns sistemas sem perda de generalização. Eu examinaria algumas estatísticas e distribuições re-amostradas de seus dados para determinar se e em que nível de subamostragem o conjunto de treinamento se torna representativo. Isso fornece uma medida da "saúde" dos seus dados.
Às vezes é bom que eles não converjam
Você já ouviu falar de um paradoxo de votação? Você pode pensar nisso como um primo de maior contagem para um impasse de mão dupla. É um loop. Em um paradoxo de votação para duas pessoas, a primeira pessoa quer o candidato "A", enquanto a segunda quer o candidato "B" (ou não A ou algo assim). A parte importante é que você pode pensar nisso como um loop.
Loops são importantes em redes neurais. Comentários. Recursão. Isso tornou o perceptron capaz de resolver problemas semelhantes ao XOR. Faz loops e, às vezes, os loops podem agir como o paradoxo da votação, onde eles continuarão mudando de peso se você tiver iterações infinitas. Eles não pretendem convergir porque não é o peso individual que importa, mas a interação dos pesos no circuito.
Nota:
Usar apenas 500 iterações pode ser um problema. Eu tive NN's onde 10.000 iterações mal eram suficientes. O número de iterações para ser "suficiente" depende, como já indiquei, de dados, topologia NN, funções de transferência de nós, função de aprendizado / treinamento e até hardware de computador. Você precisa entender bem como todos eles interagem com sua contagem de iterações antes de dizer que houve iterações "suficientes" ou "demais". Outras considerações como tempo, orçamento e o que você deseja fazer com o NN ao concluir o treinamento também devem ser consideradas.
Chen, RB, Chang, SP, Wang, W. e Wong, WK, (2011, setembro). Projetos experimentais ótimos por meio de métodos de otimização de enxame de partículas (pré-impressão), acessado em 25 de março de 2012, em http://www.math.ntu.edu.tw/~mathlib/preprint/2011-03.pdf
fonte
Para mim, é difícil dizer qual pode ser o seu problema. Um ponto a considerar é a implementação concreta que você usa. Concretamente, qual algoritmo de otimização. Se a sua rede demorar muito para convergir e você estiver usando alguma forma de descida de gradiente estocástico (ou mini-lote), pode ser que a sua rede esteja em um platô (uma região onde a função de energia / erro é muito plana para que os gradientes sejam muito baixos e, portanto, convergência).
Nesse caso, verifique a magnitude dos gradientes para ver se esse é o caso. Existem várias técnicas diferentes para lidar com esse problema, como adicionar um impulso ao gradiente.
Para uma visão geral detalhada das técnicas e truques do comércio, dê uma olhada neste artigo (obrigatório ler) de Yann LeCun .
fonte
Certifique-se de que seus gradientes não estejam além dos limites ou também é possível que eles estejam se tornando zero. Isso é conhecido popularmente como explosão de gradientes e problemas de gradientes de fuga.
Uma solução possível é usar um otimizador adaptável, como AdaGrad ou Adam.
Eu havia enfrentado um problema semelhante ao treinar uma rede neural simples quando estava começando com redes neurais.
Poucas referências: https://en.wikipedia.org/wiki/Vanishing_gradient_problem https://www.youtube.com/watch?v=VuamhbEWEWA
fonte
Eu tive muitos conjuntos de dados que convergiram lentamente - provavelmente porque as entradas eram altamente correlacionadas.
Escrevi meu próprio analisador C ++ NN e, com ele, posso variar a taxa de aprendizado para cada peso. Para cada peso em cada borda, faço duas coisas que ajudam alguns.
Primeiro, multiplico cada taxa de aprendizado por um número aleatório distribuído uniformemente de [0,1]. Suponho que isso ajude com o problema de correlação.
O outro truque é que eu comparo o gradiente atual com o gradiente anterior em cada extremidade. Se o gradiente mal diminuir em porcentagem, multiplico a taxa de aprendizado dessa borda por até 5.
Não tenho justificativa específica para nenhum desses truques, mas eles parecem funcionar muito bem.
Espero que isto ajude.
fonte