2016-07-29 13 views
1

数日前、私は、ニューラルネットワークに関する、私はAIの講義で、今年学んだことを実際に入れてみました。私は、2つのニューロンだけで入力信号を複製する単純なものを作ろうとしました。 http://imgur.com/a/RixAH(フランス語のコメントは申し訳ありませんが、実際には重要ではありません)バックプロパゲーションは

奇妙なことは、収束していることですが、単純なバイナリ入力信号の場合は、次のようになります。信号が0の場合、ネットワークは〜0を効果的に送信しますが、1の場合は〜0.5を送信し、理由を理解できません。プラス、私はそれを働かせるために、非常に高い(〜100)学習率を設定する必要があります、再び私は理由を知らない。

public class Main 
{ 
    final static double R = 100; 

public static void main(String[] args) 
{ 
    double w1 = Math.random(), w2 = Math.random(); 

    for (int iter = 1; iter <= 100; iter++) 
    { 
     int x; 

     if (Math.random() >= 0.5) 
     { 
      x = 1; 
     } 
     else 
     { 
      x = 0; 
     } 

     double p1 = x * w1; 
     double y = 1/(1 + Math.exp(-p1)); 

     double p2 = y * w2; 
     double z = 1/(1 + Math.exp(-p2)); 

     double P = -0.5 * Math.pow(x - z, 2); 

     double dP1 = (x - z) * z * (1 - z) * w2 * y * (1 - y) * x; 
     double dP2 = (x - z) * z * (1 - z) * y; 

     w1 += R * dP1; 
     w2 += R * dP2; 

     System.out.println("x = " + x + ", z = " + z + ", P = " + P); 
    } 
} 

} 

問題から来ることができ、あなたが任意のアイデアを持っていますか:

ここで私はネットワークをテストするために使用されるJavaコードですか?

ありがとうございました。

LeChocdesGitans

編集:私は最終的にそれが働いて得ることができた

(私は、ネットワーク構成のためのあなたのアドバイスに従っ)。ネットワークのレイアウトを変更した直後には機能しなかったので、実装ミスもあったと思いますが、私はそれをやり直しました。文字認識のように面白いことができます私のアプリケーションがどれほど基本的なものかを比較してください。

もう一度アドバイスをいただきありがとうございます。

+0

私は興味がありますが、なぜそれぞれ1つのニューロンで2つのレイヤーを使用することにしましたか? – rpd

+0

私は機械学習で多くの経験がないので、MITのニューラルネットワークに関するビデオで見た設定を使用しました。何が最高だと思いますか? – LeChocdesGitans

+0

2つのパーセプトロンを使用した1つのレイヤーのセットアップは、おもちゃの例として、より機能的かつ「現実的」です。 – rpd

答えて

1

rpdと言っていますが、主な問題は2つの連続したレイヤーを訓練していることです。数学的には、これはノード1に適用されたすべての修正がノード2を介してフィルタリングされなければならないことを意味します。チェーンルール、ベイズの定理などの等価フィルタリングを適用できます。

あなたが記述影響から、あなたはほぼ確実にあなたの実装でエラーが発生しています。これに対する最大の手がかりは、たとえ少しでも受け入れられる結果を得るためには、学習率を妥当な値以上に上げなければならないということです。覚えておいてください、これは小さなステップを取ることを認識するための倍率です。値が100の場合は、正しい調整の現在の最も良い推定値を取得してから、100倍の距離を進んでいることを意味します。残りのアルゴリズムが正しい場合、1.0より大きい学習率は収束せずに激しく振動する意図的な試みです。

あなたの中間値を追跡している場合、アップデートのシーケンスを投稿してください。そうでない場合は、そのデバッグステップを使用する必要があります。

しかし、あなたが初めてではない、直列、並列であなたの隠されたニューロンを置く必要があります。一つは、関数の畳み込みは単にステップを無駄にすることです。別の場合、重みは同じプロセス(並行して)で更新する必要があります。結果は、1.0に簡単に正規化された別個の重み(例えば、SoftMax操作を介して)に収束しなければならない。 1層のバックプロパゲーションは低次の計算です。設定した立方体(およびそれより悪い)のエラー関数でより速い収束を試みる前に、単純な線形プロセス(オイラーの方法)でプロセスをデバッグします。


私はあなたのノートとアルゴリズムで少し作業し、いくつかの観察を得ました。

  • あなたはあなたのノートの最初の行に負の符号を落とした:P(X、Z)= -1/2(X-Z)^ 2は、その誘導体である場合 - (X-Z)、または、Z-X。アルゴリズムのこの変更を行うことで、収束がやや容易になります。

  • ニューロンの畳み込みは、一般的に欠陥があります。これは、隠された単一のニューロンを持つモデルにとっても減少します。

関連する問題