文章 "神经网络变得轻松(第五十一部分):行为-指引的扮演者-评论者(BAC)"

 

新文章 神经网络变得轻松(第五十一部分):行为-指引的扮演者-评论者(BAC)已发布:

最后两篇文章研究了软性扮演者-评论者算法,该算法将熵正则化整合到奖励函数当中。这种方式在环境探索和模型开发之间取得平衡,但它仅适用于随机模型。本文提出了一种替代方式,能适用于随机模型和确定性模型两者。

首先,我们谈谈研究环境的必要性。我想每个人都同意这个过程是必要的。但究竟是为了什么,在什么阶段?

我们从一个简单的例子开始。假设我们发现自己身处一间有三扇相同房门的屋内,我们需要走到街上。我们该怎么办?我们逐扇打开房门,直至找到我们需要的那扇。当我们再次进入同一间屋时,我们外出就不再需要打开所有房门,取而代之的是立即前往已知的出口。如果我们有不同的任务,那么可能有一些选项。我们可以再次打开除已知出口外的所有门,并寻找合适的。或者我们可以先记住早前我们在寻找出路时打开了哪些门,以及我们需要的那扇门是否在其中。如果我们记得正确的门,我们就会走向它。否则,我们会检查以前没有尝试过的门。

结论:我们需要在不熟悉的情况下研究环境,据此选择正确的动作。找到所需的路线后,对环境的额外探索只会成为阻碍。


不过,当任务在已知状态下发生变化时,我们也许需要额外研究环境。这可能包括寻找更优化的路线。在上面的例子中,如果我们需要穿过更多的房间,或者我们发现自己在建筑物的错误一侧,也许就会发生这种情况。

因此,我们需要一种算法,允许我们能够在未探索的状态下强化环境探索,并在先前探索的状态中将其最小化。

作者:Dmitriy Gizlyk

 
#Enjoy!<3

Thanks Sir @Dmitriy

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CreateDescriptions(CArrayObj*actor, CArrayObj *critic, CArrayObj *autoencoder)
{
--- 用于调试的智能打印语句
Print("Creating layer descriptions...");
CLayerDescription *descr;
int layerNumber = 0; 追踪层数
--- 如果输入数组为空,检查并初始化输入数组
if (!actor)
{
actor = new CArrayObj();
if (!actor)
返回 false;
}
if (!critic)
{
critic = new CArrayObj();
if (!critic)
return false;
}
如果 (!autoencoder)
{
autoencoder = new CArrayObj();
如果 (!autoencoder)
返回 false;
}
--- 演员
演员Clear();
--- 第 1 层:输入层
layerNumber++;
Print("Creating actor - Input Layer ", layerNumber, ": Input layer");
if (!( descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.activation = None;
descr.optimisation = ADAM;
如果 (!actor.Add(descr))Add(descr))
{
删除 descr;
return false;
}
--- 第 2 层
layerNumber++;
Print("Creating actor - Batch Normalisation Layer ", layerNumber);
if (!( descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1000;
descr.activation = None;
descr.optimisation = ADAM;
如果 (!actor.Add(descr))Add(descr))
{
删除 descr;
return false;
}
--- 第 3 层
layerNumber++;
Print("Creating actor - Convolutional Layer ", layerNumber);
if (!( descr = new CLayerDescription())))
返回 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;
如果 (!actor.Add(descr))Add(descr))
{
删除 descr;
return false;
}
--- 第 4 层
layerNumber++;
Print("Creating actor - Convolutional Layer ", layerNumber);
if (!( descr = new CLayerDescription())))
返回 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;
如果 (!actor.Add(descr))Add(descr))
{
删除 descr;
return false;
}
--- 第 5 层
layerNumber++;
Print("Creating actor - Dense/Base Layer ", layerNumber);
if (!( descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.optimisation = ADAM;
descr.activation = LReLU;
如果 (!actor.Add(descr))Add(descr))
{
删除 descr;
return false;
}
--- 第 6 层
layerNumber++;
Print("Creating actor - Dense/Base Layer ", layerNumber);
if (!( descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
如果 (!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 7 层
layerNumber++;
Print("Creating actor - SoftMax Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronSoftMaxOCL;
prev_count = descr.count = prev_count / 16;
descr.step = 16;
descr.optimisation = ADAM;
descr.activation = None;
if(!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 8 层多头关注层
layerNumber++;
Print("Creating actor - Multilayer Multi-Head Attention Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = prev_count;
descr.window = 16;
descr.window_out = 8;
descr.step = 4;
descr.layers = 3;
descr.optimisation = ADAM;
descr.activation = None;
if(!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 9 层
layerNumber++;
Print("Creating actor - Concatenate Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
如果 (!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 10 层
layerNumber++;
Print("Creating actor - SoftMax Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronSoftMaxOCL;
prev_count = descr.count = prev_count / 16;
descr.step = 16;
descr.optimisation = ADAM;
descr.activation = None;
if(!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 11 层多头关注层
layerNumber++;
Print("Creating actor - Multilayer Multi-Head Attention Layer ", layerNumber);
if(!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = prev_count;
descr.window = 16;
descr.window_out = 8;
descr.step = 4;
descr.layers = 3;
descr.optimisation = ADAM;
descr.activation = None;
if(!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 12 层
layerNumber++;
Print("Creating actor - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 13 层
layerNumber++;
Print("Creating actor - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
if (!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 14 层
layerNumber++;
Print("Creating actor - Dense/Base Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 2 * NActions;
descr.activation = LReLU;
descr.optimisation = ADAM;
如果 (!actor.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 15 层
layerNumber++;
Print("Creating actor - VAE Output Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronVAEOCL;
descr.count = NActions;
descr.optimise = ADAM;
if (!actor.Add(descr))
{
删除 descr;
返回 false;
}
//---批评者
critic.Clear();
//--- 第 1 层:输入层
layerNumber++;
Print("Creating critic - Input Layer ", layerNumber, ": Input layer");
if (!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.activation = None;
descr.optimisation = ADAM;
如果 (!critic.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 2 层
layerNumber++;
Print("Creating critic - Concatenate Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = NActions;
descr.optimisation = ADAM;
descr.activation = LReLU;
如果 (!critic.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 3 层
layerNumber++;
Print("Creating critic - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
如果 (!critic.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 4 层
layerNumber++;
Print("Creating critic - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
如果 (!critic.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 5 层
layerNumber++;
Print("Creating critic - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if (!critic.Add(descr))
{
删除 descr;
返回 false;
}
//--- 自动编码器
autoencoder.Clear();
//--- 第 1 层:输入层
layerNumber++;
Print("Creating autoencoder - Dense/Base Layer ", layerNumber, ": Input layer");
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.activation = None;
descr.optimisation = ADAM.优化
如果 (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 2 层
layerNumber++;
Print("Creating autoencoder - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = prev_count / 2;
descr.optimisation = ADAM;
descr.activation = LReLU;
如果 (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 3 层
layerNumber++;
Print("Creating autoencoder - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = prev_count / 2;
descr.activation = LReLU;
descr.optimisation = ADAM;
如果 (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 4 层
layerNumber++;
Print("Creating autoencoder - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 20;
descr.count = LatentCount;
descr.activation = LReLU;
descr.optimisation = ADAM;
如果 (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 5 层
layerNumber++;
Print("Creating autoencoder - Dense/Base Layer ", layerNumber);
如果 (!(descr = new CLayerDescription())
返回 false;
如果 (!(descr.Copy(autoencoder.At(2))))
{
删除 descr;
return false;
}
if (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 6 层
layerNumber++;
Print("Creating autoencoder - Output Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
返回 false;
如果 (!(descr.Copy(autoencoder.At(1))))
{
删除 descr;
return false;
}
if (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 第 7 层
layerNumber++;
Print("Creating autoencoder - Output Layer ", layerNumber);
if (!(descr = new CLayerDescription()))
返回 false;
如果(!(descr.Copy(autoencoder.At(0))))
{
删除 descr;
return false;
}
if (!autoencoder.Add(descr))
{
删除 descr;
返回 false;
}
//--- 用于调试的智能打印语句
Print("Layer descriptions created successfully!");
返回 true;
}

 
你好,研究报告 再次未能进入绿色区域。负的 MinProfit 也无济于事。我已将该值调至 -10000。总的来说,这很奇怪。如果参数的初始值是随机选择的,那么至少其中一些参数应该会带来正收益。但这一点甚至都没有被观察到。
 

大家好。我的这个版本在经过大约 3-4 个周期(数据库收集--培训--测试)后,开始在测试中只给出一条直线。交易打不开。所有的训练时间都是 500 000 次迭代。另一个有趣的现象是,在某一时刻,其中一个批判者的误差开始变得非常大,然后两个批判者的误差都逐渐减小到 0。Research.mqh通项有负利润和成交的通项。还有一些通证没有成交,结果为零。在其中一个循环中,只有 5 次出现正结果。

总的来说,这很奇怪。我一直严格按照德米特里在所有文章中的指示进行训练,但却无法从任何文章中获得结果。我不知道我做错了什么....。

 

我下载了压缩包,但里面还有很多其他文件夹。

如果可能的话,我希望你能解释一下如何部署和培训。

祝贺你完成了一项伟大的工作!

非常感谢