前置

1. 分离状态层级、转移步与数组下标

设离散扩散共有 次转移,对应 个状态层级:

数学状态下标为

其中 表示干净数据, 表示终端噪声。第 次前向转移是

实现中必须把两类数组分开:

  1. 状态级数组长度为 ,代码下标 state_idx = i,可直接表示
    、、 等状态量;
  2. 转移级数组长度为 ,代码下标
    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

输入 形状为 :

  1. 初始时间 t.shape == (B,);
  2. 网络条件可保持 (B,) 交给时间嵌入层;
  3. 若要与 广播运算,扩展为 (B,1,1,1)。

不要为了基础网络的时间嵌入接口而永久覆盖广播后的张量;推荐分别命名
t_condition 与 t_broadcast。

6.2 flattening batch

输入 形状为 :

  1. 初始逐样本时间 t_sample.shape == (B,);
  2. 通过 batch_index 映射为
    t_flat.shape == (M,);
  3. 传给基础网络的时间条件通常是 (M,);
  4. 与输入逐元素运算时扩展为 (M,1,1)。

如果 hook 负责第 2 步,接口契约必须注明输入是逐样本还是逐 flatten 元素,避免上层和 hook 各重复一次。

7. 广播辅助函数的契约

一个可靠的 append_dims(value, target_ndim) 应满足:

  1. 只在末尾添加 singleton 维;
  2. 若 value.ndim > target_ndim,直接报错;
  3. 不改变 batch/flatten 轴长度;
  4. 不负责把 映射为 ;该步骤由显式
    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 时间对齐就不会再互相矛盾。