Вступление
Первый шаг
Я написал стандартную нейронную сеть с обратным распространением и, чтобы протестировать ее, решил создать карту XOR.
Это сеть 2-2-1 (с функцией активации tanh)
X1 M1
O1
X2 M2
B1 B2
В целях тестирования я вручную установил верхний средний нейрон (M1) в качестве логического элемента И, а нижний нейрон (M2) в качестве логического элемента ИЛИ (оба выводят 1, если истина, и -1, если ложь).
Теперь я также вручную настроил соединение M1-O1 на -.5, M2-O1 на 1 и B2 на -.75
Таким образом, если M1 = 1 и M2 = 1, сумма равна (-0,5 +1 -0,75 = -.25) tanh (0,25) = -0,24
если M1 = -1 и M2 = 1, сумма равна ((-0,5) * (- 1) +1 -0,75 = 0,75) tanh (0,75) = 0,63
если M1 = -1 и M2 = -1, сумма равна ((-0,5) * (- 1) -1 -0,75 = -1,25) tanh (1,25) = -0,8
Это относительно хороший результат для «первой итерации».
Шаг второй
Затем я немного изменил эти веса, а затем обучил их, используя алгоритм распространения ошибок (на основе градиентного спуска). На этом этапе я оставляю веса между входными и средними нейронами нетронутыми и просто изменяю веса между средним (и смещением) и выходом.
Для тестирования я установил веса равными и .5 .4 .3 (соответственно для M1, M2 и смещения)
Здесь, однако, у меня начинаются проблемы.
Мой вопрос
Я установил скорость обучения на .2 и позволил программе выполнять итерации по тренировочным данным (ABA ^ B) в течение 10000 итераций или более.
Большую часть времени веса сходятся к хорошему результату. Однако иногда эти веса сходятся к (скажем) 1,5, 5,7 и 0,9, что приводит к выходу +1 (четному) к входу {1, 1} (когда результатом должно быть -1).
Возможно ли относительно простое ANN, решение которого вообще не сходится, или в моей реализации есть ошибка?