接下来,我们对 Actor 进行训练。我们将一个单独的状态输入 Actor 的输入端。Actor 会产生一些动作。我们输入这个动作和环境的初始状态,然后它对 Actor 的动作进行评估。然后,我们告诉 "批判者 "我们需要改进结果(我们指定的目标结果要高于接收到的结果)。作为回应,"批评者 "会告诉 "行动者 "需要如何改变它的行动(传递误差梯度)。
接下来,我们对 Actor 进行训练。我们将一个单独的状态输入 Actor 的输入端。Actor 会产生一些动作。我们输入这个动作和环境的初始状态,它就会评估 Actor 的动作。然后,我们告诉 "批判者 "我们需要改进结果(我们指定的目标结果要高于接收到的结果)。作为回应,"批判者 "会告诉 "行动者 "如何改变其行动(传递错误梯度)。
等等。我明白了吗?让我感到困惑的是,测试中经常会出现 -7000 甚至 -9000 的大负值。而在数据库中会有很多这样的数据。难道网络不会被训练成故意在负值中交易吗?
让我们来看看学习过程,不用太深入地研究数学,用手指就能知道。在经典的强化学习中,当环境给予我们奖励时,每个动作都会受到环境的评估。我们将这种奖励作为目标结果交给模型。因此,我们训练模型并不是为了选择行动,而是为了预测行动的预期奖励(Q 函数),然后从预测的奖励中选择执行行动的最大奖励。我想说的是,如果所有行动都无利可图,那么什么都不做的选择也不会通过,因为我们把 "什么都不做 "作为一个单独的行动来评估,它也有自己的奖励水平。
在一个连续的行动空间中,我们无法直接指定一个行动的回报。毕竟,模型要返回的是影响程度(交易量、SL 水平等),而不是奖励。因此,我们使用 "批评者 "来评估行动。我们将示例数据库中的状态和行动输入到 Critic 的输入端,它就会返回一个预测奖励。我们将其与模型奖励进行比较,训练 Critic 正确评估动作。因此,Critic 会形成一个关于状态和行动对预期回报影响的抽象概念。例如,在看涨趋势中,买入量增加会增加收益,而卖出量减少会减少损失。
接下来,我们对 Actor 进行训练。我们将一个单独的状态输入 Actor 的输入端。Actor 会产生一些动作。我们输入这个动作和环境的初始状态,然后它对 Actor 的动作进行评估。然后,我们告诉 "批判者 "我们需要改进结果(我们指定的目标结果要高于接收到的结果)。作为回应,"批评者 "会告诉 "行动者 "需要如何改变它的行动(传递误差梯度)。
因此,从理论上讲,我们也可以在负通过时获得正结果。但问题是,收入与行动的函数关系并不是线性的。为了对行动进行更正确的评估,我们最好采用及格线。
至于演员的直接工作和培训。在初始阶段,我们用随机参数初始化模型。而 Actor 的行动也是随机的。例如,在训练过程中,评论家说我们需要建仓 1 手。但我们用较低的学习率训练模型。在下一次迭代中,Actor 开仓 0.01 手。显然,我们需要进行 100 次这样的训练迭代才能达到预期结果。
这样看来,我们何必自寻烦恼呢?让我们把学习系数提高到 1,并立即记住所获得的经验。但硬币也有另一面。在这种情况下,模型会立即忘记所有积累的经验,泛化也就无从谈起了。
这就是为什么我们要不断地碰壁,直到学会一个简单的道理。而模型训练的整个过程,就是通过试错法定向选择参数的过程。
我们先来看看学习过程,不用太深入地研究数学,可以说是用手指来学习。在经典强化学习中,当环境给我们带来奖励时,我们的每个行动都会受到环境的评估。我们将这种奖励作为目标结果交给模型。因此,我们训练模型并不是为了选择一个行动,而是为了预测该行动的预期奖励(Q 函数),然后从预测的奖励中选择执行该行动的最大奖励。我想说的是,如果所有行动都无利可图,那么什么都不做的选择是行不通的,因为我们把 "什么都不做 "作为一个单独的行动来评估,它也有自己的奖励水平。
在一个连续的行动空间中,我们无法直接指定某个行动的回报。毕竟,模型要返回的是影响程度(交易量、SL 水平等),而不是奖励。因此,我们使用 "批评者 "来评估行动。我们将示例数据库中的状态和行动输入到 Critic 的输入端,它就会返回一个预测奖励。我们将其与模型奖励进行比较,训练 Critic 正确评估动作。因此,Critic 会形成一个关于状态和行动对预期回报影响的抽象概念。例如,在看涨趋势中,买入量增加会增加回报,而卖出量减少会减少损失。
接下来,我们对 Actor 进行训练。我们将一个单独的状态输入 Actor 的输入端。Actor 会产生一些动作。我们输入这个动作和环境的初始状态,它就会评估 Actor 的动作。然后,我们告诉 "批判者 "我们需要改进结果(我们指定的目标结果要高于接收到的结果)。作为回应,"批判者 "会告诉 "行动者 "如何改变其行动(传递错误梯度)。
因此,从理论上讲,我们也可以在负通过时获得正结果。但问题是,收入与行动之间的函数关系并不是线性的。为了对行动进行更正确的评估,我们需要更好的通道。
至于演员的直接工作和培训。在初始阶段,我们用随机参数初始化模型。而 Actor 的行动也是随机的。例如,在训练过程中,评论家说我们需要建仓 1 手。但我们用较低的学习率训练模型。在下一次迭代中,Actor 开仓 0.01 手。显然,为了达到预期结果,我们需要进行 100 次这样的训练迭代。
这样看来,我们何必自寻烦恼呢?让我们把学习系数提高到 1,并立即记住所获得的经验。但硬币也有另一面。在这种情况下,模型会立即忘记所有积累的经验,泛化也就无从谈起了。
这就是为什么我们要不断地碰壁,直到学会一个简单的道理。而模型训练的整个过程,就是通过试错法定向选择参数的过程。
我明白了。非常感谢你如此清晰的解释。
那么问题来了--为什么要通过 100 000 次迭代来训练模型,并以 200 条轨迹为基础,不断重复收集新示例的过程?为什么 Expert Advisor 不能创建一个包含 1000 个轨迹的基础,并将 10 000 000 次迭代用于训练,然后让它在那里学习一夜、一天或一周?为什么需要不断补充基础并进行少量的迭代训练?
我明白了。非常感谢你如此清晰的解释。
那么问题来了--为什么我们要对模型进行 100 000 次迭代训练,并以 200 条轨迹为基础,不断重复收集新示例的过程?为什么 Expert Advisor 不能创建一个包含 1000 个轨迹的基础,并将 10 000 000 次迭代放在训练中,然后让它在那里学习一夜、一天或一周?为什么需要不断补充基础并进行少量的迭代训练?
理论上是可以的,但关键在于资源。例如,我们讨论的 TA 大小为 1000 点。在连续行动空间的概念中,这就是 1000 个选项。即使我们以 10 点为增量,也有 100 个变量。再加上同样数量的 SL,甚至一半(50 个变量)。再加上至少 5 个交易量变量,我们就得到 100 * 50 * 5 = 25000 个变量。乘以 2(买入/卖出) - 一根蜡烛的变体数为 50 000。再乘以轨迹的长度,就得到了完全覆盖所有可能空间的轨迹数量。
在逐步学习过程中,我们会对当前行为者行动的邻近轨迹进行采样。这样,我们就缩小了研究范围。而且,我们研究的并不是所有可能的变体,而只是一小块区域,通过寻找变体来改进当前策略。在对当前策略进行小幅 "调整 "后,我们会在这些改进所涉及的区域收集新数据,并确定下一步的行动矢量。
这不禁让人联想到在未知的迷宫中寻找出路。或者是游客走在街上向路人问路的路径。
理论上是可行的,但这完全取决于资源。例如,我们正在讨论 1000 个点的 TP 大小。在连续行动空间的概念中,这就是 1000 个变量。即使我们以 10 为增量,也有 100 种变体。再加上同样数量的 SL,甚至一半(50 个变量)。再加上至少 5 个交易量变量,我们就得到 100 * 50 * 5 = 25000 个变量。乘以 2(买入/卖出) - 一根蜡烛的变体数为 50 000。再乘以轨迹的长度,就得到了完全覆盖所有可能空间的轨迹数量。
在逐步学习过程中,我们会对当前行为者行动附近的轨迹进行采样。这样,我们就缩小了研究范围。而且,我们研究的并不是所有可能的变体,而只是一小块区域,通过寻找变体来改进当前策略。在对当前策略进行小幅 "调整 "后,我们会在这些改进所涉及的区域收集新数据,并确定下一步的运动矢量。
这可能会让人联想到在未知的迷宫中寻找出路。或者是游客走在街上向路人问路的路径。
我明白了。谢谢。
我现在注意到,当你进行Research.mqh 收集时,结果会以某种方式形成一组,组内的最终平衡非常接近。而且,Research.mqh 似乎取得了一些进展(积极的结果组开始更频繁地出现,或者其他什么原因)。但 Test.mqh 似乎没有任何进展。它有一定的随机性,一般来说,更经常以负数结束一次通过。有时先上升后下降,有时直接下降然后停滞。他似乎还增加了最后的进场量。有时,他的交易量不是负数,而是在零附近。我还注意到他改变了交易次数--有 5 个月他开了 150 笔交易,有人开了 500 笔(大约)。这一切正常吗?
我明白了谢谢。
我注意到,当我进行Research.mqh 收集时,结果会以某种方式形成一组,组内的最终平衡非常接近。而且,Research.mqh 似乎取得了一些进展(积极的结果组开始更频繁地出现或其他)。但 Test.mqh 似乎没有任何进展。它有一定的随机性,一般来说,更经常以负数结束一次通过。有时先上升后下降,有时直接下降然后停滞。他似乎还会在最后增加进场量。有时,他的交易量不是负数,而是在零附近。我还注意到他改变了交易次数--有 5 个月他开了 150 笔交易,有人开了 500 笔(大约)。这一切正常吗?
随机性是 Actor 随机性的结果。随着学习的深入,随机性会越来越小。它可能不会完全消失,但结果会很接近。
没有交易的传递不会 "堵塞 "示例数据库。Research.mq5有一个检查机制,不会保存这样的通行证。不过,Test.mq5 会保存这样的传票,这是好事。在生成奖励时,没有交易会受到惩罚。这将有助于模型摆脱这种情况。

Dmitriy 我已经做了 90 多个循环(数据库的训练-测试-收集),模型仍然是随机的。我可以说,在 Test.mqh 的 10 次运行中,7 次排水 2-3 次为 0,1-2 次为大约 4-5 个周期,有一次运行在加号中。您在文章中指出,您在 15 个周期中得到了一个积极的结果。我知道系统中存在很大的随机性,但我不明白为什么会出现这样的差异?好吧,我明白如果我的模型在 30 个周期后给出了正结果,比方说 50 个周期,那么现在已经是 90 个周期了,你看不到什么进展.....。
你确定你发布的是你自己训练的代码吗?也许你在测试时修正了一些东西,但不小心忘记了,所以发布了错误的版本.....?
举例来说,如果把训练系数提高一个等级,学习速度不是会更快吗?
我有些不明白......。