嘿,迪米特里,
我发现了一个新的 NN 序列:请欣赏 <3
![]()
也可以简单地将图片拖入文本,或使用Ctrl+V 粘贴图片
我发现了一个新的 NN 序列:请欣赏 <3
bool CreateDescriptions(CArrayObj*actor, CArrayObj *critic)
{
//---
CLayerDescription *descr;
//---
if(!actor)
{
actor = new CArrayObj();
if(!actor)
返回 false;
}
if(!critic)
{
critic = new CArrayObj();
if(!critic)
返回 false;
}
//--- Actor
actor.Clear();
//--- 输入层
if(!(descr = new CLayerDescription()))
返回 false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = None;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 1 层
if(!(descr = new CLayerDescription())))
返回 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())))
返回 false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = HistoryBars;
descr.step = HistoryBars;
descr.window_out = 8;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 3 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 8;
descr.step = 8;
descr.window_out = 4;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 4 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 5 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
// 软最大层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
// 多层多头注意力层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = LReLU;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 6 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr + 6;
descr.optimise = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 7 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 8 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 第 9 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 6;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
删除 descr;
return false;
}
//--- 评论家
critic.Clear();
//--- 输入层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = None;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
删除 descr;
return false;
}
//--- 第 1 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronConcatenate;
descr.count = 512;
descr.window = prev_count;
descr.step = 6;
descr.optimise = ADAM;
descr.activation = LReLU;
if(!critic.Add(descr))
{
删除 descr;
return false;
}
//--- 第 2 层
if(!(descr = new CLayerDescription())))
返回 false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
删除 descr;
return false;
}
//--- 第 3 层
if(!(descr = new CLayerDescription())))
返回 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 = 1;
descr.optimise = ADAM;
descr.activation = None;
if(!critic.Add(descr))
{
删除 descr;
return false;
}
//---
返回 true;
}
也可以简单地将图片拖入文本,或使用Ctrl+V 粘贴图片
我的交易软件mt4账号连接不上,无法交易下单。什么问题?
新文章 神经网络变得轻松(第四十九部分):软性扮演者-评价者已发布:
我们继续讨论解决连续动作空间问题的强化学习算法。在本文中,我将讲演软性扮演者-评论者(SAC)算法。SAC 的主要优点是拥有查找最佳策略的能力,不仅令预期回报最大化,而且拥有最大化的动作熵(多样性)。
在本文中,我们将把注意力集中在另一种算法上 — 软性扮演者-评论者(SAC)。它首次出现在 2018 年 1 月 发表的文献 “软性扮演者-评论者:随机扮演者异政策最大熵值深度强化学习” 之中。该方法几乎与 TD3 同步提出。它们有一些相似之处,但在算法上也存在差异。SAC 的主要目标是在给定策略的最大熵的情况下最大化预期回报,其能在随机环境中找到各种最优解。
软性扮演者-评价者用到的扮演者具有随机政策。这意味着处于 S 状态的扮演者能够以一定的 Pa' 概率从整个动作空间中选择 A' 动作。换言之,在每个特定状态下,扮演者的政策允许我们不一定选择特定的最优动作,而是任何可能的行动(但具有一定程度的概率)。在训练过程中,扮演者学习获得最大奖励的概率分布。
随机扮演者政策的这一属性令我们能够探索不同的策略,并发现在运用判定性策略时可能隐藏的最优解。此外,随机扮演者政策还考虑到环境中的不确定性。在出现噪声或随机因素的情况下,该种类政策可能更具弹性和适应性,因为它们可以生成各种动作,以便有效地与环境交互。
作者:Dmitriy Gizlyk