-1

エラーを逆伝播して重みを調整するメソッドを含むオンラインの例を見つけました。これが正確にどのように機能し、どの重み更新アルゴリズムが使用されているのか疑問に思っていました。勾配降下でしょうか?

 /**
   * 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());
        }
    }
}
4

2 に答える 2

2

このソリューションは確率的勾配降下法を使用しているように思えます。それと通常の勾配降下法との主な違いは、すべての例について勾配を計算してから最適な方向を選択するのではなく、例ごとに勾配を概算することです。これはバックプロパゲーションを実装するための通常のアプローチであり、勾配の適切な方にいくつかの利点があります (いくつかの極小値を回避できます)。この記事では、アイデアが何であるかについても説明していると思います。また、バックプロパゲーションの背後にある主なアイデアを説明している他の記事もたくさんあります。

于 2012-02-24T13:44:26.810 に答える
1

この見苦しい記事は、まったく同じバージョンのアルゴリズムを説明しているようです: http://www.speech.sri.com/people/anand/771/html/node37.html。私の大学の論文にも同じ式がありますが、残念ながら次のようになります。a) オンラインでは入手できません。b) 理解できない言語で書かれている。

勾配降下に関しては、アルゴリズムは勾配降下に似ていますが、最適な位置に到達する保証はありません。各ステップでは、トレーニング例の値の確率が増加するように、値を変更するネットワーク エッジで変更が行われます。

于 2012-02-24T13:44:20.227 に答える