扩散原野DIFFUSION FIELD
0/8
05Sampling

训练随机挑一步,采样必须走完整条路。

xTN(0,I)x_T\sim\mathcal N(0,I) 开始,模型在每个时间步预测噪声,转换为反向均值,再采样得到 xt1x_{t-1}

Concept player

代码与采样同步

01x = randn(shape)                 # x_T02for t in reversed(range(1, T+1)):03    eps = model(x, t)04    mean = reverse_mean(x, eps, t)05    z = randn_like(x) if t > 1 else 006    x = mean + sigma[t] * z      # x_{t-1}07return x                         # x_0
x50x_{50}概念性二维轨迹 · 不是神经网络推理结果
当前行 1反向步 5049随机项 zN(0,I)z\sim\mathcal N(0,I)

单步更新里的三件事

01 · predict

预测 εθ\varepsilon_\theta

估计当前 xtx_t 中属于噪声的部分。

02 · mean

计算 μθ\mu_\theta

xtx_t 与噪声预测构造反向分布均值。

03 · sample

采样 xt1x_{t-1}

t>1t>1 时加入 zz;最后一步通常不再加入随机噪声。

xt1=1αt(xt1αt1αˉtεθ(xt,t))+σtzx_{t-1}=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\varepsilon_\theta(x_t,t)\right)+\sigma_t z
关于少步采样: 原始 DDPM 采样较慢。DDIM 等方法能用更少步数,但不能把“随便跳过若干 DDPM 步”称为等价采样。
停下来想 30 秒

为什么 t=1t=1 得到 x0x_0 的最后一步通常不再加入额外随机噪声 zz

下一节:PyTorch 实现