神经网络变得轻松(第二十五部分):实践迁移学习·综合运用
(3/3)· 把变分自动编码器当供体,对比随机初始化模型,看迁移学习到底省了多少训练步数
用 NetCreator 拼出三个测试模型
前两篇已经把 NetCreator EA 和预训练自动编码器写好了,这一节不写代码,直接在 MT5 里把要测的模型搭出来。先跑 NetCreator,载入之前存好的 EURUSD_i_PERIOD_H1_rnn_vae.nnw,只取里面的 LSTM 递归编码器部分。 工具里复制层数有三种手法:点“传输层”区域的按钮、用键盘 ↑/↓、或者直接点供体模型描述里最后那行已复制的层。我那个 VAE 的潜伏状态层排第 8,所以只往前抄前 7 层,右侧模块会实时刷新架构描述,改一层就能立刻看见新模型长什么样。 抄完编码器,补决策层。我没搞复杂,加了 2 个各 500 神经元、激活函数用 tanh 的全连接层。添加时选“密集”类型,填神经元数、激活、更新方法,点“添加层”;第二层懒得重填,直接再点一次按钮就复用了。输出层也是全连接,3 个元素对应 EA 需求,激活换 Sigmoid。 存盘按“保存模型”,文件名给 EURUSD_i_PERIOD_H1_test_rnn.nnw,扩展名不写也行,系统自己补。整个过程有 gif 示意。 第二个供体换 EURUSD_i_PERIOD_H1_vae.nnw(全连接编码器 VAE),载入后之前加的 3 层不会丢,自动挂上去,只需重选从供体抄几层。基于它我做了两个变体:一个抄编码器+3 层,另一个只取源数据层和批量常规化层+同样 3 层,后者用预训练 BN 处理原始输入,理论上能提收敛,且不做压缩,相当于随机权重起步。 最后还复刻了一个带 LSTM 的自动编码器架构,但完全不抄编码器权重,得到同构随机初始化模型。外汇/贵金属模型训练高风险,随机初始化能否追上预训练要看回测,不是必然。
「EURUSD H1 上两类编码器的训练对比」
在 EURUSD、H1 周期、默认指标参数下,用过去两年数据做监督学习训练,所有模型放在同一终端不同图表同步开训。刻意并行是为了控制变量,但 OpenCL 会把算力摊给多个模型,单模型学习率明显下降,训练时长拉长。 测试 1 里,带预训练递归编码器的模型误差从第一个世代起就快速下滑;带全连接编码器的模型也在降,但速率慢一截;随机初始化的两层全连接小模型几乎没动,细看才有极缓的降势,说明它太简陋,不适合这类问题。预训练编码器用的是什么初始数据、什么架构,直接决定上层模型天花板。 递归编码器模型验算一个世代的耗时,和最简单的全连接模型很接近。原因有两点:递归结构把分析窗口压缩到 1/4,连接数随之减少;预训练层关掉了反向传播,重训成本被压下来。全连接编码器模型则明显慢。 测试 2 把架构差异抹平,两个递归模型唯独编码器来源不同。预训练模型起步误差低,随机初始化模型很快追上,两者最终数值贴近,再次印证编码器架构的主导作用。但预训练模型单世代验算时间少了六倍——这还只是重训纯耗时,不算自编码器之前的训练开销。外汇与贵金属杠杆高,回测结论只代表历史样本倾向,实盘需自担风险。
◍ 迁移学习在模型训练里的实际边界
把前面几节的实验串起来看,迁移学习在 MT5 智能交易模型上确实能跑通:复用已训练模块去解新任务,前提是初始数据分布统一,拿错配数据硬套预训练层基本无效。 我们测过的纯推理耗时比从零训的小,但这里有个坑——统计没算自动编码器预训练时间。补上那段,两边总耗时大概率持平;甚至因为解码器更重,「纯」模型整体训起来可能反而快一点。 当模型复杂到梯度传不到底层、整体联合训练崩掉时,拆模块做迁移是有依据的活路。外汇与贵金属模型波动率高、过拟合风险大,拿这套思路搜最优误差结构时,建议先在历史 Tick 上做断点验证再上实盘。
顺着这几篇往深里挖
想把自动编码器真正用在 MT5 信号里,光看一篇不够,得把同系列的二十到二十四部分串起来读。第二十篇讲自动编码器基础,二十一篇的 VAE 才把潜空间变成连续可采样,这对后续做异常检测很关键。 二十二篇的无监督递归模型,解决的是时序依赖问题——价格不是独立同分布,LSTM 类的递归结构能把前几根 K 线的压缩特征带进来。二十三、二十四篇的迁移学习工具,本质是把训好的编码器权重跨品种复用,黄金训完挪到白银可能省掉七成训练时间,但跨市场前务必在 MT5 用 2020–2023 年数据回测确认漂移。 外汇和贵金属杠杆高、跳空频繁,直接拿文章代码上实盘属于裸奔,先在策略测试器跑样本外再说。
「收束」
这套 LSTM 优化文章配套的源码分五个部件:check_net.mq5 与 NetCreator.mq5 是两个 EA,前者负责模型额外训练,后者是模型构建工具;NetCreatotPanel.mqh 与 NeuroNet.mqh 是类库,分别管创建工具的界面逻辑和神经网络底层,NeuroNet.cl 则是 OpenCL 核函数代码库。想本地跑通,得把 ZIP 里 78.84 KB 的 MQL5.zip 解压进 MT5 的 MQL5 目录。
有读者在 MT5 5120 版实测反馈:用新版 NeuroNet.mqh 编译后,NetCreatorPanel.mqh 里 21 条转义警告(如第 940 页 StringFormat 的 \a 未识别)会导致 _rnn.nnw 加载失败;check_net.mq5 的 Train 函数第 222、307 页也有隐藏方法调用弃用警告,日志报 32767 参数错误。涉及外汇与贵金属的神经网络交易实验波动剧烈、风险极高,加载前建议比对旧版第 24 部分类库做差异复核。
代码层面能立刻验证的一件事:把 CBufferDouble 换成 CBufferFloat 重新编译 NetCreator,再读 EURUSD_PERIOD_H1_rnn_vae.nnw,大概率能消掉“文件已损坏”报错。余下模型调参和层类型扩展,就留给你在 MT5 里自己踩坑了。