xPatch:长时间序列预测下一种低成本的Transformer有力竞争者
本帖最后由 yinda_peng 于 2026-5-29 11:56 编辑论文标题:xPatch: Dual-Stream Time Series Forecasting with Exponential Seasonal-Trend Decomposition
核心内容:
[*]提出新型双流架构 xPatch,基于指数分解思想
[*]引入季节-趋势指数分解模块,受经典指数平滑启发
[*]设计 MLP 线性流与 CNN 非线性流协同建模
[*]在非 Transformer 模型中探索分块(patching)与通道独立(channel-independence)技术
[*]构建鲁棒的反正切(arctangent)损失函数,缓解过拟合
[*]采用 Sigmoid 形式的学习率调整策略,提升训练稳定性与预测性能
作者介绍:Artyom Stitsyuk (第一作者),韩国科学技术院 KAIST 统计人工智能实验室 SAIL 的核心成员,专注于时间序列预测、可解释AI等前沿领域
Jaesik Choi (通讯作者),在 KAIST 统计人工智能实验室 SAIL 有个人页面https://sail.kaist.ac.kr/members/jaesik/
一、研究背景
在Long-term time series forecasting (LTSF) 长时间序列预测方面,基于Transformer的模型(Vaswani等,2017)彻底改变了长期时间序列预测(LTSF)任务,使强大的人工智能系统得以实现当前最优性能。Transformer架构被认为在捕捉长序列中各元素间的语义关联方面极为有效。Transformer 中采用的自注意力机制具有排列不变性。尽管位置编码等技术能在一定程度上保留顺序信息,但如何有效保持时间信息仍是基于 Transformer 的模型所面临的一大挑战。这一局限性会对处理连续点集的长时序预测(LTSF)任务性能产生不利影响。因此,一种仅使用多层感知机(MLP)网络的简单线性方法(Zeng 等,2023)已对 Transformer 在 LTSF 任务中的有效性提出了质疑。令人惊讶的是,一个名为 DLinear 的简单线性模型已超越此前所有基于 Transformer 模型的最先进预测性能,由此引发了一个根本性问题:“Transformer 是否真正适用于长时序预测?”
二、分解方法
本研究引入了指数型季节-趋势分解技术。此外,我们提出了一种结合权重衰减的鲁棒反正切损失函数,以及一种可提升训练适应性的新型学习率调整策略。同时,我们设计了xPatch,一种全新的双流网络架构,该架构融合了卷积神经网络(CNN)、多层感知机(MLP)、分块处理、通道独立性、指数型季节-趋势分解以及双流预测机制。2.1 简单移动平均(SMA)的缺陷SMA是一种用于分解时间序列数据的方法,可以将一个时间序列分解为趋势性成分XT和季节性成分XS,趋势指的就是数据曲线的走向,上升下降,季节也很好理解,是一种周期性的特征,比如我们知道春天多雨,夏天热,秋天干燥,冬天冷。大多数情况下,季节性成分是非线性的且平稳的,而趋势成分则是线性的且非平稳的。图中给出了SMA的计算方法,就是一个简单的滑动窗口,窗口长度为k,默认步长取1,对窗口内的数据进行求平均值的操作得到XT的数据点st。熟悉滑动窗口的小伙伴都知道,对一列数据进行滑窗分解之后,得到的数据点很可能少于原始数据个数。为了解决数据个数不一致的问题,SMA使用的是Padding操作,即重复第一个数据点以及最后一个数据点以达到分解后仍保留足够的数据点个数,这样季节性成分就可以用原始数据点减去st一一对应得到。但SMA有这样的缺陷:1.会丢失重要的趋势特征,从Figure1可以看出来上面的蓝色趋势性成分曲线很明显在反映上升的过程时丢失了原数据迅速爬升的特征
2.对齐操作需在序列两端填充,易扭曲首尾部分
3.简单移动平均(SMA)生成的趋势过于简单、特征贫乏4.SMA 导致季节性模式复杂难解,故需探索替代分解方法
2.2 指数移动平均EMA指数移动平均不需要进行填充操作,很大程度上避免了特征丢失和扭曲的问题。图中的计算公式可以看到,分解的第一个点等于第一个数据点x0,随后的分解点基于前一个分解点和当前的原始数据点计算得来,其中α是一个参数,介于0和1之间,分解点依旧是趋势性成分,季节性成分的计算与SMA一致。容易想到的是,α越大,趋势性成分越接近于原始数据,而季节性成分就越趋于零。从Figure2可知,对于这个序列数据,α取0.3就可以达到很好的效果。指数法能更精准地调控趋势成分和季节性成分的行为。由于数据可能呈现多种模式,包括具有不同周期和行为特征的平稳与非平稳特性,因此指数分解方法在特征提取方面更具适应性。与简单移动平均法相比,指数移动平均法在分解过程中展现出更高的灵活性,其权重分配机制基于数据点的指数衰减规律。这种适应性使指数移动平均法能更有效地捕捉趋势变化,因而特别适用于具有动态性和演化性模式的时间序列。
三、模型架构时间序列可以是多元的,也就是包含多个变量,例如风力、温度等,处理时一个个变量来处理,每个单变量序列均经过指数分解处理,随后其趋势成分和季节性成分分别输入双流网络进行处理。这里采用的方法是把趋势性成分放入一个线性块处理,而季节性成分用非线性快结合CNN来处理。线性块的构成是:全连接层->平均池化->层归一化->全连接层->平均池化->层归一化->全连接层。是一种基于多层感知机MLP的网络,包含平均池化和层归一化,且有意省略激活函数,以突出线性特征。分解后的数据依次通过两个线性模块,每个模块由一个全连接层、一个核大小k = 2的平均池化(用于特征平滑)以及层归一化(用于训练稳定性)组成。每个线性层与平均池化操作均参与降维,促使网络高效压缩特征表示,以适配有限的空间容量。这种特征数量的缩减,结合无激活函数的设计及瓶颈结构,旨在仅保留平滑趋势中最具代表性的线性特征。非线性块的构成是:Paching分块->GELU激活函数->批归一化->深度可分离卷积的CNN->GELU激活函数->批归一化->点级别卷积的CNN->GELU激活函数->批归一化->MLP的Flatten层。其中,深度可分离卷积的CNN->GELU激活函数->批归一化是残差流,残差流(Residual Stream)是 Transformer 架构中层间传递信息的核心通道,它通过残差连接将所有层的输出累加到同一个向量中,形成一条从输入到输出不间断的"信息河流"。MLP展开构成为:Flatten层->全连接层->GELU激活函数->全连接层。最后将特征拼接,再经过一个全连接层,输出最终的预测结果。Paching分块通过滑动窗口对每个单变量时间序列进行展开。我们将分块操作融入非线性模块中,以突出重复出现的季节性特征。借助分块,模型能够更聚焦于这些重复模式,从而更有效地捕捉其模式间依赖关系。在分块处理基础上施加卷积运算,CNN流可捕捉时空模式及块间相关性,重点关注季节性信号中的非线性特征。分块之后,对数据做了一个嵌入操作,目的是扩充维度。由于季节性变化中存在大量零值,我们选用GELU激活函数,因其在零点附近具有平滑过渡特性且具备非线性能力。嵌入完成后,数据进入深度可分离卷积模块(图一)。该方法将计算分解为两个步骤:深度卷积为每个输入通道单独施加一个卷积滤波器;逐点卷积(图二)则对深度卷积的输出进行线性组合,并在二者之间增设一条残差通路。非线性块的MLP,第一层线性变换将隐层维度扩大一倍,第二层线性变换则将其映射回原维度,两层之间采用GELU激活函数。一二最后将两条通路提取的线性与非线性特征进行拼接,分别对应线性块MLP流与非线性快CNN流所学习到的表征。该机制使模型能够在最终预测中动态权衡线性与非线性特征的重要性,从而灵活适应时间序列数据中多样化的模式。
四、损失函数 本文选择的是来自Card模型使用的一种基于信号衰减的损失函数,具体计算如下左图所示,其中,带帽子的x表示预测序列,不带帽子的x即现实数据,T表示预测长度,i指的是未来预测点。设计意图:远期预测的不确定性通常更高(方差大),如果对所有时刻的误差一视同仁,模型可能过度拟合远期的不稳定噪声。通过降低远期预测的权重,使模型更专注于学习近期的可靠模式,从而提升整体泛化性能和训练稳定性。因此,结论是:i 越大,损失贡献越小(权重按平方根倒数衰减)。本文则在信号衰减上使用了arctan的形式,而非按平方根倒数衰减。
五、学习率调整大多数长时间序列预测使用的学习率计算方法如下图,由于模型训练的周期数较少(通常不超过10个周期),这种指数级别的快速衰减方案效果显著。对于训练周期要求更长的模型,比如100轮,使用(19)(20)这样的学习率计算方法更优。Card模型的学习率计算则引入了预热轮数,前 ω个 epoch 内,学习率处于上升阶段;之后学习率开始衰减。预热可以帮助模型在训练初期稳定梯度,避免震荡。文章中则用的一种S型学习率计算方法,k为逻辑增长速率,s为下降曲线平滑率。计算式中第一项:控制学习率从接近 0 上升到约 α0。第二项:从第一项中减去一个同样形状、但更陡或更缓的 Sigmoid,从而在峰值之后产生下降。k越大,曲线从 0 跳变到 α0 的过渡带越窄(即学习率上升越快)。当 s=1:第二项的陡峭程度与第一项相同(因为 k/s=k)。此时两个完全相同的 Sigmoid 相减,得到一条先上升到某个峰值,然后快速下降的曲线(类似于倒 V 形,但圆滑)。当 s>1(例如 s=2,4,5):第二项的指数系数 k/s 变小,Sigmoid 的增长变慢(更平缓)。这意味着第二项从 0 上升到 α0的过渡带更宽。当 s<1(例如 s=0.5):第二项变得非常陡峭,几乎像阶跃函数。整体学习率会在峰值之后迅速跌落到接近 0,几乎没有缓降阶段。
文章用9个数据集,做了两个实验来验证xPatch的优越性和超参数选择,和其它Transformer模型的对比都体现了优越性。 本研究提出了 xPatch,一种面向长期时间序列预测(LTSF)的新型双流架构。xPatch 结合了卷积神经网络(CNN)和多层感知机(MLP)的优势,以实现更优的性能。我们的研究结果表明,融合指数移动平均(EMA)季节-趋势分解模块能够有效捕捉潜在趋势并提升预测精度。双流网络通过动态权衡线性和非线性特征在不同时间序列模式中的重要性,进一步增强了对多样数据模式的适应性。此外,本研究还引入了一种鲁棒的反正切损失函数和一种新颖的 Sigmoid 学习率调整方法,两者均能持续改进现有模型的性能。通过在基于 CNN 的主干网络中探索分块(patching)与通道独立(channel-independence)技术,xPatch 为基于 Transformer 的架构提供了一种有吸引力的替代方案,在保持计算效率的同时实现了更优越的性能。
好的,鱼油!我是FishC的计算机教育专家。刚看完你分享的这篇关于xPatch的论文,它确实是一个很有意思的工作。下面我用通俗的语言,帮你拆解一下这个模型的核心思路,以及它为什么能成为Transformer的“低成本”对手。
一、xPatch解决了什么问题?
在长时间序列预测任务中,Transformer虽然很强大,但它有个天生的“弱点”:自注意力机制不考虑数据点的顺序。尽管可以加位置编码,但这个处理方式在捕捉时间连续性上并不完美。而像DLinear这样的简单线性模型,反而能取得更好的效果,这让人们开始怀疑:对于时间序列,是不是根本不需要那么复杂的Transformer?
xPatch就是在这个背景下诞生的。它想用更轻量、更高效的结构,达到甚至超越Transformer的性能。
二、xPatch的四个核心创新(看懂这四点,你就掌握了它的精髓)
[*]1. 指数分解(Exponential Decomposition)
传统的分解方法(简单移动平均SMA)有个毛病:它会在数据两端进行填充,这会扭曲序列的起始和结尾部分,而且提取的趋势太“粗糙”。xPatch采用的是指数移动平均(EMA),它不需要填充,并且通过一个参数α就能灵活控制趋势和季节成分的分离程度。你可以想象成:EMA给近期的数据更多“关注”,给远期的数据更少“关注”,这样提取的趋势既平滑又保留了局部变化。比如,你有风速数据,EMA能更自然地分离出风速的“总体趋势”(如逐渐增强)和“季节波动”(如昼夜变化)。
[*]2. 双流架构:一条“线性流” + 一条“非线性流”
这是xPatch最巧妙的地方。它将分解后的数据分成两路处理:
[*]线性流(MLP流):专门处理趋势成分。用多层全连接层,中间故意不用激活函数,搭配平均池化和层归一化。目的是只保留最核心的线性特征,像一把“剃刀”剔除噪声。
[*]非线性流(CNN流):专门处理季节成分。先把数据切成小块(Patching),然后用深度可分离卷积和逐点卷积去捕捉块之间的复杂模式。因为季节成分往往包含大量零值和周期重复,所以用了GELU激活函数来保持平滑。最后再通过一个MLP展平。
最后把两路提取的特征拼起来,模型就能灵活权衡线性与非线性的重要性了。这就像请了两个专家:一个擅长看“长期走势”,一个擅长看“周期细节”,最后综合他们的意见做决策。
[*]3. 反正切(Arctan)损失函数
传统均方误差(MSE)对所有预测点一视同仁。但长期预测中,越远的时间点不确定性越大。如果硬让模型去拟合远期的随机噪声,容易过拟合。xPatch采用反正切形式的衰减损失:对近期的预测误差给予更大惩罚,对远期的预测误差自动“放宽”要求。这就像考试时,老师允许你最后一题错得不那么严厉,因为知道它更难。
[*]4. S型学习率调整策略
很多模型用指数衰减学习率,下降太快;或者带预热的衰减,但不够灵活。xPatch用了一种Sigmoid函数组合的方法:先让学习率缓慢上升(预热),达到峰值后又缓慢下降,并且可以通过两个参数(k和s)控制上升和下降的陡峭程度。这种“光滑的倒V形”学习率,能让训练更稳定,尤其适合需要更多epoch(比如100轮)的模型。
三、总结:为什么xPatch是“低成本有力竞争者”?
“低成本”体现在:
[*]模型主要由MLP和轻量级CNN组成,没有Transformer中昂贵的自注意力计算。
[*]参数较少,训练速度快,显存占用低。
“有力”体现在:
[*]指数分解比SMA更灵活。
[*]双流架构能分别提取线性趋势和非线性周期特征,结构更适配时间序列的“趋势+季节”本质。
[*]损失函数和学习率调整策略都考虑了预测任务的特点,训练更稳定、泛化更好。
# 以下是xPatch核心思路的简化伪代码(仅示意逻辑)
def xPatch_forward(x):# x形状: (batch, var_len, time_steps)
# 指数分解
trend = EMA_decompose(x, alpha=0.3)
seasonal = x - trend
# 线性流处理趋势
linear_features = MLP_linear(trend)# 无激活函数
# 非线性流处理季节
patches = Patching(seasonal) # 分块
cnn_features = DepthwiseConv1D(patches)
cnn_features = PointwiseConv1D(cnn_features)
nonlinear_features = MLP_flatten(cnn_features)
# 特征拼接并预测
combined = Concatenate()
output = FinalLinear(combined) # 输出未来预测
return output
总之,xPatch不追求“堆砌复杂”,而是通过“对症下药”的组件设计,用简单、高效的方式赢得了性能。它给我们的启示是:有时候,针对数据特性设计专门的模块,比盲目套用通用大模型更划算。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 啊
页:
[1]