私はPythonのXOR問題を解決するために次のニューラルネットワークを実装しました。私のニューラルネットワークは、2ニューロンの入力層、2ニューロンの1隠れ層、および1ニューロンの出力層からなる。私は、出力層の活性化関数として隠れ層とリニア(同一性)機能の活性化関数としてシグモイド関数を使用しています:XORニューラルネットワークが0.5に収束
import numpy as np
def sigmoid(z):
return 1/(1+np.exp(-z))
def s_prime(z):
return np.multiply(sigmoid(z), sigmoid(1.0-z))
def init_weights(layers, epsilon):
weights = []
for i in range(len(layers)-1):
w = np.random.rand(layers[i+1], layers[i]+1)
w = w * 2*epsilon - epsilon
weights.append(np.mat(w))
return weights
def fit(X, Y, w, predict=False, x=None):
w_grad = ([np.mat(np.zeros(np.shape(w[i])))
for i in range(len(w))])
for i in range(len(X)):
x = x if predict else X[0]
y = Y[0,i]
# forward propagate
a = x
a_s = []
for j in range(len(w)):
a = np.mat(np.append(1, a)).T
a_s.append(a)
z = w[j] * a
a = sigmoid(z)
if predict: return a
# backpropagate
delta = a - y.T
w_grad[-1] += delta * a_s[-1].T
for j in reversed(range(1, len(w))):
delta = np.multiply(w[j].T*delta, s_prime(a_s[j]))
w_grad[j-1] += (delta[1:] * a_s[j-1].T)
return [w_grad[i]/len(X) for i in range(len(w))]
def predict(x):
return fit(X, Y, w, True, x)
####
X = np.mat([[0,0],
[0,1],
[1,0],
[1,1]])
Y = np.mat([0,1,1,0])
layers = [2,2,1]
epochs = 10000
alpha = 0.5
w = init_weights(layers, 1)
for i in range(epochs):
w_grad = fit(X, Y, w)
print w_grad
for j in range(len(w)):
w[j] -= alpha * w_grad[j]
for i in range(len(X)):
x = X[i]
guess = predict(x)
print x, ":", guess
バックプロパゲーションがすべて正しいと思えます。念頭に置く唯一の問題はバイアスユニットの実装に問題があることです。いずれにしても、コードを実行するたびに、各入力のすべての述語が約0.5に収束します。私はコードを精査して、何が間違っているのか分からないようです。誰でも私の実装に間違っていることを指摘できますか?私はフィードバックを感謝します。
それが役立つかもしれない何らかの理由で、ここで私が得ていた出力のようなものだ場合:フォワードおよびバックプロパゲーションの実装では、多かれ少なかれ正確である
[[0 0]] : [[ 0.5]]
[[0 1]] : [[ 0.49483673]]
[[1 0]] : [[ 0.52006739]]
[[1 1]] : [[ 0.51610963]]
は、Gは、シグモイド関数、= S状結腸を意味し、 's_prime()'に 'a_s [j]'を渡すので、 's_prime()'は 'return np.multiply(z、1)'でなければなりません。(sigmoid(z)、sigmoid(1.0-z)) 'の代わりに' 'np.multiply(0-z)'を使用します。 – Belter