Вступ
Крок перший
Я написав стандартну нейромережу, що працює на зворотному ходу, і, щоб перевірити її, я вирішив створити її на карті XOR.
Це мережа 2-2-1 (з функцією активації tanh)
X1 M1
O1
X2 M2
B1 B2
З метою тестування я вручну встановив верхній середній нейрон (M1) як ворота AND, а нижній нейрон (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 = .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 та .9, що призводить до виведення +1 (рівного) до входу {1, 1} (коли результат повинен бути -1).
Чи можливий порівняно простий ANN, який має рішення взагалі не збігатися або є помилка в моїй реалізації?