6

最初に言いたいのは、私はニューラル ネットワークに本当に慣れていないので、あまりよく理解していないということです ;)

バックプロパゲーション ニューラル ネットワークの最初の C# 実装を作成しました。XOR を使用してテストしたところ、動作しているように見えます。

ここで、回復力のあるバックプロパゲーション (Rprop - http://en.wikipedia.org/wiki/Rprop ) を使用するように実装を変更したいと思います。

定義によると、「Rprop は、すべてのパターンの偏導関数の符号のみ (大きさではない) を考慮し、それぞれの「重み」に独立して作用します。

すべてのパターンの偏微分とは何か教えてもらえますか? そして、隠れ層のニューロンのこの偏導関数をどのように計算すればよいでしょうか。

どうもありがとう

アップデート:

この 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]変数を勾配 (偏導関数) として使用して、sing をチェックでき ますか?

4

2 に答える 2

3

「すべてのパターンで」というのは、単に「すべての反復で」という意味だと思います... RPROP の論文を見てください。

偏導関数の場合: 通常の逆伝播アルゴリズムは既に実装されています。これは勾配を効率的に計算するための方法です...そこで単一ニューロンの δ 値を計算します。これは実際には負の ∂E/∂w 値、つまり重みの関数としてのグローバル エラーの偏導関数です。

したがって、重みにこれらの値を掛ける代わりに、符号が変化したかどうかに応じて、2 つの定数 (η+ または η-) のいずれかを使用します。

于 2010-05-19T12:10:01.593 に答える
1

以下は、Encog 人工知能ライブラリでの RPROP トレーニング手法の実装の一部の例です。進め方のアイデアが得られるはずです。ライブラリ全体をダウンロードすることをお勧めします。これは、オンラインの svn インターフェイスを使用するよりも、IDE でソース コードを確認する方が簡単だからです。

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# ですが、別の言語に翻訳するのは難しくありません。

于 2010-05-19T12:24:45.687 に答える