2017-12-06 21 views
0

Andrew Traks's example에 뒤이어 나는 2 층 분류를 위해 간단한 드롭 아웃과 함께 3 개의 레이어 신경망 (1 개의 입력, 1 개의 숨겨진, 1 개의 출력)을 구현하고 싶다.신경망에서 바이어스를 역 전파하는 것

바이어스 용어 b1b2을 포함한다면 다음과 같이 앤드류 코드를 약간 수정해야합니다.

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' x_1이되어야합니다. – 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