0

나는 선형 단일 레이어 퍼셉트론 (즉 숨겨진 레이어가 없으며 모든 입력이 모든 출력에 연결되고 선형 활성화 기능)을 구축하려고합니다. 한 번에 하나의 데이터 포인트로 델타 규칙이지만, 나는 기대하고있는 결과를 얻지 못한다. 나는 내 손실 함수로 평균 제곱 오차를 사용하고 있는데, 일 경우 단순히 learning_rate * error (* 2) 인 가중치 업데이트가 발생하지만 결과는 내 수동 계산과 매우 다르게 보입니다. 내가 뭘 놓치고 있니?keras의 델타 규칙 사용

import numpy as np 
from keras.models import Sequential 
from keras.optimizers import SGD 
from keras.layers import Dense 

features = np.array([[1,0,1],[0,1,1]]) 
features = np.tile(features, (500,1)) 
labels = np.array([[1,0],[0,1]]) 
labels = np.tile(labels, (500,1)) 

network = Sequential() 
network.add(Dense(2, input_dim = 3, init = "zero", activation = "linear")) 
network.compile(loss = "mse", optimizer = SGD(lr = 0.01)) 
network.fit(features, labels, nb_epoch = 1, batch_size = 1, shuffle = False) 

network.get_weights() 
# [[ 0.59687883, -0.39686254], 
# [-0.39689422, 0.59687883], 
# [ 0.19998412, 0.20001581]], 

# manually 
weights = np.array([[0.0,0.0],[0.0,0.0],[0.0,0.0]]) 
for i in range(500): 
    summed_out1 = weights[0,0] + weights[2,0] 
    summed_out2 = weights[0,1] + weights[2,1] 
    change_out1 = 0.01 * (1.0 - summed_out1) 
    change_out2 = 0.01 * (0.0 - summed_out2) 
    weights[0,0] += change_out1 
    weights[2,0] += change_out1 
    weights[0,1] += change_out2 
    weights[2,1] += change_out2 
    # 
    summed_out1 = weights[1,0] + weights[2,0] 
    summed_out2 = weights[1,1] + weights[2,1] 
    change_out1 = 0.01 * (0.0 - summed_out1) 
    change_out2 = 0.01 * (1.0 - summed_out2) 
    weights[1,0] += change_out1 
    weights[2,0] += change_out1 
    weights[1,1] += change_out2 
    weights[2,1] += change_out2 

weights 
# [[ 0.66346388, -0.33011442], 
# [-0.33014677, 0.66346388], 
# [ 0.33331711, 0.33334946]] 

답변

0

이 문제점을 발견했습니다. 기본적으로 밀도가 높은 레이어에는 바이어스가 포함됩니다. 변경되면 네트워크에서 원하는 동작을 보여줍니다.