6

ニューラル ネットワーク (バックプロパゲーション) に関するいくつかの記事を読んだ後、単純なニューラル ネットワークを自分で作成しようとしています。

XORニューラルネットワークを決定しました。私の問題は、ネットワークをトレーニングしようとしているときです。ネットワークをトレーニングするために1つの例のみを使用する場合、1,1,0(input1、input2、targetOutputとして)としましょう。500 本の列車の後 +- ネットワークの回答は 0.05 です。しかし、私が複数の例を試している場合(2つの異なる可能性または4つの可能性すべてを考えてみましょう)、ネットワークは出力として0.5を目指しています:(私はGoogleで自分の間違いを検索しましたが、結果はありませんでした:Sはできるだけ多くの詳細を提供しようとします何が間違っているかを見つけるのを助けるために:

- 2,2,1 および 2,4,1 (inputlayer、hiddenlayer、outputlayer) のネットワークを試しました。

- 以下によって定義されるすべてのニューラルの出力:

double input = 0.0;
        for (int n = 0; n < layers[i].Count; n++)
            input += layers[i][n].Output * weights[n];

一方、「i」は現在のレイヤーで、重みは前のレイヤーのすべての重みです。

- 最後のレイヤー (出力レイヤー) エラーは次のように定義されます。

value*(1-value)*(targetvalue-value);

一方、'value' はニューラル出力で、'targetvalue' は現在のニューラルのターゲット出力です。

-他のニューラルのエラーは次のように定義されます:

foreach neural in the nextlayer 
           sum+=neural.value*currentneural.weights[neural];

-ネットワーク内のすべての重みは、この式によって適応されます (ニューラルからの重み -> ニューラル 2)

weight+=LearnRate*neural.myvalue*neural2.error;

LearnRate はネットワーク学習率です (私のネットワークでは 0.25 と定義されています)。-各ニューラルのバイアス重みは次のように定義されます。

bias+=LearnRate*neural.myerror*neural.Bias;

バイアスは const value=1 です。

出力はさまざまなトレーニング例で0.5になることを目指していると言ったので、私が詳細に説明できることはほとんどすべてです:(

大変お世話になりました^_^。

4

1 に答える 1

1

完全なコードを見ないと、エラーの場所を特定するのは困難です。慎重に確認する必要があることの 1 つは、各ユニットのローカル エラー勾配の計算が、そのレイヤーで使用している活性化関数と一致することです。一般的な式については、http: //www.learnartificialneuralnetworks.com/backpropagation.htmlをご覧ください。

たとえば、出力レイヤーに対して行う計算では、ロジスティック シグモイド活性化関数を使用していると仮定していますが、上記のコードではそれについて言及していないため、代わりに線形活性化関数を使用しているように見えます。

原則として、XOR を学習するには 2-2-1 ネットワークで十分ですが、正しい状態に収束できずにトレーニングが局所的最小値に陥ることがあります。そのため、単一のトレーニング セッションからアルゴリズムのパフォーマンスについて結論を出さないことが重要です。単純な backprog は遅くなることに注意してください。たとえば、Rprop のような高速で堅牢なソリューションがあります。

単純なネットワークの詳細な段階的計算を提供する主題に関する書籍があります (たとえば、Negnevitsky による「AI: インテリジェント システムへのガイド」)。これは、アルゴリズムのデバッグに役立ちます。別の方法として、既存のフレームワーク (Encog、FANN、Matlab など) を使用して、まったく同じトポロジと初期の重みを設定し、計算を独自の実装と比較することもできます。

于 2011-09-22T17:30:51.197 に答える