Обновление веса в предыдущих слоях в Backpropagation - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь создать простую нейронную сеть и застрял на обновлении весов на первом слое в двух слоях. Я полагаю, что первое обновление, которое я делаю для w2, правильное, как то, что я узнал из алгоритма обратного распространения. Я пока не включаю предвзятость. Но как нам обновить веса первого слоя, вот где я застрял.

import numpy as np
np.random.seed(10)

def sigmoid(x):
    return 1.0/(1+ np.exp(-x))

def sigmoid_derivative(x):
    return x * (1.0 - x)

def cost_function(output, y):
    return (output - y) ** 2

x = 2
y = 4

w1 = np.random.rand()
w2 = np.random.rand()

h = sigmoid(w1 * x)
o = sigmoid(h * w2)

cost_function_output = cost_function(o, y)

prev_w2 = w2

w2 -= 0.5 * 2 * cost_function_output * h * sigmoid_derivative(o) # 0.5 being learning rate

w1 -= 0 # What do you update this to?

print(cost_function_output)

1 Ответ

2 голосов
/ 09 мая 2020

Я не могу комментировать ваш вопрос, поэтому пишу сюда. Во-первых, ваша функция 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: Попробуйте построить вычислительные графики, поиск деривативов стал намного проще (если вы этого не знаете, прочтите онлайн)

...