
KDD 2026的投稿周期里时序扩散模型几乎是绕不开的话题。我们组去年年底开始做相关实验模型能跑损失也在降但生成的长序列总是比真实数据平滑一截方差偏小、尖峰钝化。一开始我以为是网络容量不够换backbone、调学习率、增大训练步数问题都没解决。直到某天把前向过程的噪声轨迹画出来看才意识到根源根本不在生成器而在扩散模型默认的那套噪声设置——从图像社区移植过来的先验被原封不动地套在了时间序列上。这篇文章就记录我们如何拆掉这套默认设置改成匹配时序结构的噪声机制。内容偏研究和实验向适合正在做时序预测、插补或生成方向尤其是想认真把握KDD 2026中扩散模型类工作的同学。1. 扩散模型里的“默认噪声”在时序数据上为什么失效1.1 噪声本质上定义了任务难度不只是破坏数据扩散模型的前向过程通常写成对原始信号x0在每个扩散步t上按预设的噪声调度β_t逐渐叠加噪声得到中间状态x_t模型再学习从x_t反推恢复x0或预测噪声ε。很多人把噪声简单理解成“破坏数据的工具”但更准确的看法是噪声调度定义了一条任务难度曲线。它的每一步都决定了“模型此时需要做多大的努力去恢复信息”。从频域角度理解更容易。真实图像的能量在大尺度和小尺度上相对均匀空间位置互换后统计特性基本不变所以简单的线性调度、固定高斯噪声就能给出平滑的难度递增曲线。但时间序列完全不一样它有趋势、有多个周期、有突发脉冲不同时间位置的信息密度差很多。如果继续沿用图像社区的默认调度等于让模型在所有时间步上承受同样的加噪强度这会让某些本就脆弱的结构例如周期相位过早被淹没而另一些本来是平稳波动的片段又被过度增强。我在实际实验中观察到的最典型现象是训练损失正常下降但生成样本的ACF自相关函数衰减明显快于真实数据。原因就是默认噪声调度在低频成分上加噪过快模型在反演时只学到了低阶统计特征没有保住长程依赖。这也就是说噪声设置决定的是“模型学习的可能性边界”不是单纯的预处理参数。1.2 时序数据与图像式默认假设的四处错位时序数据和图像数据最本质的区别不是维度不同而是统计假设不同。默认噪声机制里至少有四个隐藏条件在图像领域成立、在时序领域却不成立。第一是非平稳性。图像的像素统计在整张图上基本稳定但时间序列的均值、方差随时段变化。金融序列的波动率有明显的聚集效应某几天能量可能突然放大一个数量级电力负荷在工作日与周末的形态完全不同。固定的噪声方差无法匹配这样随时变化的信号能量。第二是异方差性。同一个序列内部各时间点的噪声容忍度也不同。平稳时段加一点噪声就会破坏细节突发时段同样强度的噪声却几乎感知不到。均匀加噪实际上是“非均匀毁坏”。第三是周期结构。时间序列常包含日周期、周周期、季节周期三种以上叠加成分。线性噪声调度对它们一视同仁而实际上趋势项可以承受较强噪声高频脉冲反而需要更温和的加噪否则模型会把真实尖峰当作噪声学习。第四是不规则采样与缺失。图像任务默认每个像素都是完整观测时序任务里却有大量mask区域例如传感器断档、标签缺失。此时“整条序列统一加噪”的假设已经失真缺失位本身就该比观测位有更高的初始噪声水平。看到这四处错位之后我们没有立刻推翻主模型架构而是先把注意力集中在“前向噪声设计”这件事上。论文的最终版本也主要围绕这一点展开KDD 2026投稿里我们把这套改动称为“自适应时序噪声机制”后面几节详细展开。2. 最该被重新审视的三个默认设置2.1 默认的高斯白噪声稳定但不是万能扩散模型用高斯噪声是合理的因为高斯分布可控性强、前向后验都能解析表达训练目标也有漂亮闭式解。但对时间序列来说默认使用纯高斯白噪声等于默认“每个时间点的噪声来源是同质的”。真实时序中的扰动来源往往不是单一的高斯过程。比如电力数据里可能有开关操作导致的阶跃脉冲交通数据里有偶发事故形成的局部突变气象数据里还有对流系统的非线性扰动。这些扰动是重尾或有偏的单纯用高斯噪声去拟合模型会把真实信号中的“奇异性”错误地归因到噪声端生成时就倾向于把所有点都抹匀。我自己的建议不是把高斯噪声完全替换掉而是把噪声建模成“高斯基底结构化调制”。在保持马尔可夫正向过程可计算的前提下让噪声方差本身成为一个条件随机变量而不是固定标量。后面会讲的按局部信号能量缩放噪声本质就是这一思路的最简实现。过度复杂的非高斯噪声会破坏采样效率和训练稳定性短期收益率是负的。2.2 默认的固定调度曲线把时间戳当成了像素坐标图像扩散模型中常用的调度有线性调度、余弦调度、sigmoid调度等它们的目标基本都是让信噪比均匀下降。这个前提是图像各位置的信息量分布均匀。时序数据的信息量分布极不均匀因此“信噪比均匀下降”听上去公平实际效果却很差。举一个我们实测过的例子。在交通流量数据上使用线性调度时周期波峰部分的预测误差显著高于波谷。看起来不可思议因为波峰处信号能量大、SRN本应更高错就错在线性调度完全没有把“信号本身的能量”作为调制项。模型在训练时反复看到强能量区域被大幅加噪弱能量区域被小幅加噪于是它对强能量区域的判别力始终不足。更好的做法是让噪声调度随信号内容自适应地“变速”。通常需要维护一条信号强度曲线在能量强的区间放慢加噪速度在能量弱的区间加快加噪速度使噪声破坏的相对速率接近恒定。这样就从一个固定调度曲线变成了数据相关的动态调度最终loss曲线和生成质量都会稳不少。2.3 默认的ε预测换一个目标多加一个维度多数扩散模型默认训练目标是预测噪声ε因为前向过程是高斯加噪预测噪声在数学上和“去噪”等价。对图像任务这个选择很自然但时序任务里不太一样。时间序列的能量分布不均局部信噪比差异大预测噪声不一定是最好的参数化目标。具体来说当某个时间点本身能量极低恢复方向几乎由先验主导时模型预测ε其实是在预测一个近似纯噪声的量信息价值不高反之当时间点能量很高时预测x0更直接能让模型在初期就抓住全局结构。所以有一个折中选择叫“v-prediction”即预测一个速度参数结合了ε预测和x0预测的优点。我们在多个数据集上比较了三种目标v-prediction对长程周期结构的保持明显更好尤其在采样步数减少到100以内时优势更加突出。这个发现让我们意识到扩散模型对“默认设置”的执念比想象中强。更换预测目标并不需要大改网络结构只换loss的权重形式即可却能带来稳定提升。这是整篇文章中最容易复现、性价比最高的一项改动。3. 让噪声机制“看见”时序结构——我们改了什么3.1 自适应噪声水平按局部信号能量动态缩放核心改动很直接把每个时间点的噪声标准差不设成全局标量而是设为该点局部信号能量E(x0_t)的函数再加上一个很小的常数作为下限。加噪公式变成sigma_t lambda * (E_window(t) ** gamma) epsilon_floor z_t ~ N(0, sigma_t^2)其中E_window(t)是对当前样本及邻域信号能量的估计lambda是全局缩放系数gamma控制能量对噪声强度的影响敏感度epsilon_floor防止训练初期出现零噪声。这里有一个容易忽略的细节反向模型必须知道每个时间点实际用了多强的噪声否则无法做去噪。我们做法是把sigma_t作为额外条件通道拼到输入里或者用FiLM层对隐藏特征做缩放。一开始我们尝试只在训练时自适应、推理时不做条件输入效果很差引入噪声水平作为条件后模型才真正学会“按需去噪”。从设计意图上说这个改动的本质是把异方差性直接编码进扩散过程。模型看到的每个训练样本都天然携带了“这个点可信度高/低”的信息。长序列的尖峰生成能力很大程度上依赖这一点因为尖峰处能量大模型得到了正确的相对尺度才敢在重建时保留大幅跳动。3.2 多尺度分解加噪趋势、周期、残差分开处理单条时间序列可以看成三个结构成分的叠加趋势项、周期项、残差项。它们的信息衰减规律完全不同。趋势项变化缓慢信息包容性强周期项有固定频率频率一旦被噪声破坏很难重建残差项往往本身就是无序波动更像是“该被噪声占据的部分”。我们参考了信号分解的思路用简单的移动平均和差分先把序列拆成三个成分然后对每个成分分别执行扩散加噪但允许不同成分使用不同的调度步数。比如趋势项用较慢的加噪曲线周期项用中等曲线残差项直接应用接近默认线性调度。实际效果里最明显的是对季节周期数据的生成保真度。之前直接用默认调度在周周期成分上的频谱能量会显著衰减改成多尺度加噪后周期峰的保留比例从70%左右提升到90%以上。代价是实现复杂度增加了大概一天的工作量对长序列数据额外多一次分解计算整体可控。这个做法还有一个意外的收益它可以作为不确定性分析的工具。如果我们分别生成趋势、周期、残差三个成分再把它们相加回原始尺度就能看出模型的不确定性主要来自哪个成分。这比直接观测总预测方差更有可解释性在KDD 2026的评审人面前也是一个很好的承接点。3.3 掩码感知调度插补场景下把缺失位当噪声起点时序插补任务中输入序列有mask。我们最初沿用整条序列一样的加噪策略结果模型总是把缺失区生成得特别平坦。后来分析原因是缺失位置的信号本来就是未知的它一开始的信息量就该更低可默认调度仍然把它和观测位一样对待模型自然没有意识到自己是在做“补全”而不是“生成”。所以我们引入掩码感知调度。具体做法是对观测位置沿用普通加噪调度对缺失位置把初始噪声水平提升到接近1.0的高位并且让它在整个前向阶段保持低信噪比。反向模型在推理时看到mask也知道从哪里开始重建更合理。实现时不需要修改采样器只需要在训练数据里把x_t的初始化区分开来观测位用常规的加噪结果缺失位用固定强噪声或额外采样噪声填充。这样做之后插补结果在mask边缘处的连续性会明显改善。模型不再试图“凭空创造”边缘处的数值而是先学一个过渡带再接上观测信息。这个设计对实际的Sensor数据修复、金融缺失数据补全都有直接价值。4. 实验设计与评估怎样证明不是“调参调出来的”4.1 任务、数据集与对比基准的选择逻辑做这类实验最容易遭到的质疑是“你这个方法只在某个数据上work换个数据就崩”。所以我们选择数据集时故意覆盖三类分布不同的场景第一类是更平稳的电力负荷数据有日周双周期和部分节假日脉冲第二类是金融波动率类数据异方差明显第三类是交通流数据有突发事件造成的尖峰和长尾分布。对比基准也花了心思用时间序列扩散模型里相对固定的几个公认方法TimeGrad、CSDI、Diffusion-TS的基础版本。我们曾想加更多更强的最近模型但考虑到KDD 2026投稿期有限而且论文的核心是噪声机制而不是刷SOTA对比基准保持“稳定可复现”比“数量多”更有利。这里的经验是你在论文里不可能只靠一个数据集说明“默认设置不适用”至少要拉开统计分布的差异度。如果新的噪声机制在这三类数据上都能稳定超过默认设置说明改进点确实落在了通用机制而不是单点过拟合。4.2 评估指标矩阵从概率分位到时序结构保真时序生成模型评测不能只看MSE。MSE只衡量点的期望无法捕捉分布形状和时序结构。我们建立了多层次的指标矩阵分成了三组点估计与误差MSE、MAE、偏差量这部分和传统预测论文对比时使用。概率预测质量CRPS连续排名概率得分、90%置信区间的覆盖率与区间宽度。这两个指标直接考核生成分布的合理性如果模型只会生成“平淡的均值序列”CRPS一定不会好因为它忽略了不确定性。时序结构保真生成序列与真实序列的ACF差异、频谱主峰位置及能量误差。这部分是我们特别加的绝大多数扩散模型论文都不会测它但它恰恰能反应噪声调度对长期依赖与周期结构的影响。关于区间覆盖率要小心。盲目扩大生成方差也能提高覆盖率所以必须同时报告区间宽度。覆盖率高而宽度窄才是有意义的我们实验中默认设置经常出现“宽度很大、覆盖率偏高”的情况看起来概率质量不错实际是过度发散的表现。4.3 消融实验的严谨设计消融实验我们设计了四条baseline路线。A0是完整默认机制包括线性调度加高斯噪声加ε预测A1在A0基础上只去掉自适应噪声水平A2再去掉多尺度分解A3再去掉掩码感知调度A4才是我们的完整方法。每一步都希望看到独立增益又不想让比较链太长。结果最有趣的是自适应噪声水平对金融数据影响最大、对平稳电力数据影响较小掩码感知调度对插补任务影响巨大对纯预测任务几乎没有帮助。这非常合理说明各项改进有明确的适用边界。投稿审稿人通常欢迎这种“边界清晰”的消融比一概提升更有说服力。我们也加了“伪改进对照”也就是把随机噪声作为自适应条件输入网络而不是用真实的局部能量。这一步很重要它能排除“模型只要多了一个条件输入就会变好”的假说。在我们的实验里随机条件的提升几乎为零而真实能量条件的提升是稳定的。这组对照能有效应对“你的条件只是加大了模型容量”的质疑。5. 复现要点从公式到能跑起来的代码细节5.1 数据预处理的隐藏坑归一化要先于噪声能量估计数据归一化顺序是个很容易踩的坑。我们早期版本先做全局归一化再计算局部信号能量结果发现对异常值多的序列局部能量被全局缩放扭曲自适应噪声的水平完全失真反而不如默认调度。正确做法是先用可逆实例归一化RevIN对每个窗口做局部标准化然后在这个标准化后的尺度上计算局部能量并生成噪声水平。这样能保证“噪声水平估计”和“模型见到的相对变化”一致。推理时再用倒数变换还原到原始尺度。伪代码可以用下面这种思路def compute_local_energy(x_window, kernel_size16): # x_window: (B, T, C) 已做实例归一化 x_sq x_window ** 2 kernel torch.ones(kernel_size) / kernel_size # 对时间维度做卷积得到滑动平均能量 energy F.conv1d(x_sq.transpose(1, 2), kernel.view(1, 1, -1), paddingkernel_size // 2) return energy.transpose(1, 2) # (B, T, C) def adaptive_noise_sigma(x_window, lambda_0.5, gamma0.5, floor0.01): energy compute_local_energy(x_window) sigma lambda_ * (energy ** gamma) floor return sigma这个计算非常轻量CPU上跑都行不至于成为训练瓶颈。关键是kernel_size要取多少。太短会把随机扰动当作信号能量太长又丢失局部异方差信息。根据我们经验一般取序列长度的大约5%到10%或者对应到实际业务中的“短周期长度的一半”效果比较稳。5.2 训练目标的实现细节与伪代码自适应噪声下的训练损失不能简单套用DDPM的默认公式。因为噪声强度是逐位置变化的从数学上要保留SNR加权项。我们在实现时保持了经典DDPM的噪声表示但把噪声张量替换成逐点可变的标准差损失仍取噪声重建误差# 前向加噪已经得到 x_noisy, target # 模型输入: x_noisy, t, extra_cond (sigma_t) pred model(x_noisy, t, extra_cond) if target_type eps: loss ((pred - eps) ** 2).mean() elif target_type x0: loss ((pred - x0) ** 2).mean() elif target_type v: # v sqrt(alpha_bar) * eps - sqrt(1 - alpha_bar) * x0 loss ((pred - v) ** 2).mean()一个工作细节是用切换预测目标时classifier-free guidance的权重要重新调。v-prediction在CFG下的最优权重通常比ε-prediction低。我们最早直接用default权重结果生成多样性过高曲线快翻滚。后来把CFG权重由1.5降到0.8左右才正常。这算是个小经验建议复现时一定要单独调。5.3 训练/推理配置与长序列生成策略最终实验参数相对常规batch size 64AdamW学习率2e-4EMA衰减0.999扩散步数1000。但推理时为了节约时间我会用DDIM把采样步数压到200或100。自适应噪声机制对采样步数敏感度略高建议即使推理步数少也尽量保留足够多的早期阶段信息。显存不够时不要直接减少输入长度因为长序列依赖性会因此失真。可以配置梯度累积batch减半再累积两次或者用混合精度。我们最常用的是梯度累积加torch.amp在A6000上能稳定训练序列长度1024的batch 64设置。对于超长序列完整生成几千点的序列对一次前向来说代价还是太高。我们采用“滑窗生成重叠平均”策略先生成几个重叠窗口重叠区域取平均不仅稳定还能兼顾边界连续性。窗口长度取一个主周期长度或主周期的倍数比如电力数据取48步或96步重叠区域10~20步。这个技巧不依赖我们的噪声机制但对复现长序列实验很有帮助。6. 踩过的坑汇总——这些问题理论上都不会写进论文6.1 六个高频问题的排查思路训练发散、生成平滑、插补生硬之类的问题我们都逐一碰到并定位过。整理成速查表现象可能原因处理策略加入自适应噪声后loss震荡局部能量估计未做对数压缩或下限太低对energy取log并clamp设置floor生成序列比真实更平滑推理步数太少、或目标函数选x0过强提高sample步数到200尝试v-prediction插补mask边缘出现突变mask信息没进入网络条件通道将mask作为显式输入通道训练时随机mask不同数据集效果波动大多尺度分解参数过拟合单一周期用数据驱动方式估计周期或舍弃硬编码分解曲线尖峰过多、噪声感太强CFG权重过高、v-prediction未校参降低CFG权重重跑小范围参数扫描区间覆盖率高但宽度过大生成分布过度发散检查损失是否加了过大的方差惩罚核查采样器超参这类问题索引非常实用如果审稿人或实验室同学要快速复现直接查这个表比从头读代码更高效。6.2 发现“评估指标与人工看图结果互相打架”之后这个现象值得多说一句。某次实验在指标表里表现得很好CRPS下降3%ACF差异变小可我们拿生成样本画出来总觉得不对曲线形态有点“假”。后来发现是评估指标里少了频域惩罚导致模型学会了让ACF接近真实数据但频谱主峰的能量分布却歪了。它提醒我们时序生成评估不能依赖单一指标。如果只算MSE或CRPS默认噪声设置未必显得很差可一旦加上频谱与ACF结构指标差异就非常显著。这也是我特别建议做扩散模型生成任务的朋友不要只盯CRPS的原因视觉一致性和统计分布一致性在时序领域有时候是互相独立的属性。此外噪声机制对高频细节的影响一定要通过小样本可视化来验证。抽样二三十条生成曲线和真实曲线叠在一起直接看波形抖动程度、峰谷位置是否自然比任何数值指标都更能发现问题。我们论文里最终保留了一组这种可视化审稿阶段也常被提到“有助于理解方法效果”。结尾放在真实体会里调完这轮噪声机制之后我最大的感受是扩散模型在时间序列方向上其实还没有被好好伺候过默认设置里的很多选择只是“从别的领域顺手带过来的惯性”。把噪声当成一个可以被重新设计的变量而不是一个固定不变的破坏过程往往比改网络结构更事半功倍。如果你手头的时序扩散模型也出现了生成过于平滑、尖峰丢失或长程依赖不足的问题建议先检查一下前向噪声设计很可能答案就在那里。后续我们还在尝试把自适应噪声与score-based连续时间框架结合起来目前看起来有潜力等KDD 2026这轮投完之后如果结果出来再写文章细聊。