2012-05-04 4 views
0

エコー状態ネットワークに精通している人は誰ですか?私はC#でエコー状態のネットワークを作成しました。その目的は、入力をGOODとNOT GOODに分類することでした。入力は倍数の配列です。私はおそらくこの分類のエコー状態ネットワークが最良の選択ではないことを知っていますが、私はこの方法でそれをしなければなりません。エコー状態ニューラルネットワーク?

私の問題は、ネットワークを訓練した後、それが一般化できないということです。私は外国のデータ(教授の入力ではない)でネットワークを走らせるとき、私は約50-60%の良い結果しか得ません。

詳細:私のエコー状態ネットワークは関数近似器のように動作しなければなりません。関数の入力は17のdouble値の配列で、出力は0または1です(入力を悪い入力または良い入力に分類する必要があります)。

私はネットワークを作成しました。これには、17ニューロンの入力層と、ネオン数が調整可能なリザーバ層と、0または1の出力に必要な1ニューロンを含む出力層が含まれています。単純な例では、出力フィードバックは使用されません(出力フィードバック同様に、しかし何も変わっていない)。

リザーバ層の内側のマトリックスも調整可能です。私は調整可能なスパースネス比で2つの二重値(最小、最大)の間の重みを生成します。値が大きすぎる場合、マトリックスは、1より小さいスペクトル半径を有するように行列をノルムライズする。リザーバ層は、シグモイドおよびタン活性化関数を有することができる。

入力層は、ランダム値でリザーバ層に完全に接続されています。したがってトレーニング状態では、学習データを使って内部のX(n)予備の活性化を計算し、それを行列の列に集めます。所望の出力データ行列(今は0の0の値を持つベクトル)を使用して、出力の重みを計算します(リザーバから出力へ)。リザーバは出力に完全に接続されています。エコー状態のネットワークを使っている人が何を話しているかは分かりません。私はこのための擬似逆方法です。

問題は、ネットワークを調整してより一般化するにはどうすればいいですか?外国のデータセット(訓練用データセットではない)で希望のアウトプットの50-60%以上を打つ。トレーニングデータセットを使用してネットワークを再起動すると、80-90%と非常に良い結果が得られますが、それをより一般化することが望ましいです。

エコー状態のネットワークで誰かがこの問題を抱えていることを願っています。

+0

「誰かができる場合は、私が問題をより完全に説明できるように返答してください。」どのようにあなたはより完全に説明し、その後我々は応答する? – Annabelle

答えて

2

私が正しく理解していれば、あなたが訓練している既知の分類されたデータがあり、次にそれを分類する未知のデータがあります。トレーニングの後、既知のデータをよく分類し直すこ​​とができますが、未知のデータをうまく処理することはできません。これは、overfittingと呼ばれています。あなたのネットワークにあまり厳しくないこと、ノード番号を減らすこと、隠れたデータセットに基づいてトレーニングすることなどが考えられます。

人々のやり方は、トレーニングセットA、検証セットB、テストセットCです。あなたはAとBの正しい分類を知っていますが、Cではありません。(既知のデータをAとB、Cはネットワークがあなたに求める値です)。トレーニングでは、ネットワークAのみを表示しますが、繰り返しごとにAとBの両方を使用して成功を計算します。トレーニング中、ネットワークはAだけを見て、AとBの両方に存在する関係を理解し​​ようとします。 Bの実際の入力値と出力値を見ることはできませんが、現在の状態がBを正確に記述しているかどうかしかわかりません。これは過大適合を減らすのに役立ちます。

通常、人は4/5のデータをAに分割し、1/5はBに分割するようですが、もちろん異なる比率を試すことができます。

最後に、トレーニングを終えて、ネットワークがあなたの未知のセットCについて何を言うかを見てください。

申し訳ありませんが、非常に一般的な、基本的な答えが、おそらくそれはより良い問題を記述するのに役立ちます。

+0

あなたの答えをありがとうが、私はそれを正しく理解しているかわからない。だから、あなたはAとネットワークを訓練し、接続を出力するために貯水池を計算した後、AとBでネットワークを走らせてから、それから計算速度を計算する必要があります。このようにして、内部リザーバ状態X(n)は、データセットCに対して「良好」になるように変化するだろうか? 私はそれをお試しいただきますありがとうございます! :)それが助けてくれることを願います。 –

+0

ようこそ。おそらく、これは参考になるでしょう:http://stackoverflow.com/questions/2976452/whats-the-diference-between-train-validation-and-test-set-in-neural-networks – Superbest

+0

うーん、問題は私が使用していないですバックプロパゲーション。私の方法はdiffrenetです。私は出力重みを計算するためにオフラインアルゴリズムを使用します。 –

0

ネットワークが一般化していない場合、それはオーバーフィットであることを意味します。

ニューラルネットワーク上の過剰適合減らすために、2つの方法があります。

  • より多くのトレーニングデータを取得また、あなたはしている機能について考えるかもしれないニューロン

の数を減らしますネットワークに給電する。たとえば、それが毎週繰り返される時系列である場合、1つの特徴は、「曜日」、「週の時間」または「週の分」のようなものである。

ニューラルネットワークには多くのデータが必要です。たくさんの例があります。何千もの何千もの人がいない場合は、ほんの一握りのニューロンだけでネットワークを選択するか、回帰のように他の何らかのパラメータを使用してパラメータを少なくする必要があります。ここで示唆されている他の回答のように

0

が、これはオーバーフィッティングの古典的なケースである:あなたのモデルは、あなたの学習データによく機能するが、それは、新たな試験データにも一般化しません。

ヒューの答えは、あなたのモデルのパラメータの数を減らす(つまり、リザーバのサイズを縮小する)ことをお勧めしますが、ESNに有効かどうかはわかりません。 ESNが解決できる問題の複雑さは、貯水池のサイズの対数に比例して増加する。モデルのサイズを小さくすると、実際にはモデルがうまく機能しなくなる可能性がありますが、このタイプのモデルではオーバーフィットを避ける必要があります。

Superbestのソリューションは、バリデーションセットのパフォーマンスが向上しなくなるとすぐにトレーニングを停止するために、バリデーションセットを使用することです。これはというテクニックです。ただし、オフライン回帰を使用してESNの出力ウェイトを計算するため、検証セットを使用してモデルパラメータの更新を停止することはできません。早期停止はオンライントレーニングアルゴリズムにのみ有効です。

しかし、別の方法で検証セットを使用することができます。回帰係数を正規化することです!

  • 学習データを「トレーニング」の部分(通常は利用可能なデータの80〜90%)と「検証」部分(残りの10〜20%)に分割します。
  • バニラ線形回帰を使用する代わりに回帰を計算するときは、ridge regression,lasso regression、またはelastic net regressionなどの正規化された手法を使用します。回帰の計算には、データセットの「トレーニング」部分のみを使用します。
  • これらの正則化された回帰テクニックはどれも、モデルの適合性とその複雑さとのバランスをとる1つ以上の「ハイパーパラメータ」を持っています。 「検証」データセットは、これらのパラメータ値を設定するために使用されます。grid search、進化的手法、またはその他のハイパーパラメータ最適化手法を使用してこれを行うことができます。一般的に言えば、これらの方法は、ハイパーパラメータの値を選択し、「トレーニング」データセットを使用してモデルをフィッティングし、フィッティングされたモデルのパフォーマンスを「検証」データセットで測定することによって機能します。 N回繰り返し、「検証」セットで最もよく機能するモデルを選択します。

正規化と回帰の詳細については、http://en.wikipedia.org/wiki/Least_squares#Regularized_versionsで、または機械学習や統計の教科書で調べることができます。

さらに、クロスバリデーションのテクニックについては、http://en.wikipedia.org/wiki/Cross-validation_(statistics)を参照してください。