Я пытаюсь решить проблему XOR с помощью нейронной сети. Для обучения я использую генетический алгоритм.
Но после определенного количества поколений (200) ошибка застряла в 1. И выходы правильные, кроме 1 xor 0, где вместо 1 выводится 0, я не понимаю, почему это происходит.
размер популяции : 100
частота кроссовера : 70
частота мутаций : 5
элитный номер : 2
функция активации : сигмовидная
метод отбора : турнирный отбор с 7 участниками
Алгоритм мутации =
for (int i=0; i< individual.getNbrOfWeights(); i++)
if (random(0,100) < mutationRate)
{
genome[i] = genome[i] + random(-0.1,0.1);
}
Расчет фитнеса =
double error = 0;
error = error + feedForward({0, 1}, 1);
error = error + feedForward({1, 0}, 1);
error = error + feedForward({1, 1}, 0);
error = error + feedForward({0, 0}, 0);
fitness = error;
где ошибка является целевым выходом
Я попытался в мутации установить веса в диапазоне [-2 2], но стало еще хуже (ошибка застряла в 1.6). Так что я не знаю, если он обязан установить вес в определенном диапазоне...
Мне очень нужна ваша помощь, заранее спасибо.
ИЗМЕНИТЬ
На самом деле проблема заключалась в инициализации веса и методе мутации.
Когда я устанавливаю веса между [-1 1], алгоритм не сходится. Но чем больше я увеличиваю диапазон, тем больше он дает лучших результатов, скажем, между [-4 4].
для мутации я попробовал два метода (мутировать один ген, выбранный случайным образом):
--> Добавьте случайное возмущение между [-0,1 0,1] с частотой мутаций 5%. Таким образом, я получил наилучшие результаты (сетевые выходы, как и желаемые) на поколении 1800.
--> Измените значение гена на новое. Новое значение должно принадлежать диапазону. В этом случае мне пришлось поставить скорость мутации на 50%, чтобы алгоритм мог сходиться. И веса должны быть между -7 и 7, иначе он не сойдется.