Реализация персептрона с алгоритмом обратного распространения

Я пытаюсь реализовать двухслойный персептрон с обратным распространением для решения проблемы четности. Сеть имеет 4 двоичных входа, 4 скрытых блока на первом уровне и 1 выход на втором уровне. Я используюэто для справки, но у меня проблемы с конвергенцией.

Во-первых, я отмечу, что я использую сигмовидную функцию для активации, и поэтому производная является (из того, что я понимаю) сигмовидной (v) * (1 - сигмовидной (v)). Итак, это используется при расчете значения дельты.

Итак, в основном я настроил сеть и пробежал всего несколько эпох (пройдусь по каждому возможному шаблону - в данном случае 16 шаблонов ввода). После первой эпохи веса меняются незначительно. После второго веса не меняются и остаются такими, независимо от того, сколько еще эпох я бегу. Я использую скорость обучения 0,1 и смещение +1 на данный момент.

Процесс обучения сети приведен ниже в псевдокоде (который, как я считаю, является правильным в соответствии с источниками, которые я проверил):

Шаг подачи вперед:

v = SUM[weight connecting input to hidden * input value] + bias  
y = Sigmoid(v)  
set hidden.values to y  
v = SUM[weight connecting hidden to output * hidden value] + bias  
y = Sigmoid(v)  
set output value to y

Обратное распространение выходного слоя:

error = desired - output.value  
outputDelta = error * output.value * (1 - output.value)

Обратное распространение скрытого слоя:

for each hidden neuron h:  
error = outputDelta * weight connecting h to output  
hiddenDelta[i] = error * h.value * (1 - h.value)

Обновление весов:

for each hidden neuron h connected to the output layer  
h.weight connecting h to output = learningRate * outputDelta * h.value

for each input neuron x connected to the hidden layer  
x.weight connecting x to h[i] = learningRate * hiddenDelta[i] * x.value

Этот процесс, конечно, проходит через эпохи, и изменения в весе продолжаются. Итак, мой вопрос: есть ли причины, по которым весы остаются постоянными после второй эпохи? При необходимости я могу опубликовать свой код, но в данный момент я надеюсь на что-то очевидное, что я пропускаю. Спасибо всем!

РЕДАКТИРОВАТЬ: Вот ссылки на мой код в соответствии с предложением sarnold:
MLP.java:http://codetidy.com/1903
Neuron.java:http://codetidy.com/1904
Pattern.java:http://codetidy.com/1905
input.txt:http://codetidy.com/1906

Ответы на вопрос(1)

Ваш ответ на вопрос