چیت‌شیت

مدل‌های دیفیوژن و زایشی

Diffusion and Generative Models

آموزش و نمونه‌گیری VAE، GAN، DDPM، دیفیوژن نهان و تطبیق جریان، سپس ارزیابی آن‌ها. کدهای پایتون ساده‌ی درس‌ها.

  • ۱۱ بخش
  • ۷ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. دیفیوژن نهان با CFG
  2. آموزش و نمونه‌گیری DDPM
  3. فرمول‌های کلیدی
  4. وظایف در کد
  5. برنامه‌ی زمان‌بندی DDPM، نویز و حلقه‌ی معکوس
  6. نمونه‌گیرها و گام‌ها
  7. پیش‌فرض‌ها و مقادیر عددی
  8. عیب‌یابی
  9. اختصارات
  10. پرسش‌ها
  11. نکات کاربردی

دیفیوژن نهان با CFG

معماری
cross attnدو تا epsT گامآموزشافزودن نویزکدگذار متنفریز شده، CLIP یا T5نهان نویزیشروع از N(0, I)نویززداU-Net یا DiTترکیب CFGشرطی و غیرشرطینهان تمیز64 × 64 × 4کدگشای VAEنهان به پیکسل‌هاتصویر512 × 512 × 3کدگذار VAEآموزش و img2img

آموزش و نمونه‌گیری DDPM

گام‌به‌گام
  1. برنامه‌ی زمان‌بندی$\beta_t$ خطی از 1e-4 تا 0.02 طی $T$ گام، سپس $\bar\alpha_t$.
  2. نمونه‌گیری اولیه$x_0$ از داده‌ها، $t$ تصادفی، $\epsilon \sim \mathcal{N}(0, I)$.
  3. نویزمحاسبه‌ی یک‌باره‌ی $x_t$ با فرم بسته.
  4. پیش‌بینیشبکه $x_t$ و امبدینگ سینوسی $t$ را دریافت کرده و $\hat\epsilon$ را خروجی می‌دهد.
  5. تابع زیان (loss)خطای مربعات بین $\epsilon$ و $\hat\epsilon$، سپس یک گام گرادیان.
  6. شروع نمونه‌گیریرسم $x_T \sim \mathcal{N}(0, I)$.
  7. فرآیند معکوساعمال گام معکوس از $t = T$ تا 1. افزودن نویز در تمام گام‌ها جز آخرین گام.

فرمول‌های کلیدی

مفهوم‌ها
گذر رو به جلو
$q(x_t \mid x_0) = \mathcal{N}\left( \sqrt{\bar\alpha_t} \, x_0, (1 - \bar\alpha_t) I \right)$
آلفا بار
$\bar\alpha_t = \prod_{s=1}^{t} (1 - \beta_s)$
زیان ساده
$L_{\text{simple}} = \lVert \epsilon - \epsilon_\theta(x_t, t) \rVert^2$
گام معکوس
$x_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}} \epsilon_\theta(x_t, t) \right) + \sigma_t z$
زیان VAE
$\lVert x - \hat{x} \rVert^2 + \beta \sum_i \frac{\sigma_i^2 + \mu_i^2 - \log \sigma_i^2 - 1}{2}$
بازی GAN
$\min_G \max_D \, \mathbb{E}[\log D(x)] + \mathbb{E}[\log(1 - D(G(z)))]$
هدایت بدون طبقه‌بند (CFG)
$\epsilon_{\text{cfg}} = (1 + w) \epsilon_{\text{cond}} - w \epsilon_{\text{uncond}}$
تطبیق جریان
$x_t = t x_1 + (1 - t) x_0$, $L = \lVert v_\theta(x_t, t) - (x_1 - x_0) \rVert^2$

وظایف در کد

کار و کد
وظیفهکد
نویز زدن به $x_0$ تا گام $t$x_t = math.sqrt(a_bar) * x0 + math.sqrt(1 - a_bar) * eps
بازپارامتری‌سازی VAE[m + s * e for m, s, e in zip(mu, sigma, eps)]
زیان اشباع‌نشده‌ی G-sum(math.log(max(p, 1e-8)) for p in d_fake) / len(d_fake)
حذف برچسب برای CFGuse_c = NULL_CLASS if rng.random() < 0.1 else c
ترکیب با CFGeps_cfg = (1 + w) * eps_cond - w * eps_uncond
هدف تطبیق جریانtarget = x1 - x0
گام اویلر، جریانx -= dt * net_forward(x, t)
رمزگشایی کاشی‌وار VAEpipe.vae.enable_tiling()

برنامه‌ی زمان‌بندی DDPM، نویز و حلقه‌ی معکوس

کد
python
betas = [1e-4 + (0.02 - 1e-4) * t / (T - 1) for t in range(T)]  # خطی
alphas = [1 - b for b in betas]
alpha_bars, cum = [], 1.0
for a in alphas:
    cum *= a
    alpha_bars.append(cum)                                      # حاصل‌ضرب تجمعی
eps = rng.gauss(0, 1)                                           # نویز آموزش
x_t = math.sqrt(a_bar) * x0 + math.sqrt(1 - a_bar) * eps        # یک‌باره
x = rng.gauss(0, 1)                                             # شروع نمونه‌گیری از نویز
for t in range(T - 1, -1, -1):                                  # T-1 به سمت 0
    eps_hat, _ = forward([x], t_emb, net)                       # نویز پیش‌بینی‌شده
    mean = (x - beta_t / math.sqrt(1 - alpha_bars[t]) * eps_hat[0]) / math.sqrt(alphas[t])
    x = mean + math.sqrt(beta_t) * rng.gauss(0, 1)              # فقط زمانی که t > 0

نمونه‌گیرها و گام‌ها

دستورها
Samplerگام‌ها
DDPM1000 گام معکوس در مقاله اصلی
DDIM20 تا 50، هدف آموزشی یکسان
DPM-Solver++10 تا 20
UniPC8 تا 16
Flow matching, Euler4 تا 8 در مسیرهای مستقیم
Rectified flow, 2 reflows2 تا 4
Distillation, consistency1 تا 4، نیازمند آموزش مجدد
VAE or GANیک گذر رو به جلو

پیش‌فرض‌ها و مقادیر عددی

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
$\beta$ start1e-4برنامه‌ی زمان‌بندی خطی
$\beta$ end0.02$x_T$ نزدیک به $\mathcal{N}(0, I)$ است
Steps $T$1000کد ساده از 40 استفاده می‌کند
CFG scale $w$33 تا 7 بازه‌ی ایده‌آل است
CFG label dropout10%توکن تهی در آموزش
SD 1.x VAE scaling factor0.18215اعمال پس از کدگذاری
LoRA rank $r$4-16لایه‌های اتنشن، 64 تا 128 برای فاین‌تیون‌های سنگین
FID sample count10kمقدار کم N باعث نمایش اشتباه و کاذب FID پایین می‌شود

عیب‌یابی

عیب‌یابی
  • $z$ هیچ اطلاعاتی از $x$ در برندارد

    علت
    فروپاشی توزیع پسین، غلبه‌ی KL
    راه‌حل
    افزایش تدریجی (anneal) نرخ $\beta$ از 0 تا 1، یا استفاده از free bits
  • GAN فقط یک مُد تولید می‌کند

    علت
    فروپاشی مُد
    راه‌حل
    افزودن نویز به ورودی‌های D، تفکیک مینی‌دسته یا WGAN-GP
  • توقف بهبود G، دقت D بالای 95٪

    علت
    D بسیار قوی است
    راه‌حل
    کاهش نرخ یادگیری D به میزان 2 تا 5 برابر
  • تصاویر روغنی و به شدت اشباع‌شده

    علت
    مقدار بیش از حد بالای CFG
    راه‌حل
    نگه‌داشتن $w$ بین 3 تا 7
  • آموزش نویززدا روی واریانس نهان نادرست

    علت
    ضریب مقیاس‌بندی VAE اعمال نشده
    راه‌حل
    اعمال ضریب مقیاس چک‌پوینت
  • خروجی NaNs از VAE نسخه‌ی SD 1.x در ابعاد 1024²

    علت
    تبدیل نوع به fp16
    راه‌حل
    استفاده از fp16-fix VAE یا bf16
  • LoRA هیچ اثری ندارد

    علت
    آموزش روی پایه‌ی متفاوتی انجام شده
    راه‌حل
    استفاده از مدل پایه‌ی منطبق
  • FID غیرواقعی و بیش از حد خوب است

    علت
    مقدار N کمتر از 10k
    راه‌حل
    استفاده از حداقل 10k نمونه و 3 سید مختلف

اختصارات

اصطلاح‌ها
VAE
خودکدگذار متغیری. کدگذار یک توزیع خروجی می‌دهد و جمله‌ی KL فضای کد را شکل می‌دهد.
ELBO
کران پایین شواهد. بازسازی منهای KL، کران پایین روی $\log p(x)$.
GAN
مولد $G(z)$ و تفکیک‌کننده $D(x)$ در یک بازی مینی‌ماکس.
DDPM
مقاله Ho و همکاران 2020. با $\beta$ خطی، 1000 گام، U-Net.
DDIM
نمونه‌گیر غیرمارکوفی. 20 تا 50 گام، با همان هدف آموزشی.
CFG
هدایت بدون طبقه‌بند. ترکیب پیش‌بینی‌های شرطی و غیرشرطی.
DiT
ترنسفورمر دیفیوژن. یک ترنسفورمر روی پچ‌های نهان به جای U-Net.
FID
فاصله‌ی فِرِشه اینسپشن. فاصله‌ی برازش گاوسی ویژگی‌های واقعی و تولیدشده.

پرسش‌ها

پرسش و پاسخ
چرا خروجی log σ² است و نه σ؟
خروجی بدون محدودیت می‌ماند. گرادیان‌ها در softplus حول σ نزدیک به 0 صفر می‌شوند.
چرا نمونه‌های VAE تار هستند؟
بازسازی با MSE میانگین خروجی‌های محتمل را به دست می‌دهد.
چرا دیفیوژن در فضای نهان؟
فضای نهان 64×64×4 برای کیفیت مشابه حدود 64 برابر FLOPs کمتری نیاز دارد.
آیا تطبیق جریان و DDPM تفاوت دارند؟
در مسیرهای گاوسی از نظر جبری معادل یکدیگرند.
نحوه‌ی محاسبه‌ی FID چگونه است؟
$\lVert \mu_r - \mu_g \rVert^2 + \mathop{\mathrm{Tr}}(\Sigma_r + \Sigma_g - 2 (\Sigma_r \Sigma_g)^{0.5})$ روی ویژگی‌های Inception-v3. مقدار کمتر بهتر است.

نکات کاربردی

نکته‌ها
  • از فرم بسته KL استفاده کنید؛ نوع مونت‌کارلو 3 برابر کندتر است.
  • در هر گام نمونه‌های فیک جدید به G بدهید، وگرنه گرادیان‌های آن منقضی می‌شوند.
  • برای تصاویر از امبدینگ زمانی مناسب استفاده کنید؛ مقدار خام $t$ جواب نمی‌دهد.
  • هنگام ورود کیفیت به حالت یکنواخت (Plateau)، برنامه‌ی زمان‌بندی کسینوسی را امتحان کنید.
  • مجموع وزن‌های ControlNet را نزدیک به 1.0 نگه دارید. مقدار LoRA $\alpha \le 1.5$ باشد.
  • مقادیر FID، امتیاز CLIP و ارزیابی انسانی را در کنار هم گزارش کنید.