記事「ニューラルネットワークが簡単に(第57回):Stochastic Marginal Actor-Critic (SMAC)」についてのディスカッション

 

新しい記事「ニューラルネットワークが簡単に(第57回):Stochastic Marginal Actor-Critic (SMAC)」はパブリッシュされました:

今回は、かなり新しいStochastic Marginal Actor-Critic (SMAC)アルゴリズムを検討します。このアルゴリズムは、エントロピー最大化の枠組みの中で潜在変数方策を構築することができます。

自動売買システムを構築する際には、逐次的な意思決定のためのアルゴリズムを開発します。強化学習法は、まさにそのような問題を解決することを目的としています。強化学習における重要な問題の1つは、エージェントが環境との相互作用を学習する際の探索プロセスです。この文脈では、最大エントロピーの原則がしばしば使用され、エージェントは最大のランダム性の程度で行動をとるように動機付けられます。しかし、実際には、このようなアルゴリズムは、単一行動の周りの局所的な変化のみを学習する単純なエージェントを訓練します。これは、エージェント方策のエントロピーを計算し、訓練目標の一部として使用する必要があるためです。

同時に、Actorの方策の表現力を高める比較的簡単なアプローチは、潜在変数を使用することです。潜在変数は、観測、環境、および未知の報酬における確率的特性をモデル化するための独自の推論手順をエージェントに提供します。

エージェントの方策に潜在変数を導入することで、過去の観測結果と互換性のある、より多様なシナリオをカバーすることができます。ここで注意しなければならないのは、潜在変数を持つ方策は、そのエントロピーを決定する単純な式を許さないということです。素朴なエントロピー推定は、方策の最適化において壊滅的な失敗につながる可能性があります。また、エントロピー最大化のための高分散確率更新では、局所的ランダム効果とマルチモーダル探索を容易に区別できません。

このような潜在変数方策の欠点を解決する選択肢のひとつが「Latent State Marginalization as a Low-cost Approach for Improving Exploration」で提案されています。著者らは、完全に観測可能な環境と部分的に観測可能な環境の両方において、より効率的でロバストな探索をおこなうことができる、シンプルかつ効果的な方策最適化アルゴリズムを提案しています。

作者: Dmitriy Gizlyk

 
編集されていない。
ファイル:
 
私もコンパイルしていない。同じことだ。
 
star-ik #:
コンパイルされていません。

記事中のファイルのアーカイブが更新されました。

 

ドミトリー、ご苦労様。すべてうまくいっています。

Expert Advisor Researchで 例を 100パス 収集し、Expert Advisor Studyでモデルを訓練し、Testでテストします。そしてまた50パス収集し、10,000反復訓練し、またテストする。

そしてモデルが学習するまで繰り返す。ただし、これまでのところ、テストはサイクル終了後に常に異なる結果を出しており、必ずしもポジティブな結果ばかりではありません。私は1サイクル、2-3回のテストを実行しましたが、結果は異なっていました。

どのサイクルで結果が安定するのでしょうか?それとも、それは終わりのない作業で、結果は常に異なるのでしょうか?

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

 
Nikolai Fedotov Expert Advisor Researchで 例を 100パス 収集し、Expert Advisor Studyでモデルを訓練し、Testでテストします。その後、再度50パス収集し、10,000反復のトレーニングを行い、再度テストします。

そしてモデルが学習するまで繰り返す。ただし、これまでのところ、テストはサイクル終了後に常に異なる結果を出し、必ずしもポジティブな結果を出すとは限らない。つまり、あるサイクルを実行し、2-3回テストすると、結果が異なるのだ。

どのサイクルで結果が安定するのでしょうか?それとも終わりのない作業で、結果は常に異なるのでしょうか?

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

Expert Advisorは確率的な方針でモデルを訓練します。つまり、モデルはシステムの特定の状態において、特定の行動を取ることで報酬が最大になる確率を学習します。環境と相互作用しながら、学習した確率でアクションがサンプリングされます。初期段階では、すべての行動の確率は同じであり、モデルはランダムに行動を選択する。学習過程では、確率が変化し、より意識的に行動を選択するようになる。

 

ドミトリー、こんにちは。 安定したプラスの結果を得るために、上記のニコライのように何サイクルかかりましたか?

また、もう一つ興味深いのは、Expert Advisorが現在の期間で学習し、例えば1ヶ月後に新しいデータを考慮して再学習する必要がある場合、完全に再学習するのでしょうか、それとも学習する前に再学習するのでしょうか?学習プロセスは最初のものと同等になるのでしょうか、それとももっと短く速くなるのでしょうか。また、EURUSDで学習したモデルをGBPUSDで使用する場合、最初の学習と同じように再学習されるのでしょうか、それとも学習前の方が速いのでしょうか。この質問は、この特定の記事についてではなく、強化学習の 原理で動作するすべてのExpert Advisorについてです。

 

こんにちは。

ディミトリ、お疲れ様。

私は皆のために明らかにしたい...

ディミトリが投稿しているのは「聖杯」ではない。

それは学術的な問題の典型的な例あり、 理論的、方法論的な性質の科学的研究 活動の準備を 意味する

そして、誰もが今ここで、自分のアカウントで肯定的な結果を見たいと思っている......。

ドミトリーは、ドミトリーが提示するすべての方法によって(私たちの/私の/あなたの/彼らの)問題を解決する方法を教えてくれる。

人気のAI(GPT)は7億以上のパラメーターを持っています!!!!このAIは一体どれほどのものなのでしょうか?

良い結果を得たいなら、アイデアを交換したり(パラメータを追加したり)、テスト結果を 出したりしてください。

別のチャットルームを作って、そこで結果を「ゲット」してください。ここで自慢して、ドミトリーの仕事の有効性を示してください。

 
Oleg_Filatov テスト結果を 出したりしてください。

別のチャットルームを作って、そこで結果を「ゲット」してください。ここで自慢して、ドミトリーの仕事の有効性をアピールしてください。

誰もここで聖杯を待っているわけではありません!私はただ、ドミトリーが出したものが実際に機能することを確かめたいだけなのだ。記事の中のドミトリーの言葉からではなく(彼の記事はすべてほぼ肯定的な結果を出している)、私のコンピュータでだ。この記事から彼のExpert Advisorをダウンロードし、すでに63サイクルのトレーニング(データ収集→トレーニング)を行いました。そしてまだ損をしている。63サイクル中、データ収集は2、3回だけで、50の新しい例のうち5、6がプラスでした。どうすれば本当にうまくいくのか?

上の投稿でドミトリーに尋ねたが、彼は何も答えなかった。いくらトレーニングしても結果が出ない......。

友人よ、もし安定した結果が出たのなら、安定した結果が出るまでに何サイクルやったか、例えばこの記事に書いてくれないか?もし変更するのであれば、何を変更すれば、テスターだけでなく、自分のコンピューターで結果を見ることができるのか?聖杯ではないが、少なくとも、それが機能することを確認するために...?

 
Oleg_Filatov テスト結果を 出したりしてください。

別のCHATを作成し、そこで結果を「得る」。ここで自慢して、ドミトリーの仕事の有効性を示してください。

お楽しみください <3

パラメータは以下の通りです:(ドミトリーといくつかの調査に基づいています。)
// RSIの入力パラメータ
入力グループ "---- RSI ----"
input int RSIPeriod = 14; // 期間
input ENUM_APPLIED_PRICE RSIPrice = PRICE_CLOSE; // 適用価格

// CCIの入力パラメータ
入力グループ "---- CCI ----"
入力 int CCIPeriod = 14; // 周期
input ENUM_APPLIED_PRICE CCIPrice = PRICE_TYPICAL; // 適用価格

// ATRの入力パラメータ
入力グループ "---- ATR ----"
入力 int ATRPeriod = 14; // 期間

// MACDの入力パラメータ
入力グループ "---- MACD ----"
入力 int FastPeriod = 12; // 高速
input int SlowPeriod = 26; // 遅い
入力 int SignalPeriod = 9; // 信号
input ENUM_APPLIED_PRICE MACDPrice = PRICE_CLOSE; // 適用価格

// モメンタムの入力パラメータ
入力グループ "---- モメンタム ----"
input int MomentumPeriod = 14; // モメンタムの周期
input ENUM_APPLIED_PRICE AppliedPrice = PRICE_CLOSE; // モメンタムの適用価格

// SARの入力パラメータ
入力グループ "---- SAR ----"
input float SARStep = 0.02f; // SARステップ
input float SARMaximum = 0.2f; // SARの最大値

// バンドの入力パラメータ
入力グループ "---- バンド ----"
input int BandsPeriod = 20; // バンドの周期
input int BandsDeviation = 2.0; // バンド偏差
input int BandsShift = 0; // バンドシフト

#include "FQF.mqh"
//---
#define HistoryBars 72 //ヒストリーの深さ
#define BarDescr 14 //1バーの説明のための要素
#define AccountDescr 12 //口座の説明
#define NActions 6 //可能なアクションの数
#define NRewards 5 //報酬の数
#define 埋め込みサイズ 64
#define バッファサイズ 6500
#定義 DiscFactor 0.99f
#define FileName "zJimReaper_NNM_Neural_Network_"
#定義LatentLayer 11
#define LatentCount 2048
#define SamplLatentStates 32
#define MaxSL 1000
#define MaxTP 1000
#define MaxReplayBuffer 500
#define StartTargetIteration 50000
#define fCAGrad_C 0.5f
#define iCAGrad_Iters 15
#define KNN 32
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CreateDescriptions(CArrayObj *actor, CArrayObj *critic, CArrayObj *convolution)
{
//---
CLayerDescription *descr;
//---
if(!actor)
{
actor = new CArrayObj();
if(!actor)
return false;
}
if(!critic)
{
critic = new CArrayObj();
if(!critic)
return false;
}
if(!convolution)
{
convolution = new CArrayObj();
if(!convolution)
return false;
}
//--- アクタ
アクター.Clear();
//--- 入力レイヤ
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.activation = None;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー1
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;
}
//--- レイヤー2
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = HistoryBars;
descr.step = HistoryBars;
int prev_wout = descr.window_out = HistoryBars / 2;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 3
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 7;
descr.step = 3;
descr.window_out = 32;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 4
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 5;
descr.step = 2;
descr.window_out = 16;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;


}メッセージの長さは 64000 文字を超えてはいけません

 


//--- レイヤー5
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 3;
descr.step = 1;
descr.window_out = 8;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 6
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = HistoryBars;
descr.step = HistoryBars;
prev_wout = descr.window_out = HistoryBars / 2;
descr.activation=LReLU;
descr.optimisation=ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 7
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = prev_wout;
descr.step = prev_wout;
descr.window_out = 32;
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 = 2 * LatentCount;
descr.optimisation = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 9
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 10
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConcatenate;
descr.count = 4 * LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 11
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronVAEOCL;
descr.count = 2 * LatentCount;
descr.optimise = ADAM;
if(!actor.Add(descr))
{
descrを削除する;
return false;
}
//--- レイヤー 12
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = 2 * LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 13
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 14
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー 15
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = 2 * NActions;
descr.activation = SIGMOID;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
descrを削除します;
return false;
}
//--- レイヤー16
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronVAEOCL;
descr.count = NActions;
descr.optimise = ADAM;
if(!actor.Add(descr))
{
descr.を削除します;
return false;
}
//--- 批評家
critic.Clear();
//--- 入力レイヤー
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 2 * LatentCount;
descr.activation = None;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
descrを削除;
return false;
}
//--- レイヤー1
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConcatenate;
descr.count = 2 * LatentCount;
descr.window = prev_count;
descr.step = NActions;
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 = 2 * LatentCount;
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 = LatentCount;
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 = LatentCount;
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 = NRewards;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic.Add(descr))
{
descrを削除する;
return false;
}
//--- 畳み込み
// 共通パラメータの定義
int input_size = (HistoryBars * BarDescr) + AccountDescr;
int num_actions = NActions;
int embedding_size = EmbeddingSize;
// ニューラルネットワークを作成する
convolution.Clear();
// 入力レイヤー0
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = 4 * input_size;
descr.activation = None;
descr.optimisation = ADAM;
if (!convolution.Add(descr))
{
descrを削除;
return false;
}
// レイヤー1
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = 2 * LatentCount;
descr.window = 2 * input_size;
descr.step = 2 * num_actions;
descr.activation = SIGMOID;
descr.optimisation = ADAM;
if (!convolution.Add(descr))
{
descrを削除;
return false;
}
// レイヤー2
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.window = input_size;
descr.step = num_actions;
descr.activation = SIGMOID;
descr.optimisation=ADAM;
if (!convolution.Add(descr))
{
descrを削除;
return false;
}
// 畳み込み層
for (int i = 0; i < 6; i++)
{
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronConvOCL;
descr.count = 2 * LatentCount / (1 << i); // レイヤーごとにカウントを半分にする。
descr.window = 64;
descr.step = 64;
descr.window_out = 32 / (1 << i); // window_outを半分にする
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!convolution.Add(descr))
{
descrを削除する;
return false;
}
}
// 出力レイヤー
if (!(descr = new CLayerDescription()))return false;
descr.type = defNeuronBaseOCL;
descr.count = embedding_size;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!convolution.Add(descr))
{
descrを削除;
return false;
}
// ネットワークの作成に成功
trueを返します;
}
#ifndef Study
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool IsNewBar(void)
{
===コメントが 64000文字に制限されているため、最後の部分をカットしました。=)
メッセージの長さは64000文字を超えてはならない

-----------------------------------------------------+