Implementación de un perceptrón con algoritmo de retropropagación

Estoy tratando de implicar, implementar un perceptrón de dos capas con propagación hacia atrás para resolver el problema de paridad. La red tiene 4 entradas binarias, 4 unidades ocultas en la primera capa y 1 salida en la segunda capa. Estoy usandoest como referencia, pero tengo problemas con la convergencia.

Primero, notaré que estoy usando una función sigmoide para la activación, por lo que la derivada es (por lo que entiendo) el sigmoide (v) * (1 - sigmoide (v)). Entonces, eso se usa al calcular el valor delta.

Entonces, básicamente configuré la red y ejecuté solo unas pocas épocas (repase cada patrón posible, en este caso, 16 patrones de entrada). Después de la primera época, los pesos cambian ligeramente. Después del segundo, los pesos no cambian y permanecen así que no importa cuántas épocas más corro. Estoy usando una tasa de aprendizaje de 0.1 y un sesgo de +1 por ahora.

El proceso de capacitación de la red se encuentra a continuación en pseudocódigo (que creo que es correcto según las fuentes que he verificado):

aso de avance de @Feed:

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

Propagación posterior de la capa de salida:

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

Propagación hacia atrás de la capa oculta:

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

Actualizar pesos:

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

Este proceso, por supuesto, se repite a través de las épocas y los cambios de peso persisten. Entonces, mi pregunta es, ¿hay alguna razón para que los pesos permanezcan constantes después de la segunda época? Si es necesario, puedo publicar mi código, pero en este momento espero algo obvio que estoy pasando por alto. ¡Gracias a todos

EDIT: Aquí están los enlaces a mi código según lo sugerido por sarnold:
MLP.java:http: //codetidy.com/190
Neuron.java:http: //codetidy.com/190
Pattern.java:http: //codetidy.com/190
input.txt:http: //codetidy.com/190

Respuestas a la pregunta(2)

Su respuesta a la pregunta