単純なニューラルネットワークを作成しようとしていますが、2つのレイヤーの最初のレイヤーで重みを更新することに固執しています。私が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)
私はあなたの質問にコメントすることができないので、ここに書いてください。まず、sigmoid_derivative関数が間違っています。の導関数sigmoid(x*y) w.r.t x is = sigmoid(x*y)*(1-sigmoid(x*y))*y
。
編集:(不要なテキストを削除)
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:計算グラフを作成してみてください。導関数を見つけるのが、はるかに簡単になります。(これがわからない場合は、オンラインで読んでください)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加