期货_期货量化软件神经网络变得轻松-36

赫兹量化软件将继续探索强化学习方法。 在前面的文章中,我们已经讨论过几种算法。 但我们始终使用卷积模型。 原因很简单。 在设计和测试所有先前研究的算法时,赫兹量化软件参考了各种电脑游戏。 因此,我们主要将各种电脑游戏的关卡图像输入模型。 卷积模型可以轻松解决相关的任务,譬如图像识别和检测这些图像上的对象。

电脑游戏中的图像没有噪点或物体失真。 这简化了识别任务。 然而,现实中没有这样的“理想”条件。 数据充满了各种噪音。 很多时候,所研究图像距理想预期甚远。 它们可以围绕场景移动(卷积网络可以轻松处理这一点),且会受到各种失真的影响。 它们也可以拉伸、压缩、或以不同的角度呈现。 对于通常的卷积模型,此任务更难处理。

在某些情况下,不仅存在两个或多个物体,那么它们的相对位置对于成功解决问题就尤为重要。 使用卷积模型很难解决这些问题。 但是它们可以通过关系模型得以很好地解决。

1. 关系强化学习

关系模型的主要优点是能够在对象之间构建依赖关系。 这样就可以构建源数据。 关系模型可以用示图的形式表示,其中对象和事件表示为节点,而关系代表对象和事件之间的依赖关系。

通过使用示图,赫兹量化软件可以直观地构建对象之间的依赖关系结构。 例如,如果我们想描述通道突破模式,我们可以绘制一个有顶部的通道形成的示图。 通道形成描述也可以表示为示图。 接下来,我们将创建两个通道突破节点(上边界和下边界)。 两个节点均拥有与前一个通道形成节点的相同链接,但它们彼此间没有相互连接。 为了避免在出现假突破时入场建仓,我们可以等待价格回滚到通道边界。 这就是另外两个节点,即回滚到通道上边界和下边界。 它们将与相应通道边界突破的节点建立连接。 但同样,它们彼此之间不会有连接。

所描述的结构适合示图,从而提供了数据和事件序列的清晰结构。 在构建关联规则时,赫兹量化软件研究过类似的东西。 但这与我们之前所用的卷积网络难以相关。

卷积网络用于识别数据中的对象。 我们可以训练模型来检测一些走势逆转点或小型趋势。 但在实践中,通道形成过程可以随着通道内趋势的不同强度而扩展。 然而,卷积模型也许无法很好地应对这种扭曲。 此外,卷积和完全连接的神经层都不能分离由不同序列的相同对象组成的两种不同形态。

还应该注意的是,卷积神经网络只能检测对象,但不能在它们之间建立依赖关系。 因此,我们需要寻找一些其它算法来学习这种依赖关系。 现在,赫兹量化软件回到关注度模型。 关注度模型可以将注意力集中在独立对象上,从常规数据数组中将它们挑捡出来。

“广义关注度机制”于 2014 年 9 月首次提出,旨在提高使用递归i模型的机器翻译模型的效率。 这个思路是创建一个附加的关注度层,其在处理原始数据集时收集编码器的隐藏状态。 这解决了长期记忆的问题。 序列元素之间依赖关系的分析有助于提高机器翻译的质量。

该机制操作算法包括以下迭代:

1. 创建 编码器隐藏状态,并将其累积在关注度模块之中。
2. 评估每个 编码器元素的隐藏状态与 解码器的最后一个隐藏状态之间的成对依赖关系。
3. 将结果分数组合成单个向量,并调用  Softmax 函数对其进行归一化。
4. 通过将 编码器的所有隐藏状态乘以其相应的对齐得分来计算上下文向量
5. 解码上下文向量,并将结果值与 解码器的先前状态相结合。

迭代重复所有操作,直至收到句子结束信号为止。

下图展示了此解决方案的可视化效果:

不过,训练递归模型是一个相当耗时的过程。 故此,在 2017 年 3 月,在文章“关注度是您所需的一切”中提出了另一种变体。 这是 Transformer 神经网络的新架构,它不使用递归模块,而是使用新的自关注算法。 与前面讲述的算法不同,自关注分析一个序列中的配对依赖关系。 在之前的文章中,赫兹量化软件曾用自关注算法创建了 3 种类型的神经层。 我们将在本文中使用其中之一。 但在继续实现智能系统之前,我们研究一下自关注算法如何学习示图结构。

自关注算法的输入中,我们期望源数据的张量,其中序列的每个元素都由一定数量的要素描述。 此类要素的数量是预先确定的,并且对于序列的所有元素都是固定的。 因此,初始数据张量以表格形式表示。 此表格的每一行都是序列中一个元素的描述。 每列对应一个要素。

所用的要素可以具有完全不同的分布。 一个要素的分布特征可能与另一个要素大不相同。 要素的绝对值及其变化对最终结果的影响也可能完全相反。 为了令数据具有可比较的形式,类似于递归层的隐藏状态,我们使用权重矩阵。 将初始数据张量的每一行乘以权重矩阵,将序列元素的描述转换为某种 d-维内部嵌入空间。 在学习过程中为指定的矩阵选择参数,允许为序列元素选择数值,将最大程度地分离,并按相似性分组。 请注意,自关注算法允许创建和训练三个这样的矩阵。 矩阵允许我们形成三种不同的源数据嵌入:QueryKey 和 Value。 Query 和 Key 向量维度是在模型创建期间设置的。 Value 向量维度对应于源数据中的要素数(对应于一个元素描述向量的大小)。

每个生成的嵌入都有自己的功能用途。 Query 和 Key 用于定义序列元素之间的相互依赖关系。 Value 定义应传递每个元素的哪些信息。

为了找到序列元素之间的依赖系数,我们需要将 Query 张量中每个序列元素的嵌入成对乘以 Key 张量中所有元素的嵌入(包括相应元素的嵌入)。 使用矩阵运算时,我们可以简单地将 Query 矩阵乘以转置的 Key 矩阵。

赫兹量化软件将获得的值除以 Key 嵌入维度的平方根,并在 Query 嵌入序列元素的上下文中调用 Softmax 函数进行规范化。 作为此操作的结果,我们得到了初始数据序列元素之间的依赖关系方阵。

注意以下两点:

  1. 通过调用 Softmax 函数,我们得到了归一化在 0 到 1 范围内的依赖系数。 在这种情况下,系数的逐行总和等于 1。
  2. 我们使用不同的矩阵来创建 Query 和 Key。 这意味着我们为源数据序列的同一元素获得了不同的嵌入。 通过这种方法,我们最终获得了依赖系数的非对角矩阵。 在此矩阵中,A 元素对 B 元素的依赖系数和 B 元素对 A 元素的反依赖系数将不同。

我们记住这个行动的目的。 如上所述,我们希望获得一个模型,该模型可以构建各种对象和事件之间的依赖关系图。 我们使用初始数据张量中的要素向量描述每个对象或事件。 生成的依赖系数矩阵则按所需图形的表格表示。 在此矩阵中,系数的零值表示源数据的相应节点之间没有链接。 非零值确定一个节点对另一个节点值的加权影响。

但回到自关注算法。 我们将获得的依赖系数乘以 Value 张量中的相应嵌入。 我们对“加权”嵌入的结果值求和,结果向量是序列中分析元素的自关注模块的输出。 使用矩阵运算时,我们只需使用矩阵乘法函数。 通过将依赖系数的方阵乘以 Value 张量,我们得到了自关注模块结果的所需张量。

上面描述了一个简单的单目击者案例的自关注算法。 然而,在实践中,我们主要使用多目击者关注度选项。 在这样的实现中,又增加了一个降维矩阵。 它将级联张量的维度从所有目击者减少到源数据的维度。

自关注算法结束时,我们将源数据张量与关注度模块相加,然后规范化结果值。

如您所见,自关注模块输入和输出处的张量大小相同。 但是输出张量包含归一化值,因此对结果有重大影响的要素被最大化。 与之对比,不影响结果和噪声现象的要素值将被最小化。 通常,在模型中后随若干个关注度模块来增强这种效果。

不过,关注度模块只能帮助我们找到明显的要素。 它不能提供问题的解决方案。 因此,关注度模块之后是决策模块。 该模块可以是完全连接感知器,或任何以前研究过的体系架构解决方案。

2. 利用 MQL5 实现

现在我们移步到实现,应该注意的是,我们不会重复来自原始文章“具有关系归纳偏差的深度强化学习”中的模型。 我们将使用建议的开发,并向我们的模型添加一个关系模块,即内部好奇心模块。 我们在上一篇文章中已创建了此模型的副本。 我们依据上一篇文章创建智能系统的副本,并将其保存为 RLL-Learning.mq5。

在不修改源数据层的情况下,更改我们正在训练的模型的内部架构,结果层不需要更改 EA 算法,因此我们可以简单地创建新的模型文件,而无需直接修改 EA 代码。 不过,在以前发表文章的评论中,我经常收到消息,其内容有关加载由 NetCreator 工具创建的模型时出错。 因此,在本文中,我决定回到 EA 代码中编译模型架构的讲述。

当然,您仍然可以使用 NetCreator 来创建必要的模型。 但在这种情况下,您应该注意以下几点。

在 EA 代码中,模型名称由宏替换指定。 因此,模型应与指定的格式相对应。

#define FileName        Symb.Name()+"_"+EnumToString(TimeFrame)+"_"+StringSubstr(__FILE__,0,StringFind(__FILE__,".",0))

文件名由以下部分组成:

  1. 运行 EA 的图表的品种。 它是终端中显示品种的全名,包括前缀和后缀。
  2. 在 EA 参数中指定的时间帧。
  3. 不带扩展名的 EA 文件名。

上述所有组件都由下划线分隔。

以下扩展名之一将添加到文件名中:

  • "nnw" 表示正在训练的模型
  • "fwd" 代表前向模型
  • "inv" 表示逆模型

将创建模型的所有文件保存在终端的 “Files” 目录或 “Common/Files” 中。 在这种情况下,包含文件的目录必须与程序代码中指定的 common 标志匹配。 common 标志的 true 值对应于 “common” 目录。

bool CNet::Load(string file_name, float &error, float &undefine, float &forecast, datet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值