Pergunta: é possível treinar um NN para distinguir entre números pares e ímpares usando apenas como entrada os próprios números?
Eu tenho o seguinte conjunto de dados:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
Treinei um NN com dois neurônios de entrada (um sendo a variável Number, o outro sendo um neurônio de viés), nove neurônios na camada oculta e um neurônio de saída usando um algoritmo genético muito simples: em cada época, dois conjuntos de pesos "lutam" " um contra o outro; aquele com o erro mais alto perde e é substituído por uma versão modificada do vencedor.
O script resolve facilmente problemas simples como os operadores AND, OR ou XOR, mas fica parado ao tentar categorizar números pares e ímpares. No momento, o melhor que conseguiu fazer é identificar 53 números em 100 e levou várias horas. Normalizar ou não as entradas parece não fazer diferença.
Se eu quisesse trapacear, poderia apenas pré-processar os dados e alimentar% 2 para o NN como uma entrada, mas não quero fazer isso; NN deve ser capaz de aproximar todas as funções, incluindo o operador de módulo ( acredito ). O que estou fazendo de errado?
fonte
Respostas:
Como em qualquer tarefa de aprendizado de máquina, a representação de suas informações desempenha um papel crucial na forma como você aprende e generaliza.
Penso que o problema com a representação é que a função (módulo) é altamente não linear e não suave na representação de entrada que você escolheu para esse problema.
Eu tentaria o seguinte:
Tente um algoritmo de aprendizado melhor (retropaginação / gradiente descendente e suas variantes).
Tente representar os números em binário usando uma precisão de comprimento fixo.
Se sua representação de entrada for um número b-bit, eu garantiria que seu conjunto de treinamento não seja enviesado para números pequenos ou grandes. Tenha números que sejam uniformemente escolhidos aleatoriamente e de forma independente no intervalo .[ 0 , 2b- 1 ]
Como você fez, use uma rede de várias camadas (tente duas camadas primeiro: por exemplo, oculto + saída, antes de usar mais camadas).
Use um treinamento separado + conjunto de teste. Não avalie seu desempenho no conjunto de treinamento.
fonte
Aprender a classificar números ímpares e pares é um problema difícil. Um padrão simples continua repetindo infinitamente. 2,4,6,8 ..... 1,3,5,7 .....
Funções de ativação não linear como sin (x) e cos (x) se comportam de maneira semelhante. Portanto, se você alterar seus neurônios para implementar o pecado e o cos, em vez de funções de ativação populares como tanh ou relu, acho que você pode resolver esse problema facilmente usando um único neurônio.
As transformações lineares sempre precedem as transformações não lineares. Portanto, um único neurônio acaba aprendendo o pecado (ax + b) que, para a combinação correta de a & b, gera 0 e 1 como alternativa na frequência desejada que queremos, que neste caso é 1.
Eu nunca tentei pecado ou cos em minhas redes neurais antes. Então, desculpas se isso acabar sendo uma péssima idéia.
fonte
Então, eu estou trabalhando com redes neurais agora e tive o mesmo problema que você. O que acabei fazendo foi representar o número de entrada como uma matriz com valores iguais à representação binária do número. Como o que estamos fazendo é classificar, eu representei minha saída como uma matriz, e não um único valor. ex:
Espero que isto ajude!
fonte
Eu chego aqui onde estava lutando com um problema semelhante. Então eu escrevo o que consegui.
Tanto quanto sei, o perceptron é capaz de resolver todos os problemas, que no final podem ser simplificados para dividir objetos em qualquer geometria usando linha reta. E esse é esse tipo de problema. Se você desenhar o último pedaço de representação binária no papel, também poderá desenhar uma linha, e todos os números ímpares estarão de um lado e Mesmo do outro. Pela mesma razão, é impossível resolver o problema xor com uma rede de camada.
Está bem. Esse problema parece muito simples, então vamos dar o passo Heaviside como função de ativação. Depois que brinquei um pouco com o meu número, percebi que o problema aqui é o viés. Pesquisei um pouco no google e descobri que, se você permanecer com a representação geométrica, o viés permitirá alterar o local de ativação no sistema de coordenadas.
Problema muito educacional
fonte
É sabido que as portas lógicas NOT, AND, OR podem ser feitas com redes neurais (NN) muito simples, e que você pode construir uma calculadora aritmética completa com portas lógicas usando números binários como entrada. Portanto, você deve poder criar um NN para calcular n módulo k, para qualquer número de ne expressado na base 2.
Se você deseja calcular n módulo k para um número fixo k (por exemplo, k = 4), é possível criar um NN extremamente simples que faça isso: expresse o número de entrada n na base k e ignore todos os dígitos que não sejam da classificação mais baixa dígito e você tem a resposta!
fonte
Uma idéia que evita o uso do "mod 2" explícito na entrada pode ser codificar o número como uma sequência de pixels, então o problema é reconhecer se o segmento pode ser dividido em dois segmentos iguais. Esse é um problema de visão de máquina e pode ser aprendido por redes convencionais.
Por outro lado, se o número for armazenado como um flutuador, a questão será reduzida (ou generalizada) para reconhecer quando um número flutuante é aproximadamente um número inteiro.
fonte
Eu criei uma rede aqui .
A representação que @William Gottschalk deu foi a base.
Ele usa apenas 1 neurônio na primeira camada oculta com 32 entradas. A camada de saída possui apenas 2 neurônios para a codificação one-hot de 0 e 1.
fonte
Minha solução
Além disso, dividir por outros números (digamos, 7) também é bom:
Explicação:
Eu recebo 2 soluções diferentes. Ambos são bons:
1. pecado como ativação
2. andar (ou int) como ativação
É impossível encontrar os melhores pesos usando descida de gradiente, e eu uso o algoritmo genético (do scikit-opt )
fonte