一份其实很短的CSDI(基于得分扩散模型的条件时间序列插补)架构简介

CSDI: Conditional Score-based Diffusion Models for Probabilistic Time Series Imputation(基于得分扩散模型的条件时间序列插补)

近期在研究DDPM,一直在考虑其实际应用,后来偶然就发现了这篇用于时间序列插补的文章。在此简要讲解一下自己的学习。(会附上代码讲解)

为了方便大家,这里是

回顾扩散模型

首先,我们知道DDPM的流程如下:DDPM流程图
从一个图片集开始,对每一张图片一直添加随机噪声,直到T步,然后我们再逐步去噪,从而生成一些新的图片。

如何用于时间序列?

DDPM用于时间序列有很多方面,例如插补和预测。

插补的应用场景就是我们的缺失数据集,在这里我以文中的physio数据集为例,形式大概如下(整理好后的):

某位病人病理特征1病理特征2病理特征3
凌晨1点2
凌晨2点35
凌晨3点321

原数据集有大约10134个病人,每位病人对应着35个病理特征和48个时间点。具体处理细节我会在后面的代码讲解中详细介绍,No rush。

我们的目的就是根据整体的特征去试图填补里面空缺的部分。

那么如果要用于预测呢?

那还不简单,我们只要把要预测的值认为是空缺的不就行了,比如下面:

某位病人病理特征1病理特征2病理特征3
凌晨1点223
凌晨2点345
凌晨3点

Good,到现在我们已经清楚其应用场景了,接下来就是搞清楚其架构了。

CSDI的基础架构

CSDI的原文架构
图中我们已有的就是左上角的蓝色线和红色线信息(文中称为条件观测值 x 0 c o x_0^{co} x0co),中间空着的线段,那段空白就是要插值的部分,然后我们只针对于这部分空白进行加噪去噪。加噪到T时刻就是我们左下角的图片,然后进行去噪得到我们右下角的图片。

如此就完成了插值过程。

需要注意的是,我们在对该部分空白进行处理时,一般会给其填补一个初始的随机噪声开始。如下:

某位病人病理特征1病理特征2病理特征3
凌晨1点2Random Noise3
凌晨2点3Random NoiseRandom Noise
凌晨3点3Random Noise4

训练过程

在训练时,我们的数据集就已经是缺失的了。(是的,不是那种拿完整的数据集训练,然后在空缺的数据集填补)

所以,在训练过程中,我们根本没有空白部分的完整版样本,只能通过其他已知的部分来填补空白。

事实上,我们在训练过程并没有用到空白部分,原文提出的自监督训练过程如下:
CSDI的自监督训练流程

图中绿色部分指的是我们的已观测值,比如我们有一个样本如下:

某位病人病理特征1病理特征2病理特征3
凌晨1点22
凌晨2点3
凌晨3点31

然后我们根据一定的策略去随机选择一部分给他人为遮住,作为我们要插补的目标:

某位病人病理特征1病理特征2病理特征3
凌晨1点2遮住啦
凌晨2点3
凌晨3点遮住啦1

⚠️注意!!!

我们之后的任务就是用我们现在已知的信息(比如上面的数值2,3,1)去预测我们这些遮住的数值

等我们这一个任务完成的较好的时候,就可以把预测<遮住啦>的模型用在预测空白上。

我们在实际代码运行中,是对这些遮住的噪声进行传统的DDPM扩散过程。并把预测值与其原有值进行对比来计算损失函数(这里要用上周围已知的信息,比如2,3,1。具体用的方式在下面会介绍)试图还原这些遮住数值,等这套体系训练好了,再把这套模型运用在空白部分。

在预测空白部分的时候是先给其赋予一些随机噪声作为起始。

(这部分如果不懂的话,后续出的代码详解可能会帮助你)
😆

我们看上面的图,可以知道除去遮掩部分的其他信息在我们的 x 0 c o x_0^{co} x0co里(2,3,1)。我们是肯定要用这部分信息的,不然得不到篮球和练习室的关系,没有任何意义。

  • 可是问题就出在这里,我们的条件信息(就是已知信息 x 0 c o x_0^{co} x0co)应该如何用呢?

🐱🐱🐱
Yang Song的原始DDPM中其实也对这种条件模型用于插补做了一些设想,其架构大致如下:
DDPM用于插补的架构

让我慢慢讲解,首先我们的目标是要插补出来中间白色空白的部分(为了方便理解,你可以认为那就是个图像,周围是练习室 x t c o x_{t}^{co} xtco表示condition,空白部分我们要填补出一个🏀篮球 x t t a x_{t}^{ta} xtta表示target)。

理所当然的,第一张图的蓝色部分就是我们的条件了,我们要根据这个条件去试图还原篮球,我们是怎么做的呢?其实还是跟原始DDPM一样,我们对整体图片进行加噪(是的,包括空白部分,在这里我们用随机噪声填补了空白)。

最后我们一直加到T步,它变成了一堆噪声。

重点就在我们的去噪过程,我们倒着来,从T步到T-1步,是对 x T x_T xT整体进行去噪的,然后我们单独把中间那一块 x T − 1 t a x_{T-1}^{ta} xT1ta(target)拿出来。

然后呢,我们把这个核(下面的蓝色核)再和正向过程的T-1步的条件部分(黄色外壳)拼起来,作为下一步去噪的起始点。如此,我们就合理的用到了我们的条件。


这是Yang Song的原始DDPM提出的思想,但是这里还有个小问题❓就是:
在这里插入图片描述

  • 划红线部分,我们的去噪过程中用到的条件 x t c o x_{t}^{co} xtco都是加了噪声之后的(因为我们是对整体加噪的嘛),所以会产生很多的信息损失,怎么办呢?

于是我们的CSDI就提出了一种新的架构(就是之前提到的图),可以不用加噪后的条件,直接用最原始的条件来还原我们的篮球🏀(坤坤狂喜)。

简洁版如下:

CSDI的抽象架构图

跟上面一对比你就可以清晰看出,相比于DDPM使用的U-net架构进行去噪,CSDI直接改用了diffwave架构,可以直接吸收我们的 x 0 c o x_0^{co} x0co作为输入从而进行去噪过程。

其中Diffwave架构由来已久,最早是用于处理音频数据的,这里CSDI拿来改了一下:

CSDI多元时间序列预测的去噪架构
我们可以看到最上方input中,我们输入的是 x 0 c o x_0^{co} x0co x t t a x_t^{ta} xtta,这样就直接用了最原始的条件,其他两个分别是

  • 时间嵌入矩阵(Diffusion embedding of t)
  • 边缘信息(Side info)

到此为止,CSDI的基本架构和思路就差不多over了,原文附有很完整的代码实现,如果这期点赞收藏率高的话,我会把代码部分好好整理一下写出来。毕竟代码实现才是真正落地。

下课!😊

<think>好的,用户现在想了解扩散模型时间序列中的应用或实现方法,并且还希望看到相关代码。我需要结合之前提供的三个引用,这些引用提到了几篇关于扩散模型时间序列结合的论文。首先,我应该先回顾扩散模型的基本原理,然后过渡到它在时间序列中的应用。 扩散模型的核心是前向加噪和反向去噪过程。对于时间序列,可能需要处理的是多变量预测或概率性预测。用户提到的论文中,比如Autoregressive Denoising Diffusion Models和Transformer-Modulated Diffusion Models,可能涉及到自回归结构或Transformer架构的应用。我需要解释这些方法如何与扩散模型结合,以及它们在时间序列中的具体应用场景,比如预测、异常检测等。 接下来是代码实现部分。用户可能希望看到具体的代码示例,比如如何构建扩散模型来处理时间序列数据。考虑到时间序列数据的结构,可能需要使用特定的网络结构,如LSTM、Transformer或者TCN。需要确保代码示例简洁,并说明关键部分,如噪声调度、损失函数、采样过程等。 同时,用户的问题可能需要分步骤回答,先讲应用,再讲实现方法,最后给出代码。要注意引用格式,在适当的地方添加引用标识。例如,在提到自回归扩散模型时,引用对应的论文[^1],在涉及Transformer时引用[^3]。 还需要生成相关问题,这些问题应该围绕扩散模型时间序列中的进一步应用、优化方法、评估指标等展开。确保问题具有连贯性,能够帮助用户深入理解主题。 现在需要检查是否有遗漏的点,比如是否提到了概率性预测、多变量处理,以及代码是否涵盖了关键步骤。另外,注意使用正确的中文表达,避免技术术语使用不当。最后,确保所有数学公式按照要求使用$...$或$$...$$格式,并且LaTeX语法正确。</think>### 扩散模型时间序列中的应用与实现方法 #### 一、核心应用场景 1. **多变量概率预测** 通过扩散模型建模时间序列的联合概率分布,生成未来多步预测的置信区间。例如,论文[^1]提出自回归扩散模型,通过迭代去噪生成未来序列的概率分布。 2. **异常检测** 利用扩散模型重构时间序列,通过重构误差判断异常点。扩散过程可有效捕捉复杂时序模式。 3. **数据** 在缺失数据场景下,扩散模型通过反向去噪过程生成合理填充值(如论文[^2]中提出的合成-优化方法)。 #### 二、实现方法(以概率预测为例) 1. **模型架构选择** - **主干网络**:Transformer(如论文[^3])、TCN或LSTM - **噪声调度**:余弦调度或线性调度噪声方差$\beta_t$ $$ \beta_t = \beta_{\text{min}} + (\beta_{\text{max}}-\beta_{\text{min}})\frac{t}{T} $$ 2. **训练流程** ```python import torch class TimeSeriesDiffusion(torch.nn.Module): def __init__(self, backbone_type='transformer'): super().__init__() if backbone_type == 'transformer': self.backbone = TransformerEncoder(...) self.noise_scheduler = CosineScheduler(...) def forward(self, x, t): # 添加噪声 noise = torch.randn_like(x) alpha_bar = self.noise_scheduler.get_alpha_bar(t) noisy_x = torch.sqrt(alpha_bar) * x + torch.sqrt(1 - alpha_bar) * noise # 预测噪声 pred_noise = self.backbone(noisy_x, t) return torch.nn.functional.mse_loss(pred_noise, noise) ``` 3. **采样过程** ```python def sample(self, cond_data, steps=1000): x_t = torch.randn_like(cond_data) for t in reversed(range(steps)): alpha = self.scheduler.alphas[t] sigma = self.scheduler.sigmas[t] # 使用网络预测噪声 pred_noise = self.backbone(x_t, t, cond_data) x_t = (x_t - (1 - alpha)/torch.sqrt(1 - alpha_bar) * pred_noise) / torch.sqrt(alpha) if t > 0: x_t += sigma * torch.randn_like(x_t) return x_t ``` #### 三、关键创新方向 1. **自回归引导**:如论文[^2]将预测结果作为条件输入扩散过程 2. **时空联合建模**:在交通流量预测中融合空间拓扑图与时间扩散 3. **非平稳性处理**:通过自适应归一化模块消除分布偏移
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值