Эластичная нейронная сеть обратного распространения - вопрос о градиенте - PullRequest
4 голосов
/ 19 мая 2010

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

Я сделал свою первую реализацию C # нейронной сети обратного распространения. Я протестировал его с помощью 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] в качестве градиента (частной производной) для проверки пения?

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Я думаю, что «по всем шаблонам» просто означает «в каждой итерации» ... взгляните на документ RPROP

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

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

1 голос
/ 19 мая 2010

Ниже приведен пример части реализации методики обучения 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 #, но его нетрудно перевести на другой язык.

...