2015-02-22 5 views
0

Я работаю над внедрением алгоритма обратного распространения. Сначала я работал над обучением своей сети для решения XOR, чтобы убедиться, что он работает правильно, прежде чем использовать его для моего дизайна. Прочитав this, я решил сначала обучить его, чтобы решить И ворота. Я использую sigmoid как функцию передачи и MSE для вычисления общей ошибки. Я использовал разные курсы обучения, которые варьировались от 0,01 до 0,5. Я тренировал сеть несколько раз каждый раз для разных итераций от 100 итераций до 1000 итераций. Минимальная полная ошибка, которую я получил, составляет 0,08. Это приемлемая ошибка?Нейронная сеть для решения AND

Мой второй вопрос, следует ли использовать порог вместо сигмоида для решения И ворот? если да, то какой подходящий порог?

В-третьих, следует ли установить лимит на начальные веса, например, betwen -1 и 1 ??

Заранее спасибо.

EDIT 1

Я думаю, что выход странно здесь выход после первой итерации:

Target: 0.0 Output: 0.5314680723170211 
Target: 0.0 Output: 0.7098671414869142 
Target: 0.0 Output: 0.625565435381579 
Target: 1.0 Output: 0.7827456263767251 

и выход после 400-й итерации:

Target: 0.0 Output: 0.2826892072063843 
Target: 0.0 Output: 0.4596476713717095 
Target: 0.0 Output: 0.3675222634971935 
Target: 1.0 Output: 0.5563197014845178 

EDIT 2

Вот часть моего кода, который делает обратное распространение:

for(int i=0;i< currentLayer.getSize();i++) 
     { 
       temp = currentLayer.getAt(i); 
       err=temp.getOutput()*(1-temp.getOutput())*outErr[i]; 
       temp.setError(roundTwoDecimals(err)); 
     } 

     for (int i=0;i<currentLayer.getSize();i++) 
     { 
      temp = currentLayer.getAt(i); // get a neuron at the output layer 
      // update the connections 
       for (int j=0 ;j<temp.getInConnections().size();j++) 
       { 
        inputCon= temp.getInputConnectionAt(j); 

        newW=inputCon.getWeight()+ inputCon.getDst().getError()*inputCon.getInput()*this.learningRate; 

        inputCon.setWeight(roundTwoDecimals(newW)); 
       } 
       // now update the bias 
       temp.setBias(temp.getBias()+(this.learningRate*temp.getError())); 
     } 

ответ

2

0,08 является довольно низким, но и должна быть совершенно решаемыми, то есть ошибка 0 должна быть возможной. Ваши итерации и учебные курсы также кажутся разумными. Какова топология вашей сети? Вы включаете узел смещения?

Стандартные алгоритмы backpropagation обычно не играют превосходно с порогами, поэтому они обычно не используются. Если вы хотите попробовать это как тест отладки, вы можете использовать правило обучения Perceptron и порог 0,5 (что довольно стандартно).

Да, ограничение начальных весов между -1 и 1, вероятно, является хорошей идеей. Для простых логических задач люди обычно не позволяют весам выходить за пределы этого диапазона вообще, хотя в принципе я не думаю, что это должно быть проблемой.

+0

Да, я включаю в себя предвзятость. Это неправильно? – Alaa

+0

Я отредактировал свой вопрос, не могли бы вы его увидеть? – Alaa

+0

Нет, включая предубеждение - хорошая идея! Я просто хотел убедиться, что вы были. Я согласен, что это немного странно (хотя и не совсем невероятно), что выход для последнего набора входов уменьшается. В противном случае это все выглядит примерно так, как вы ожидали бы - выход начинается довольно неточно, но постепенно идет в правильном направлении. – seaotternerd

Смежные вопросы