在早前的文章中,我们曾研究过操作原理,以及完全连接感知器、卷积和递归网络的方法实现。 我们利用梯度下降来训练所有网络。 根据这种方法,我们判断每个步骤的网络预测误差,并调整权重来减少误差。 然而,我们并没有完全消除每一步的误差,而只是调整权重来减少误差。 如此,我们正在尝试找到这样的权重,并沿其整体长度紧密地重复训练集。 学习率负责在每步中将误差最小化。
1. 问题
选择学习率有什么问题? 我们来概括与学习率选择有关的基本问题。
1. 为什么我们不能使用等于 “1”(或接近值)的比率来立即补偿误差? 在这种情况下,我们将针对最后一种情形对神经网络进行过度训练。 结果则为,忽略历史记录,仅基于最新数据做出进一步的决策。
2. 已知的较小速率允许对整个样本进行平均计算,这样会带来什么问题? 该方法的第一个问题是神经网络的训练周期。 如果步幅太小,则需要大量的步骤。 而这需要时间和资源。
该方法的第二个问题是,通往目标的道路并不总是一帆风顺的。 也许会有山谷和丘陵。 如果我们以太小的步幅移动,我们可能会被其中一个值卡住,从而错误地将其确定为全局最小值。 在这种情况下,我们将永远无法实现目标。 这可通过在权重更新公式中使用动量来部分解决此问题,但问题仍然存在。
出于便捷起见,我们将 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)。
实验 2
在第一个实验中,神经网络权重矩阵以随机方式初始化。 并因此,所有 EA 都有不同的初始状态。 为了消除随机性对实验结果的影响,采用之前实验中学习速率等于 0.01 的 EA 的权重矩阵,将其加载到所有三个 EA 中,并继续训练额外的 30 个迭代。
新的训练过程证实了早前获得的结果。 我们看到所有三个 EA 的平均误差约为 0.42。 最低学习率(0.001)的 EA 再次得到较小的误差(相同差值 0.0018)。 学习率逐渐降低的影响实践当中等于 0。