2010-05-19 2 views
4

Прежде всего я хочу сказать, что я действительно новым для нейронных сетей, и я не понимаю, что это очень хорошо;)Плотных нейронная сеть обратного распространения - вопрос о градиенте

Я сделал свою первую C# реализацию из backpropagation нейронной сети. Я тестировал его с помощью XOR, и он выглядит так, как будто он работает.

Теперь я хотел бы изменить свою реализацию, чтобы использовать упругую обратную прокрутку (Rprop - http://en.wikipedia.org/wiki/Rprop).

определение говорит: «Rprop принимает во внимание только знак частной производной по всем паттернам (не магнитуды), и действует независимо друг от друга на каждый„весе“

Может кто-нибудь сказать мне, что частная производная над. все модели и как я должен вычислить эту частную производную для нейрона в скрытом слое

Спасибо большое

UPDATE:.

Моя реализация базы на этом Java-код: www_.dia.fi. upm.es/~jamartin/downloads/bpnn.java

Мой метод backPropagate выглядит следующим образом:

public double backPropagate(double[] targets) 
    { 
     double error, change; 

     // calculate error terms for output 
     double[] output_deltas = new double[outputsNumber]; 

     for (int k = 0; k < outputsNumber; k++) 
     { 

      error = targets[k] - activationsOutputs[k]; 
      output_deltas[k] = Dsigmoid(activationsOutputs[k]) * error; 
     } 

     // calculate error terms for hidden 
     double[] hidden_deltas = new double[hiddenNumber]; 

     for (int j = 0; j < hiddenNumber; j++) 
     { 
      error = 0.0; 

      for (int k = 0; k < outputsNumber; k++) 
      { 
       error = error + output_deltas[k] * weightsOutputs[j, k]; 
      } 

      hidden_deltas[j] = Dsigmoid(activationsHidden[j]) * error; 
     } 

     //update output weights 
     for (int j = 0; j < hiddenNumber; j++) 
     { 
      for (int k = 0; k < outputsNumber; k++) 
      { 
       change = output_deltas[k] * activationsHidden[j]; 
       weightsOutputs[j, k] = weightsOutputs[j, k] + learningRate * change + momentumFactor * lastChangeWeightsForMomentumOutpus[j, k]; 
       lastChangeWeightsForMomentumOutpus[j, k] = change; 

      } 
     } 

     // update input weights 
     for (int i = 0; i < inputsNumber; i++) 
     { 
      for (int j = 0; j < hiddenNumber; j++) 
      { 
       change = hidden_deltas[j] * activationsInputs[i]; 
       weightsInputs[i, j] = weightsInputs[i, j] + learningRate * change + momentumFactor * lastChangeWeightsForMomentumInputs[i, j]; 
       lastChangeWeightsForMomentumInputs[i, j] = change; 
      } 
     } 

     // calculate error 
     error = 0.0; 

     for (int k = 0; k < outputsNumber; k++) 
     { 
      error = error + 0.5 * (targets[k] - activationsOutputs[k]) * (targets[k] - activationsOutputs[k]); 
     } 

     return error; 
    } 

Так я могу использовать change = hidden_deltas[j] * activationsInputs[i] переменную как градиент (частной производной) для проверки петь?

+0

Вчера вечером я провел отладку своей реализации, и у меня возникают проблемы с тем, что я не понимаю этот алгоритм. Вы знаете хорошее описание этого? –

ответ

2

Я думаю, что «по всем узоры» означает просто «в каждой итерации» ... посмотрим на RPROP paper

Для paritial производной: вы уже реализовали нормальный алгоритм обратного распространения. Это метод для эффективного вычисления градиента ... там вы вычисляете значения δ для одиночных нейронов, которые на самом деле являются отрицательными значениями ∂E/∂w, т. Е. Производной по паритету глобальной ошибки как функции весов.

поэтому вместо умножения веса с этими значениями, вы берете один из двух констант (η + или η-), в зависимости от того знака изменилось

+0

Будете ли вы так добры и смотрите на мой код (см. Выше) и скажите мне, правильно ли я думаю –

+0

Да, значение изменения является частичной производной. В соответствии с изменением знака другой фактор используется для обновления изменения веса (см. Формулу 4-7 в документе, который я связал, поскольку есть еще несколько правил ... Значения ∂E/∂w - это ваше изменение переменные) –

+0

Я думаю, что http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html хорошо объясняет идею обратного распространения.http://www.learnartificialneuralnetworks.com/backpropagation.html - более математическое описание того, как и почему оно работает –

1

Ниже приведен пример части реализации методики обучения RPROP в библиотеке искусственного интеллекта Encog. Это должно дать вам представление о том, как действовать. Я бы рекомендовал загрузить всю библиотеку, потому что будет легче проходить исходный код в среде IDE, а не через онлайн-интерфейс svn.

http://code.google.com/p/encog-cs/source/browse/#svn/trunk/encog-core/encog-core-cs/Neural/Networks/Training/Propagation/Resilient

http://code.google.com/p/encog-cs/source/browse/#svn/trunk

Обратите внимание на код в C#, но не должно быть трудно перевести на другой язык.

+0

Thx, я попробую просмотреть это решение –

+0

У меня есть следующий вопрос, который я [размещен здесь] (http://stackoverflow.com/questions/12146986/part-2-resilient- обратное распространение-нейронная сеть). Просто я пытаюсь понять, как частная производная работает для NN. Любые идеи были оценены. – Nutritioustim

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