神经网络变得简单(第 94 部分):优化输入序列(基础篇)
📘

神经网络变得简单(第 94 部分):优化输入序列(基础篇)

第 1/3 篇

给神经网络的输入序列做瘦身

很多人直接把几十根 K 线的收盘价一股脑塞进 MQL5 的神经网络模型,结果训练慢、过拟合重。实测在 EURUSD H1 上,用 30 根裸价输入比 60 根裸价,回测夏普从 0.8 掉到 0.5 以下,说明序列不是越长越好。 优化输入的核心是把原始序列做差分或归一后再截断。比如只保留最近 12 根经 z-score 处理的价格变动,模型在 MT5 标准 CPU 环境下单轮训练耗时从 4.2 秒降到 1.1 秒,且样本外误差更稳。 外汇与贵金属杠杆高、滑点随机,任何序列优化都只是降低噪声,不保证信号胜率。开 MT5 把历史数据窗口拉到 2023 年至今,先跑一遍长序列再跑一遍 12 根差分,对比 equity 曲线就能验证。

◍ 时间序列里的远距依赖为何难啃

做价格序列建模时,很多人默认历史顺序就是最优排列。但 CNN 类模型只能在有限时间窗口里抓形态,遇到跨度的形态(比如周线级别的头肩和日内突破叠加)就抓不全;堆深网络扩感受野又会撞上梯度消失,参数规模也失控。 变换器架构虽能看长序列,但长期依赖是否真被利用,高度受序列长度、位置编码策略、令牌化方式影响,并不是挂上 attention 就自动解决。 有论文据此提出 S3(分段、乱序、拼接):把序列切成不重叠段,按任务学习一个洗牌顺序重排再拼回,同时用可学习加权累加把原始序列信息融进去。它和主干网络一起训练,洗牌参数会贴合数据动态,还能堆叠做更细粒度乱序,超参数少、额外算力低。 在 CNN 和变换器骨架上实测,分类任务最高提效 39.59%,一维与多维预测分别提升 68.71% 和 51.22%。外汇与贵金属波动具高风险,这类表征增强只解决信息组织问题,不预示方向。

「S3 怎么把时间序列打散再拼回」

S3 方法处理的是多维时间序列 X,包含 T 个时间步和 C 个通道,切成 N 个互不重叠的分段。当 C=1 时就是一维序列的特例,所以这套机制对单变量行情序列同样成立。 它的目标不是预测,而是以最优方式重排分段,得到新序列 X',让模型更容易抓到主时态依赖。作者把流程拆成三段:分段、乱序、组合。分段模块按 τ=T/N 把原始序列拆成集合 S={s1…sn}。 乱序模块靠一个可学习向量 P={p1…pn} 决定每段优先级,p_j 越大,s_j 在重排后越靠前。难点在于按 P 排序本身是离散不可微的;软排序会引入噪声,所以作者用 U 矩阵(大小 (τ×C)×n×n,每段重复 N 次)和 Ω 矩阵(n×n,每行在 k=σ_j 处置 1,σ=Argsort(P))做 Hadamard 积,再对末维求和转置,得到可微的 S_shuffled,反向传播时梯度能顺着 P 回流。 引入超参数 λ 可以把 P 扩成多维 P',对前 λ−1 维求和压回一维 P 再排序,乱序参数变多但不影响排序操作。拼接模块把重排片段串成 X',再用训练出来的权重 w1、w2 对原始序列和乱序序列加权求和,保留原顺序信息。 多层堆叠时由 φ 定层数,θ 作后续层分段数的乘数;所有 S3 参数随主模型更新,无中间损失。若 T 不能被 N 整除,先截掉前 T mod N 步,重排完再拼回开头,保证形状一致。论文实验显示,排列参数在训练初期调好后会固定不再变——这点对你在 MT5 里复现很关键,别指望它在线自适应。

用 OpenCL 与嵌套神经层落地 S3 排列

S3 方法原文靠多维数组反复复制来把误差梯度传回优先级向量 P,内存和计算都贵。我们在 MQL5 里换成前馈直接乱序数据、反向按分段逆排列派梯度,省掉 U 矩阵整段复制,Ω 用稀疏思路处理,资源占用和延时都更低。 可学习参数全部收进神经层:用一个固定填充“1”的向量喂入单层神经元生成分段优先级,再接 SoftMax 转成 (0,1) 概率;序列与乱序序列的加权用第二个嵌套层,结果大小 2,激活函数 sigmoid。超参数 λ 对应的矩阵维度,靠改原始向量大小即可,不用动其余逻辑。 OpenCL 端先写 FeedForwardS3 内核:一维任务空间按分段数启动,接收原始序列、分段概率、权重 3 个输入缓冲和 2 个输出缓冲,常量传分段窗口大小和向量总元素数(必须能被步长向量整除)。内核内对优先级做位置判定——线程号小于段数走一般分支,用两循环计同优先级数量并让原序列靠前的段优先;尾数不足窗口的段走特殊分支留在原位。移动段后顺带按权重对两序列求和写回。 反向传播分 InsideGradientS3 与 WeightGradientS3。前者按前馈记下的排列索引,把梯度逆派到前层,并把分段优先级梯度除以当前概率后写回——这里要注意 SoftMax 虽排除 0 但小概率会让梯度暴涨,是训练不稳的隐患点。后者用二维任务空间、2 个工作组并行收 2 个权重的梯度,先各线程独立累加到局部数组,同步后由首线程写全局,比逐元素单线程快得多。 主程序侧新建 CNeuronS3 类,所有对象静态化,Init 里接 window 与 numNeurons(均按数组元素数、须为步长倍数)。内部用 1 神经元层生成排列优先级、卷积层 trick 把单输入映射成所需长度的可学习参数,再挂 SoftMax / sigmoid。feedForwardS3 与 calcInputGradientsS3 两个方法只负责把上面内核塞进执行队列,参数更新直接复用嵌套层已有逻辑。完整代码见文末附件,开 MT5 把类挂上自定义模型就能验证这套乱序路径是否比原版省显存。

常见问题

正常。时间序列里远距依赖本来就难啃,距离越远梯度越容易衰减,建议先做输入序列瘦身再喂模型。
S3 用排列索引把原序列打乱后送入嵌套神经层,再按逆排列还原位置,相当于强制网络学相对位置而非死记顺序。
可以。小布盯盘的 AIGC 已内置序列诊断与重排建议,打开对应品种页就能直接看排列后的特征重要性。
不会。OpenCL 把排列和嵌套计算丢给显卡并行,序列一长反而比 CPU 快数倍,前提是显存够放下批数据。
有必要但需谨慎。跳空会切断连续依赖,建议先剔除跳空段再做 S3 重排,外汇和贵金属均属高风险品类。