記事"ディープニューラルネットワーク(その5)DNNハイパーパラメータのベイズ最適化"についてのディスカッション - ページ 2

 

検証 サンプルの誤差は、トレーニングサンプルの誤差よりも小さかった!

言い換えれば、あるデータで訓練されたモデルは、他のデータでも機能するように学習したのである。

私は作者に訴えたい - shtukarstvaと改ざんをやめて、最終的にExpert Advisorを書いて、少なくともデモで結果を示してください。

 
revers45:

言い換えれば、あるデータで訓練されたモデルが、他のデータでも機能するように学習した のである。

すべてのモデルはトレーニングプロットで訓練され、トレーニングプロットでの誤差を最小化しようとしたが、最終的にはテストプロットで選択され、もしモデルがデータのパターンを見つけられなかったら、結果はトレーニングプロットでもテストプロットの後のプロットでも非常に悪かっただろう。しかし結果が示すように、そこでもそこでも、選択が行われたテストプロットと大きな違いはない。
つまり、NSはもう一方から学んだ のではなく、両方のデータセットに共通するパターンを見つけたのである。
もし結果があまり安定していなかったとしたら、(訓練者の誤差を考慮に入れずに)テストプロット上で選択することで、それにフィッティングすることになったかもしれない。今回の場合はそうならなかったが、他のデータでは(パターンが見つからなければ)そうなる可能性がある。そして、Err = (ErrLeran * 0.37 + ErrValid * 0.63)のような誤差のバランスを探すのがよいだろう。

 
elibrarius:

こんにちは、ウラジーミル、

なぜあなたのNSがトレーニングデータで学習され、テストデータで評価されるのか、よく理解できません(もし私が間違っていなければ、あなたはそれを検証として使用しています)。

この場合、テストプロットへの適合は得られないのでしょうか?つまり、テストプロットで最もうまくいったモデルを選択するのでしょうか?
また、テストプロットは非常に小さいので、時間的パターンの1つにフィットさせることができますが、これはすぐに機能しなくなる可能性があることも考慮する必要があります。
たぶん、トレーニングプロット、またはプロットの合計、またはDarchのように(検証データを提出した場合)Err = (ErrLeran * 0.37 + ErrValid * 0.63)で推定する方が良いでしょう - これらの係数はデフォルトですが、変更することができます。

多くのオプションがあり、どれが最良かは明らかではありません。テストプロットを支持するあなたの議論は興味深いです。

こんにちは。

より具体的に説明しましょう。データ集合Xは,4つのサブセット preptrain = 4001, train = 1000, test = 500, test1 = 100 bar からなります.事前訓練には、訓練セット - preptrain、検証セット - trainを使用します。

#  SRBM + upper Layer (backpropagation)
 pretrainSRBM_topLayer <- function(Ln, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top) #  SRBM + upper Layer (backpropagation)
  {
    darch( x = X$pretrain$x, y = X$pretrain$y,
          xValid = X$train$x, 
          yValid = X$train$y,
          #=====constant======================
......................................................

微調整には、pretrainセットをトレーニングセットとして使用し、validationセットをテストセットの最初の250小節に使用する。

fineTuneRP <- function(Ln, fact1, fact2, dr1, dr2, Dnn) #  rpropagation
  {
    darch( x = X$train$x, y = X$train$y,
           #xValid = X$test$x, yValid = X$test$y,
           xValid = X$test$x %>% head(250), 
           yValid = X$test$y %>% head(250),
           #=====constant========
................................................

したがって、最終的な品質を決定するために、テストセットの最後の250バーをテストセットとして使用します。コード

#---SRBM + upperLayer + RP----
  fitnes4.DNN <- function(n1, n2, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top)
  {
    Ln <- c(0, 2*n1, 2*n2, 0)
    #--
     pretrainSRBM_topLayer(Ln, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top) -> Dnn
    fineTuneRP(Ln, fact1, fact2, dr1, dr2, Dnn) -> Dnn
    predict(Dnn, newdata = X$test$x %>% tail(250) , type = "class") -> Ypred
    yTest <- X$test$y[ ,1] %>% tail(250)
    #numIncorrect <- sum(Ypred != yTest)
    #Score <- 1 - round(numIncorrect/nrow(xTest), 2)
    Score <- Evaluate(actual = yTest, predicted = Ypred)$Metrics$F1 %>%
      mean() 
    return(list(Score = Score, Pred = Ypred)
  }

矛盾は見当たらない。同意しますか?

幸運を祈る

 
elibrarius:

すべてのモデルは訓練プロット上で訓練され、つまりこのプロット上で誤差を最小化しようとしたが、最後にテストプロット上で選択が行われ、もしモデルがデータ中にパターンを見つけられなかった場合、結果は訓練プロット上でもテストプロット後のプロット上でも非常に悪いものとなる。しかし結果が示すように、そこでもそこでも、選択が行われたテストプロットと大きな違いはない。
つまり、NSはもう一方から学んだ のではなく、両方のデータセットに共通するパターンを見つけたのである。
もし結果があまり安定していなかったとしたら、(訓練者の誤差を考慮に入れずに)テストプロット上で選択することで、それにフィッティングすることができたかもしれない。今回の場合はそうならなかったが、他のデータでは(パターンが見つからなければ)そうなる可能性がある。その場合は、Err = (ErrLeran * 0.37 + ErrValid * 0.63)のような誤差のバランスを探した方がいいだろう。

いずれにせよ、訓練プロット上の一般的な規則性は、テストプロット上よりも小さくないはずです。

この記事の著者は、自分は科学者でもプログラマーでもないが、ニューラルネットワークのプログラミング方法を教えることに固執しているとコメントで書いているので、どうやら反論しようとしているようだが。

もちろん、彼はすでに多くのRコードを投稿しているが、十分な結果を見てみたい。そして、最も重要なことは、少なくとも1つの正常なExpert Advisorが現れるまで、彼があと何回記事を書くのかを理解することである。

 
Vladimir Perervenko:

こんにちは。

明確にしましょう。データセットXは、4つのサブセットpreptrain = 4001、train = 1000、test = 500、test1 = 100 barで構成されています。事前学習には、学習セット - preptrain、検証セット - trainを使用します。

微調整のために、pretrainセットをトレーニングセットとして使用し、検証セットはテストセットの最初の250バーを使用する。

したがって、最終的な品質を決定するために、テストセットの最後の250バーをテストセットとして使用します。コード

矛盾は見当たらない。同意しますか?

幸運を祈る

技術的にはすべてよくできている。
250本ではモデルを評価するには不十分だと思う。
確かに、ある特定のケースではうまくいっています(どのサイトでも良い結果が得られています)が、普遍的なものではないと思います。

結局のところ、あまり良くないデータもあり得るのです。例えば、トレーニングプロットでは40%の誤差になるように学習させたモデルが、テストプロットでは純粋に偶然に30%の誤差を示したとします。そして2番目のモデルは、両方のプロットで35%に訓練されたとしよう。明らかに2番目の方が優れている。しかし、テストプロットだけを選択すると、最初のものが選択されます。比較のために、次のモデル評価のオプションがあります:
トレーニングプロットのみでの評価、
またはすべてのプロットの合計での評価、
またはDarchのように、Err = (ErrLeran * 0.37 + ErrValid * 0.63) - これらの係数はデフォルトですが、変更可能です。

最後のバリエーションは最も興味深いもので、両方の誤差を考慮に入れますが、検証セクションの比重が大きくなります。
原則的には、例えばErr = (ErrLeran * 0.25 + ErrValid * 0.35 + ErrTest * 0.4)のように式を拡張することができます。

たとえば、ErrLeranとErrTestが5%以上異なる場合は、そのようなモデルを棄却します。そして残りのモデルから選択する。

私は実験をしてみた。

以下は、30回のトレーニングの結果である:(モデルはオリジナルのものと同じではなく、すべてが完璧である。)

デコーディング: V1 = 1-ErrLearn; V2 = 1-ErrOOC; Value = 1 - (ErrLeran * 0. 37 + ErrOOC * 0.37 + ErrOOC * 0.63); OOSでは、ValidとTestのデータを接着した。

Value V1 V2

0.5712 0.4988 0.6138 - OOSは良いが、Learn = 50%なのでランダム。

0.5002 0.5047 0.4975 - この方が一般的だった。

0.6719 0.6911 0.6606 - このようなことが数回あった。Value = 1 - (ErrLeran * 0.37 + ErrOOC * 0.63)でソートすると、このようなパターンが上向きになる。

 
revers45:
もちろん、彼はすでに多くのRコードを投稿しているが、私は十分な結果を見てみたいし、最も重要なことは、少なくとも1つの正常なEAができるまで、彼があと何回記事を書くのかを理解することだ。

記事の一つにExpert Advisorがあり、私はそれをDarchの新バージョン用に数日で書き直した。Expert Advisorは単純で、OHLCを読み込んでRに放り込み、Rで計算関数を実行する。最後にNSからコマンドを受け取り、取引コマンドをサーバーに送る。それだけだ。
最も難しいのは、まさに記事で説明されている通り、良いデータを見つけて、それを使ってNSを適切に訓練することだ。Vladimirは、モデル、アンサンブル、最適化、予測変数の選択と処理...のあらゆる種類のバリエーションを示している。)

 


n2 > n1である層のニューロン数を持つバリアントは、ハイパーパラメータの列挙から除外すべきでしょうか?

例えば、ネットワーク 10 - 20 - 100 - 2 や 10 - 8 - 100 - 2
のように。

もし n2 > n1 なら、n1 に圧縮され、次に n2 に伸長され、出力層の1ニューロンか2ニューロン に再び圧縮される。もし最後にまだ2つのニューロンがあれば、n1層でデータを圧縮した後、中間で伸長しても過変換は起こらないはずである。しかし、明らかに悪い変種を計算するのに多くの時間を消費します。
以下の方法でフィットネス関数でできると思います:n1はニューロンの数、n2はn1の%で、切り上げと*2で最大になります。

更新:
自分でやってみた。計算パワーがより効率的に使われることを期待する。
 
elibrarius:


n2 > n1である層のニューロン数を持つバリアントは、ハイパーパラメータの列挙から除外すべきでしょうか?

例えば、ネットワーク 10 - 20 - 100 - 2 や 10 - 8 - 100 - 2
のように。

もし n2 > n1 なら、n1 に圧縮され、次に n2 に伸長され、出力層の1ニューロンか2ニューロン に再び圧縮される。もし最後にまだ2つのニューロンがあれば、n1層でデータを圧縮した後、途中で伸長しても過変換は起こらないはずだ。しかし、明らかに悪い変種を計算するために多くの時間を費やすことになります。
以下の方法でフィットネス関数の中で行うことができると思います:n1をニューロンの数として列挙し、n2をn1の%として列挙し、その後丸め、*2をmaxoutとする。

よろしく。

パラメーターを使った長い実験から、いくつかの特異性に気づきました:

- fact = 2でより良い結果が得られることが多い。

- または、両方の隠れ層が同じ活性化関数を持つ場合。

私は隠れ層のニューロンの比率を制限しませんでした。最適でない比率はすぐに検討対象から外れてしまいます。しかし、このアイデアをテストすることはできます。時間を見つけてrgenoudで最適化をチェックするかもしれない。

幸運を祈る。

 
Vladimir Perervenko:

隠れ層のニューロンの比率は制限しなかった。最適でない比率はすぐに検討対象から外れてしまうからだ。しかし、このアイデアをテストすることはできる。時間を見つけてrgenoudで最適化をチェックするかもしれない。

次の層は前の層の%でカウントされるようにした。しかし、特に比較したいわけではない。純粋に理論的には、前の層で圧縮した後、ネットワーク内部で解凍しても新しい情報は得られないというのが正しいことを期待している。

GA:gaで遺伝学を試してみた。計算のためにNSを200-300回走らせた。かなりの回数だ。そして結果に改善は見られなかった。

ベイズ最適化では、もっと多くのパスが必要だと思いますが、20~30回ではなく、100回まででしょう。というのも、最良の結果が10個のランダムな開始バリアントのうちの1つで、次の10~20回の最適化ではそれ以上のものが見つからないということがよくあるからです。100回通せば改善されるかもしれないが......。

ウラジミール・ペレヴェンコ

- ファクト=2で最良の結果が得られることが多い

- あるいは、両方の隠れ層が同じ活性化関数を持つ場合。

これは私にとっては違う。Reluが良いことが多い。

 
elibrarius:

私は次のレイヤーを前のレイヤーに対するパーセンテージでカウントするようにした。しかし、それを比較する気はない。純粋に理論的には、ネットワーク内部での解凍が、前の層での圧縮の後に新しい情報を与えることはないだろう。

GA:gaで遺伝学を試してみた。計算のためにNSを200-300回走らせた。かなりの回数だ。そして結果に改善は見られなかった。

しかし、ベイズ最適化では、20~30回ではなく、100回くらいは必要だと思います。というのも、最良の結果が10個のランダムな開始バリアントのうちの1つで、次の10~20回の最適化ではそれ以上のものが見つからないということがよくあるからです。100回パスすれば改善されるかもしれませんが......。

私にとってはそこが違うところだ。Reluは良いことが多い。

ジェネティクスは私にとってもベストな選択肢を見つけられなかった。

ベイズの場合はパス数だけでなく、ポイント数でも勝負する必要がある。より速いオプションを探さなければならない。これはとても面倒なことだ。

幸運を祈る。

PS.TensorFlowに乗り換えないのですか?レベルが高いだけだ。