English Русский Español Deutsch 日本語 Português
preview
神经网络变得轻松(第六部分):神经网络学习率实验

神经网络变得轻松(第六部分):神经网络学习率实验

MetaTrader 5示例 | 3 二月 2021, 14:01
2 280 0
Dmitriy Gizlyk
Dmitriy Gizlyk

内容


概述

在早前的文章中,我们曾研究过操作原理,以及完全连接感知器、卷积和递归网络的方法实现。 我们利用梯度下降来训练所有网络。 根据这种方法,我们判断每个步骤的网络预测误差,并调整权重来减少误差。 然而,我们并没有完全消除每一步的误差,而只是调整权重来减少误差。 如此,我们正在尝试找到这样的权重,并沿其整体长度紧密地重复训练集。 学习率负责在每步中将误差最小化。


1. 问题

选择学习率有什么问题? 我们来概括与学习率选择有关的基本问题。

1. 为什么我们不能使用等于 “1”(或接近值)的比率来立即补偿误差?
在这种情况下,我们将针对最后一种情形对神经网络进行过度训练。 结果则为,忽略历史记录,仅基于最新数据做出进一步的决策。

2. 已知的较小速率允许对整个样本进行平均计算,这样会带来什么问题?
该方法的第一个问题是神经网络的训练周期。 如果步幅太小,则需要大量的步骤。 而这需要时间和资源。

该方法的第二个问题是,通往目标的道路并不总是一帆风顺的。 也许会有山谷和丘陵。 如果我们以太小的步幅移动,我们可能会被其中一个值卡住,从而错误地将其确定为全局最小值。 在这种情况下,我们将永远无法实现目标。 这可通过在权重更新公式中使用动量来部分解决此问题,但问题仍然存在。


3. 已知的较大速率允许在一定距离内进行数值平均,并避免局部最小值,这样会有什么问题?
尝试通过提高学习率来解决局部最小值问题,会引发另一个问题:采用较大的学习率通常无法将误差最小化,因为随着下一次更新权重,它们的变化将大于所需,故此我们将跳过全局最小值。 如果我们以后再次返回,情况依然类似。 结果就是,我们将在全局最低值附近徘徊。

这些都是众所周知的问题,它们经常被讨论,但我还没有找到有关学习率选择的明确建议。 每个人都建议根据经验为每个特定任务选择速率。 一些其他作者则建议在学习过程中逐渐降低速率,从而令上述风险 3 最小化。

在本文中,我提议进行一些实验,以不同学习率来训练一个神经网络,并从整体上查看此参数对神经网络训练的影响。    


2. 实验 1

出于便捷起见,我们将 CNeuronBaseOCL 类中的 eta 变量设为全局变量。

double   eta=0.01;
#include "NeuroNet.mqh"

class CNeuronBaseOCL    :  public CObject
  {
protected:
   ........
   ........
//---
   //const double      eta;

现在,以不同学习率参数(0,1; 0,01; 0,001)创建智能交易系统的三个副本。 另外,创建第四个 EA,将初始学习率设置为 0.01,并每经过 10 个周期将其降低 10 倍。 为此,将以下代码添加到 “Train” 函数的训练循环中。

         if(discount>0)
            discount--;
         else
           {
            eta*=0.1;
            discount=10;
           }

所有四个 EA 在一个终端中同时启动。 在此实验中,我采用早前 EA 测试中的参数:品种 EURUSD,时间帧 H1,连续 20 根烛条的数据输入到网络中,并用最近两年的历史记录进行训练。 训练样本约为 1.24 万根柱线。

所有 EA 均以 -1 到 1 的随机权重进行初始化(不包括零值)。

不幸的是,学习率等于 0.1 的 EA 误差接近 1,因此未在图表中显示。 以下图表显示了其他 EA 的学习动态。

5 个迭代之后,所有 EA 的误差均达到 0.42 的水平,而在其余时间内,该误差会继续波动。 学习率等于 0.001 的 EA 误差略低。 差异出现在小数点后第三位(其他两个 EA 的 0.420 对比 0.422)。

具有可变学习率的 EA 其误差轨迹遵循学习因子为 0.01 的 EA 误差曲线。 在前十个迭代中这是完全可以预期的,但是当速率降低时没有偏差。


我们仔细看看上述 EA 的误差之间的区别。 几乎贯穿整个实验,恒定学习率分别为 0.01 和 0.001 的 EA 它们误差之间的差值在 0.0018 左右波动。 甚或,EA 的学习速率每 10 个迭代降低一次几乎没有影响,且速率为 0.01(等于初始学习速率)的 EA 其偏差在 0 附近波动。


所获得的误差值表明 0.1 的学习率不适用于我们的情况。 采用 0.01 及以下的学习率会产生相似的结果,误差约为 42%。

神经网络的统计误差非常明显。 这将如何影响 EA 的性能? 我们来检查漏掉的分形数量。 不幸的是,所有 EA 在实验过程中均显示不良结果:它们都错过了近 100% 的分形。 甚而,学习率为 0.01 的 EA 判断出约 2.5% 的分形,而学习率为 0.001 的 EA 则跳过了 100% 的分形。 在第 52 个迭代之后,学习率为 0.01 的 EA 表现出掠过分形的数量降低的趋势。 可变速率的 EA 并未展现出这种趋势。 

   

遗漏分形的百分比增量图表还显示,学习率为 0.01 时,EA 的差值逐渐增加。

我们已研究过两个神经网络性能指标,到目前为止,学习率较低的 EA 的误差较小,但会遗漏分形。 现在,我们检查第三个数值:预测分形的“命中”。

以下图表显示了学习率为 0.01 且速率动态下降的 EA 在训练中“命中”百分比的增长情况。 变化增长的速率随着学习速率的降低而降低。 学习率为 0.001 的 EA 其“命中”百分比在 0 附近卡住,这很自然,因为它错过了 100% 的分形。 


以上实验表明,最佳学习率,或在我们的问题范围内训练的神经网络,其值接近 0.01。 学习率的逐渐降低并未得到积极的结果。 如果我们把速率降低到少于 10 个迭代,速率降低的影响可能会有所不同。 也许,100 或 1000 个迭代效果会更好。 然而,这需要由实验进行验证。


3. 实验 2

在第一个实验中,神经网络权重矩阵以随机方式初始化。 并因此,所有 EA 都有不同的初始状态。 为了消除随机性对实验结果的影响,采用之前实验中学习速率等于 0.01 的 EA 的权重矩阵,将其加载到所有三个 EA 中,并继续训练额外的 30 个迭代。

新的训练过程证实了早前获得的结果。 我们看到所有三个 EA 的平均误差约为 0.42。 最低学习率(0.001)的 EA 再次得到较小的误差(相同差值 0.0018)。 学习率逐渐降低的影响实践当中等于 0。

至于漏掉分形的百分比,再次确认了较早获得的结果。 学习因子较低的 EA 在 10 个迭代内遗漏分形接近 100%,即 EA 无法识别分形。 其他两个 EA 的数值为 97.6%。 学习率逐渐降低的影响实践当中等于 0。  

学习率为 0.001 的 EA 的“命中”百分比持续递增。 学习率的递减不会影响该数值。 


 

4. 实验 3

第三个实验与本文的主题略有偏离。 其思路来自前两个实验。 因此,我决定与您分享。 在观察神经网络训练的同时,我注意到不存在分形的概率在 60-70% 左右波动,且很少低于 50%。 无论买入或卖出,出现分形的可能性均约为 20% 至 30%。 这是很自然的,因为图表上的分形比趋势内的烛条少得多。 因此,我们的神经网络被过度训练,且我们获得了以上结果。 几乎 100% 的分形都遗漏了,且只能捕获罕有的分形。  

以 0.01 的学习率训练 EA

为了解决这个问题,我决定稍微补偿样本的不均匀性:由于参考值中缺乏分形,因此在训练网络时我指定了 0.5 来替代 1。

            TempData.Add((double)buy);
            TempData.Add((double)sell);
            TempData.Add((double)((!buy && !sell) ? 0.5 : 0));

该步幅产生了良好的效果。 以 0.01 的学习率和从之前的实验获得的权重矩阵运行 智能交易系统,在 5 个训练迭代后显示出约 0.34 的稳定误差。 分形遗漏的比例下降到 51%,命中百分比则增加到 9.88%。 从图表中可以看出,EA 生成的信号会成组出现,从而显示某些特定区域。 显然,这个想法需要额外的开发和测试。 但结果表明这种方法很有前途。 

无分形则学习率为 0.5



结束语

我们在本文中实现了三个实验。 前两个实验已表明正确选择神经网络学习率的重要性。 学习率会影响整个神经网络训练结果。 不过,目前尚无选择学习率的明确规则。 这就是为什么您必须在实践中经由实验选择它的原因。

第三个实验表明,解决问题的非标准方法可以改善结果。 但是每种方案的应用都必须经过实验确认。

参考

  1. 神经网络变得轻松
  2. 神经网络变得轻松(第二部分):网络训练和测试
  3. 神经网络变得轻松(第三部分):卷积网络
  4. 神经网络变得轻松(第四部分):循环网络
  5. 神经网络变得轻松(第五部分):OpenCL 中的多线程计算

本文中用到的程序

# 名称 类型 说明
1 Fractal_OCL1.mq5  智能交易系统 利用 OpenCL 技术,且学习率 = 0.1 的含有分类神经网络(输出层中有 3 个神经元)的智能交易系统
2 Fractal_OCL2.mq5 智能交易系统   利用 OpenCL 技术,且学习率 = 0.01 的含有分类神经网络(输出层中有 3 个神经元)的智能交易系统
Fractal_OCL3.mq5 智能交易系统 利用 OpenCL 技术,且学习率 = 0.001 的含有分类神经网络(输出层中有 3 个神经元)的智能交易系统
Fractal_OCL_step.mq5 智能交易系统   利用 OpenCL 技术,且学习率从 0.01 开始每 10 次迭代降低 10 倍,含有分类神经网络(输出层中有 3 个神经元)的智能交易系统
5 NeuroNet.mqh 类库 用于创建神经网络的类库
6 NeuroNet.cl 代码库 OpenCL 程序代码库


本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/8485

附加的文件 |
MQL5.zip (1582.99 KB)
模式搜索的暴力方法(第二部分):深入 模式搜索的暴力方法(第二部分):深入
在本文中,我们将继续讨论暴力方法。我将尝试使用我的应用程序的新改进版本来更好地解释这种模式。我还将尝试使用不同的时间间隔和时间框架来找出稳定性的差异。
DoEasy 函数库中的时间序列(第五十四部分):抽象基准指标类的衍生 DoEasy 函数库中的时间序列(第五十四部分):抽象基准指标类的衍生
本文研究基于基准抽象指标衍生对象类的创建。 这些对象所提供功能,可访问创建的指标 EA,收集和获取各种指标和价格数据的数值统计信息。 同样,创建指标对象集合,从中可以访问程序中创建的每个指标的属性和数据。
手工图表和交易工具包(第二部分)。 图表图形绘图工具 手工图表和交易工具包(第二部分)。 图表图形绘图工具
这是该系列的下一篇文章,在其中我展示了如何创建一个函数库来,从而看便利地用键盘快捷键手动绘制图表图形。 所用工具包括直线及其组合。 在这一部分中,我们将查看如何在绘图工具里应用第一部分中讲述的函数。 该函数库可连接到任何 EA 或指标,这将大大简化绘图任务。 此方案未使用外部 dll,而所有命令都是由内置 MQL 工具实现的。
开发和分析交易系统的最佳方法 开发和分析交易系统的最佳方法
在这篇文章中,我将展示在选择一个系统或信号来投资你的资金时所使用的标准,以及描述开发交易系统的最佳方法,并强调这个问题在外汇交易中的重要性。