期货量化交易软件:神经网络变得轻松(第四十六部分):条件导向目标强化学习(GCRL)

文章探讨了条件导向目标强化学习(GCRL)在强化学习中的应用,特别是在金融交易中如何通过子任务分解和技能训练来优化代理者的决策。作者介绍了GCRL的原理,包括子任务描述向量的形成,以及如何结合MQL5实现实现。
摘要由CSDN通过智能技术生成

概述

“条件导向目标强化学习” 听起来有点不同寻常,甚至很奇怪。 毕竟,强化学习的基本原则旨在令代理者与环境交互期间的总奖励最大化。 但按上下文,赫兹量化正在观察在特定阶段或特定场景内达成特定目标。

赫兹量化曾讨论过将总体目标分解为子任务的益处,并探索了向代理者传授有助于达成整体结果的不同技能的方法。 在本文中,我提议从不同的角度来看待这个问题。 意即,我们应当训练一位代理者来独立选择策略,以及达成特定的子任务的技能。

1. GCRL 特征

条件导向目标强化学习(GCRL)是一组复杂的强化学习问题。 我们训练代理者在某些场景下达成不同的目标。 以前,我们训练代理者根据环境的当前状态来选择一个或另一个动作。 在 GCRL 的情况下,我们希望以这样一种方式训练代理者,即其动作不仅由当前状态判定,而且还涉及此阶段的特定子任务。 换言之,除了描述当前状态的向量之外,我们还应该以某种方式向代理者指明在每个特定时刻要达成的子任务。 这与训练技能的任务非常相似,即我们在每个时刻向代理者指示一项技能之时。 毕竟,指示使用“开仓技能”或“开仓任务”似乎是在玩文字游戏。 但这些话的背后是代理者训练方法的差异。

在强化学习中,瓶颈始终是奖励函数。 就像在传统的强化训练中一样,在技能训练任务中使用单一目标奖励函数。 指示所用技能应能补足环境状态,并有助于代理者导航环境。

在使用 GCRL 方式时,我们会引入特定的子任务。 它们的成就应该反映在代理者收到的奖励当中。 它类似于判别器的内部奖励,但基于旨在达成特定目标(解决子任务)的明确可衡量指标。

为了理解其中分寸,我们来看一个按两种方式开仓的示例。 在训练技能时,我们将环境的当前状态,和缺少持仓的账户状态向量传递给调度程序。 调度程序判定所要传递给代理者进行决策的技能描述向量。 如您所忆,我们采用账户余额变化作为奖励。 值得注意的是,我们在整个代理者训练过程中都应用相同的奖励。 更在于,开仓不会立即影响余额变化。 例外则是开仓可能占用的佣金。 但通常是,我们得到延迟开仓的奖励。

对于 GCRL,不光含有全局目标的奖励,我们还引入了针对达成特定子任务的额外奖励。 例如,我们可以针对开仓引入一些奖励,或者与其对比,在代理者开仓之前处以罚款。 在此,我们需要采取一种平衡的方式来形成这种奖励。 它不应超过交易操作本身可能产生的盈利和亏损。 否则,代理者只是简单地开仓并“获得点数”,而账户余额将趋于 0。

此外,奖励应取决于手头的任务。 只有在设置“开仓”任务时,我们才会对开仓进行奖励,并惩罚此类操作的缺失。 在搜索持仓的离场点时,对比开仓,我们可以针对加仓、以及长期持仓进行惩罚。

出于 GCRL,形成手头任务的描述向量时,重要的是要考虑某些需求。 向量应明确指示代理者在特定时间点应达成的子任务。

任务描述向量可以包含各种元素,具体取决于任务的上下文和细节。 例如,在开仓的情况下,描述向量包含的信息也许是有关目标资产、交易量、价格限制、或与开仓相关的其它参数。 这些元素对于代理者来说应该是清晰易懂的,如此他才能正确解释给定的子任务。

此外,任务描述向量应含有充足的信息量,如此这般代理者才能做出相应决策,最大程度地专注于达成该子任务。 这也许需要包含额外的数据或上下文信息,以便帮助代理者更准确地理解如何采取行动来达成目标。

子任务描述向量与期待的结果之间应当存在明显的逻辑关系,但并非数学关系。 我们可以使用常规的独热向量。 向量的每个元素都对应一个单独的子任务。 向量会与环境当前状态的描述一同传递给代理者。 最主要的是,代理者能够清晰地解释子任务,并在子任务和奖励之间建立其内部连接。 有关于此,我们应注意到奖励。 引入的额外奖励应与特定的子任务相匹配。

但还有其它方式也可以形成子任务描述向量。 如果需要众多因素的组合来描述一个单独的子任务,我们能够利用一个单独的模型,通过模仿训练技能的方法来形成这样的向量。 这样的模型能用各种自动编码器、或其它任何可用的方法进行训练。

如您所见,这两种方式都非常强大,可令我们解决不同的问题。 不过,它们每个都有其缺点。 这两种方式之间出现各种协同作用并非巧合,这令构建更稳定的算法成为可能。 毕竟,在学习技能的过程中,我们在环境的当前状态和代理者技能(动作政策)之间构建了依赖关系。 使用旨在达成特定子任务的其它工具,将有助于调整代理者策略,从而获得最优结果。

其中一种方式是自适应变分 GCRL(aVGCRL)。 该思路是,在随机环境中,每个技能的分发表现不会是均匀的。 甚至,它也许会根据环境状态而变化。 在某些状态下,将存在对某些技能的依赖性,而其分发的离散度会最小。 与此同时,在相同状态下使用其它技能的可能性不会那么明显,且它们的分发离散度会明显更高。 在其它环境状态下,技能分发的各异性很可能会大不相同。 如果我们看一下我们在赫兹量化交易软件中训练调度器的变分自动编码器的各种隐含表述,就可以观察到这种效果。 一个合乎逻辑的解决方案是专注于显式依赖关系。 aVGCRL 方法的作者建议将每个技能与目标值的偏离误差除以分发的离散度。 显然,方差越小,误差的影响越大,训练过程中相应的权重系数变化越大。 与此同时,其它技能的随机性不会给一般模型带来明显的失衡。

2. 利用 MQL5 实现

我们转入 GCRL 方法的实现,以便更好地掌握它。 我们将为两种所考察的方法创建共生关系,尽管我们会将一切合并到单一模型之中。

在前一篇文章中,我们创建了 2 个模型:变分自动编码器形式的调度器,和代理者。 与以前的方法不同,代理者仅接收自动编码器的隐含状态,根据我们的逻辑,其应该包含所有必要的信息。 测试表明,训练代理者依据自动编码器以便达成状态预测,并不能提供预期的结果。 这也许是由于预测条件的品质不够。

与此同时,使用经典的奖励方法有可能改进使用以前已训练调度训练代理者的过程。

在这步操作中,我们决定放弃单独训练变分自动编码器,并将其编码器直接包含在代理者模型当中。 应当说,这种方式在某种程度上违反了训练自动编码器的原则。 毕竟,使用任何自动编码器的主要思在于不涉及特定任务的情况下进行数据压缩。 但现在,我们面临的任务并非训练编码器,依据相同的源数据解决若干个问题。

此外,我们只往编码器输入中供应环境的当前状态。 在我们的情况下,这些是有关金融产品价格变动的历史数据,和分析指标的参数。 换言之,我们排除了有关帐户状态的信息。 我们假设调度器(在本例中为编码器)将基于历史数据形成所采取的技能。 这可以是在上涨、下跌或横盘行情中的操作政策。

基于有关帐户状态的信息,我们将为代理者创建一个子任务来搜索入场或离场点。

将模型划分为调度器和代理者是绝对任意的。 毕竟,我们将形成一个模型。 不过,如上所述,我们仅向编码器输入里供应历史数据。 这意味着我们必须将有关已分配子任务的信息添加到模型的中部。 我们以前并未这样做过。 这不是一个全新的方案。 我们以前遇到过这种情况。 在这种情况下,我们创建了 2 个模型。

第一部分由一个模型求解,然后我们将第一个模型的输出与新数据相结合,并将其投喂到第二个模型的输入之中。 这种方案更容易安置,但它有一个明显的缺陷。 它会导致主程序和 OpenCL 关联环境之间多余的通信。 我们必须从关联环境中获取第一个模型的结果,并在第二个模型里重新加载它们。 逆向验算过程中的误差梯度也是如此。 使用单一模型可以消除这些操作。 但是,在模型操作的分段添加新信息的问题浮现了。

为了解决这个问题,我们将创建一个新型的神经层 CNeuronConcatenate。 和以前一样,我们在 OpenCL 程序中创建必要的内核来开始操控每个新的神经层类。 首先,我们创建了 Concat_FeedForward 前向验算内核。 所有内核都在基本全连接神经层的类似内核基础上创建的。 主要区别在于为第二条信息流添加了额外的缓冲区和参数。

在 Concat_FeedForward 内核参数中,我们看到一个单独的权重矩阵、2 个源数据张量、一个结果向量、和 3 个数值参数(源数据张量的大小,和激活函数 ID)

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赫兹量化软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值