Estou tentando programar meu próprio sistema para executar uma rede neural. Para reduzir o número de nós necessários, foi sugerido que ele tratasse as rotações da entrada igualmente.
Minha rede tem como objetivo aprender e prever o Jogo da Vida de Conway, olhando para cada quadrado e seus quadrados ao redor em uma grade e fornecendo a saída para esse quadrado. Sua entrada é uma sequência de 9 bits:
O acima é representado como 010 001 111.
No entanto, existem outras três rotações dessa forma e todas produzem a mesma saída:
Minha topologia de rede é de 9 nós de entrada e 1 nó de saída para o próximo estado do quadrado central na entrada. Como posso construir a (s) camada (s) oculta (s) para que elas tomem cada uma dessas rotações da mesma forma, reduzindo o número de entradas possíveis em um quarto da original?
Editar:
Há também um giro de cada rotação que produz um resultado idêntico. Incorporar esses itens reduzirá minhas entradas em 1/8. Com o planador, meu objetivo é que todas essas entradas sejam tratadas exatamente da mesma forma. Isso precisa ser feito com pré-processamento ou posso incorporá-lo à rede?
fonte
Respostas:
Se bem entendi, seu único nó de saída será o próximo status do quadrado no meio. Você não precisa se preocupar com o número de nós nas camadas ocultas enquanto tiver recursos suficientes para treinar o modelo. Esse problema é muito fácil de aprender para uma rede neural, portanto, não há preocupação com o tamanho.
Você precisa fazer um treinamento supervisionado, o que significa que precisa alimentar os dados de entrada e a saída esperada correspondente. Você precisa ter certeza de que nos dados de treinamento todas as 4 rotações são atribuídas à mesma saída. Dessa forma, sua rede deve aprender a tratar tudo isso da mesma maneira.
Você me deixou curioso, então eu me tentei. Minha solução pode aprender 100% de correção em cerca de 20 épocas em execução em alguns segundos no meu laptop antigo. Alterei apenas ligeiramente a saída para ser categórica [0,1] ou [1,0], mas isso dá o mesmo resultado que você está procurando. Apenas para referência, aqui está o código escrito em python:
fonte
Você identificou uma otimização no espaço do problema e deseja incorporar isso na sua rede neural. Sugiro pré-processamento: componha sua otimização com uma rede neural que faça um subconjunto do que você deseja.
Em outras palavras, normalize sua entrada codificando manualmente um algoritmo de rotação que gira entradas para capturar a equivalência destacada em sua postagem. Em seguida, alimente o resultado dessa transformação à sua rede neural, para treinamento e todos os outros usos. Isso significa que você está treinando a rede neural para resolver o subproblema identificado - as rotações são redundantes.
Teste seu normalizador gerando entrada aleatória, girando-o para todas as quatro transformações em potencial, execute o normalizador em cada uma e verifique se todas são equivalentes.
fonte
Para ser mais purista, comece considerando a entrada de maneira diferente, como uma matriz circular de tamanho quatro, cada item contendo um par de bits e, adicionalmente, um bit central:
Em todo o design da rede, continue essa estrutura circular e o paradigma do ponto central.
fonte