forked from manbo/internal-docs
Add detailed mask-ddpm documentation
This commit is contained in:
918
knowledges/mask-ddpm.md
Normal file
918
knowledges/mask-ddpm.md
Normal file
@@ -0,0 +1,918 @@
|
|||||||
|
# mask‑ddpm 项目说明书(内部长文版|约 3 千字)
|
||||||
|
|
||||||
|
> 目标:以“论文叙述 + 说明书”混合风格,把项目的背景、方法、流程、评估、局限、未来方向完整写清楚。
|
||||||
|
> 面向对象:对扩散模型/时序建模不熟悉的读者也能读懂。
|
||||||
|
> 注意:不写具体实现代码,只写概念与方法。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 摘要(Abstract)
|
||||||
|
|
||||||
|
工业控制系统(ICS)数据具有“多变量、强时序、混合类型”的特点。传统生成模型往往只能满足分布或时序之一,难以同时兼顾。我们提出一种 **两阶段混合扩散框架(mask‑ddpm)**:第一阶段学习时序趋势,第二阶段用扩散模型学习残差分布,同时对离散变量采用遮蔽‑恢复式扩散。为解决少数变量主导 KS 的问题,我们进一步提出 **Type‑aware 分治思路**,将程序驱动变量与过程变量分离处理,并配套完善的诊断与评估体系。实验表明,该框架能显著改善分布一致性,同时保持一定的时序结构,且具备可解释的误差定位能力。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 背景与动机(Why this problem is hard)
|
||||||
|
|
||||||
|
工业数据和普通时间序列有本质区别:
|
||||||
|
|
||||||
|
1) **物理惯性**:许多变量变化缓慢,前一刻会强烈影响后一刻。
|
||||||
|
2) **程序驱动**:部分变量来自操作者/调度程序,呈现“阶跃 + 长时间停留”。
|
||||||
|
3) **混合类型**:连续传感器与离散状态共存,必须分别处理。
|
||||||
|
|
||||||
|
如果只用一个模型去学所有变量,会产生明显问题:
|
||||||
|
- 模型为了对齐分布,会牺牲时序结构 → lag‑1 变差
|
||||||
|
- 模型为了时序稳定,会模糊分布 → KS 上升
|
||||||
|
- 离散变量如果当连续处理,会出现非法值 → JSD 上升
|
||||||
|
|
||||||
|
因此,需要一种结构化的建模策略来“拆分矛盾”。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 问题定义(Problem Formulation)
|
||||||
|
|
||||||
|
给定真实序列 \(X \in \mathbb{R}^{T\times D}\),其中:
|
||||||
|
- \(T\):时间长度
|
||||||
|
- \(D\):变量维度(连续 + 离散)
|
||||||
|
|
||||||
|
目标是学习生成模型 \(G\),输出 \(\hat{X}\),使得:
|
||||||
|
|
||||||
|
**分布一致性**:
|
||||||
|
\[
|
||||||
|
\forall i,\; F^{(i)}_{gen}(x) \approx F^{(i)}_{real}(x)
|
||||||
|
\]
|
||||||
|
|
||||||
|
**时序一致性**:
|
||||||
|
\[
|
||||||
|
\rho_1(\hat{x}^{(i)}) \approx \rho_1(x^{(i)})
|
||||||
|
\]
|
||||||
|
|
||||||
|
**离散合法性**:
|
||||||
|
\[
|
||||||
|
\hat{x}^{(j)} \in \mathcal{V}_j
|
||||||
|
\]
|
||||||
|
|
||||||
|
其中 \(\rho_1\) 表示 lag‑1 相关,\(\mathcal{V}_j\) 是离散变量的合法词表。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 方法概览(Method Overview)
|
||||||
|
|
||||||
|
核心设计是 **两阶段 + 混合扩散**:
|
||||||
|
|
||||||
|
### 阶段 1:时序趋势建模
|
||||||
|
用序列模型学习“整体趋势”。直觉上,这一步只负责回答“序列怎么变化”。
|
||||||
|
|
||||||
|
### 阶段 2:分布残差建模
|
||||||
|
用扩散模型学习“趋势以外的残差”,修正分布形状。直觉上,这一步只负责回答“数值分布像不像”。
|
||||||
|
|
||||||
|
这种解耦让“时序一致性”与“分布一致性”不再直接冲突。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 模型结构(Model Details)
|
||||||
|
|
||||||
|
### 4.1 连续变量扩散(DDPM)
|
||||||
|
|
||||||
|
扩散过程:
|
||||||
|
\[
|
||||||
|
x_t = \sqrt{\bar{\alpha}_t}\,x_0 + \sqrt{1-\bar{\alpha}_t}\,\epsilon,\quad \epsilon \sim \mathcal{N}(0,I)
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:
|
||||||
|
- \(x_0\) 是真实残差
|
||||||
|
- \(x_t\) 是加噪后的数据
|
||||||
|
- 模型学习从 \(x_t\) 还原 \(x_0\) 或 \(\epsilon\)
|
||||||
|
|
||||||
|
### 4.2 离散变量扩散(Mask Diffusion)
|
||||||
|
|
||||||
|
离散变量通过“遮蔽 + 恢复”建模:
|
||||||
|
- 随机遮蔽部分 token
|
||||||
|
- 学习预测原始 token
|
||||||
|
|
||||||
|
这样保证离散输出 **合法且可解释**。
|
||||||
|
|
||||||
|
### 4.3 时序模块(Temporal GRU)
|
||||||
|
|
||||||
|
GRU 用于学习连续序列的趋势:
|
||||||
|
- 输入:连续序列
|
||||||
|
- 输出:趋势序列
|
||||||
|
- 用于构建残差:\(x_{resid} = x - trend\)
|
||||||
|
|
||||||
|
直观理解:
|
||||||
|
- GRU 负责“走向”
|
||||||
|
- 扩散负责“修正细节”
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 损失函数设计(Loss Design)
|
||||||
|
|
||||||
|
### 5.1 连续损失
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{cont} =
|
||||||
|
\begin{cases}
|
||||||
|
\|\hat{\epsilon}-\epsilon\|^2 & (预测噪声)\\
|
||||||
|
\|\hat{x}_0-x_0\|^2 & (预测原值)
|
||||||
|
\end{cases}
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:衡量“去噪后是否接近真实残差”。
|
||||||
|
|
||||||
|
### 5.2 离散损失
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{disc} = \frac{1}{|\mathcal{M}|}\sum_{(i,t)\in\mathcal{M}} CE(\hat{p}_{i,t}, y_{i,t})
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:只对被遮蔽的 token 做交叉熵,确保离散预测正确。
|
||||||
|
|
||||||
|
### 5.3 总损失
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L} = \lambda \mathcal{L}_{cont} + (1-\lambda)\mathcal{L}_{disc}
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:\(\lambda\) 决定分布与离散的权衡。
|
||||||
|
|
||||||
|
### 5.4 额外增强(可选)
|
||||||
|
|
||||||
|
**SNR 权重**:
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{snr} = \frac{\text{SNR}_t}{\text{SNR}_t+\gamma}\,\mathcal{L}_{cont}
|
||||||
|
\]
|
||||||
|
|
||||||
|
**分位数对齐**:
|
||||||
|
\[
|
||||||
|
\mathcal{L}_Q = \frac{1}{K}\sum_k \|Q_k(x_{real}) - Q_k(x_{gen})\|_1
|
||||||
|
\]
|
||||||
|
|
||||||
|
这些项有助于降低 KS,但可能牺牲时序一致性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 评估指标(Evaluation Metrics)
|
||||||
|
|
||||||
|
### 6.1 KS(分布一致性)
|
||||||
|
\[
|
||||||
|
KS_i = \sup_x |F^{(i)}_{gen}(x) - F^{(i)}_{real}(x)|
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:越小代表分布越接近。
|
||||||
|
|
||||||
|
### 6.2 JSD(离散一致性)
|
||||||
|
\[
|
||||||
|
JSD(P,Q)=\tfrac12 KL(P\|M)+\tfrac12 KL(Q\|M)
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:衡量离散分布差异。
|
||||||
|
|
||||||
|
### 6.3 Lag‑1 Diff(时序一致性)
|
||||||
|
\[
|
||||||
|
\Delta_{lag1} = \frac{1}{d}\sum_i |\rho_1(\hat{x}_i) - \rho_1(x_i)|
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:衡量相邻时刻相关性偏差。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 诊断与分治思想(Type‑aware)
|
||||||
|
|
||||||
|
现实中,少数变量会主导 KS:
|
||||||
|
- setpoint/demand(程序驱动)
|
||||||
|
- actuator(饱和/停留)
|
||||||
|
- derived tags(确定性映射)
|
||||||
|
|
||||||
|
因此我们提出 Type‑aware 分治:
|
||||||
|
|
||||||
|
| 类型 | 特性 | 处理思路 |
|
||||||
|
|------|------|---------|
|
||||||
|
| Type1 | 程序驱动 | 单独建模/重采样 |
|
||||||
|
| Type2 | 控制器输出 | 条件生成 |
|
||||||
|
| Type3 | 执行器位置 | 状态 + 停留模型 |
|
||||||
|
| Type4 | PV 过程量 | 扩散建模 |
|
||||||
|
| Type5 | 派生变量 | 确定性映射 |
|
||||||
|
| Type6 | 辅助量 | 简单统计模型 |
|
||||||
|
|
||||||
|
当前实现为 **KS‑only baseline**(经验重采样),只用于诊断上界。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 方法优势与局限
|
||||||
|
|
||||||
|
### 优势
|
||||||
|
- 将时序与分布解耦,训练更稳定
|
||||||
|
- 连续/离散混合扩散保证合法性
|
||||||
|
- 诊断工具完整,可定位问题变量
|
||||||
|
|
||||||
|
### 局限
|
||||||
|
- Type1/2/3 仍是难点
|
||||||
|
- KS 与时序存在 trade‑off
|
||||||
|
- KS‑only baseline 破坏联合分布
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 未来方向
|
||||||
|
|
||||||
|
1) Type1/2/3 条件生成器替代重采样
|
||||||
|
2) Type4 加工况 embedding
|
||||||
|
3) 增加跨变量相关性评估
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 结论
|
||||||
|
|
||||||
|
mask‑ddpm 通过“两阶段趋势 + 扩散残差”实现了更平衡的 ICS 序列生成框架。项目已经在大多数变量上取得合理分布对齐,但仍需针对程序驱动变量进行专门建模。该框架提供了一个清晰可扩展的研究路径。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录:公式解释简表
|
||||||
|
|
||||||
|
| 公式 | 含义 |
|
||||||
|
|------|------|
|
||||||
|
| DDPM 加噪 | 描述连续变量如何被噪声腐蚀 |
|
||||||
|
| 连续损失 | 衡量去噪结果与真实残差距离 |
|
||||||
|
| 离散交叉熵 | 衡量遮蔽 token 是否正确恢复 |
|
||||||
|
| KS | 分布最大偏差 |
|
||||||
|
| JSD | 离散分布偏差 |
|
||||||
|
| Lag‑1 Diff | 时序相关差异 |
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Part 1 / 4 — 方法与理论基础(约 5k)
|
||||||
|
|
||||||
|
> 本部分重点:把“这个方法为什么合理”讲清楚,建立读者对整体框架的直觉与理论基础。
|
||||||
|
|
||||||
|
## 1.1 工业时序生成的独特性
|
||||||
|
|
||||||
|
工业控制系统(ICS)数据和常规时序数据(如股票、天气)有本质差别。最关键的三点是:
|
||||||
|
|
||||||
|
**(a) 强物理约束**
|
||||||
|
许多过程变量受到物理规律约束,比如液位变化不可能突然跳跃,压力和温度的变化速度有上限。这意味着模型必须尊重“惯性”与“平滑性”。
|
||||||
|
|
||||||
|
**(b) 强程序驱动**
|
||||||
|
工业系统中存在大量“外部控制信号”,例如设定值(setpoint)、需求(demand)、运行模式。这些变量不是由过程自然演化产生,而是外部程序/操作者指令造成。它们往往呈现“阶跃+停留”模式。
|
||||||
|
|
||||||
|
**(c) 混合变量类型**
|
||||||
|
同时存在连续变量(传感器、控制量)和离散变量(状态、模式、告警)。如果把离散变量强行当连续变量,会造成语义错误,例如出现“介于运行/停机之间”的无意义状态。
|
||||||
|
|
||||||
|
因此,工业时序生成不是单纯的“预测下一步”,而是需要同时兼顾分布、时序、离散合法性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.2 为什么单一模型会失败
|
||||||
|
|
||||||
|
如果用单一的序列模型(例如 LSTM/Transformer)去同时优化分布与时序,通常会出现以下冲突:
|
||||||
|
|
||||||
|
- **分布损失优化 → 时序退化**
|
||||||
|
模型为了匹配每个变量的分布,会倾向于忽略时间结构,生成“看起来像分布,但像噪声”的序列。
|
||||||
|
|
||||||
|
- **时序损失优化 → 分布退化**
|
||||||
|
模型为了保持时序连续性,生成的数值往往过于平滑,导致分布偏离真实数据(尤其重尾、尖峰)。
|
||||||
|
|
||||||
|
- **离散变量错误**
|
||||||
|
离散变量被当作连续变量,会出现非法 token,导致 JSD 增大。
|
||||||
|
|
||||||
|
因此,必须引入结构性拆分:让不同模块只负责自己擅长的部分。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.3 设计原则:解耦与专职化
|
||||||
|
|
||||||
|
本项目遵循三条核心原则:
|
||||||
|
|
||||||
|
**原则 1:解耦“时序”与“分布”**
|
||||||
|
- 时序结构由 Temporal 模块负责
|
||||||
|
- 分布细节由 Diffusion 模块负责
|
||||||
|
|
||||||
|
**原则 2:连续与离散分开建模**
|
||||||
|
- 连续变量适合高斯扩散
|
||||||
|
- 离散变量适合 mask‑diffusion
|
||||||
|
|
||||||
|
**原则 3:对难学变量分类处理**
|
||||||
|
- 程序驱动变量(Type1)不适合 DDPM
|
||||||
|
- 执行器变量(Type3)需要额外模型
|
||||||
|
|
||||||
|
这些原则构成了本项目的总体方法论。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.4 两阶段框架的理论直觉
|
||||||
|
|
||||||
|
两阶段方法可以理解为:
|
||||||
|
|
||||||
|
\[
|
||||||
|
X = \text{Trend}(X) + \text{Residual}(X)
|
||||||
|
\]
|
||||||
|
|
||||||
|
**趋势部分**:决定序列“怎么走”,例如逐渐上升/下降,保持物理惯性。
|
||||||
|
**残差部分**:决定数值“长什么样”,例如分布形状、重尾、异常点等。
|
||||||
|
|
||||||
|
如果直接用一个模型去学 \(X\),它必须同时解决趋势与分布问题。而我们拆成两部分后:
|
||||||
|
- 第一阶段(GRU)只学趋势
|
||||||
|
- 第二阶段(Diffusion)只学残差
|
||||||
|
|
||||||
|
这样能显著减少“时序 vs 分布”的冲突。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.5 扩散模型为什么适合分布对齐
|
||||||
|
|
||||||
|
扩散模型(DDPM)是一类生成式模型,核心思想是:
|
||||||
|
1) 逐步加噪,把数据变成纯噪声
|
||||||
|
2) 逐步去噪,恢复真实分布
|
||||||
|
|
||||||
|
数学形式:
|
||||||
|
\[
|
||||||
|
x_t = \sqrt{\bar{\alpha}_t}\,x_0 + \sqrt{1-\bar{\alpha}_t}\,\epsilon
|
||||||
|
\]
|
||||||
|
|
||||||
|
去噪的目标是预测 \(\epsilon\) 或 \(x_0\)。
|
||||||
|
|
||||||
|
**优点**:
|
||||||
|
- 可以拟合复杂、多峰、重尾分布
|
||||||
|
- 不依赖显式的概率密度函数
|
||||||
|
|
||||||
|
这正是 ICS 数据中“分布复杂”的现实需求。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.6 为什么离散变量要用 mask‑diffusion
|
||||||
|
|
||||||
|
离散变量的关键问题是“语义合法性”。如果直接用连续扩散,会生成不合法值(例如 0.3、1.7 等),导致模型失效。
|
||||||
|
|
||||||
|
mask‑diffusion 的思路:
|
||||||
|
1) 随机遮蔽部分 token
|
||||||
|
2) 模型预测被遮蔽 token
|
||||||
|
|
||||||
|
损失是交叉熵:
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{disc} = \frac{1}{|\mathcal{M}|}\sum_{(i,t)\in\mathcal{M}} CE(\hat{p}_{i,t},y_{i,t})
|
||||||
|
\]
|
||||||
|
|
||||||
|
这样保证输出必然来自 vocab,语义上合法。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.7 为什么需要 Type‑aware 分治
|
||||||
|
|
||||||
|
即使有两阶段 + 混合扩散,仍然会发现 KS 被少数变量主导:
|
||||||
|
|
||||||
|
- Type1(setpoint/demand)几乎是“程序信号”
|
||||||
|
- Type3(执行器)具有“停留+饱和”特性
|
||||||
|
- Type5(派生变量)是确定性函数
|
||||||
|
|
||||||
|
这些变量从统计机制上就不适合扩散模型,因此需要额外设计。
|
||||||
|
|
||||||
|
Type‑aware 的意义是:
|
||||||
|
- 把“扩散学不好的变量”剥离出去
|
||||||
|
- 让扩散专注于真正适合它的变量(Type4)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.8 指标设计的意义(直觉解释)
|
||||||
|
|
||||||
|
我们采用三类核心指标:
|
||||||
|
|
||||||
|
**(a) KS:分布对齐**
|
||||||
|
衡量生成分布与真实分布最大差距,越小越好。
|
||||||
|
|
||||||
|
**(b) JSD:离散一致性**
|
||||||
|
衡量离散状态频率是否接近真实。
|
||||||
|
|
||||||
|
**(c) Lag‑1 Diff:时序一致性**
|
||||||
|
衡量相邻时刻相关结构是否接近真实。
|
||||||
|
|
||||||
|
这三个指标对应三个核心目标:分布、时序、合法性。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.9 理论层面的 trade‑off
|
||||||
|
|
||||||
|
可以理解为:
|
||||||
|
|
||||||
|
- KS 低 → 表示分布好
|
||||||
|
- Lag‑1 diff 低 → 表示时序好
|
||||||
|
|
||||||
|
但在实践中:
|
||||||
|
- 如果模型过度优化 KS,序列可能变成“随机抽样” → 时序崩坏
|
||||||
|
- 如果模型过度优化时序,分布会过于平滑 → KS 上升
|
||||||
|
|
||||||
|
因此,一个好的模型必须在二者之间找到平衡点。这正是本项目提出两阶段框架的核心动机。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.10 小结
|
||||||
|
|
||||||
|
本部分给出了方法的理论基础:
|
||||||
|
|
||||||
|
1) ICS 数据复杂且混合类型,单一模型难以兼顾
|
||||||
|
2) 两阶段结构用于解耦时序与分布
|
||||||
|
3) 混合扩散用于处理连续与离散
|
||||||
|
4) Type‑aware 分治用于处理“扩散难学”的变量
|
||||||
|
|
||||||
|
下一部分将详细介绍**训练流程与损失设计**。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Part 2 / 4 — 训练流程与损失设计(约 5k)
|
||||||
|
|
||||||
|
> 本部分重点:让普通读者清楚“模型训练到底在做什么、每一步优化的目标是什么、为什么需要这些 loss”。
|
||||||
|
|
||||||
|
## 2.1 训练流程总览(高层视角)
|
||||||
|
|
||||||
|
整个训练分为两个阶段:
|
||||||
|
|
||||||
|
1) **Temporal Stage**:训练一个时序模型(GRU),学习序列趋势。
|
||||||
|
2) **Diffusion Stage**:训练扩散模型,学习趋势残差的分布。
|
||||||
|
|
||||||
|
换句话说,训练不是一次性完成,而是先学“怎么变化”,再学“变化后的数值细节”。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.2 Temporal Stage:学趋势的意义
|
||||||
|
|
||||||
|
工业过程的动态通常平滑且具有惯性。假设我们直接用扩散模型学习整个序列,那么它必须同时完成“序列走向”和“数值分布”的建模任务。这样会产生冲突:
|
||||||
|
|
||||||
|
- 过度优化分布 → 序列变随机
|
||||||
|
- 过度优化时序 → 分布变窄
|
||||||
|
|
||||||
|
Temporal Stage 的目的就是先把“走向”固定住。
|
||||||
|
|
||||||
|
### 训练方式(直觉)
|
||||||
|
- 输入:连续变量序列
|
||||||
|
- 目标:预测下一时刻的连续序列
|
||||||
|
- 损失:MSE
|
||||||
|
|
||||||
|
这样模型学到的是“趋势结构”,而不是复杂分布。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.3 Diffusion Stage:学残差分布
|
||||||
|
|
||||||
|
在 Temporal Stage 得到趋势序列 \(T\) 后,我们构造残差:
|
||||||
|
\[
|
||||||
|
R = X - T
|
||||||
|
\]
|
||||||
|
|
||||||
|
Diffusion Stage 的目标是拟合残差分布。这样最终生成结果为:
|
||||||
|
\[
|
||||||
|
\hat{X} = \hat{R} + T
|
||||||
|
\]
|
||||||
|
|
||||||
|
**直观理解**:
|
||||||
|
- 趋势提供骨架
|
||||||
|
- 残差提供“真实的噪声与细节”
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.4 连续分支损失设计
|
||||||
|
|
||||||
|
### 基本损失
|
||||||
|
在扩散中,我们可以选择预测噪声 \(\epsilon\),或直接预测原始 \(x_0\):
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{cont} =
|
||||||
|
\begin{cases}
|
||||||
|
\|\hat{\epsilon} - \epsilon\|^2 & (eps 预测)\\
|
||||||
|
\|\hat{x}_0 - x_0\|^2 & (x0 预测)
|
||||||
|
\end{cases}
|
||||||
|
\]
|
||||||
|
|
||||||
|
### 为什么要预测 eps 或 x0?
|
||||||
|
- eps 预测更稳定(扩散原始形式)
|
||||||
|
- x0 预测更容易做分布校正
|
||||||
|
|
||||||
|
因此在不同实验中会切换。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.5 离散分支损失设计
|
||||||
|
|
||||||
|
离散变量使用 mask‑diffusion。训练时随机遮蔽一部分 token:
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{disc} = \frac{1}{|\mathcal{M}|}\sum_{(i,t)\in\mathcal{M}} CE(\hat{p}_{i,t},y_{i,t})
|
||||||
|
\]
|
||||||
|
|
||||||
|
直觉解释:
|
||||||
|
- 只对被 mask 的 token 计算交叉熵
|
||||||
|
- 学到的是“在上下文中恢复正确状态”
|
||||||
|
|
||||||
|
这样避免了离散变量非法输出问题。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.6 总损失与权衡
|
||||||
|
|
||||||
|
最终损失采用线性加权:
|
||||||
|
\[
|
||||||
|
\mathcal{L} = \lambda\mathcal{L}_{cont} + (1-\lambda)\mathcal{L}_{disc}
|
||||||
|
\]
|
||||||
|
|
||||||
|
**\(\lambda\) 的作用**:
|
||||||
|
- \(\lambda\) 大 → 连续分布更好,离散可能退化
|
||||||
|
- \(\lambda\) 小 → 离散更好,连续分布可能偏差
|
||||||
|
|
||||||
|
这是训练中的关键权衡参数。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.7 SNR 加权(为什么需要)
|
||||||
|
|
||||||
|
扩散过程早期噪声大、后期噪声小。直接用统一损失会导致训练不均衡。
|
||||||
|
因此引入 SNR 权重:
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{snr} = \frac{\text{SNR}_t}{\text{SNR}_t+\gamma}\mathcal{L}_{cont}
|
||||||
|
\]
|
||||||
|
|
||||||
|
直觉解释:
|
||||||
|
- 在高噪声阶段,降低损失权重
|
||||||
|
- 在低噪声阶段,更强调精细结构
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.8 分位数损失(为什么对 KS 有效)
|
||||||
|
|
||||||
|
KS 本质是比较分布的 CDF。
|
||||||
|
因此加入分位数损失:
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_Q = \frac{1}{K}\sum_k \|Q_k(x_{real}) - Q_k(x_{gen})\|_1
|
||||||
|
\]
|
||||||
|
|
||||||
|
直觉解释:
|
||||||
|
- 让模型对齐分布的关键分位点
|
||||||
|
- 尤其改善重尾和尖峰变量
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.9 残差统计约束(防止塌缩)
|
||||||
|
|
||||||
|
为了避免残差分布塌缩,加入 mean/std 对齐:
|
||||||
|
|
||||||
|
\[
|
||||||
|
\mathcal{L}_{stat} = \|\mu_{gen}-\mu_{real}\|^2 + \|\sigma_{gen}-\sigma_{real}\|^2
|
||||||
|
\]
|
||||||
|
|
||||||
|
解释:
|
||||||
|
- 约束残差均值与方差
|
||||||
|
- 防止模型学到“过于平滑”残差
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.10 为什么训练会慢(深度解释)
|
||||||
|
|
||||||
|
1) **两阶段训练**
|
||||||
|
- Temporal 训练 + Diffusion 训练
|
||||||
|
- 训练成本几乎翻倍
|
||||||
|
|
||||||
|
2) **扩散步数大**
|
||||||
|
- timesteps=600
|
||||||
|
- 每次训练/采样都要反复迭代
|
||||||
|
|
||||||
|
3) **Transformer backbone**
|
||||||
|
- 自注意力复杂度随序列长度平方增长
|
||||||
|
- seq_len=128 时显存和时间增加明显
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.11 训练中的常见异常与解释
|
||||||
|
|
||||||
|
**(a) loss 降得慢**
|
||||||
|
- 原因:扩散训练本身慢
|
||||||
|
- 解决:降低 timesteps 或增大 batch
|
||||||
|
|
||||||
|
**(b) loss 大幅波动**
|
||||||
|
- 原因:噪声采样随机性 + 分布复杂性
|
||||||
|
- 解决:增加 EMA 或降低学习率
|
||||||
|
|
||||||
|
**(c) lag‑1 差**
|
||||||
|
- 原因:trend 学得不足或 seq_len mismatch
|
||||||
|
- 解决:提高 temporal_epochs,并统一 seq_len 与 sample_seq_len
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.12 小结
|
||||||
|
|
||||||
|
本部分强调了训练的核心逻辑:
|
||||||
|
- Temporal Stage 负责时序结构
|
||||||
|
- Diffusion Stage 负责分布残差
|
||||||
|
- Loss 设计通过多项损失平衡分布与时序
|
||||||
|
|
||||||
|
下一部分将深入说明评估与诊断体系。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Part 3 / 4 — 评估与诊断体系(约 5k)
|
||||||
|
|
||||||
|
> 本部分重点:让读者理解“如何判断模型好坏”,以及“为什么需要诊断工具”。
|
||||||
|
|
||||||
|
## 3.1 为什么只看 loss 不够
|
||||||
|
|
||||||
|
训练 loss 只能说明“模型在拟合训练目标”,但不一定等价于真实质量。
|
||||||
|
在本项目中,loss 可能降低,但 KS 或 lag‑1 仍可能很差,因为:
|
||||||
|
- loss 主要优化局部误差,而 KS 衡量整体分布差异
|
||||||
|
- 模型可能学到“平均值附近”,但尾部严重缺失
|
||||||
|
- 离散变量可能预测错误,但 loss 依旧较小
|
||||||
|
|
||||||
|
因此,必须使用更贴近目标的评估指标。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.2 分布一致性指标(KS)
|
||||||
|
|
||||||
|
KS 统计量定义为:
|
||||||
|
\[
|
||||||
|
KS_i = \sup_x |F^{(i)}_{gen}(x)-F^{(i)}_{real}(x)|
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:
|
||||||
|
- \(F_{gen}\):生成分布的累积分布函数
|
||||||
|
- \(F_{real}\):真实分布的累积分布函数
|
||||||
|
- KS 表示两条 CDF 曲线的最大距离
|
||||||
|
|
||||||
|
**直观理解**:
|
||||||
|
- KS 小 → 生成分布几乎重合
|
||||||
|
- KS 大 → 分布偏移明显
|
||||||
|
|
||||||
|
**注意**:在尖峰/离散化变量上,必须使用 tie‑aware KS,否则会被高估。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.3 离散一致性指标(JSD)
|
||||||
|
|
||||||
|
Jensen‑Shannon Divergence:
|
||||||
|
\[
|
||||||
|
JSD(P,Q)=\tfrac12 KL(P\|M)+\tfrac12 KL(Q\|M)
|
||||||
|
\]
|
||||||
|
其中 \(M = (P+Q)/2\)。
|
||||||
|
|
||||||
|
**解释**:
|
||||||
|
- 衡量离散分布差异
|
||||||
|
- 适合评估状态类变量
|
||||||
|
- 越小越好
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.4 时序一致性指标(Lag‑1 Diff)
|
||||||
|
|
||||||
|
Lag‑1 相关差异:
|
||||||
|
\[
|
||||||
|
\Delta_{lag1} = \frac{1}{d}\sum_i |\rho_1(\hat{x}_i)-\rho_1(x_i)|
|
||||||
|
\]
|
||||||
|
|
||||||
|
**解释**:
|
||||||
|
- 计算每个变量的相邻相关性
|
||||||
|
- 衡量“时间上的惯性是否正确”
|
||||||
|
- 越小越好
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.5 为什么要做诊断
|
||||||
|
|
||||||
|
即使平均 KS 下降,也可能是“部分变量非常好,部分变量非常差”。
|
||||||
|
这会误导优化方向。因此必须诊断:
|
||||||
|
|
||||||
|
- 哪些变量最差?
|
||||||
|
- 它们的分布差在什么区间?
|
||||||
|
- 它们属于哪种类型?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.6 诊断工具 1:Per‑feature KS 排序
|
||||||
|
|
||||||
|
我们用 `ranked_ks.py` 输出:
|
||||||
|
- 变量 KS 从高到低排序
|
||||||
|
- 观察“top‑N 主导问题变量”
|
||||||
|
|
||||||
|
**意义**:
|
||||||
|
- 精准定位瓶颈
|
||||||
|
- 避免盲目改模型
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.7 诊断工具 2:CDF 图
|
||||||
|
|
||||||
|
用 `diagnose_ks.py` 绘制 CDF 对比:
|
||||||
|
- 真实 vs 生成
|
||||||
|
- 可直观看到“尾部缺失 / 中位数偏移 / 饱和堆积”
|
||||||
|
|
||||||
|
这是理解 KS 高的最直接手段。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.8 诊断工具 3:Filtered KS
|
||||||
|
|
||||||
|
Filtered KS 会剔除:
|
||||||
|
- 标准差为 0 的变量
|
||||||
|
- KS 极端异常的变量
|
||||||
|
|
||||||
|
**意义**:
|
||||||
|
- 判断“整体模型是否已经合理”
|
||||||
|
- 证明 KS 被少数变量拖垮
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.9 Type‑wise 评估
|
||||||
|
|
||||||
|
为了对应 Type‑aware 分治策略,我们也统计:
|
||||||
|
- Type1 KS 均值
|
||||||
|
- Type2 KS 均值
|
||||||
|
- Type3 KS 均值
|
||||||
|
- …
|
||||||
|
|
||||||
|
这样可以看到不同类型变量的贡献。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.10 评估指标的 trade‑off
|
||||||
|
|
||||||
|
现实中常见情况:
|
||||||
|
- KS 下降 → lag‑1 上升
|
||||||
|
- lag‑1 下降 → KS 上升
|
||||||
|
|
||||||
|
因此需要在实验中明确目标:
|
||||||
|
- 若目标是分布一致性,接受时序退化
|
||||||
|
- 若目标是时序一致性,接受分布偏差
|
||||||
|
|
||||||
|
这也是论文中必须讨论的权衡点。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.11 KS‑only baseline 的作用
|
||||||
|
|
||||||
|
KS‑only baseline 是一种诊断工具:
|
||||||
|
- 把难学变量替换为真实分布采样
|
||||||
|
- 观察整体 KS 降到的“上限”
|
||||||
|
|
||||||
|
意义:
|
||||||
|
- 如果 KS 仍高 → 说明模型整体分布学得差
|
||||||
|
- 如果 KS 明显降 → 说明瓶颈集中在少数变量
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.12 评估流程的完整逻辑
|
||||||
|
|
||||||
|
评估流程包含:
|
||||||
|
1) 生成数据(generated.csv)
|
||||||
|
2) 与真实数据对比,计算 KS/JSD/lag‑1
|
||||||
|
3) 输出 eval.json
|
||||||
|
4) 额外诊断:CDF/Rank/Filtered
|
||||||
|
5) 若启用后处理,再评估 eval_post.json
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.13 小结
|
||||||
|
|
||||||
|
本部分说明:
|
||||||
|
- 为什么必须用 KS/JSD/lag‑1 评估
|
||||||
|
- 为什么要做 per‑feature 诊断
|
||||||
|
- 为什么引入 Type‑wise 分治评估
|
||||||
|
|
||||||
|
下一部分将讨论实验观察、局限与未来方向。
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Part 4 / 4 — 实验观察、局限与未来方向(约 5k)
|
||||||
|
|
||||||
|
> 本部分重点:总结实验现象,解释为什么会出现这些现象,并给出未来工作的方向。
|
||||||
|
|
||||||
|
## 4.1 典型实验现象回顾
|
||||||
|
|
||||||
|
在大量实验中,我们观察到几个稳定现象:
|
||||||
|
|
||||||
|
1) **KS 可以明显下降,但 lag‑1 可能变差**
|
||||||
|
- 当加强分布对齐(quantile loss、校准)时,分布更好,但时序一致性下降
|
||||||
|
|
||||||
|
2) **离散 JSD 相对稳定**
|
||||||
|
- 离散 mask diffusion 保证 token 合法性
|
||||||
|
- JSD 通常不会像 KS 那样剧烈波动
|
||||||
|
|
||||||
|
3) **少数变量主导 KS**
|
||||||
|
- Type1/2/3 是 KS 的主要来源
|
||||||
|
- 说明整体分布其实已经合理,问题集中在少数难学变量
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.2 为什么 Type1/2/3 变量难学
|
||||||
|
|
||||||
|
**Type1(setpoint/demand)**
|
||||||
|
- 本质是外部程序驱动,而非系统响应
|
||||||
|
- 呈现长时间常数 + 突然阶跃
|
||||||
|
- 扩散模型更擅长连续变化,难以准确复现这种跳变
|
||||||
|
|
||||||
|
**Type2(controller output)**
|
||||||
|
- 受控制算法约束(PID)
|
||||||
|
- 值域常常饱和于 0 或 100
|
||||||
|
- 分布极端尖峰
|
||||||
|
|
||||||
|
**Type3(actuator positions)**
|
||||||
|
- 常有停留、饱和和离散档位
|
||||||
|
- 实际变化规律与简单连续噪声不同
|
||||||
|
|
||||||
|
这些特性说明:必须用专门的模型去建模,而不是依靠通用 DDPM。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.3 KS‑only baseline 的意义与局限
|
||||||
|
|
||||||
|
KS‑only baseline(经验重采样)告诉我们:
|
||||||
|
- **理论上 KS 能到多低**
|
||||||
|
- 确认瓶颈是否在少数变量
|
||||||
|
|
||||||
|
但它的局限也非常明显:
|
||||||
|
- 破坏变量之间的依赖关系
|
||||||
|
- 无法保证联合分布一致
|
||||||
|
- 只能作为诊断工具,而非最终生成器
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.4 时序 vs 分布的理论矛盾
|
||||||
|
|
||||||
|
在本项目中,时序与分布的矛盾非常典型:
|
||||||
|
|
||||||
|
- 如果只关注分布:序列会失去惯性,变成“随机抽样”
|
||||||
|
- 如果只关注时序:序列会变平滑,失去重尾或多模态特征
|
||||||
|
|
||||||
|
两阶段架构正是为了缓解这种矛盾,但仍无法彻底消除。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.5 为什么需要条件建模(Conditioning)
|
||||||
|
|
||||||
|
真实工业数据往往依赖于“工况/模式”。
|
||||||
|
例如:
|
||||||
|
- 不同 setpoint 会导致不同 PV 分布
|
||||||
|
- 不同状态会导致执行器行为差异
|
||||||
|
|
||||||
|
因此,未来需要在模型中加入条件:
|
||||||
|
|
||||||
|
\[
|
||||||
|
P(X|C)\quad \text{而不是}\quad P(X)
|
||||||
|
\]
|
||||||
|
|
||||||
|
这种条件建模可以显著减少分布误差。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.6 未来方向(具体可操作的路线)
|
||||||
|
|
||||||
|
### 方向 1:Type1 程序生成器
|
||||||
|
- 用 HMM 或 change‑point 模型生成 setpoint/demand
|
||||||
|
- 再作为条件输入扩散模型
|
||||||
|
|
||||||
|
### 方向 2:Type2 控制器模拟器
|
||||||
|
- 训练一个小型控制器网络
|
||||||
|
- 根据 setpoint + PV 输出控制量
|
||||||
|
|
||||||
|
### 方向 3:Type3 执行器动力学模型
|
||||||
|
- 用“状态 + 停留 + 速率”建模
|
||||||
|
- 比纯重采样更真实
|
||||||
|
|
||||||
|
### 方向 4:Type4 PV 的条件扩散
|
||||||
|
- 加入工况 embedding
|
||||||
|
- 在不同 regime 下分布更一致
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.7 实验写作建议(论文表达角度)
|
||||||
|
|
||||||
|
在写论文时,可以这样组织:
|
||||||
|
|
||||||
|
1) 展示 KS/JSD/lag‑1 的全局指标
|
||||||
|
2) 展示 per‑feature KS 排序
|
||||||
|
3) 强调“少数变量主导错误”
|
||||||
|
4) 提出 Type‑aware 分治策略
|
||||||
|
5) 用 KS‑only baseline 作为诊断上界
|
||||||
|
|
||||||
|
这样能显得方法合理且有深度。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.8 结论总结
|
||||||
|
|
||||||
|
本项目提供了一条清晰路径:
|
||||||
|
|
||||||
|
- 先解耦时序与分布(两阶段)
|
||||||
|
- 再解决连续与离散(混合扩散)
|
||||||
|
- 最后用 Type‑aware 分治处理难变量
|
||||||
|
|
||||||
|
因此,它不仅是一个生成模型,更是一套“如何诊断、如何改进”的系统性方法。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 全文总结
|
||||||
|
|
||||||
|
mask‑ddpm 的核心贡献在于 **结构性拆解问题**:
|
||||||
|
- 时序结构与分布对齐分开建模
|
||||||
|
- 连续与离散分开扩散
|
||||||
|
- 难变量类型单独处理
|
||||||
|
|
||||||
|
通过这些结构化手段,本项目为工业时序生成提供了一个可解释、可扩展的方案。它不是单纯追求指标最优,而是提供了一套完整的研究路径。
|
||||||
|
|
||||||
Reference in New Issue
Block a user