#397 · Deep Learning · Medium
⊣ Solve on deep-ml.comImplement classifier-free guidance (CFG) for conditional diffusion models. During inference, combine the conditional and unconditional noise predictions using a guidance scale to strengthen the influence of the conditioning signal.
import numpy as np
def classifier_free_guidance(
noise_pred_uncond: np.ndarray,
noise_pred_cond: np.ndarray,
guidance_scale: float
) -> np.ndarray:
# CFG formula: eps = eps_uncond + w * (eps_cond - eps_uncond)
return noise_pred_uncond + guidance_scale * (noise_pred_cond - noise_pred_uncond)
def cfg_training_step(
model_fn,
x_noisy: np.ndarray,
t: np.ndarray,
condition: np.ndarray,
null_condition: np.ndarray,
drop_prob: float = 0.1
) -> np.ndarray:
# Randomly drop condition during training
batch_size = x_noisy.shape[0]
drop_mask = np.random.random(batch_size) < drop_prob
# Replace dropped conditions with null condition
cond = condition.copy()
for i in range(batch_size):
if drop_mask[i]:
cond[i] = null_condition[0]
return model_fn(x_noisy, t, cond)eps = eps_uncond + w * (eps_cond - eps_uncond).w=1 gives standard conditional generation. w>1 amplifies the effect of the condition (higher fidelity, less diversity). w=0 gives unconditional generation.