您应当知道的 MQL5 向导技术(第 28 部分):据入门学习率重新审视 GAN·进阶篇
📘

您应当知道的 MQL5 向导技术(第 28 部分):据入门学习率重新审视 GAN·进阶篇

第 2/2 篇

「指数衰减如何让学习率平滑下行」

指数衰减和步进衰减最大的区别,是它不挑特定局次才砍学习率,而是每个新局次都乘一个衰减因子,曲线更连续。公式里 lr = initial_lr × e^(-decay_rate × epoch),欧拉常数 e 把降幅压成渐次收敛的形状,训练初期掉得猛,越往后越温柔。 这种渐次方式避开了步进衰减里「到了步数突然跳水」的毛病,后者常让模型权重更新节奏断裂、训练波动变大。对 MT5 上跑神经网络型策略的人来说,指数衰减更贴近真实调参直觉。 以 EURJPY 2023 年日线周期回测为例,指数衰减下学习率随局次修正,但并非每步降幅相等:前几局次降幅明显更大,逼近末局时微小到可忽略。外汇与贵金属属高风险品种,此类衰减仅影响优化稳定性,不预示任何收益。 MQL5 里落地就几行:判断衰减类型后,用 exp() 直接算当前局次学习率。

MQL5 / C++
    else if(m_learning_type == LEARNING_EXPONENTIAL_DECAY)
    {    _learning_rate = m_learning_rate * exp(-class="num">1.0 * m_decay_rate * (m_epochs - i + class="num">1));
    }

◍ 多项式衰减怎么拖慢前期、猛砍后期

多项式衰减和指数衰减同属随训练推进而下调学习率的路子,但前期它降得很慢,越接近训练末尾降速越猛。公式里 lr(t)=initial_lr×(1−(max_epochs−t)/max_epochs)^power,power 就是控制后期陡降程度的常数指数。 把 power 作为参数塞进信号类后,几种学习率格式能共用一个文件,靠输入切换。上面那段 MT5 代码就是多项式分支的落地:用 pow(1.0 - ((m_epochs - i) / m_epochs), m_polynomial_power) 算衰减因子,再乘初始学习率。 这种「前慢后快」的走法让学习率尽可能长时间维持高位,只在局次快耗尽时猛降,等于把调参空间押在选对多项式幂上。幂大则训练提速、幂小则拖慢,属于用时间换平滑或用速度换精度的权衡。 EURJPY 2023 年日线回测里跑过这套逻辑,说明它在外汇品种上可复现,但外汇/贵金属杠杆高、滑点跳空频发,实盘前务必在 MT5 策略测试器用自己的样本外数据验一遍。

MQL5 / C++
      else if(m_learning_type == LEARNING_POLYNOMIAL_DECAY)
      {  _learning_rate = m_learning_rate * pow(class="num">1.0 - ((m_epochs - i) / m_epochs), m_polynomial_power);
      }

逆时衰减在巨量数据下的慢降速优势

逆时衰减同样在每个训练局次按参考时间做衰减以压低学习率。前面看过指数衰减初期掉速猛、多项式衰减掉速缓,而逆时衰减把降低速度放得更慢,因此在处理非常大的训练数据集时,它甚至比多项式衰减更合适。 公式里 η_{n+1} 是下一局次学习率,η_n 是当前先验学习率,d 为衰减率,n 是局次索引。核心在于分母 1 + d·n 随局次线性爬升,学习率被温和摊薄而非陡降。 下面这段 MQL5 实现就是上述逻辑的直接落地: else if(m_learning_type == LEARNING_INVERSE_TIME_DECAY) { _learning_rate = m_prior_learning_rate / (1.0 + (m_decay_rate * (m_epochs - i))); m_prior_learning_rate = _learning_rate; } 逐行看:先判断衰减类型是否为逆时;再用先验学习率除以「1.0 加 衰减率乘剩余局次」得到新学习率;最后把新值回写先验变量,供下个局次迭代。 原文在相同品种、周期与测试区间跑过对照,逆时衰减对超大数据集倾向表现更稳,完整源码开放改动,交易者可自行在 MT5 里换衰减率参数做复杂验证。外汇与贵金属模型训练属高风险实验,回测优不代表实盘概率占优。

MQL5 / C++
      else if(m_learning_type == LEARNING_INVERSE_TIME_DECAY)
      {  _learning_rate = m_prior_learning_rate / (class="num">1.0 + (m_decay_rate * (m_epochs - i)));
         m_prior_learning_rate = _learning_rate;
      }

「余弦退火怎么重启学习率」

余弦退火把学习率按余弦曲线往预设最小值压,但和逆时衰减不同,它到了最小点会直接重置回初始值再跑一轮,直到所有局次耗尽。这种“周期重置”在 MQL5 里对应 LEARNING_COSINE_ANNEALING 分支,本质上是在探索和利用之间反复横跳。 代码里那行赋值就是核心:以最小学习率为底,加上半幅差乘余弦项。MathCos 的参数是剩余局次占比乘 π,所以越接近末尾余弦越趋 -1,学习率越贴 min_lr;新一轮重启时 i 归零,曲线重画。 m_min_learning_rate 是额外可调把手。单批次测试中,调低它可拉长有效训练时长、逼网络多探索;调高则更快利用已知较优权重。面对大型数据集时,这比逆时衰减更不容易过早陷进局部劣解,外汇模型训练属高风险实验,参数乱给可能过拟合历史行情。 热重启和它有血缘但不同:前者在批次边界自动复位,余弦退火可在单批次内靠局次索引循环。真要落地,开 MT5 把这段塞进你的优化器,先跑 200 局次看 loss 曲线是否呈锯齿下行。

MQL5 / C++
      else if(m_learning_type == LEARNING_COSINE_ANNEALING)
      {  _learning_rate = m_min_learning_rate + (class="num">0.5 * (m_learning_rate - m_min_learning_rate) * (class="num">1.0 + MathCos(((m_epochs - i) * M_PI) / m_epochs)));
      }

◍ 轮转学习率先从抬升再压回

和前面几种直接衰减的套路不同,轮转学习率(cyclical)在把速率最终压到下限前,会先往上拉一波,呈三角波形态循环。每一轮转都从最小学习率起步,按公式 η(t)=η_min+(η_max−η_min)·max(0, 1−2·(t mod T_cycle)/T_cycle−1) 走,其中 T_cycle 是单轮转局次总数,我们实测只跑单轮转。

MQL5 里这段分支就是该逻辑的落地:先取余算相位,再映射回学习率。下面逐行拆一下—— else if(m_learning_type == LEARNING_CYCLICAL):当学习率模式被设为轮转时才进该分支。 double _x = fabs(((2.0 * fmod(m_epochs - i, m_epochs))/m_epochs) - 1.0):用总轮次减当前局次取模,乘 2 除总量减 1 取绝对值,得到三角波的归一化偏移。 _learning_rate = m_min_learning_rate + ((m_learning_rate - m_min_learning_rate) * fmax(0.0, (1.0 - _x))):以最小率为底,叠加(初始率−最小率)乘上 1−偏移的下半截,实现先升后降。 沿用前面相同的品种、时间帧与测试区间跑下来,轮转式在收敛节奏上和阶梯衰减有明显差异,外汇与贵金属样本上属高波动场景,结果仅代表历史窗口概率,不构成方向预判。 轮转还有个变体叫 triangular-2:每次触底后重新起涨,但每轮能摸到的最大学习率逐轮减半。后面我们会顺带测自适应、热重启,以及下一篇的单轮转率。

MQL5 / C++
    else if(m_learning_type == LEARNING_CYCLICAL)
    {  class="type">class="kw">double _x = fabs(((class="num">2.0 * fmod(m_epochs - i, m_epochs))/m_epochs) - class="num">1.0);
       _learning_rate = m_min_learning_rate + ((m_learning_rate - m_min_learning_rate) * fmax(class="num">0.0, (class="num">1.0 - _x)));
    }

学习率路径的变数才是真风险

把 GAN 里那个学习率单独拧出来换值,跑出来的权重和乖离能差出无数条路径——这参数看着只是个收敛步长,实际在固定算力和时间窗里,选哪条路抵达目标权重,变数几乎全压在它身上。 附件里 gan_learn_r.mq5 只有 7.52 KB,SignalWZ_28.mqh 是 15.88 KB,直接丢进 MT5 把学习率从 0.001 改成 0.01 各跑一轮,就能看见同样的网络结构产出完全不一样的信号分布。 外汇和贵金属这类高波动品种,用这类敏感超参的模型下单,回测漂亮不等于实盘稳,路径依赖带来的过拟合概率得自己压。开 MT5 验证一遍比看十篇综述都实在。

常见问题

固定学习率容易在后期跳过最优解,用指数或余弦衰减让率平滑下行,通常验证集误差能降几个百分点。
数据量巨大且训练步数长时逆时衰减慢降速更稳;样本少想快速收敛就用指数衰减,前期砍得快。
小布可接入你的训练日志,把指数、多项式、余弦等路径画在同一张图,标出哪段波动最大,你直接看结论。
重启是故意抬升再压回,帮跳出局部最优;只要重启幅度不过半,原有权重倾向保留,测试准确率多波动少崩。
显存看批次和模型大小,路径本身不占额外显存;升段只是调超参,前期抬升可能让梯度更活跃,掉点风险低些。