2017-12-06 9 views
0

Andrew Traks's exampleに続いて、私はバイナリ分類のための単純なドロップアウトで、1入力、1隠れ、1出力の3層ニューラルネットワークを実装したいと考えています。ニューラルネットワークのバックプロパゲーションバイアス

バイアス用語b1b2を含めると、以下のように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の寸法を上記のコードと同様にb2layer_2_deltaと、layer_1_deltaの寸法と一致しているいけません。

私はデルタはb1b2を更新する計算方法を理解していない - Michael Nielsen's exampleによると、b1b2は私のコードでは、私はそれぞれlayer_1_deltalayer_2_deltaであると信じるデルタで更新する必要があります。

私はここで間違っていますか?デルタやバイアスの次元性を台無しにしましたか?私はそれが後者であると感じます。なぜなら、このコードから偏りを取り除くとうまくいくからです。事前のおかげで

+0

'bX'は層のデルタではなく、' bX_delta'によって更新されるべきです。 'layer_1_delta'は' layer size''''の 'prev_layer_size'の次元を持っていますが、' bX_delta'は 'layer_size'になります。 – Andrey

+0

@Andrey - ありがとう。私はそれがそれのようなものになると思った - 今私の質問は 'bX_delta'をどのように計算するのか? – killerT2333

答えて

1

だから、最初、彼らが属している場所ですので、私は、synapse_Xに対応して0と1にbXXを変更するだろうし、それが作る:mは例の数ではあり

b1 -= alpha * 1.0/m * np.sum(layer_2_delta) 
b0 -= alpha * 1.0/m * np.sum(layer_1_delta) 

トレーニングセット。また、ドロップ率は愚かに高く、実際に収束を傷つける。したがって、すべてのコードで考えてみましょう:

import numpy as np 

X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ]) 
m = X.shape[0] 
y = np.array([[0,1,1,0]]).T 
alpha,hidden_dim,dropout_percent = (0.5,4,0.02) 
synapse_0 = 2*np.random.random((X.shape[1],hidden_dim)) - 1 
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1 
b0 = np.zeros(hidden_dim) 
b1 = np.zeros(1) 
for j in range(10000): 
    # sigmoid activation function 
    layer_1 = (1/(1+np.exp(-(np.dot(X,synapse_0) + b0)))) 
    # 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) + b1))) 
    # 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 * 1.0/m * np.sum(layer_2_delta) 
    b0 -= alpha * 1.0/m * np.sum(layer_1_delta) 

print layer_2 
関連する問題