Introdução
Passo um
Escrevi uma rede neural padrão de backpropegating e, para testá-la, decidi mapear o XOR.
É uma rede 2-2-1 (com função de ativação tanh)
X1 M1
O1
X2 M2
B1 B2
Para fins de teste, configurei manualmente o neurônio do meio superior (M1) como uma porta AND e o neurônio inferior (M2) como uma porta OR (saída 1 se verdadeira e -1 se falsa).
Agora, também configurei manualmente a conexão M1-O1 como -.5, M2-O1 como 1 e B2 como -.75
Portanto, se M1 = 1 e M2 = 1, a soma é (-0,5 +1 -0,75 = -,25) tanh (0,25) = -0,24
se M1 = -1 e M2 = 1, a soma é ((-0,5) * (- 1) +1 -0,75 = 0,75) tanh (0,75) = 0,63
se M1 = -1 e M2 = -1, a soma é ((-0,5) * (- 1) -1 -0,75 = -1,25) tanh (1,25) = -0,8
Este é um resultado relativamente bom para uma "primeira iteração".
Passo dois
Depois, modifiquei um pouco esses pesos e os treinei usando o algoritmo de propagação de erros (com base na descida do gradiente). Nesse estágio, deixo intactos os pesos entre os neurônios de entrada e os médios e apenas modifico os pesos entre o meio (e o viés) e a saída.
Para o teste, defino os pesos como e .5 .4 .3 (respectivamente para M1, M2 e viés)
Aqui, no entanto, começo a ter problemas.
Minha pergunta
Defino minha taxa de aprendizado como 0,2 e deixo o programa repetir os dados de treinamento (ABA ^ B) para 10000 iterações ou mais.
Na maioria das vezes, os pesos convergem para um bom resultado. No entanto, às vezes, esses pesos convergem para (digamos) 1.5, 5.7 e .9, o que resulta em uma saída +1 (par) para uma entrada de {1, 1} (quando o resultado deve ser -1).
É possível que uma RNA relativamente simples, que tenha uma solução para não convergir, ou que haja algum erro na minha implementação?