当前位置:首页 > 随笔 > 正文内容

CycleNet源码解析:可学习周期分解的时间序列预测

访客 随笔 2026年6月19日 1

CycleNet是NeurIPS 2024收录的轻量级时序预测模型,其核心创新在于通过显式建模数据的周期性成分来简化预测任务。本文将深入剖析其PyTorch实现,重点关注周期分解机制与残差预测的具体代码逻辑。

核心架构:周期-残差双分支设计

模型的基本假设是时间序列可分解为周期性成分残差成分。前者通过可学习参数显式建模,后者则由轻量网络预测。这种解耦策略显著降低了学习难度,尤其适合具有稳定周期特征的数据。

def forward(self, inputs, start_idx):
    # inputs: [B, L, C]  批次、历史长度、通道数
    # start_idx: [B]     各样本在周期中的起始偏移
    
    # 实例归一化
    if self.use_revin:
        mu = inputs.mean(dim=1, keepdim=True)
        sigma = torch.sqrt(inputs.var(dim=1, keepdim=True) + 1e-5)
        inputs = (inputs - mu) / sigma
    
    # 剥离历史周期成分
    periodic_hist = self.period_bank(start_idx, self.hist_len)
    residual = inputs - periodic_hist
    
    # 通道独立预测残差
    residual_pred = self.predictor(
        residual.transpose(1, 2)
    ).transpose(1, 2)  # [B, pred_len, C]
    
    # 叠加未来周期成分
    future_idx = (start_idx + self.hist_len) % self.period_size
    periodic_future = self.period_bank(future_idx, self.pred_len)
    outputs = residual_pred + periodic_future
    
    # 反归一化
    if self.use_revin:
        outputs = outputs * sigma + mu
    
    return outputs

周期记忆模块:高效索引实现

period_bank是模型的关键组件,以可学习参数存储一个完整周期的模式:

class PeriodicMemory(nn.Module):
    def __init__(self, period_len, channels):
        super().__init__()
        self.period_len = period_len
        self.channels = channels
        # 可学习的周期模板 [period_len, channels]
        self.template = nn.Parameter(
            torch.zeros(period_len, channels)
        )
    
    def forward(self, offsets, span):
        # offsets: [B]  各样本的起始位置
        # span: 需要连续取样的长度
        
        # 构建全局索引: [B, span]
        # 行方向: 各样本的起始偏移
        # 列方向: 0到span-1的连续位置
        positions = offsets.unsqueeze(1) + torch.arange(
            span, device=offsets.device
        ).unsqueeze(0)
        
        # 周期循环取模
        cyclic_idx = positions % self.period_len
        
        # 向量化索引提取 [B, span, channels]
        return self.template[cyclic_idx]

该实现摒弃了循环遍历,通过张量广播与模运算实现一次性索引,速度提升约2-3倍。

残差预测网络:极简MLP设计

剥离周期后的残差序列交由轻量网络处理,作者提供两种配置:

  • Linear:单层全连接,参数量最低
  • MLP:双层结构带激活,实际效果更优
class ResidualForecaster(nn.Module):
    def __init__(self, hist_len, pred_len, channels, hidden=None):
        super().__init__()
        self.channels = channels
        
        if hidden is None:  # Linear模式
            self.layers = nn.Linear(hist_len, pred_len)
        else:               # MLP模式
            self.layers = nn.Sequential(
                nn.Linear(hist_len, hidden),
                nn.ReLU(),
                nn.Linear(hidden, pred_len)
            )
    
    def forward(self, x):
        # x: [B, channels, hist_len]
        # 通道独立:各通道共享相同映射权重
        return self.layers(x)  # [B, channels, pred_len]

实现要点与局限

周期设定的敏感性:模型性能高度依赖period_len的选取。以Weather数据集为例,144步长表现最优,偏离此值则显著下降,暗示需针对数据集调参或引入自适应周期学习。

场景适配边界:在交通流等时空耦合复杂数据中,单层MLP难以捕捉通道间交互与时滞依赖,表现不及iTransformer等架构。此外,数据中的突变异常会破坏周期假设,导致预测失效。

计算效率优势:得益于周期分解与极简预测器,CycleNet参数量远低于PatchTST等模型,训练推理速度具有明显优势,在周期特征明确的场景下性价比突出。

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。