前置
1. 分离状态层级、转移步与数组下标
设离散扩散共有 次转移,对应 个状态层级:
数学状态下标为
其中 表示干净数据, 表示终端噪声。第 次前向转移是
实现中必须把两类数组分开:
- 状态级数组长度为 ,代码下标
state_idx = i,可直接表示
、、 等状态量; - 转移级数组长度为 ,代码下标
step_idx = i - 1,对应数学转移 和参数
。
因此:
step_idx = 0对应从 到 的第一步,而不是状态 或 本身;step_idx = N - 1对应从 到 的第 步;state_idx = 0对应 ;state_idx = N对应 。
原有“idx = 0 既对应 又改成对应 ”的矛盾,来自把转移数组下标和状态数组下标共用同一个 idx。本文禁止这种未标类型的写法。
2. DDPM 数组约定
数学上定义
推荐实现:
betas.shape == (N,),betas[step_idx]表示
,其中 i=\texttt{step_idx}+1;alphas.shape == (N,),使用同一转移下标;alpha_bars.shape == (N + 1,);alpha_bars[0] = 1;alpha_bars[i] = prod(alphas[:i]),。
这样任意状态都可直接写成
特别地, 自动给出 ,不需要伪造
。若某个旧接口坚持使用长度 的 betas_state,必须明确
betas_state[0] 只是 padding,不是一次实际转移。
2.1 任意两状态之间
对 ,
这里 都是 state_idx,不是 step_idx。当 时
,第一步和任意时刻扰动都无需特殊边界补丁。
3. 连续时间与 EDM 网格
连续时间模型的训练时间 可以直接采样为实数,不应强行解释成 DDPM 的转移数组下标。若数值求解使用网格
则网格仍有 个状态点和 个积分区间。
EDM 采样通常按噪声从大到小存储:
此时:
sigma_idx = 0是采样起点的最大噪声;sigma_idx = N是最终零噪声;- 第
solver_idx = i个求解区间是
; - 该数组方向与正向物理时间是否递增无关,变量名应写
sigma_idx或solver_idx,不要复用 DDPM 的step_idx。
若前向 VE 过程在连续时间 上满足
需确保根号内非负,并明确 是否为零。若
,从干净数据到首个噪声层的方差约定不能被数组下标掩盖。
4. 宏观形状与微观形状
张量完整形状分为:
- Macro shape:批次和样本组织维度;
- Micro shape:单个样本内部的特征维度;
- Full shape:
Macro + Micro。
常规固定长度批次中:
- 文本表示形状 :
macro 为 ,micro 为 ; - 图像形状 :
macro 为 ,micro 为 ; - 单个向量批次 :
macro 为 ,micro 为 。
所有按样本采样的时间、噪声标准差、损失权重等最初形状通常都是
。在与数据做逐元素运算前,应扩展为
例如图像时间从 变为 ,向量批次从
变为 。
5. Batch flattening
变长数据常把批次内各样本的首个微观维度拼接。设批次有 个样本,第
个样本长度为 ,其余微观形状为
。令
拼接后数据形状为
本文约定:
- 逻辑 macro shape 仍为 ;
- 被拼接的变长轴由 表示;
- flatten 后供基础网络处理的逐元素 batch 轴为 ;
- 剩余 micro shape 为 。
需要一个归属映射
其中每个样本编号 重复 次。若逐样本时间为
先映射为
再扩展为
不能仅凭 reshape 把 变成 ;必须根据
batch_index、lengths 或等价的 segment 元数据重复各样本值。
6. 时间条件的形状变换
6.1 常规 batch
输入 形状为 :
- 初始时间
t.shape == (B,); - 网络条件可保持
(B,)交给时间嵌入层; - 若要与 广播运算,扩展为
(B,1,1,1)。
不要为了基础网络的时间嵌入接口而永久覆盖广播后的张量;推荐分别命名
t_condition 与 t_broadcast。
6.2 flattening batch
输入 形状为 :
- 初始逐样本时间
t_sample.shape == (B,); - 通过
batch_index映射为
t_flat.shape == (M,); - 传给基础网络的时间条件通常是
(M,); - 与输入逐元素运算时扩展为
(M,1,1)。
如果 hook 负责第 2 步,接口契约必须注明输入是逐样本还是逐 flatten 元素,避免上层和 hook 各重复一次。
7. 广播辅助函数的契约
一个可靠的 append_dims(value, target_ndim) 应满足:
- 只在末尾添加 singleton 维;
- 若
value.ndim > target_ndim,直接报错; - 不改变 batch/flatten 轴长度;
- 不负责把 映射为 ;该步骤由显式
batch_index完成。
数学上,
其中 是目标维数。
8. 最小命名规范
state_idx:离散状态层级,范围 ;step_idx:DDPM 转移数组,范围 ,对应数学步
i=\texttt{step_idx}+1;solver_idx:数值积分区间;sigma_idx:EDM 噪声级数组;t_continuous:连续时间实数;t_sample:形状 的逐样本时间;t_flat:形状 的 flatten 后时间;t_broadcast:追加 singleton 维后的广播张量。
只要这些对象不都缩写成 t 或 idx, 边界、第一步噪声、累计系数和 flattening 时间对齐就不会再互相矛盾。