Estou usando a rede neural em R para criar um NN com 14 entradas e uma saída. Eu construo / treino a rede várias vezes usando os mesmos dados de treinamento de entrada e a mesma arquitetura / configurações de rede.
Depois que cada rede é produzida, eu a uso em um conjunto autônomo de dados de teste para calcular alguns valores previstos. Estou descobrindo que há uma grande variação em cada iteração dos dados previstos, apesar de todas as entradas (os dados de treinamento e de teste) permanecerem as mesmas sempre que eu construo a rede.
Entendo que sempre haverá diferenças nas ponderações produzidas no NN e que não haverá duas redes neurais idênticas, mas o que posso tentar produzir redes mais consistentes em cada trem, dados dados idênticos?
Respostas:
Em geral, você obteria mais estabilidade aumentando o número de nós ocultos e usando uma redução de peso apropriada (também conhecida como penalidade na crista).
Especificamente, eu recomendaria o uso do
caret
pacote para entender melhor sua precisão (e até a incerteza em sua precisão.) Também no sinal de intercalação está oavNNet
que torna um ensemble aprendiz de várias redes neurais para reduzir o efeito das sementes iniciais. Pessoalmente, não vi grandes melhorias usando,avNNet
mas isso poderia resolver sua pergunta original.Eu também me certificaria de que suas entradas fossem todas adequadamente condicionadas. Você ortogonalizou e redimensionou-os? A Caret também pode fazer esse pré-processamento por sua
pcaNNet
função.Por fim, você pode considerar lançar algumas conexões da camada de salto. Você precisa se certificar de que não existem pontos de discrepância / alavancagem em seus dados para distorcer essas conexões.
fonte
nnet
pesos iniciais, todos são inicializados com um número aleatório uniforme entre -0,7 e 0,7, se bem me lembro. E você pode controlar a magnitude em um parâmetro. Sinceramente, tive muita sorte com onnet
pacote e nunca tentei nenhuma das outras opções. Boa sorte!Eu não trabalhei com R, então só posso dar dicas mais gerais.
Você verificou se o algoritmo convergiu? Uma explicação possível pode ser que os diferentes conjuntos de parâmetros estejam todos na metade do caminho para o mesmo ideal.
Se o algoritmo sempre convergir, mas para um ótimo local diferente, existem muitas heurísticas que você pode tentar evitá-las. Uma estratégia simples ao usar a descida do gradiente estocástico (SGD) seria usar lotes menores e maior momento . Os lotes menores introduzem efetivamente algum ruído no treinamento, o que pode ajudar a escapar de algumas ótimas locais. Uma estratégia muito mais sofisticada seria inicializar os pesos usando autoencoders .
fonte
nnet
da base R, ele usa o método de otimização BFGS dos R'soptim
. Na verdade, ele calcula os gradientes para obter uma imagem da superfície. Não há processamento em lote nem parâmetro de momento fixo em sua implementação. Dito tudo isso, pode facilmente não convergir; especialmente com lixo.