量化软件——赫兹MT5神经网络变得简单( 61 )离线强化学习中的乐观情绪问题

最近,离线强化学习方法已广泛普及,其在解决不同复杂度的问题方面具有许多前景。然而,研究人员面临的主要问题之一是当学习时可能浮现的乐观情绪。智能体基于训练集中的数据优化其策略,并获得对其动作的信心。但是训练集往往无法涵盖环境的所有可能状态和转变。在随机环境中,这种信心被揭示是不完全正当的。在这种情况下,智能体的乐观情绪策略可能会导致风险增加,以及不良后果。因子选股  

1. SPLT-转换器方法

解决 2 个主要问题:

模型应有助于在任何情况下为智能体的行为创建各种候选者;
模型应涵盖向新环境状态转变的各种潜在模式的大多数。
为了达成该目标,我们基于扮演者政略和环境模型转换器,训练了 2 个独立的 VAE。方法作者为两个流程生成随机潜在变量,并在覆盖整个规划界限内使用它们。这令我们能够枚举所有可能的候选轨迹,而分支不会呈指数级增加,并在测试期间提供对行为选项的有效搜索。
因子选股  
这一思路是,潜在的政策变量应当对应于不同高度的意图,类似于层次化算法的技能。同时,环境模型的潜在变量应当对应于各种可能的趋势、及其状态下最可能的变化。
因子选股  
政策和环境编码器所用的架构与转换器相同。它们按先前轨迹的形式接收相同的初始数据。但与前面讨论的算法不同,轨迹仅包括一组扮演者状态和动作。在编码器的输出端,我们获得离散的潜在变量,每个维度的值数量有限。
因子选股  
该方法的作者建议使用转换器所有输出元素的平均值,以便将整个轨迹合并为一个向量表示。

接下来,这些输出中的每一个都经由一个小型多层感知器处理,其输出潜在表示的独立分类分布。

政策解码器接收与输入相同的原始轨迹,并辅以相应的潜在表示。政策解码器的目标是估算概率,并预测轨迹中下一个最有可能的动作。该方法的作者提出了一个使用转换器模型的解码器。

如上所述,我们从序列中删除了奖励,但添加了一个潜在表示。不过,潜在表示并不会在每个步骤中取代奖励作为序列元素。该方法的作者推介了一种由单个嵌入向量转换的潜在表示,类似于转换器架构下的其它一些工件中所用的位置编码。

环境模型解码器具有类似于政策解码器的架构。仅在输出端,环境模型解码器具有“三个头”来预测最可能的后续状态及其成本,以及转变奖励。

与 DT 一样,训练模型使用监督学习方法,并依据训练集中的数据。模型经过训练,可以将轨迹与后续动作(扮演者)、转换到新状态及其成本(环境模型)进行比较。
因子选股  
在测试和操作时,基于在给定规划界限上候选预测轨迹的评估来选择最优动作。为了编制一个规划的候选轨迹,生成含有奖励的行动和状态序列要涵盖规划界限运作。然后选择最优轨迹,且其第一个动作开始运作。在转变到环境的新状态后,重复整个算法。

2. 利用 MQL5 实现
在研究 SPLT-转换器方法的理论层面之后,我们转到利用 MQL5 实现所提出的方法。我想立即言明,我们的实现将比以往任何时候都更远离作者的算法。原因是我的主观感知。本系列文章的整个经验演绎了为金融市场创建环境模型的复杂性。我们所有的尝试结果有点惭愧。预测的准确性非常低,只有 1-2 步。随着规划界限的增长,它趋于 0。因此,我决定不构建候选轨迹,而是将自己限制在仅从当前状态生成几个候选动作选项。

但这种方式在动作和估值之间产生了差距。如上面的可视化效果所示,扮演者政策和环境模型接收相同的输入数据。但随后数据以并行流的形式流动。因此,在预测后续状态和预期奖励时,环境模型对智能体将选择的动作一无所知。在此,我们只能基于来自训练样本的先前经验来谈论具有一定概率的某个假设。应该注意的是,训练样本是基于与当前所用扮演者政策不同的一个创建的。
因子选股  
在作者的版本中,通过将智能体的动作和预测状态添加到下一步的轨迹中来取得平衡。然而,在我们的案例中,考虑到对后续环境状态进行低质量规划的经验,我们有可能在轨迹中添加完全不协调的状态和动作。这将导致预测轨迹中下一步的规划品质愈加下降。以我的观点,这种规划和估算这种轨迹的效率是非常值得怀疑的。因此,我们不会将资源浪费在预测候选轨迹上。

同时,我们需要一种能够比较智能体动作和预期奖励的机制。一方面,我们可以使用评论者模型,但这从根本上破坏了算法,并彻底排除了环境模型。当然不能如此,我们把它当作评论者。

不过,我决定尝试的一种不同方式更接近原始算法。我决定开始就对两个流使用一个编码器。由此产生的潜在状态被添加到轨迹中,并馈送到 2 个解码器的输入端。扮演者基于初始数据生成预测动作,环境模型返回未来折扣奖励的数额。
因子选股  
该思路在于,给定相同的输入数据,模型返回一致的结果。为此,我们排除了扮演者和环境模型中的随机性。如此这般,我们在潜在表示中创建了随机性,这令我们能够生成多个候选操作和相关的预测状态估值。根据这些估值,我们将对候选动作进行排位,以便选择最优权重步骤。

为了优化所执行操作的数量,我们应该注意另一点。通过将相同的轨迹馈送到编码器输入,我们将以数学精度重复其所有内层的结果。仅当从给定分布中采样时,才会在变分自动编码器层中形成差异。因此,为了生成候选动作,建议我们将指定的层移动到编码器之外。这将允许我们在每次迭代中只执行一次编码器验算。经过一番思索,我将变分自动编码器层移到了环境模型之中。

我在优化工作流的道路上走得更远了。我们的三个模型都使用与输入数据相同的轨迹。如您所知,轨迹元素并不均匀。在处理之前,它们会经过嵌入层。这给了我一个灵感,即只在一个模型中嵌入数据,然后在剩下的两个模型中使用结果数据。因此,我只将嵌入层留在编码器当中。

还有一件事。环境模型和扮演者均用轨迹和潜在表示的串联向量作为输入。我们已经判定,为了形成随机潜在表示,变分自动编码器层已转移到环境模型之中。在此,我们将运作向量的组合,并将已经获得的结果传递到扮演者的输入端。

现在我们将上述思路转移到代码中。我们创建模型的定义。如常,它是在 CreateDescriptions 方法中形成的。在参数中,该方法接收指向定义模型的三个对象指针。

bool CreateDescriptions(CArrayObj *agent, CArrayObj *latent, CArrayObj *world)
  {
//---
   CLayerDescription *descr;
 架构的定义应当从编码器的模型开始,其输入提供的是未处理的序列数据。

//---
   latent.Clear();
//--- Input layer
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBaseOCL;
   prev_count = descr.count = (BarDescr * NBarInPattern + AccountDescr + TimeDescription + NActions);
   descr.activation = None;
   descr.optimization = ADAM;
   if(!latent.Add(descr))
     {
      delete descr;
      return false;
     }
我们将接收到的数据传递到批量常规化层,从而将其转换为可比较的形式。

//--- layer 1
   if(!(descr = new CLayerDescription()))
      return false;
   descr.type = defNeuronBatchNormOCL;
   descr.count = prev_count;
   descr.batch = 1000;
   descr.activation = None;
   descr.optimization = ADAM;
   if(!latent.Add(descr))
     {
      delete descr;
      return false;
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值