É 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?
fonte
Respostas:
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.
Aqui está um artigo que analisa o problema xor.
fonte
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).
Foto graças ao "blog Abhranil"
fonte
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.
fonte