Implement the linear beta noise schedule for Denoising Diffusion Probabilistic Models (DDPM). Compute the sequence of beta values, and derive alpha, alpha_bar (cumulative product), and the forward diffusion noise parameters for any timestep.
import numpy as np
def ddpm_linear_schedule(num_timesteps: int, beta_start: float = 1e-4, beta_end: float = 0.02) -> dict:
betas = np.linspace(beta_start, beta_end, num_timesteps)
alphas = 1.0 - betas
alpha_bars = np.cumprod(alphas)
sqrt_alpha_bars = np.sqrt(alpha_bars)
sqrt_one_minus_alpha_bars = np.sqrt(1.0 - alpha_bars)
return {
"betas": betas,
"alphas": alphas,
"alpha_bars": alpha_bars,
"sqrt_alpha_bars": sqrt_alpha_bars,
"sqrt_one_minus_alpha_bars": sqrt_one_minus_alpha_bars,
}
def forward_diffusion(x0: np.ndarray, t: int, schedule: dict) -> tuple[np.ndarray, np.ndarray]:
noise = np.random.randn(*x0.shape)
sqrt_ab = schedule["sqrt_alpha_bars"][t]
sqrt_1_ab = schedule["sqrt_one_minus_alpha_bars"][t]
xt = sqrt_ab * x0 + sqrt_1_ab * noise
return xt, noisebeta_start to beta_end over T timesteps.1 - beta. Alpha_bar is the cumulative product of alphas, representing total signal retained.x_t = sqrt(alpha_bar_t) * x_0 + sqrt(1 - alpha_bar_t) * epsilon.sqrt_alpha_bar controls how much original signal remains; sqrt_one_minus_alpha_bar controls noise magnitude.