1

3層でニューラルネットワークxorを教えたい: 1.ニューロンが2つの入力層が2ニューロンの次の単一隠れ層に完全に接続されている 3つ目の出力層が単一出力のニューロンで構成されている。私はシグモイド活性化関数と勾配降下を使用するつもりです。教示ニューラルネットワークXor関数

私の質問は次のとおりです。1.停止機能の定式化方法:イタレーションの数を確認するか、またはエラーが許容可能なエラーよりも小さいかどうかを確認できますが、このエラーをどのように計算する必要がありますか?数式は何ですか?出力層で計算されたエラーのみ? 1つのサンプルを教える1回のパス中に? 2.バイアス値を1未満で0より大きくすることはできますか?いくつかの説明は、常に1であるべきであることを示していますが、他のものはこの範囲の乱数である可能性があります。

答えて

2

ここでは、逆伝播を伴う1つの隠れ層ネットワークがあります。これは、relu、sigmoid、およびその他のアクティブ化を使用して実験を実行するようにカスタマイズできます。いくつかの実験の後に、reluでネットワークがより良好に実行され、収束に早く到達し、シグモイドでは損失値が変動すると結論付けられた。これは、 "the gradient of sigmoids becomes increasingly small as the absolute value of x increases"が原因で発生します。

import numpy as np 
import matplotlib.pyplot as plt 
from operator import xor 

class neuralNetwork(): 
    def __init__(self): 
     # Define hyperparameters 
     self.noOfInputLayers = 2 
     self.noOfOutputLayers = 1 
     self.noOfHiddenLayerNeurons = 2 

     # Define weights 
     self.W1 = np.random.rand(self.noOfInputLayers,self.noOfHiddenLayerNeurons) 
     self.W2 = np.random.rand(self.noOfHiddenLayerNeurons,self.noOfOutputLayers) 

    def relu(self,z): 
     return np.maximum(0,z) 

    def sigmoid(self,z): 
     return 1/(1+np.exp(-z)) 

    def forward (self,X): 
     self.z2 = np.dot(X,self.W1) 
     self.a2 = self.relu(self.z2) 
     self.z3 = np.dot(self.a2,self.W2) 
     yHat = self.relu(self.z3) 
     return yHat 

    def costFunction(self, X, y): 
     #Compute cost for given X,y, use weights already stored in class. 
     self.yHat = self.forward(X) 
     J = 0.5*sum((y-self.yHat)**2) 
     return J 

    def costFunctionPrime(self,X,y): 
     # Compute derivative with respect to W1 and W2 
     delta3 = np.multiply(-(y-self.yHat),self.sigmoid(self.z3)) 
     djw2 = np.dot(self.a2.T, delta3) 
     delta2 = np.dot(delta3,self.W2.T)*self.sigmoid(self.z2) 
     djw1 = np.dot(X.T,delta2) 

     return djw1,djw2 


if __name__ == "__main__": 

    EPOCHS = 6000 
    SCALAR = 0.01 

    nn= neuralNetwork()  
    COST_LIST = [] 

    inputs = [ np.array([[0,0]]), np.array([[0,1]]), np.array([[1,0]]), np.array([[1,1]])] 

    for epoch in xrange(1,EPOCHS): 
     cost = 0 
     for i in inputs: 
      X = i #inputs 
      y = xor(X[0][0],X[0][1]) 
      cost += nn.costFunction(X,y)[0] 
      djw1,djw2 = nn.costFunctionPrime(X,y) 
      nn.W1 = nn.W1 - SCALAR*djw1 
      nn.W2 = nn.W2 - SCALAR*djw2 
     COST_LIST.append(cost) 

    plt.plot(np.arange(1,EPOCHS),COST_LIST) 
    plt.ylim(0,1) 
    plt.xlabel('Epochs') 
    plt.ylabel('Loss') 
    plt.title(str('Epochs: '+str(EPOCHS)+', Scalar: '+str(SCALAR))) 
    plt.show() 

    inputs = [ np.array([[0,0]]), np.array([[0,1]]), np.array([[1,0]]), np.array([[1,1]])] 
    print "X\ty\ty_hat" 
    for inp in inputs: 
     print (inp[0][0],inp[0][1]),"\t",xor(inp[0][0],inp[0][1]),"\t",round(nn.forward(inp)[0][0],4) 

最終結果:

enter image description here

X  y  y_hat 
(0, 0) 0  0.0 
(0, 1) 1  0.9997 
(1, 0) 1  0.9997 
(1, 1) 0  0.0005 

トレーニングの後に得られた重みがあった。

nn.w1

[ [-0.81781753 0.71323677] 
    [ 0.48803631 -0.71286155] ] 

nn.w2

[ [ 2.04849235] 
    [ 1.40170791] ] 
私は、ニューラルネットを理解するため、以下のユーチューブシリーズが非常に役に立った:少しだけあり Neural networks demystified

私が知っているし、またそれがこの回答に説明することができました。神経回路網をよりよく理解したい場合は、次のリンクを参照することをお勧めします。[cs231n:1つのニューロンをモデル化する] [4]

+0

バイアスを使用しないでください。 – Macko

+0

コスト関数はどのように計算されますか?単一のサンプルトレーニングのために?出力ニューロンのみが関与していますか? – Macko

関連する問題