Я не могу комментировать ваш вопрос, поэтому пишу сюда. Во-первых, ваша функция sigmoid_derivative неверна. Производная от sigmoid(x*y) w.r.t x is = sigmoid(x*y)*(1-sigmoid(x*y))*y
.
Edit: (удалил ненужный текст)
Нам нужны dW1 и dW2 (это dJ/dW1
и dJ/dW
(частные производные) соответственно.
J = (o - y)^2
следовательно dJ/do = 2*(o - y)
Теперь, dW2
dJ/dW2 = dJ/do * do/dW2 (chain rule)
dJ/dW2 = (2*(o - y)) * (o*(1 - o)*h)
dW2 (equals above equation)
W2 -= learning_rate*dW2
Теперь, для dW1
dJ/dh = dJ/do * do/dh = (2*(o - y)) * (o*(1 - o)*W2
dJ/dW1 = dJ/dh * dh/dW1 = ((2*(o - y)) * (o*(1 - o)*W2)) * (h*(1- h)*x)
dW1 (equals above equation)
W1 -= learning_rate*dW2
PS: Попробуйте построить вычислительные графики, поиск деривативов стал намного проще (если вы этого не знаете, прочтите онлайн)