MATLAB で二次方程式を分類できる 3 入力、1 出力のニューラル ネットワーク (入力層、1 つの非表示層、および出力層) をトレーニングしようとしています。フィードフォワード、$x_i^{out}=f(s_i)$、$s_i={\sum}_{\substack{j\\}} w_{ij}x_j^{in} のフェーズを実装しようとしています。 $ back-propagation ${\delta}_j^{in}=f'(s_i){\sum}_{\substack{j\\}} {\delta}_i^{out}w_{ij}$ と更新$w_{ij}^{new}=w_{ij}^{old}-\epsilon {\delta}_i^{out}x_j^{in}$、$x$ は入力ベクトル、$w$ は$\epsilon$ は学習率です。
ネットワークの出力のエラーが減少していないように見えるため、隠れ層のコーディングと活性化関数 $f(s)=tanh(s)$ の追加に問題があります。誰かが私が間違って実装していることを指摘できますか?
入力は二次方程式の実係数 $ax^2 + bx + c = 0$ であり、出力は二次方程式に 2 つの実根がある場合は正、そうでない場合は負になります。
nTrain = 100; % training set
nOutput = 1;
nSecondLayer = 7; % size of hidden layer (arbitrary)
trainExamples = rand(4,nTrain); % independent random set of examples
trainExamples(4,:) = ones(1,nTrain); % set the dummy input to be 1
T = sign(trainExamples(2,:).^2-4*trainExamples(1,:).*trainExamples(3,:)); % The teacher provides this for every example
%The student neuron starts with random weights
w1 = rand(4,nSecondLayer);
w2 = rand(nSecondLayer,nOutput);
nepochs=0;
nwrong = 1;
S1(nSecondLayer,nTrain) = 0;
S2(nOutput,nTrain) = 0;
while( nwrong>1e-2 ) % more then some small number close to zero
for i=1:nTrain
x = trainExamples(:,i);
S2(:,i) = w2'*S1(:,i);
deltak = tanh(S2(:,i)) - T(:,i); % back propagate
deltaj = (1-tanh(S2(:,i)).^2).*(w2*deltak); % back propagate
w2 = w2 - tanh(S1(:,i))*deltak'; % updating
w1 = w1- x*deltaj'; % updating
end
output = tanh(w2'*tanh(w1'*trainExamples));
dOutput = output-T;
nwrong = sum(abs(dOutput));
disp(nwrong)
nepochs = nepochs+1
end
nepochs
ありがとう