入力の順序をニューラルネットワークにランダム化する効果

私のAdvanced Algorithms and Data Structuresクラスでは、私の教授が私たちに興味のあるトピックを選ぶように頼んだ。彼はまた、私たちにそれを研究し、その中で解決策を試して実行するように指示しました。私は神経ネットワークを選びました。なぜなら、これは長い間学習したかったからです。

私は、ニューロンがアクチベータのためのステップ関数を使用するニューラルネットワークを使って、AND、OR、およびXORを実装することができました。その後、私はXOR演算子(シグモイド関数をアクティベータとして使用する)を認識することを学ぶ逆伝搬ニューラルネットワークを実装しようとしました。私は3-3-1ネットワーク(入力と隠れ層で1つのバイアス、無作為に初期化された重み付き)を使用することで、これを90%の時間で動作させることができました。他の時には、私はローカルミニマムだと思うものにこだわっているようですが、私は確信が持てません(私はこれまでに質問してきました。

[0、0]、[0、1]、[1、0]、[1、0] の順番で入力を一貫して提示していました。期待される出力は [0、1、1、0] に設定されています。一貫して同じ順序で値を提示すると、ネットワークは最終的にパターンを学習します。私はそれを送信する順番は実際には関係ありません。

その後、トレーニングセットのランダム化を実装しました。今回は、入力の順序が十分にランダム化されています。私の神経ネットワークが詰まり、エラーが減少しているが、非常に小さいレート(各エポックで小さくなっている)になったことに気付いた。しばらくすると、エラーはある値の周りを振動し始めます(エラーは減少しなくなります)。

私はこのトピックの初心者で、これまでに知っていることはすべて自己学習しています(チュートリアル、論文などを読む)。入力の提示順序がネットワークの動作を変えるのはなぜですか?それは、エラーの変化がある入力から次の入力まで一貫しているからです(順序が一致しているため)。これはネットワークの学習を容易にしますか?

これを修正するにはどうすればよいですか?私はそれを正しく実装したかどうかを確認するために、私のバックプロパゲーションアルゴリズムを調べます。現在、学習率と勢いで実装されています。私は適応学習率のような他の強化を検討することを検討しています。しかし、XORネットワークはしばしば非常に単純なネットワークとして描かれているので、洗練されたバックプロパゲーションアルゴリズムを使う必要はないはずです。

4

1 答え

ネットワークにあなたのトレーニングセットを含む観測値(入力ベクトル)を提示する順序は、無作為配置の観測変数応答変数順序付けられた配置に対して強く好ましい。

たとえば、トレーニングセットを含む150の観測値があり、応答変数ごとに3つのクラスラベル(クラスI、II、またはIII)のいずれかであり、観察1-50がクラスI、51-100がクラスIIでは101-50、クラスIIIでは101-50であった。あなたがしたくないことは、それらをネットワークにその順序で提示することです。言い換えれば、ネットワークがクラ​​スIの全50回の観測を見ることを望んでいません。その後、クラスIIで50回、クラスIIIで50回の観測をすべて見ることはできません。

あなたのクラシファイアのトレーニング中に何が起こったのですか?最初はあなたのネットワークに4つの観測点を提示していました。順序は[0,1,1,0]です。

あなたのネットワークが収束しなかったインスタンスで入力ベクトルの順序がどうなったのでしょうか?それが[1,1,0,0]、または[0,1,1,1]の場合、これは上記の経験的なルールiとよく似ています。

On the other hand, i have to wonder whether this rule even applies in your case. The reason is that you have so few training instances that even if the order is [1, 1, 0, 0], training over multiple epochs (which i am sure you must be doing) will mean that this ordering looks more "randomized" rather than the exemplar i mentioned above (i.e., [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0] is how the network would be presented with the training data over three epochs).

Some suggestions to diagnose the problem:

  1. 上記のように、非コンバージェンスの場合の入力ベクトルの順序を見てください - それらは応答変数でソートされていますか?

  2. 収束していないケースでは、あなたの体重行列を見てください(私はそれらの2つがあると仮定します)。非常に大きい値を探します(他の値は100倍、初期化された値の100倍など)。大きなウェイトはオーバーフローを引き起こす可能性があります。

7
追加された
情報ダグありがとう。繰り返しますが、私は初心者なので、私はすべての言葉にあまり慣れていません。 「収束しないケース」とはどういう意味ですか?ウェイトに関する限り、私は2つのウェイトベクトルを持っています:1つは隠れたレイヤへの入力用、もう1つは出力レイヤへの入力用です。
追加された 著者 Vivin Paliath,
入力はネットワークが何も学んでいないことを保証した出力に対応していませんでした!また、バックプロパゲーションアルゴリズムを変更して、ネットワーク内のすべてのノードについてエラーが計算された後にのみ重みを調整しました。
追加された 著者 Vivin Paliath,
そのリンクをありがとうございます。それは非常に参考になります!また、私のコードのエラーを起こしにくくするための提案をありがとう!
追加された 著者 Vivin Paliath,
@VivinPaliathの「非コンバージェンス」のケースは、ネットワークが結果に収束しなかった場合(つまり、どのデータポイントによって障害が発生したか)を指します。私を提案させてください。あなたはニューラルネットcomp.ai FAQについて知っていますか? IMO、どこでも最高のNNリソース - 最も権威があり、最も包括的で、驚くほど簡単に読むことができます(FAQ形式)。 faqs.org/faqs/ai-faq/neural- nets/part1/preamble.html 7つの部分があります、あなたはpdf形式で7をすべてダウンロードすることができます。
追加された 著者 doug,
あなたがそれを解決することを知ってうれしい@ VivinPaliath。だから、あなたは入力配列を並べ替えましたが、同様に、対応するターゲットを並べ替えるのを忘れました。 pythonやmatlabを使用する場合は、入力+ターゲットを単一の2D( 'data')マトリックスとしてまとめておくだけで、それぞれを別々の変数(入力、ターゲット)にバインドするのではなく、index/slice例えば、入力はデータ[:、: - 1]、ターゲットはデータ[:、 - 1]
追加された 著者 doug,