2

だれかウェブサイトを推薦したり、NN でバックプロパゲーションがどのように実装されているかを簡単に教えてもらえますか? 基本的な概念は理解できましたが、コードの書き方がわかりません。

私が見つけたソースの多くは、方程式を示しているだけで、なぜそれを行っているのかを説明していません。また、変数名のせいで見つけにくくなっています。

例:

void bpnn_output_error(delta, target, output, nj, err)
double *delta, *target, *output, *err;
int nj;
{
  int j;
  double o, t, errsum;

  errsum = 0.0;
  for (j = 1; j <= nj; j++) {
    o = output[j];
    t = target[j];
    delta[j] = o * (1.0 - o) * (t - o);
    errsum += ABS(delta[j]);
  }
  *err = errsum;

}

その例では、誰かがの目的を説明できますか

delta[j] = o * (1.0 - o) * (t - o);

ありがとう。

4

4 に答える 4

9

の目的

デルタ[j] = o * (1.0 - o) * (t - o);

逆伝播ネットワークで出力ノードのエラーを見つけることです。

o はノードの出力を表し、t はノードの出力の期待値です。

項 (o * (1.0 - o) は、使用される一般的な伝達関数であるシグモイド関数の導関数です。(他の伝達関数も珍しくなく、代わりにシグモイドの 1 次導関数を持つコードを書き直す必要があります。関数と導関数の不一致は、トレーニングが収束しないことを意味する可能性があります。)ノードには、出力 o を取得するために伝達関数を介して供給される「活性化」値があります。

o = f(活性化)

主なことは、バックプロパゲーションが勾配降下を使用し、エラーがチェーン ルールの適用によってバックワード プロパゲーションされることです。問題は、出力が期待値と直接比較できない隠しノードに対するクレジットの割り当て、または責任の 1 つです。既知で比較可能な出力ノードから始めます。誤差は、期待される出力と実際の出力の間の生の誤差値を出力にかけた一次導関数に比例すると見なされます。

より象徴的に、その行を次のように書きます。

デルタ[j] = f'(アクティベーション_j) * (t_j - o_j)

ここで、f は伝達関数、f' はその 1 次導関数です。

さらに隠れ層に戻ると、ノードでの誤差は、次の層で見つかった誤差への推定寄与です。そのため、後続のレイヤーからのデルタに結合重みが掛けられ、それらの積が合計されます。その合計に隠しノードのアクティベーションの一次導関数を掛けて、隠しノードのデルタを取得します。または、

delta[j] = f'(activation_j) * Sum(delta[k] * w_jk)

ここで、j は次の層の隠しノードと ka ノードを参照します。

于 2012-12-04T16:18:35.700 に答える
2

(t-o)tはターゲット出力でoあり、実際の出力であるため、ネットワークの出力のエラーです。正規化された形式でdelta配列に格納されています。正規化に使用される方法は実装に依存し、o * ( 1.0 - o )それを行っているようです (その仮定については間違っている可能性があります)。

この正規化されたエラーは、トレーニングがいつ完了したかを判断するために、トレーニング セット全体に対して蓄積されます。通常は、errsumある目標しきい値を下回ったときです。

于 2010-01-15T17:32:53.380 に答える
1

実際、理論を知っていれば、プログラムは理解しやすいはずです。この本を読んで、鉛筆を使っていくつかの簡単なサンプルを作成し、繁殖の正確な手順を理解することができます。これは、数値プログラムを実装するための一般的な原則であり、小さなケースでは非常に詳細を知っている必要があります。

Matlab を知っている場合は、C よりも理解しやすいMatlab のソース コード (たとえば、ここ) を読むことをお勧めします。

質問のコードでは、名前は一目瞭然です。出力は予測の配列である可能性があり、ターゲットはトレーニングラベルの配列である可能性があります。デルタは予測と真の値の間の誤差であり、値としても機能します重みベクトルに更新されます。

于 2010-01-15T17:32:14.707 に答える
0

基本的に、バックプロップが行うことは、トレーニング データでネットワークを実行し、出力を観察してから、出力ノードから入力ノードに繰り返し戻ってノードの値を調整することです。

于 2010-01-15T17:33:58.093 に答える