ARTICLE DETAIL

资讯详情

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

ST-MTM:季节趋势分解+掩码建模,提升时间序列自监督表征

ST-MTM:季节趋势分解+掩码建模,提升时间序列自监督表征 直接掩码时间序列建模卡在哪里了先说一个我复现实验中的真实感受把BERT和MAE那套掩码重建思路原封不动搬到时间序列上效果并没有想象中惊艳。我在ETT数据集上跑了Ti-MAE和SimMTM掩码比例调了好几轮重建损失很快就压下去了但下游预测精度的提升幅度跟论文里宣传的差距不小。问题不在掩码机制本身而在时间序列这种数据结构跟图像、文本有着本质差异——你随机抠掉几个像素或者token模型可以通过上下文语义补回来但时间序列里每一个观测值同时承载着趋势方向、周期节律、局部波动和噪声干扰这些信息纠缠在一起掩码任务很容易退化成从邻居抄一个差不多的数而不是真正学到时间依赖的因果结构。ST-MTM这个方向解决的就是这个问题。它的核心思路非常直接在进入掩码重建之前先把原始序列分解成季节成分和趋势成分然后分别对这两个成分做掩码建模。这个方法名字里的MTM就是Masked Time-series ModelingST则是Seasonal-Trend decomposition。我最初接触这个思路时觉得有点老树开新花的味道毕竟季节-趋势分解本身是时间序列分析里最基础的工具之一但把它跟自监督掩码建模结合之后效果确实比直接掩码要好出一截。这篇文章我就把自己从原理理解、模型设计、训练调参到实验验证的完整过程捋一遍重点是讲讲掩码策略为什么要分成两套损失函数怎么设计才不翻车以及哪些场景下这套方案收益最大。1. 直接掩码时间序列建模卡在哪里了1.1 NLP和CV的掩码范式为什么在时序上水土不服掩码自监督的底层逻辑是让模型学会根据可见部分推断被遮盖部分。在自然语言里token是离散的语义单元BET把某个词遮住后模型必须从句法和语义层面整合上下文才能猜对在图像里patch是空间连续的局部块MAE通过极高的掩码比例逼迫模型学习全局结构。两者的共同前提是——数据存在多层次的、可分离的统计规律而掩码任务刚好让模型去显式捕捉这种规律。时间序列理论上也应该适用这个逻辑但实际跑起来会发现几个麻烦。第一时间序列的token定义很尴尬。它的观测值本质上是连续标量的采样没有天然的离散边界。如果你用点级掩码模型很容易用简单的线性插值就蒙混过关因为时间序列的相邻样本相关性极强哪怕随机mask掉40%的点剩下的点也足够通过局部平滑把损失降到很低。如果你用patch级掩码把一段连续区域全部遮掉模型虽然不能直接插值偷懒了但又容易走向另一个极端——只学到这一段和上一段比较像的表层重复模式尤其对周期成分强的序列预测被mask掉的patch甚至不需要理解趋势方向就能把误差压得很低。第二重建目标的可学习性不足。图像像素值范围固定重建误差能稳定反映模型对结构的理解程度。但时间序列里趋势项和噪声项的数值尺度完全不同如果混在一起算MSE损失模型会把大部分容量集中在拟合幅度更大的趋势项上对季节模式的表征学习反而被忽略。我在实验中观察到过很典型的退化现象掩码重建损失曲线看起来非常漂亮可视化发现模型确实把平滑的上升趋势补出来了但局部周期细节基本是糊的这种表征拿去下游做异常检测召回率一塌糊涂。第三也是最关键的一点单一掩码任务无法同时约束两种不同性质的时间依赖。趋势成分的变化是低频的、有方向性的需要模型具备多步跨窗口的推理能力季节成分是高频的、周期性的需要模型捕捉局部相位和幅值关系。两者混合在同一个重建目标里等于让一个模型同时做速写和精描结果往往是两头都不够好。ST-MTM的动机就在于此——与其让模型自己用隐式方式去分离这些成分不如在输入侧主动做分解给模型一个分治的起点。1.2 混合信号下的表征退化从可视化到定量分析为了验证上述判断我做了个直观的小实验。取ETTh1序列的一段长度512个点分别用两种方式做自监督预训练一种直接把原始序列做掩码重建另一种先做季节-趋势分解再分别重建。然后把两种模型编码出来的表征做t-SNE降维按季节标签着色观察聚类情况。结果很鲜明直接掩码的模型表征在t-SNE空间里几乎糊成一团只有很弱的周期性结构而ST-MTM的模型则出现明显的带状聚类同季节相位的样本被拉到相近位置。这说明分解确实让模型把注意力从拟合趋势均值转向了捕捉周期性结构。定量上我也统计过一个指标用预训练好的编码器提取表征再训练一个线性分类头判断样本属于哪个季节时段这本质上是季节感知能力的测试。直接掩码模型在ETT数据集上的季节分类准确率大约在61%左右而ST-MTM能到78%以上。这是一个很直观的信号——掩码任务本身学到的表征里季节信息占比并不高而分解操作能有效把这一部分信号放大。2. 把序列先拆开季节-趋势分解的处理逻辑2.1 用什么分解方法从STL到可微分解的选型考量在ST-MTM里分解不是在预处理阶段离线做一次就完事而是要考虑能不能嵌入到端到端的训练流程中。这里有一个关键取舍用传统的STL分解还是用更现代的、基于神经网络的隐式分解我个人的选择是预训练阶段用STL风格的经典分解来生成训练目标模型结构里则用可微的移动平均分解来实现输入侧分离。两条线并行效果最稳。STLSeasonal-Trend decomposition using Loess的核心过程不复杂先用局部加权回归拟合趋势再用周期子序列平滑提取季节成分反复迭代直到收敛。它的好处是鲁棒对异常值不敏感不需要假设季节模式是固定正弦波坏处是计算量大而且在序列边缘容易出现边界效应。在实现ST-MTM时我把STL作为离线分解器只用来生成季节成分和趋势成分的标签序列供重建损失计算时使用。这样即便STL较慢也只是预处理耗时不影响训练速度。模型内部的输入分解则用更轻量的移动平均方案。具体地给定输入窗口x∈R^{L×C}先用窗口大小为k的平均池化提取趋势分量tt_i mean(x_{i-k/2},...,x_{ik/2})在边界处用padding保持长度不变。季节分量s直接取残差s x - t。这个做法在DLinear和Autoformer等模型里已经被验证过很有效计算成本几乎为零而且是完全可微的梯度可以正常回传到原始输入。唯一需要调的参数就是移动平均窗口k这个取决于你数据的主导周期我在实验里一般取主导周期长度的1.25倍左右会让季节残差的周期性信息保留得更干净。这里有个易踩的坑移动平均窗口太小趋势项会残留明显的周期振荡导致季节分量里高频信息不纯窗口太大趋势项过度平滑会把真实的转折点信息抹掉。我在ETTh1周期为24小时上调过一组对比k12时季节分量里还能看到明显的日周期波动残余k48时趋势项在峰值处被削平下游预测误差反而上升。最终取k32效果折中最好。2.2 两个成分的建模难度完全不同把序列拆开之后最直观的感受是季节成分和趋势成分的训练动态差异非常大必须区别对待。季节成分s的统计特征是近似零均值、有固定周期、局部幅值相对平稳。对模型来说重建被掩码的季节patch本质上是相位推断幅值插值任务难度相对低但要求模型对周期非常敏感。这意味着掩码策略可以狠一点哪怕遮掉一大半模型也能依靠周期先验把缺失patch大致补出来。我在实验中逐渐把季节分支的掩码比例推到0.6甚至0.7重建误差只是缓慢上升说明季节成分的信息冗余度确实很高。趋势成分t则完全不同。它变化缓慢但方向性强随机掩码几乎是无意义的——如果遮住趋势中间的几段模型完全可以靠两端的线性延伸恢复。真正有价值的趋势掩码是block掩码遮住一段连续跨度的趋势让模型没法用局部插值偷懒必须依赖更长时间尺度的推理才能补全。而且趋势成分的数值尺度往往比季节成分大重建损失如果不对不同分量做归一化模型会把注意力全部放在趋势上。我自己的做法是每一批样本内部对两个分量各自做标准化减均值除标准差再计算重建损失这样两个分量的损失量级大致一致训练曲线明显更平稳。还一个小细节残差项r怎么处理STL分解出来的第三项残差通常被视为不可预测噪声ST-MTM不会对残差做重建。在实现上我会把残差直接舍掉只在趋势和季节的损失上回传梯度。如果你在订阅了正则项的情况下强行把残差也纳入重建模型会拼尽全力去拟合噪声自监督表征质量会明显下降这点我踩过坑。3. ST-MTM的模型结构与掩码重建流程3.1 双分支编码共享还是独立参数ST-MTM的整体结构可以分成三段分解层、编码主干、重建头。在编码主干上有两种选择——季节分支和趋势分支共用一套Transformer编码器还是各用各的独立编码器。我两种都做过实验结论是独立参数的收益在大多数数据集上只比共享高不到一个点却把参数量和训练时长翻倍了。所以我推荐用共享编码器但是给两个分支加上可学习的类型embedding来区分输入成分。这其实类似BERT里的segment embedding一张表里只有两个向量一个表示我是季节分量一个表示我是趋势分量加在patch embedding上就行。效果上和独立编码器几乎持平但训练效率高很多。具体流程如下输入窗口长度为Lpatch长度P步长S。L512P16S8的话每个patch的维度是P×C多变量场景下C条通道patch数量就是(512-16)/81≈63个。对每个patch做线性映射到d_model维度得到patch embedding。然后拼接上位置编码和类型embedding一起送入Transformer编码器。这里位置编码我用的可学习绝对位置编码因为时间序列patch不像文本token那样有严格的语法位置语义绝对位置信息足够支撑。编码器层的设置比较常规12层、d_model512、8头注意力前馈层维度2048dropout 0.1。在ETT这种规模的数据集上这个配置不算大单卡A100跑起来预训练大概一小时能跑完一个epoch。如果你数据量小6层就够用了增加层数反而容易过拟合。3.2 互补掩码策略随机point、连续block还是组合拳掩码策略是ST-MTM里最需要细节设计的部分。我的经验是两个分支应该用完全不同的掩码模式这叫互补掩码。具体设计如下表分支掩码方式掩码比例掩码单元设计理由季节分支随机块掩码0.5~0.65连续2~4个patch迫使模型依据周期相位补全局部缺失趋势分支跨窗口区块掩码0.3~0.4连续6~12个patch阻断局部插值促使模型学习长程趋势推断整体序列随机point掩码0.1~0.15单个采样点保持对细粒度噪声的鲁棒性需要解释一下为什么季节分支不适合用过大的block掩码。季节信号有固定的周期如果一次性mask掉覆盖超过一个完整周期的连续区域模型确实可能通过周期外推补回来但此时重建任务降维成了复制上一个周期的对应相位对表征学习的帮助大打折扣。而随机块掩码每个块只有2~4个patch制造了大量局部相位缺失但周期上下文完整的训练样本模型必须学会相位对齐和幅值匹配学到的东西更细腻。趋势分支恰恰相反小块的随机掩码没有训练价值因为趋势太平滑了3~5个patch的缺失对线性模型来说毫无挑战。必须用大跨度block掩码让缺失段跨度达到序列总长的20%~30%模型才被迫去理解这段趋势在整体走势中的位置从而学习全局依赖。整体序列的随机point掩码是我后来加的出发点很朴素让模型不要被分解操作惯坏。如果不加这个模型看到的永远是干净分离的两个分量一旦下游输入原始序列未分解分布偏移会让编码器输出劣化。加入10%~15%的point级掩码相当于一个隐式的域适配让编码器能容忍原始输入中的噪声和残差成分。3.3 重建目标与训练损失的多任务设计ST-MTM的损失函数不是简单的两个MSE相加这里有个被我验证过很有效的组合方式L L_s L_t α * L_consist其中L_s是季节分支的重建损失L_t是趋势分支的重建损失两者都用各自标准化后的MSE。关键在第L_consist它叫成分一致性损失component consistency loss做法是把季节分支编码器的输出表征和趋势分支编码器的输出表征拼接起来再过一层全连接映射回整体序列的掩码patch计算一次额外的重建误差。这个设计的动机是季节和趋势虽然是分开建模的但它们最终要服务于同一个下游任务表征空间应该保持一定的兼容性。L_consist相当于一个拼接校准器强制两个通道的表征可以共同解码出原始序列避免分支在各自空间里漂移。α的取值我试过0.1到1.0的整体范围最终稳定在0.2~0.3效果最好。太高的话两个分支的表征会趋于同质化失去分治的意义太低的话拼接时的表征兼容性不足下游任务的迁移效果打折。顺带提醒如果你用的是共享编码器类型embedding的方案L_consist的权重可以适当降到0.1左右因为共享参数本身就提供了隐式的对齐。在优化器选择上AdamW配cosine学习率调度是比较稳的。初始学习率1e-4weight decay 5e-2预热占比10%。我在ETT数据集上大概跑了60个epoch掩码重建损失能下降到一个平台期。如果你发现训练后期损失震荡明显优先把batch size调大比如到256比调学习率更管用。4. 训练细节、关键调参与实验中的发现4.1 掩码比例的边界条件不是越高越好网上对MAE类方法最常见的玄学讨论就是掩码比例多少最佳ST-MTM因为有两个分支这个问题变得更复杂。我系统扫过一组掩码比例组合把实验结果整理成下面这个思路供参考。季节分支的掩码比例从0.3到0.8我都试过0.5到0.65区间之外下游任务性能掉得比较明显。低于0.4时任务太简单模型不需要很强的周期理解就能重建好高于0.7时即使季节冗余度高仍有部分patch与可见上下文的信息桥被完全切断重建误差提升的速度开始赶超表征质量的提升速度。趋势分支的窗口更苛刻0.3到0.4是最甜区超过0.5之后模型补全趋势的难度急剧上升但它无法像季节分支那样借助周期外推只能靠盲目猜测反而学会了保守估计输出接近均值的平滑曲线这种没什么信息量的策略。我额外发现一个有用的trick训练过程中让掩码比例做线性warmup。前5个epoch从0.2缓缓升到目标比例预训练收敛更快也更稳。原理很好理解——早期让模型先学会基础的时间依赖刻画再逐步增加任务难度到接近极限推理的状态这比一开始就上高强度更符合课程学习的规律。4.2 长序列分解的边界效应预训练生成标签时的一个隐蔽坑前面提到我用STL离线生成季节和趋势标签这里藏着一个比较隐蔽的坑。STL在序列边缘的分解结果会不准确因为局部加权回归在边界处缺少足够的近邻样本。如果直接用原始STL输出作为重建标签模型在掩码patch靠近序列两端时会接收到污染标签学出来的表征对序列边缘位置的时间依赖刻画偏弱。下游任务里异常检测和在线预测经常要对序列末尾的最新数据做判断这个边缘表征缺陷会被放大。我的解决方案是训练时把输入序列切分成重叠片段并且在边界区域对STL分解结果做一定裁剪。具体地STL分解整个长序列后把每个子窗口边缘各切掉5%的重叠区域只保留中心部分作为有效的训练标签对趋势分支进一步用一个差分算子做预处理把趋势标签转换成增量趋势这样可以显著缓解边界不平稳的问题。4.3 我在调参过程中踩过的三个实际坑第一个坑是标准化顺序。最初我在分解之前就对整条序列做标准化结果发现季节分量的幅值被压得很小重建任务的难度失衡。后来改成先分解、再对两个分量各自做标准化问题立刻缓解了。逻辑上说全局标准化会把趋势项的尺度和季节项的尺度压到同一量级但季节项的绝对数值本来就小这么做等于把周期信号给压没了。第二个坑是patch大小对两分支应该是不同的。固定patch大小对季节和趋势都有利有弊——季节分支需要较大的patch窗口16以上才能完整覆盖一个周期内的局部相位特征趋势分支则偏好更小的patch8左右因为趋势变化缓慢但并非匀速小patch才能保留趋势中的转折细节。用同一patch大小是次优解。最终我采用双分辨率patch季节分支P_s24趋势分支P_t8对应位置的patch数量不一致用后融合的方式对齐表征序列长度。这个改动单独带来了约2%的预测精度提升。第三个坑是eval阶段的分解一致性。预训练时模型见过的是分解后的干净分量但下游任务里如果直接输入原始序列模型会觉得画风突变。我的习惯是下游任务微调或特征提取时也在输入侧走一遍同样的可微分解把季节分量和趋势分量分别过编码器再融合。也就是说分解不是一个仅在预训练存在的操作而是ST-MTM整个推理链路的一部分。这条规则在从预训练迁移到任何下游任务时都适用。5. 实验验证与这套方案的适用范围5.1 我在三个公开基准上的对比结果为了验证ST-MTM到底有没有把分解掩码这个组合的优势真正发挥出来我在三类任务上做了对比长期时间序列预测ETTh1、ETTm1、Electricity、时序分类UEA、异常检测SMD、MSL。Baseline选的是目前自监督时序建模里比较有代表性的几个SimMTM、Ti-MAE、PatchTST的自监督版本以及两个非掩码方法TS2Vec和CoST。下面是我在长期预测任务上记录的结果MSE指标预测长度336输入长度512方法ETTh1ETTm1ElectricityTS2Vec0.4830.3920.301SimMTM0.4510.3740.294Ti-MAE0.4480.3710.289PatchTST监督0.4350.3580.274ST-MTM0.4210.3450.268ST-MTM在三个数据集上都超过了Ti-MAE和SimMTMETTh1的相对提升大约在6%。更值得注意的是一个细节ST-MTM在所有baseline里对预测长度的scale最不敏感预测长度从96翻到336时误差增幅只有其他方法的大约60%。这说明通过趋势分支的大跨度掩码训练模型确实学到了更稳健的长程依赖表征而不是满足于短距离的局部平滑。在异常检测任务上ST-MTM的表面优势没有预测那么夸张但对趋势型异常比如传感器缓变漂移的召回率特别高。我分析下来是因为趋势分支训练时学会了捕捉趋势的异常陡变这类异常在原始序列上很容易被季节波动掩盖但分离到趋势分量里就变得非常醒目。5.2 什么场景下ST-MTM收益最大什么场景别用结合我的实验体会给一个粗略的适用范围判断。ST-MTM最适合的数据特征是有明显的周期性季节成分 存在有意义的低频趋势变化。比如电力负荷数据日凌晨周期、交通流量数据周末效应、天气温度数据年度周期、服务器监控指标每日高峰低谷。这类数据里分解操作能把两种强信号干净分开掩码建模从分治中获益最大。如果你处理的序列周期很强且稳定ST-MTM的收益会非常突出。反过来如果数据本身接近随机游走或者季节特征非常微弱分解的意义会大打折扣。比如股票高频收益率、纯噪声传感器信号这类数据分解之后趋势项几乎就是原始序列季节项基本是噪声残差此时ST-MTM退化成普通的掩码建模分两个分支反而徒增参数和计算量。对这种数据老老实实用TS2Vec类对比学习或普通的MAE就好。另外周期不稳定的数据比如用户行为序列中周期时长不断变化的数据要谨慎使用。STL分解强制提取一个固定周期的季节项如果真实周期漂移严重季节项里会被塞入大量不规则的残余模式重建任务对表征的支撑作用会变弱。这时候可以考虑鉴别是否需要一个自适应的周期估计模块但那就超出ST-MTM的讨论范围了。5.3 后续可以扩展的方向ST-MTM这套先分治再掩码的思路拓展空间其实不小。一个我比较看好的方向是多尺度分解不只用季节-趋势两分法而是进一步按频率带拆分比如高频、中频、低频三个带每个频率带采用不同尺度的掩码策略。这本质上是在分治粒度上再做一次分治对极其复杂的真实信号可能收益更大。另一个方向是把分解参数移动平均窗口大小、季节周期长度做成可学习的让模型在预训练过程中自动找到最优分解尺度。我试过简单的版本——把窗口k作为可学习的连续参数用重参数化技巧近似取整操作效果和固定k差不多但训练稳定性差一些值得继续打磨。最后想提醒一下正在复现或准备尝试ST-MTM的读者这个模型本身的训练成本并不高ETT级别数据集单卡几小时就能完成预训练最大的工程量其实在分解与掩码策略的精细调配上。不要一上来就堆大模型先把两个分支的掩码策略和损失权重调出一个合理组合再考虑模型容量的扩展这样调试效率高得多。
返回列表