Andrew Traks's exampleに続いて、私はバイナリ分類のための単純なドロップアウトで、1入力、1隠れ、1出力の3層ニューラルネットワークを実装したいと考えています。ニューラルネットワークのバックプロパゲーションバイアス
バイアス用語b1
とb2
を含めると、以下のようにAndrewのコードを少し修正する必要があります。
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
alpha,hidden_dim,dropout_percent = (0.5,4,0.2)
synapse_0 = 2*np.random.random((X.shape[1],hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
b1 = np.zeros(hidden_dim)
b2 = np.zeros(1)
for j in range(60000):
# sigmoid activation function
layer_1 = (1/(1+np.exp(-(np.dot(X,synapse_0) + b1))))
# dropout
layer_1 *= np.random.binomial([np.ones((len(X),hidden_dim))],1-dropout_percent)[0] * (1.0/(1-dropout_percent))
layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1) + b2)))
# sigmoid derivative = s(x)(1-s(x))
layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
synapse_0 -= (alpha * X.T.dot(layer_1_delta))
b1 -= alpha*layer_1_delta
b2 -= alpha*layer_2_delta
問題は、当然のことながら、b1
の寸法を上記のコードと同様にb2
とlayer_2_delta
と、layer_1_delta
の寸法と一致しているいけません。
私はデルタはb1
とb2
を更新する計算方法を理解していない - Michael Nielsen's exampleによると、b1
とb2
は私のコードでは、私はそれぞれlayer_1_delta
とlayer_2_delta
であると信じるデルタで更新する必要があります。
私はここで間違っていますか?デルタやバイアスの次元性を台無しにしましたか?私はそれが後者であると感じます。なぜなら、このコードから偏りを取り除くとうまくいくからです。事前のおかげで
'bX'は層のデルタではなく、' bX_delta'によって更新されるべきです。 'layer_1_delta'は' layer size''''の 'prev_layer_size'の次元を持っていますが、' bX_delta'は 'layer_size'になります。 – Andrey
@Andrey - ありがとう。私はそれがそれのようなものになると思った - 今私の質問は 'bX_delta'をどのように計算するのか? – killerT2333