収束するのではなく分岐するニューラルネットワーク


9

2層のニューラルネットワーク(CUDAを使用)を実装しました。(レイヤーあたり2ニューロン)。私は、バックプロパゲーションを使用して2つの単純な2次多項式関数を学習させるようにしています。

しかし、収束するのではなく、それは発散します(出力は無限大になります)

これが私が試したことの詳細です:

  • 初期の重みを0に設定しましたが、発散していたため、初期の重みをランダム化しました(範囲:-0.5〜0.5)
  • 学習率が高すぎるとニューラルネットワークが分岐する可能性があるため、学習率を0.000001に下げました。
  • 追加しようとしている2つの関数は次のとおりです。3* i + 7 * j + 9およびj * j + i * i + 24(レイヤーiおよびjを入力として指定しています)
  • 私は以前にそれを単一の層として実装しました、そしてそれは今それをしているよりも多項式関数をよりよく近似することができました
  • このネットワークに勢いをつけることを考えていますが、それが学習に役立つかどうかはわかりません
  • 線形(noのように)アクティベーション関数を使用しています
  • 最初は振動がありますが、いずれかのウェイトが1を超えると出力が発散し始めます

コードをチェックして再チェックしましたが、コードになんら問題はないようです。

だから私の質問です:ここで何が問題になっていますか?

どんなポインタでも大歓迎です。

回答:


8
  1. ニューラルネットワークでは、対称性を壊すために常にランダムに重みを初期化する必要があります。
  2. 非表示のユニットで非線形のアクティベーション関数を使用しない場合は、単一のレイヤーにとどまっている可能性もあります。これで、ネットワークは2つの線形関数の構成になりました。もちろん、これは単なる別の線形関数です。
  3. その学習率は非常に小さいようです。固定学習率を使用している場合、通常、ほとんどの問題に対して適切に機能するように、0.1から0.0001の間の値を見つけます。これは明らかに問題に依存しているので、それが何であるかについて私の経験をとってください。
  4. 学んだ数学とコードを照合することに加えて、勾配ベースの最適化を行う場合、有限差分を使用して必要な勾配を分析的に計算し、コードで計算している値と比較すると非常に役立ちます。これを行う方法の説明については、こちらを参照してください。この方法で多くのエラーを検出しました。これらのタイプのテストに合格することで、コードの正確さをより確実に感じることができます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.