記事"ディープニューラルネットワーク(その4)ニューラルネットワーク分類器のアンサンブル: バギング"についてのディスカッション

 

新しい記事 ディープニューラルネットワーク(その4)ニューラルネットワーク分類器のアンサンブル: バギング はパブリッシュされました:

本稿では、バギング構造を持つニューラルネットワークのアンサンブルを構築および訓練する方法について説明します。また、アンサンブルを構成する個々のニューラルネットワーク分類器の超パラメータ最適化の特性も特定されます。このシリーズの前の記事で得られた最適化ニューラルネットワークの品質は、作成されたニューラルネットワークのアンサンブルの品質と比較されます。アンサンブルの分類の質をさらに向上させる可能性が考慮されます。

アンサンブル内の個々の分類器の超パラメータが直感的に選択され、明らかに最適ではないという事実にもかかわらず、平均化と単純多数決を使用することにより、質の高く安定した分類が得られました。

上記をすべて要約してみます。図式的に示すと、ニューラルネットワークのアンサンブルを作成してテストするプロセス全体は4段階に分けることができます。

図3 平均化/投票結合器によるニューラルネットワークのアンサンブルの訓練およびテストの構造

作者: Vladimir Perervenko

 

ありがとう、興味深い。elmNNは、特にアンサンブルにおいて、nnetの代わりになりそうだ。 rBayesianOptimizationについても学んだので、今後使ってみようと思う。

 

興味深い記事だ!
500ものネットワークを一度に学ぶとは予想外だった。こんなに早くできるとは思わなかった。

1) 追加の乱数生成器 setRNG(rng[[k]]) の代わりに、組み込みの holdout(Ytrain, ratio = r/10, mode = "random", seed = i ) # ここで i はループの繰り返し数です。
こうすることで、各繰り返しで新しい入力データの混合セットを得ることができ、再スタート時に繰り返されます。

2) 一般的に、holdout は素晴らしい関数で、データを非常にうまくミックスします。各行をランダムに他の行に置き換える MT5 の自作関数よりもはるかに優れています。
非常に優れた学習結果に出くわすことができるのは、seed を変更するときです。私はdarchで手動で変更しようとしました - 私はエラーが50%から30%になり、取引数が単位から数百になりました - そして、これはミキシングのキーを変更した後だけです。ループで自動的にチェックする方が、おそらく信頼性が高い。

3) elmNN - 1エポックの学習で通常のNSに似ている。500個のピース(その中から最適なものを選ぶ)を使って、500エポックの訓練(その中から最適なエポックも選ぶ)を行った1個のNSのアナログが得られる。しかし、これは単なる連想であり、明言ではない。

しかし、500エポック後に1つの最良の結果を得るよりは、いくつかの最良のネットワークの平均の方が良いと思います。DNNでアンサンブルをやってみたいのですが、学習曲線が非常に長くなりそうで怖いです。実験してみます)
記事をありがとう!

 
elibrarius:

興味深い記事だ!
500ものネットワークを一度に学ぶとは予想外だった。こんなに早くできるとは思わなかった。

1) 追加の乱数生成器setRNG(rng[[k]])の代わりに、組み込みのholdout(Ytrain, ratio = r/10, mode = "random", seed = i ) # ここでiはループの繰り返し数です。
この方法では、各繰り返しで新しい入力データの混合セットも得られ、再スタート時に繰り返されます。

2) 一般的に、holdout は素晴らしい関数で、データをうまくミックスしてくれます。各行をランダムに他の行に置き換える MT5 の自作関数よりもはるかに優れています。
非常に優れた学習結果に出くわすことができるのは、シードを変更するときです。私はdarchで手動で変更しようとしました - 私はエラーが50%から30%になり、取引数が単位から数百になりました - そして、これはミキシングのキーを変更した後だけです。ループの中で自動的にチェックする方が、おそらく信頼できるだろう。

3) elmNN - 1エポックのトレーニングで通常のNSに似ている。500個のピース(その中から最適なものを選ぶ)を使って、500エポックの訓練(その中から最適なエポックも選ぶ)を行った1個のNSのアナログが得られる。しかし、これは単なる連想であり、明言ではない。

しかし、500エポック後に1つの最良の結果を得るよりは、いくつかの最良のネットワークの平均の方が良いと思います。DNNでアンサンブルをやってみたいのですが、学習曲線が非常に長くなりそうで怖いです。実験してみます)
記事をありがとうございました!

1.できません。RNGの主な仕事は、アンサンブルのニューラルネットワークの重みが一定の確率変数によって初期化されるようにすることです。 一定の確率変数によって初期化されるようにすることです。ハイパーパラメータを最適化するには、一定の品質のアンサンブルが必要です。

3.これは単層NNですが、バックプロパゲーション学習はありません。リンク先の説明を読んでほしい。そこには動物園がある。そして、開発者が主張するように、これらは非常にうまく機能する。

ELMを使ったアンサンブルの結果は、正直言って私にとって大きな驚きであり、「難しいことがすべて素晴らしいわけではない」という言葉を裏付けるものだった。次のパートでは、平均化によって分類の 質を向上させるいくつかの方法を試してみる。

幸運を祈る

 
Vladimir Perervenko:

1.できない。RNGの主な仕事は、アンサンブル内のニューラルネットワークの重みが一定の確率変数によって初期化されるようにすることである。 一定の確率変数によって初期化されるようにすることです。ハイパーパラメータを最適化するには、一定の品質のアンサンブルが必要です。

3.これは単層NNですが、バックプロパゲーション学習はありません。リンク先の説明を読んでください。そこには動物園がある。そして、開発者が主張するように、これらは非常にうまく機能する。

ELMを使ったアンサンブルの結果は、正直言って私にとって大きな驚きであり、「難しいことがすべて素晴らしいわけではない」という言葉を裏付けるものだった。次のパートでは、平均化によって分類の 質を向上させるいくつかの方法を試してみる。

幸運を祈る

1) 了解。混合を初期化するだけでなく、ネットワークの重みも初期化しています。
set.seed(i);だけでは同じ効果は得られないのですね?

 
elibrarius:

1) 了解。ミキシングの初期化に加えて、ネットワークの重みも初期化しています。
set.seed(i);だけでは同じ効果は得られないのですか?

いいえ、そうではありません。RNGの状態は一度だけ設定されますが、foreachを500回繰り返すので、それぞれの繰り返しでRNGの状態を変える必要があります。doRNGパッケージの説明を見てください。

幸運を祈る。

 
Vladimir Perervenko:

いいえ。RNGの状態は一度だけ設定されますが、500回のforeach反復があり、各反復で異なるRNGの状態が必要です。doRNGパッケージの説明を見てください。

幸運を祈る

ループの中にある

  Ens <- foreach(i = 1:n, .packages = "elmNN") %do% {
    set.seed(i);
    idx <- rminer::holdout(Ytrain, ratio = r/10, mode = "random")$tr
    elmtrain(x = Xtrain[idx, ], y = Ytrain[idx], 
             nhid = nh, actfun = "sin")
  }
つまり、set.seed(1); 次にset.seed(2); set.seed(3); ...... set.seed(500)となります;
 
elibrarius:

ループの中に入る

試してみてください。うまくいくかもしれない。

 
Vladimir Perervenko:

試してみてください。うまくいくかもしれない。

そのはずだ。

そして、この場合マルチスレッドをオフにしないことも可能だと思う。

 
elibrarius:

そうしなければならない。

この場合、マルチスレッドをオフにしないことも可能だと思う。

実際にテストしてみてください。同じ結果かそれ以上の結果が得られるなら、この方法でやればいい。R言語では、同じ動作をさまざまな方法で実行することができます。

幸運を祈る。

 
Vladimir Perervenko:

実践的にテストすればいい。同じ結果かそれ以上のものが得られるなら、その方法でやればいい。R言語では、同じ動作をさまざまな方法で実行できる。

幸運を祈る

バージョン

  Ens <- foreach(i = 1:n, .packages = "elmNN") %do% {
    set.seed(i);
    idx <- rminer::holdout(Ytrain, ratio = r/10, mode = "random")$tr
    elmtrain(x = Xtrain[idx, ], y = Ytrain[idx], 
             nhid = nh, actfun = "sin")
  }

はうまくいく。実行するたびに同じネットワークの重みを与える。私は2番目のネットワークで比較していました。env$Ens[2]を出力し、notepad++のプラグインで比較した。

マルチスレッドでは動かなかった:

setMKLthreads(2) のエラー:can't find function "setMKLthreads"

この関数は何ですか?4と6のコードにはありません。どのように接続するのですか?

追記: すべての関数とソースデータを含むRセッションを投稿していただけるとより便利です。