これはかなり奇妙な問題です。
次のように、完全に機能する逆伝播のコードがあります。
現在、バッチ学習を行うと、単純なスカラー関数の近似に関係する場合でも、間違った結果が得られます。
トレーニング後、ネットワークはすべての入力パターンに対してほぼ同じ出力を生成します。
この瞬間までに私は試しました:
- バイアス重みの導入
- 入力重みの更新の有無にかかわらず試してみました
- バッチ学習でパターンをシャッフル
- 各パターンの後に更新を試み、蓄積
- 考えられるさまざまな方法で初期化された重み
- コードを 10 回ダブルチェックした
- パターン数で正規化された累積更新
- 別のレイヤー、ニューロン数を試しました
- さまざまなアクティベーション関数を試しました
- さまざまな学習率を試した
- 50 から 10000 までの異なる数のエポックを試しました
- データの正規化を試みました
たった 1 つのパターンに対して一連の逆伝播を行った後、ネットワークは多種多様な入力に対してほぼ同じ出力を生成することに気付きました。
関数を近似しようとすると、常に直線 (ほぼ直線) になります。このような:
関連する質問:ニューラル ネットワークは常に任意の入力に対して同じ/類似の出力を生成し ます。バイアス ニューロンを追加するという提案は、私の問題を解決しませんでした。
次のような投稿を見つけました。
When ANNs have trouble learning they often just learn to output the
average output values, regardless of the inputs. I don't know if this
is the case or why it would be happening with such a simple NN.
これは私の状況を十分に詳しく説明しています。しかし、どのように対処するのですか?
私が遭遇する状況には、そうあるべきだという結論に達しています。実際には、ネット構成ごとに、出力レイヤーまでのすべての接続を「カット」することができます。これは実際に可能です。たとえば、非表示レイヤーを過飽和にして出力を入力から独立させるために、すべての非表示の重みをほぼゼロに設定するか、バイアスを異常な値に設定します。その後、入力とは独立して出力をそのまま再現するように、出力レイヤーを自由に調整できます。バッチ学習では、勾配が平均化され、ネットはターゲットの平均だけを再現します。入力は何の役割も果たしません。