Алгоритм обратного распространения - PullRequest
0 голосов
/ 24 февраля 2012

В Интернете я нашел пример, который содержит метод, который возвращает ошибку и корректирует веса. Мне было интересно, как это работает и какой алгоритм обновления веса используется. Может ли это быть градиентный спуск?

 /**
   * all output propagate back
   * 
   * @param expectedOutput
   *            first calculate the partial derivative of the error with
   *            respect to each of the weight leading into the output neurons
   *            bias is also updated here
   */
  public void applyBackpropagation(double expectedOutput[]) {

    // error check, normalize value ]0;1[
    for (int i = 0; i < expectedOutput.length; i++) {
        double d = expectedOutput[i];
        if (d < 0 || d > 1) {
            if (d < 0)
                expectedOutput[i] = 0 + epsilon;
            else
                expectedOutput[i] = 1 - epsilon;
        }
    }

    int i = 0;
    for (Neuron n : outputLayer) {
        ArrayList<Connection> connections = n.getAllInConnections();
        for (Connection con : connections) {
            double ak = n.getOutput();
            double ai = con.leftNeuron.getOutput();
            double desiredOutput = expectedOutput[i];

            double partialDerivative = -ak * (1 - ak) * ai
                    * (desiredOutput - ak);
            double deltaWeight = -learningRate * partialDerivative;
            double newWeight = con.getWeight() + deltaWeight;
            con.setDeltaWeight(deltaWeight);
            con.setWeight(newWeight + momentum * con.getPrevDeltaWeight());
        }
        i++;
    }

    // update weights for the hidden layer
    for (Neuron n : hiddenLayer) {
        ArrayList<Connection> connections = n.getAllInConnections();
        for (Connection con : connections) {
            double aj = n.getOutput();
            double ai = con.leftNeuron.getOutput();
            double sumKoutputs = 0;
            int j = 0;
            for (Neuron out_neu : outputLayer) {
                double wjk = out_neu.getConnection(n.id).getWeight();
                double desiredOutput = (double) expectedOutput[j];
                double ak = out_neu.getOutput();
                j++;
                sumKoutputs = sumKoutputs
                        + (-(desiredOutput - ak) * ak * (1 - ak) * wjk);
            }

            double partialDerivative = aj * (1 - aj) * ai * sumKoutputs;
            double deltaWeight = -learningRate * partialDerivative;
            double newWeight = con.getWeight() + deltaWeight;
            con.setDeltaWeight(deltaWeight);
            con.setWeight(newWeight + momentum * con.getPrevDeltaWeight());
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Мне кажется, что это решение использует стохастический градиентный спуск .Основное различие между ним и обычным градиентом приличия состоит в том, что градиент аппроксимируется для каждого примера, а не вычисляется для всех примеров, а затем выбирается наилучшее направление.Это обычный подход к реализации обратного распространения и даже имеет некоторые преимущества для градиентного приличия (можно избежать некоторых локальных минимумов).Я полагаю, что статья также объясняет, в чем заключается идея, и есть также много других статей, которые объясняют основную идею обратного распространения.

1 голос
/ 24 февраля 2012

Эта уродливая статья, кажется, описывает точно такую ​​же версию алгоритма: http://www.speech.sri.com/people/anand/771/html/node37.html. У меня те же формулы в моих университетских работах, но, к сожалению: а) они не доступны в Интернете;б) они написаны на языке, который вы не поймете.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...