Criando rede neural para a função xor

8

É um fato bem conhecido que uma rede de uma camada não pode prever a função xor, uma vez que não é linearmente separável. Tentei criar uma rede de duas camadas, usando a função sigmoide logística e backprop, para prever xor. Minha rede possui 2 neurônios (e um viés) na camada de entrada, 2 neurônios e 1 viés na camada oculta e 1 neurônio de saída. Para minha surpresa, isso não irá convergir. se eu adicionar uma nova camada, então eu tenho uma rede de 3 camadas com entrada (2 + 1), hidden1 (2 + 1), hidden2 (2 + 1) e saída, ela funciona. Além disso, se eu mantiver uma rede de duas camadas, mas aumentar o tamanho da camada oculta para 4 neurônios + 1 polarização, ela também converge. Existe uma razão pela qual uma rede de duas camadas com 3 ou menos neurônios ocultos não será capaz de modelar a função xor?

do utilizador
fonte
2
Você pode prever o XOR usando essa estrutura. Na verdade, você nem precisa de preconceitos (veja aqui ).
Krychu #
Preciso inicializar meus pesos de alguma maneira especial para obter convergência? Eu a tentar uma rede neural simples com pesos entre (-1,1) inicializado de forma aleatória, mas eu não posso obtê-lo a convergir (mesmo usando preconceitos)
usuário
Na verdade, usando o sigmóide logístico, às vezes converge, mas não o tempo todo, depende da escolha inicial de pesos aleatórios.
usuário
Seu alcance parece bastante grande, tente (-0,1, 0,1). Caso contrário, você corre o risco de o sinal de entrada de um neurônio ser grande desde o início, caso em que o aprendizado para esse neurônio é lento. Você também pode diminuir a taxa de aprendizado e aumentar o número de iterações.
Krychu #
Pelo contrário, valores maiores tornam a convergência mais rápida. Eu tentei menor taxa de aprendizado e muitas iterações. Acho que a resposta de Neil Slater abaixo resume as questões, embora ainda não tenha certeza do porquê.
usuário

Respostas:

7

Sim, há uma razão. Tem a ver com a forma como você inicializa seus pesos.

Existem 16 mínimos locais que têm a maior probabilidade de convergir entre 0,5 - 1.

insira a descrição da imagem aqui

Aqui está um artigo que analisa o problema xor.

Emil
fonte
2
Parece que o link está quebrado.
Adam Kingsley
@ Emil Então, se os pesos são muito pequenos, você está dizendo que nunca convergirá? Eu também corrigi o link para você.
usuário
@user Correct.
Emil
6

Uma rede com uma camada oculta contendo dois neurônios deve ser suficiente para separar o problema do XOR. O primeiro neurônio atua como uma porta OR e o segundo como uma porta NOT AND. Adicione os dois neurônios e se eles ultrapassarem o limiar, é positivo. Você pode usar neurônios de decisão lineares para isso ajustando os vieses dos limites. As entradas da porta NOT AND devem ser negativas para as entradas 0/1. Essa imagem deve ficar mais clara, os valores nas conexões são os pesos, os valores nos neurônios são os vieses, as funções de decisão agem como decisões 0/1 (ou apenas a função de sinal também funciona neste caso).

Rede Neural XOR

Foto graças ao "blog Abhranil"

Jan van der Vegt
fonte
Obrigado, então não é possível fazer isso usando um sigmóide logístico, pois restringe o valor a (0,1)
usuário
Sem ele ainda deve ser possível aprender isso com um sigmóide logística, ele deve apenas aprender os limiares / pesos de forma diferente
Jan van der Vegt
O viés no portão NAND deve ser um +1.5.
Marc
4

Se você estiver usando descida de gradiente básica (sem outra otimização, como momento) e uma rede mínima com 2 entradas, 2 neurônios ocultos, 1 neurônio de saída, é definitivamente possível treiná-lo para aprender XOR, mas pode ser bastante complicado e não confiável.

  • Pode ser necessário ajustar a taxa de aprendizado. O erro mais comum é defini-lo muito alto, para que a rede oscile ou divirja em vez de aprender.

  • Pode levar um número surpreendentemente grande de épocas para treinar a rede mínima usando descidas em gradiente online ou em lotes. Talvez vários milhares de épocas sejam necessários.

  • Com um número tão baixo de pesos (apenas 6), às vezes a inicialização aleatória pode criar uma combinação que fica presa facilmente. Portanto, você pode precisar tentar verificar os resultados e reiniciar. Sugiro que você use um gerador de números aleatórios semeados para a inicialização e ajuste o valor da semente se os valores de erro ficarem presos e não melhorarem.

Neil Slater
fonte
Sim, é isso que estou observando, com alguns valores de sementes que convergem, outros, não. Além disso, se eu usar tangente hiperbólica em vez de sigmóide, ela funcionará bastante bem o tempo todo, com a sigmóide ela depende da semente, como você observou. Qual é a razão para ser tão complicado?
usuário
Não tenho muita certeza de qual é o motivo matemático, isso é apenas da minha experiência em escrever suíte de testes para aprender xor. No meu caso, adicionar impulso ajudou, mas acho que qualquer ajuste longe da rede mais simples e / ou otimizador ajuda.
Neil Slater