Andrew Traks's example에 뒤이어 나는 2 층 분류를 위해 간단한 드롭 아웃과 함께 3 개의 레이어 신경망 (1 개의 입력, 1 개의 숨겨진, 1 개의 출력)을 구현하고 싶다.신경망에서 바이어스를 역 전파하는 것
바이어스 용어 b1
과 b2
을 포함한다면 다음과 같이 앤드류 코드를 약간 수정해야합니다.
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' x_1이되어야합니다. – Andrey
@Andrey - 감사합니다. 나는 그것이 저렇게 될 것이라고 생각했다. 이제 나의 질문은'bX_delta'를 어떻게 계산 하는가이다. – killerT2333