ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

时间序列预测研究前沿:基础模型、非平稳与频域方法实战解析

时间序列预测研究前沿:基础模型、非平稳与频域方法实战解析 时间序列预测这几年在NeurIPS上的存在感是真的肉眼可见地在涨。我今年把时间序列方向的投稿集中过了一遍最直观的感受是大家终于不再满足于在公开数据集上刷一两个点的SOTA而是开始认真回答那些做实际业务时根本绕不开的问题——换一个领域模型还能不能直接跑数据是非平稳的采样的时间点还不均匀怎么办如果光给一个预测值不够能不能把区间也一起给出来围绕这些问题时序基础模型、非平稳建模、不规则采样、概率预测再加上这轮明显升温的频域和谱域方法几乎成了投稿里出场率最高的几个关键词。我打算按主题拆开聊尽量把每类方法在解决什么问题、核心思路是什么、以及我实际读下来和复现时觉得容易踩坑的地方都讲清楚。如果你刚入门时间序列或者正在做预测类业务希望这份总结能帮你省掉一些自己摸索的时间。1. 时序基础模型从“调参侠”到“预训练优先”1.1 为什么时序预训练这两年突然能打了先说结论时序基础模型的核心并不是“用了Transformer”而是把“预训练微调”这套在NLP和CV里被验证过的范式真正搬到了时间序列上。以前做时序预测基本是拿到数据先做季节性分解、差分平稳化然后根据业务场景去调ARIMA、GARCH或者LightGBM模型选择、特征工程和调参占了大半工作量。而这一批工作里预训练模型先在大量不同领域的时间序列上学习通用的时序模式下游任务只做轻量微调甚至zero-shot整个工作重心从“调模型”变成了“设计数据接口和微调策略”。为什么以前做不成因为时间序列不像文本有“词”这种天然离散、语义统一的单位。股票序列和电力负荷序列放在一起量纲不同、采样密度不同、周期模式不同很难定义一个通用的“token”。早期跨数据集预训练效果一直不温不火直到大家把两件事想明白一是把序列切成patch用patch内部的时间局部性作为通用表征单元二是做实例归一化把每个序列都缩放到标准尺度上学习预测完再还原回去。这两招叠加预训练模型才真正有了跨域迁移的底子。1.2 复现和使用时最容易忽略的几个细节第一是patch大小和stride的选择。patch越大序列被压缩得越狠长程依赖更容易被捕捉但局部细节丢失也越明显。我实测下来以小时粒度为主、周期明显的电力/流量数据patch取16到32、stride取8通常比较稳高频传感器数据比如毫秒级振动patch要压到4到8。这个参数在很多论文里被一笔带过但它的影响往往比换模型结构还大。第二归一化一定不要用全局统计量。有人复现时图省事拿整个训练集的均值和方差做归一化预测完再整体还原。离线实验看着没问题一旦上线做在线预测未来数据还没来统计量是未知的整套流程直接失效。正确做法是对每个输入序列单独计算均值和方差预测完再反归一化。这也是为什么最近的方法都在强调“实例级”归一化。第三微调时不要所有层都解冻。我做实验时发现全量微调的效果反而比只微调最后两三层差。原因在于时序预训练模型学到的规律本身就比较通用全量微调会把跨域的通用知识冲掉。冻结前面的特征提取层、只微调输出层在很多场景下不仅省显存效果还更好。如果你只是想快速验证基础模型的价值别一上来就自己训练大数据集先在公开权重上做一轮zero-shot评估再决定要不要微调。2. 非平稳建模模型翻车的最常见原因2.1 非平稳到底难在哪很多同学对非平稳的理解还停留在统计课的ADF检验上以为p值大于0.05就是非平稳。但从模型视角看真正让模型翻车的是分布随时间发生了变化训练集学到的均值方差、自相关结构、季节模式到了测试集已经不再成立。举两个我做过的业务例子。电力负荷数据某地区大批用户装了分布式光伏后午间负荷曲线的形状整个变了某电商平台的商品销量序列大促前后不仅均值变了日内的周期模式也变了。这种变化不是简单差分能去掉的。更麻烦的是非平稳和预测任务之间存在一个天然矛盾长期预测需要依赖一段“持续可用的时间结构”而数据偏偏在这段时间里发生了漂移。你越是试图把数据平稳化越容易把真正有用的趋势信息比如level shift和斜率变化也一起抹掉但如果不平稳化模型又会被原始尺度的大幅波动带偏。最近好几篇论文把这个矛盾专门拎出来讨论这已经是时间序列方向一个公认的核心问题。2.2 三类值得试的做法以及它们的代价第一类先平稳化、预测后再还原的改良。典型做法是把差分、季节性分解和实例归一化组合使用预测平稳残差再把趋势加回去。这类方法实现简单、落地快对近似周期且缓慢变化的数据效果很好。代价是分解环节的误差会被放大分解太激进会把低频有效信息也当作噪声丢掉所以分解参数要在验证集上专门调一下。第二类在线适应。就是在测试阶段利用测试序列本身的信息实时更新模型参数可以理解成模型一边预测一边重新校准。分布发生突变比如突发促销、极端天气这类方法尤其有效但因为推理时要反向传播单次预测的耗时明显变大。如果做线上服务我建议只对归一化层做在线适应或者在一个很小的子网络上做否则服务压力扛不住。第三类频域分离。长周期的趋势变化集中在低频端短期突发波动集中高频在频域里做高低频加权或滤波可以让模型只关注稳定的低频趋势同时不被高频噪声误导。这个思路和第4节讲的频域方法是一脉相承的在非平稳场景里值得一试。处理非平稳问题先搞清楚你的数据里到底主要是均值漂移、方差变化还是季节模式改变再选对应的方法比直接换模型靠谱得多。我有一个偷懒的检验法把训练集和测试集都做一次简单统计对比均值、标准差和主导周期差异超过阈值就可以考虑上非平稳建模的手段了。3. 不规则采样与概率预测从玩具数据走向真实业务3.1 不规则采样时间戳本身也是信息标准的时间序列数据集都是等间隔采样但真实业务里大量数据是不规则的。比如电商订单高峰期一秒好几条凌晨十分钟一条ICU里的生理监测血压、心率采样频率不同中间还有大量缺失。早期处理办法无非是重采样到统一网格或插值数据稀疏时插值会引入很大偏差而且会抹掉“这段时间没有数据”这个信号本身。这一轮投稿里我注意到的共同趋势是直接把观测时间点当作模型输入而不是先强行平均到网格上。落地思路大致有两种。一种是连续时间模型比如神经常微分方程把隐状态随时间的演化建模成连续轨迹观测只在某些时刻“刷新”它。另一种是把时间戳编码成连续特征在注意力机制里显式建模时间间隔对依赖强度的影响。第二种尤其适合工程因为改动很小现有Transformer可以直接接。如果你想快速测试不妨先试把相邻观测的时间间隔作为额外特征拼进输入很多场景下就能看到收益。3.2 概率预测仅仅预测一个值远远不够为什么概率预测在NeurIPS上的占比越来越高因为业务侧真正需要的往往不是一个点估计而是“5%到95%的区间落在哪”。库存管理里你告诉系统明天销量500件系统还要知道如果到800件会不会缺货电网调度里置信区间直接决定备用容量的报价。预测一个数再准也回答不了这类风险问题。实现上概率预测大致有三条路线参数化分布、分位数回归、集成或贝叶斯类方法。三者的核心区别我整理成了表格路线核心思路训练损失优点主要坑参数化分布网络输出分布参数负对数似然 / CRPS能直接求任意分位数分布假设太强厚尾数据容易低估极值分位数回归同时输出多个分位数Pinball对分布形态不敏感不同分位点之间可能出现顺序错乱集成/贝叶斯多个模型估计不确定性MSE 分歧度量能区分偶然与认知不确定性推理成本高部署麻烦评估上CRPS正逐渐取代负对数似然成为更主流的选择。原因在于CRPS既对预测分布的整体形态敏感又和业务侧的区间需求直接挂钩。如果你做的是有决策风险的业务建议同时报告CRPS和预测区间覆盖率别只盯着点预测的MSE。3.3 两者结合离散事件业务里的“区间时间”预测把3.1和3.2放在一起你会发现一个更贴近业务的场景数据既不规则、又需要区间预测。比如交易反欺诈的时间窗口预测事件到达时间是随机的你却要给出未来一段窗口内发生风险的概率区间。这类任务里时间间隔特征、概率输出的网络头、CRPS损失三者常常出现在同一篇论文中。一个比较容易被忽略的操作是对时间间隔做log变换再输入模型。因为原始间隔的分布往往严重右偏直接喂给网络会影响梯度这个小细节实测下来对结果稳定性帮助很大。4. 频域与谱域视角换个坐标系看时间序列4.1 为什么频域方法在长周期预测上这么能打时域里一个明显的季节性周期要等模型看到足够多个周期才能“学会”位置一偏移卷积和attention可能又需要重新学习一遍。但在频域里同一种周期模式对应的是固定的频率分量模型只需要感知“这个频率的强度有没有变化”。这就是频域方法在长周期预测上的天然优势。具体做法上FFT把序列变换到频域后得到的是功率谱和相位信息。常见方案有两种一种是对功率谱做阈值截断只保留能量占主导的若干频率分量把这些分量作为辅助输入喂给Transformer另一种是在频域里做attention让不同频率分量之间互相加权。时域attention关心的是“点与点”的关系频域attention关心的是“成分与成分”的关系两者互补性很强。所以很多实际有效的方案都是时频双通道一个分支做patch建模一个分支做谱域建模最后融合输出。4.2 频域实操里的几个坑频域不是银弹我用下来踩过的坑主要有三个。第一不加窗直接FFT会带来频谱泄漏。序列长度如果不是周期的整数倍频域里会出现本不该存在的旁瓣模型容易学到假的频率。解决办法是FFT前先乘一个汉宁窗或海明窗这个预处理步骤很小但经常被论文忽略。你可以在自己的数据上对比一下加窗和不加窗的功率谱差别一眼就能看出来。第二高频分量和噪声的边界很难划。业务数据里的高频往往就是噪声但一刀切滤掉又可能丢掉突然的真实信号。我建议在验证集上先做一次“频率保留清单”保留能量占比达到一定阈值比如95%的频率其余直接裁掉。这样至少能保证过滤操作是数据驱动的而不是拍脑袋决定低通滤波的截止频率。第三复数的处理方式。幅度谱包含了周期性强度的主要信息相位信息往往只在需要时间对齐时才发挥价值。所以我的经验是先用幅值谱做特征如果模型出现时间对齐上的错误再把相位信息作为额外通道加进来不要一上来就把实部虚部全部丢给模型那样只会增加参数量和过拟合风险。5. 论文阅读顺序和我的复现踩坑记录5.1 建议的阅读路线如果你是从零开始进入时间序列方向我不建议直接按标题从头读到尾那样读两天就分不清谁是谁了。我建议按依赖关系来读先读“patch 实例归一化 Transformer”的组合这是目前时序基础模型的地基。再读非平稳方向重点理解“平稳化和预测能力之间的权衡”是怎么被定义出来的。接着读频域方法看长周期预测需要什么样的结构支持。最后读概率预测与不确定性把预测结果从点值升级成区间。这个顺序的逻辑是先建立“数据如何喂给模型”的直觉再理解“数据本身发生了什么变化”然后理解“模型结构能做什么”最后才考虑“预测结果如何量化风险”。反过来读也不是不行但你会经常碰到“为什么要这么做”的困惑效率会低不少。5.2 复现时最容易踩的四个坑数据泄露之一切分顺序。很多人做时序预测先切train/val再做归一化测试集的统计信息就顺着归一化泄露进来了。先完成所有时间切分再独立计算两边的统计量这个看起来简单的习惯能避免大量“伪SOTA”。数据泄露之二概率预测的评估。预测区间时如果评估时拿了训练数据的上下界给测试集打分结果会乐观到离谱。我第一次复现概率预测时区间覆盖率报了98%后来发现是评估协议里用错了数据集真实数据只有87%左右。指标口径。同样是MSE有的论文用全局归一化后的MSE有的一律用每个序列独立归一化后的MSE数字能差好几倍。对比结果之前先确认他们到底用的哪个评估协议。随机种子和优化器。这类任务对初始化和学习率特别敏感同一个模型换一个seedMSE能波动几个百分点这时候硬比论文里的数字没有意义。我通常跑5到10个seed取中位数再去做结论。最后再分享一点我自己的体会。去年我把一个论文里的基础模型搬去做真实的跨域预测前前后后折腾了一个多月最后发现最大的收益不在模型结构而是我把归一化从“全局”改成“实例级”、并在频域加窗之后得到的提升。论文里的SOTA列表可以当作方向参考但真正决定线上效果的往往还是那些论文里不写明的配套细节。如果你也想在这个方向深入我建议先把上面说到的这些基础操作吃透再挑一两个最贴近自己业务痛点的小点去优化比如非平稳场景的在线归一化、概率预测的CRPS校准、频域方法里的加窗和阈值保留。这些小改动放进论文里可能不够起眼但在真实数据上它们往往比换一个复杂模型带来的提升更稳定也更容易向业务方解释。时间序列预测这个方向正在从“刷榜”走向“解决问题”这也是我觉得它越来越有意思的原因。
返回列表