9.时间序列预测入门到实战:卷积视角:从 TCN 到 TimesNet
2026/7/15 4:40:16 网站建设 项目流程

时间序列预测入门到实战(九)· 卷积视角:从 TCN 到 TimesNet

本文是「码海寻道」《时间序列预测入门到实战》系列的第 9 篇。上一篇 RNN 靠"记忆"处理序列,但它得一步步顺序算,慢、难并行。这一篇我们换个视角——用卷积啃时序。从经典的TCN(一维因果卷积),一路讲到 2023 年很有代表性的TimesNet(把一维序列"折叠"成二维)。同一个"卷积"武器,两种截然不同的用法。


一、TCN:卷积也能处理序列,还更快

CNN 不是图像的专利。把二维卷积压成一维,让卷积核沿时间轴滑动,就能扫序列了。TCN(时序卷积网络)在此基础上加了两个关键设计。

因果卷积:绝不偷看未来

普通卷积会同时看左右两边,但预测时未来是不可知的因果卷积只让卷积核看当前及过去(padding 只加在左侧,算完裁掉右边多出的部分)。这从结构上杜绝了第 1 篇反复强调的数据泄露。

膨胀卷积:用"空洞"看得更远

要抓长期依赖,感受野就得大。一层层堆普通卷积太慢。膨胀卷积(dilated convolution)给卷积核带上"空洞"——隔几个点取一个,让膨胀系数按1, 2, 4, 8…指数增长。这样几层就能覆盖成百上千步的历史,感受野指数级膨胀。

"指数级"到底多快?普通卷积每加一层,感受野只多几步,要看 512 步得堆几百层。膨胀卷积把每层的"步长"翻倍:第 1 层看 1、2 步,第 2 层跨 2 步、第 3 层跨 4 步……覆盖范围是1+2+4+8+…的等比累加,每加一层就翻一倍。所以2⁹=512——堆 9 层就能回看 500 多步历史,而计算量只线性增加。用"空洞"换"深度",这是 TCN 又快又能看得远的秘诀。

importtorch.nnasnn,torch.nn.functionalasFclassChomp(nn.Module):# 裁掉右侧多余 padding,保证因果def__init__(self,s):super().__init__();self.s=sdefforward(self,x):returnx[:,:,:-self.s].contiguous()classTCNBlock(nn.Module):def__init__(self,cin,cout,k,dilation):super().__init__()pad=(k-1)*dilation self.net=nn.Sequential(nn.Conv1d(cin,cout,k,padding=pad,dilation=dilation),Chomp(pad),nn.ReLU(),nn.Dropout(0.1))self.down=nn.Conv1d(cin,cout,1)ifcin!=coutelseNonedefforward(self,x):res=xifself.downisNoneelseself.down(x)returnF.relu(self.net(x)+res)# 残差连接,堆深也稳

TCN vs RNN:TCN 能并行(整条序列一次卷完,不用等上一步),感受野可控,梯度更稳。很多任务上它又快又好,是个被低估的强基线。


二、TimesNet:把一维"折叠"成二维

TCN 还是在一维上做文章。TimesNet(2023)提出了一个很妙的洞见:时序的复杂变化,本质来自多重周期——日内有规律、跨日有规律。既然如此,为什么不把这两种规律摆到二维平面上分别处理?

它的核心三步:

  1. FFT 找主周期:对序列做快速傅里叶变换,挑出能量最强的几个周期(比如 24、168);
  2. 按周期折叠成 2D:把一维序列按周期长度 reshape 成矩阵——每一列是一个周期内的位置,每一行是第几个周期。于是"周期内变化"成了矩阵的一个方向,"周期间变化"成了另一个方向;
  3. 2D 卷积一起抓:用二维卷积核(Inception 结构)同时捕捉这两个方向的模式,再还原回一维。多个周期分别处理后加权融合。

为什么折叠这一下如此关键?想象一条按小时排的油温序列,周期是 24。把它按 24 一段段码成一张表:每行是一天,每列是一天里的第几个小时。神奇的事发生了——“昨天 14 点"和"今天 14 点”,在一维里隔着 24 个点很遥远,折成 2D 后却上下紧挨在同一列。于是普通的 2D 卷积核(本就擅长看"上下左右邻居")一扫,就同时抓到了两种规律:横向看到一天内的走势(周期内),纵向看到同一时刻的日复一日变化(周期间)。TimesNet 只是把 CNN 在图像上的看家本领,借这一"折叠"搬到了时序上。

# 概念骨架:找周期 → 折成 2D → 2D 卷积 → 融合deffind_periods(x,k=3):# x: (batch, length, channels)amp=torch.fft.rfft(x,dim=1).abs().mean(0).mean(-1)amp[0]=0# 屏蔽直流分量(整体均值)top=amp.topk(k).indices# 取能量最强的 k 个频率return[x.shape[1]//int(i)foriintop]# 频率 → 周期长度# 对每个 period:reshape 成 (batch, n_periods, period, C) 的 2D 图# → 2D Inception 卷积 → reshape 回 1D → 按 FFT 幅值加权求和

一个漂亮的副产品:TimesNet 是通用骨架,同一套结构能做预测、分类、异常检测、缺失填补,不只是预测。


三、两种卷积,怎么选

TCNTimesNet
视角1D,沿时间滑动2D,按周期折叠
抓什么长期依赖(大感受野)多重周期的周期内/周期间模式
成本轻、快重(FFT + 2D 卷积 + 多周期)
定位强基线SOTA 级但计算密集

参考量级:TimesNet 在多个公开 benchmark(含 ETT 系列)上表现亮眼,是一段时间的 SOTA。但它计算不轻,而且——先剧透一个反转:下一批模型里,会有个简单到离谱的线性模型(DLinear)在长序列预测上把一众复杂模型(包括这类)打得很难看。所以别急着膜拜复杂度,TCN 这种简单高效的基线,永远值得先试


小结

  • TCN因果卷积(不偷看未来)+膨胀卷积(空洞扩大感受野)处理序列,可并行、比 RNN 快、是强基线;
  • TimesNet的洞见是多重周期:用 FFT 找周期,把 1D 序列折叠成 2D,用二维卷积同时抓周期内和周期间的变化,还是通用骨架;
  • 选择上:先上 TCN 这种轻量基线,复杂如 TimesNet 虽强但重,未必总是最优。

卷积和循环都讲过了,接下来登场的是这几年最耀眼的主角——注意力机制与 Transformer。它凭什么横扫 NLP,搬到时序上又会水土不服在哪?下一篇揭晓。

思考题:TimesNet 靠 FFT 找周期来折叠。如果一个序列几乎没有明显周期(比如纯随机游走),这个"折叠成 2D"的思路还成立吗?会退化成什么?


卷积流派讲完了。下一篇迎来重头戏 Transformer,看注意力机制如何重塑时序预测。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询