記事「ニューラルネットワークが簡単に(第50回):Soft Actor-Critic(モデルの最適化)」についてのディスカッション

 

新しい記事「ニューラルネットワークが簡単に(第50回):Soft Actor-Critic(モデルの最適化)」はパブリッシュされました:

前回の記事では、Soft Actor-Criticアルゴリズムを実装しましたが、有益なモデルを訓練することはできませんでした。今回は、先に作成したモデルを最適化し、望ましい結果を得ます。

Soft Actor-Criticアルゴリズムの研究を続けます。前回の記事では、アルゴリズムを実装しましたが、収益性の高いモデルを訓練することができませんでした。今日は可能な解決策を考えてみましょう。同じような疑問は、「先延ばしのモデル、理由と解決策」稿でもすでに提起されています。この分野の知識を広げ、私たちのSoft Actor-Criticモデルを例として新しいアプローチを検討することを提案します。

構築したモデルの最適化に直接移る前に、Soft Actor-Criticが連続行動空間における確率モデルの強化学習アルゴリズムであることを思い出してください。この方法の主な特徴は、報酬関数にエントロピー成分を導入したことです。

確率的Actor方策を使用することで、モデルはより柔軟になり、いくつかの行動が不確実であったり、明確なルールを定義できないような複雑な環境における問題を解決することができます。この方策は、確率的な要素を考慮し、明確なルールに縛られないため、多くのノイズを含むデータを扱う場合、よりロバストであることが多くなります。

作者: Dmitriy Gizlyk

 
//--- アクター
アクター.Clear();
//--- 入力レイヤ
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = なし;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
// レイヤー1|マルチレイヤー・マルチヘッド・アテンション・レイヤー - 1
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 1: Multilayer Multi-Head Attention Layer - 1: Data successfully passed. \n");
//--- レイヤ2|バッチ正規化レイヤ
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1000;
descr.activation = None;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 2: Batch Normalisation Layer: Data successfully passed. \n");
// レイヤ 3|多層マルチヘッドアテンションレイヤ - 2
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 3: Multilayer Multi-Head Attention Layer - 2: Data successfully passed. \n");
//--- レイヤー2
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 2;
descr.step = 1;
descr.window_out = 8;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー3
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConvOCL;
descr.count = prev_count;
descr.window = 8;
descr.step = 8;
descr.window_out = 8;
descr.activation=LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 7|畳み込みレイヤー - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 8;
descr.step = 1;
descr.window_out = 9;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 7: Convolutional Layer - 4: Data successfully passed.♪");
//--- レイヤ 8|畳み込みレイヤ 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 9;
descr.step = 1;
descr.window_out = 7;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 8: Convolutional Layer - 5: Data successfully passed.♪");
//--- レイヤ9|畳み込みレイヤ6
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 7;
descr.step = 1;
descr.window_out = 5;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 9: Convolutional Layer - 6: Data successfully passed.♪");
//--- レイヤ 10|畳み込みレイヤ 7
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 5;
descr.step = 1;
descr.window_out = 4;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 10: Convolutional Layer - 7: Data successfully passed.♪");
// レイヤ 11|多層マルチヘッド注意レイヤ - 3
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[アクター] レイヤ 11: 多層多頭注意レイヤ - 3: データは正常に渡されました;)
// レイヤ 12|多層多頭注意レイヤ 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[アクター] 層 12: 多層多頭注意層 - 4: データは正常に渡されました;)
// レイヤ 13|多層マルチヘッド注意レイヤ 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[アクター] レイヤー 13: マルチレイヤー・マルチヘッド・アテンション・レイヤー - 5: データの受け渡しに成功しました;)
//--- レイヤ4
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.optimisation = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 5
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
// レイヤー13|マルチレイヤー・マルチヘッド・アテンション・レイヤー - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[アクター] レイヤー 13: マルチレイヤー・マルチヘッド・アテンション・レイヤー - 5: データの受け渡しに成功しました;)
//--- レイヤー6
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー16|ソフトマックスレイヤー
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Softmax Layer: Data successfully passed. \n");
//--- レイヤー 7
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 8
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 8
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 9
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftActorCritic;
descr.count = NActions;
descr.window_out = 32;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- 批評家
critic.Clear();
//--- 入力レイヤー
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = なし;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
//--- レイヤー1
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConcatenate;
descr.count = 1024;
descr.window = prev_count;
descr.step = 6;
descr.optimisation = ADAM;
descr.activation = LReLU;
if(!critic.Add(descr))
{
descrを削除;
return false;
}
//--- レイヤー2
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー3
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
--- レイヤー4
if(!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic.Add(descr))
{
descr.を削除する;
return false;
}
//---
trueを返す;
}
 
//--- アクター
アクター.Clear();
//--- 入力レイヤ
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = なし;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
// レイヤー1|マルチレイヤー・マルチヘッド・アテンション・レイヤー - 1
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 1: Multilayer Multi-Head Attention Layer - 1: Data successfully passed. \n");
//--- レイヤ2|バッチ正規化レイヤ
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1024;
descr.activation = None;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 2: Batch Normalisation Layer: Data successfully passed.♪");
// レイヤ 3|多層マルチヘッドアテンションレイヤ - 2
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 3: Multilayer Multi-Head Attention Layer - 2: Data successfully passed. \n");
//--- レイヤ4
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 2;
descr.step = 1;
descr.window_out = 8;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 5
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 8;
descr.step = 8;
descr.window_out = 8;
descr.activation=LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー6|畳み込みレイヤー - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 8;
descr.step = 1;
descr.window_out = 9;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 7: Convolutional Layer - 4: Data successfully passed.♪");
//--- レイヤ 7 | 畳み込みレイヤ - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 9;
descr.step = 1;
descr.window_out = 7;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 8: Convolutional Layer - 5: Data successfully passed.♪");
//--- レイヤー8|畳み込みレイヤー6
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 7;
descr.step = 1;
descr.window_out = 5;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 9: Convolutional Layer - 6: Data successfully passed.♪");
//--- レイヤ9|畳み込みレイヤ7
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 5;
descr.step = 1;
descr.window_out = 4;
descr.activation=LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 10: Convolutional Layer - 7: Data successfully passed.♪");
// レイヤ 10|多層マルチヘッド注意レイヤ - 3
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[アクター] レイヤ 11: 多層多頭注意レイヤ - 3: データは正常に渡されました;)
// レイヤ 11|多層多頭注意レイヤ 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Layer 12: Multilayer Multi-Head Attention Layer - 4: Data successfully passed. \n");
//--- レイヤー12
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronLSTMOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 13
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
// レイヤー14|マルチレイヤー・マルチヘッド・アテンション・レイヤー - 5
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[アクター] レイヤー 13: マルチレイヤー・マルチヘッド・アテンション・レイヤー - 5: データは正常に受け渡されました;)
//--- レイヤ15
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー16|ソフトマックスレイヤー
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if (!actor.Add(descr))
{
descrを削除します;
return false;
}
PrintFormat("[Actor] Softmax Layer: Data successfully passed. \n");
//--- レイヤー 17
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 18
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 19
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 20
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 21
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftActorCritic;
descr.count = NActions;
descr.window_out = 32;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- 批評家
critic.Clear();
//--- 入力レイヤー
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = なし;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
// レイヤー1|マルチレイヤー・マルチヘッド・アテンション・レイヤー - 4
if (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!critic.Add(descr))
{
descrを削除する;
return false;
}
PrintFormat("[Actor] Layer 12: Multilayer Multi-Head Attention Layer - 4: Data successfully passed. \n");
//--- レイヤ2
if(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = 512;
descr.window = prev_count;
descr.step = 6;
descr.optimisation = ADAM;
descr.activation = LReLU;
if(!critic.Add(descr))
{
descrを削除;
return false;
}
//--- レイヤー3
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
//--- レイヤー4
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
//--- レイヤー5
if(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
--- レイヤー6
if(!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic.Add(descr))
{
descr.を削除する;
return false;
}
//---
はtrueを返す;


画像をテキストにドラッグしたり、Ctrl+Vで 貼り付けることもできます。
 
調査が正取引を達成できない。データディレクトリにファイルがない。 共有データフォルダのSoftAC.bdファイルが空(12バイト)のようだ。スタディがチャートに張り付きません。どうすればよいでしょうか?
 
star-ik #:
調査が正取引を達成できない。データディレクトリにファイルがない。 共有データフォルダのSoftAC.bdファイルが空(12バイト)のようだ。スタディがチャートに張り付きません。どうしたらよいでしょうか?

1.Researchの最初のパスでプラスの取引が異なるのは、まったくランダムなネットワークが使用されているため、ごく自然なことです。また、取引も同様にランダムになります。Expert Advisorを起動する際、MinProfitをできるだけマイナスに設定します。そうすると、SoftAC.bd ファイルはモデルの初期トレーニングのための例で満たされます。

2.Studyファイルにはチェックがあります。SoftAC.bdに 例がない場合、これは機能しません。モデルトレーニング用のデータがない。

 
ありがとう。緑の点が表示されるようになりました。MinProfitがマイナスの範囲に設定できるとは知りませんでした。しかし、もう一つ質問があります。最初のデータベースは手動で削除しなければならないのでしょうか?どのファイルを?
 
star-ik #:
ありがとう。緑の点が表示されるようになりました。MinProfitがマイナスの範囲に設定できるとは知りませんでした。しかし、もう一つ質問があります。最初のデータベースは手動で削除する必要があるのでしょうか?また、どのファイルを削除するのでしょうか?

例のデータベース全体はSoftAC.bdにあります。最初のものは手動で削除しました。しかし、Expert AdvisorにはMaxReplayBuffer 500という定数があり、例データベースのサイズを500トラジェクトリーに制限しています。必要であれば、ファイルを変更して再コンパイルすることができます。これにより、最後の 500 個の軌跡だけをサンプルデータベースに残すことができます。

 
Dmitriy Gizlyk #:

サンプルのデータベース全体はSoftAC.bd.最初のものは手動で削除した。しかし、Expert AdvisorにはMaxReplayBuffer 500という定数があり、例題データベースのサイズを500軌跡に制限しています。必要であれば、ファイルを変更して再コンパイルすることができる。これにより、最後の500の軌跡だけをサンプル・データベースに残すことができます。

ありがとうございました。

 

ドミトリー,例題データベースを埋めて新しい例題を追加するとき,古い例題は削除されるのですか,それとも誤って削除されるのですか?それとも、トレーニングで追加されたものを考慮に入れて、トレードの全数、1000の軌跡のデータベースの例を持つ必要がありますか?

私の理解が正しければ、Test.mqh Expert Advisor(トレーニングの500 000反復後)でテストを10回行ったと書かれています。そして、収集-トレーニング-テストをさらに15回(サイクル)行ったと書かれています。そして、あなたは実用的なモデルを得ました。つまり、サイクルの各段階でTest.mqh Expert Advisorを10回実行したのかどうか、理解できません。私が抱えている問題は、そうするとベースにマイナスの例が多くなり、Expert Advisorが最終的にマイナスで取引し始めることです。

例えば、200の軌跡を収集したとします。それを100,000回反復学習させた。そして、テストから10パスを追加し、Research.mqhは10-15個の新しい例をデータベースに追加した。MinProfitの 境界を例えば-3000に設定した

次のトレーニング(100 000反復)を行います。再度、10個のテストパスと10-15個のResearch.mqhからの パスを追加 します

再びトレーニングを行う(100 000反復)。再び10回のテストとResearch.mqhから 10-15個の例を追加します。

といった具合です。理解できましたか?私を混乱させるのは、テストがしばしば-7000や-9000の非常に大きな負のパスを与えることです。そして、ベースにはそれがたくさんあります。ネットワークは意図的にマイナスの取引をするように訓練されているのではないですか?

また、テストパスが前回よりも悪い結果を出した場合はどうすればいいのでしょうか?MinProfitをマイナス側に 変更すべきでしょうか?また、Research.mqhが、指定されたリミット(例えば、MinProfit=-500)で100回のパスを検索し、データベースに追加することができない 場合、どうすればよいでしょうか?

 
Viktor Kudriavtsev 全案件数の 例データベースを持つ必要があるのでしょうか?

古いものは削除されます。先入れ先出しの原則に従って整理されます。

 
Viktor Kudriavtsev #:

そしてここには、Test.mqh Expert Advisor(トレーニングの500,000回の繰り返しの後)でテストを10回行ったと書かれています。そして、収集-トレーニング-テストをさらに15回(サイクル)行ったと書かれています。そして、あなたは実用的なモデルを得ました。つまり、サイクルの各段階でTest.mqh Expert Advisorを10回実行したのか、しなかったのかがわかりません。私が抱えている問題は、そうすると、ベースにマイナスの例が多くなり、Expert Advisorが最終的にマイナスで取引し始めることです。

モデル結果の散らばりの限界を推定するために、ストラテジーテスターで条件付きで10回の単回実行を行っています。そして、その後の最適化モードでのトラジェクトリーの収集の際に、最適なトラジェクトリーを選択するために上限分位点を選択します。