چیتشیت
مدلهای دیفیوژن و زایشی
Diffusion and Generative Models
آموزش و نمونهگیری VAE، GAN، DDPM، دیفیوژن نهان و تطبیق جریان، سپس ارزیابی آنها. کدهای پایتون سادهی درسها.
فهرست مطالب
دیفیوژن نهان با CFG
معماریآموزش و نمونهگیری DDPM
گامبهگام- برنامهی زمانبندی$\beta_t$ خطی از 1e-4 تا 0.02 طی $T$ گام، سپس $\bar\alpha_t$.
- نمونهگیری اولیه$x_0$ از دادهها، $t$ تصادفی، $\epsilon \sim \mathcal{N}(0, I)$.
- نویزمحاسبهی یکبارهی $x_t$ با فرم بسته.
- پیشبینیشبکه $x_t$ و امبدینگ سینوسی $t$ را دریافت کرده و $\hat\epsilon$ را خروجی میدهد.
- تابع زیان (loss)خطای مربعات بین $\epsilon$ و $\hat\epsilon$، سپس یک گام گرادیان.
- شروع نمونهگیریرسم $x_T \sim \mathcal{N}(0, I)$.
- فرآیند معکوساعمال گام معکوس از $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) |
| حذف برچسب برای CFG | use_c = NULL_CLASS if rng.random() < 0.1 else c |
| ترکیب با CFG | eps_cfg = (1 + w) * eps_cond - w * eps_uncond |
| هدف تطبیق جریان | target = x1 - x0 |
| گام اویلر، جریان | x -= dt * net_forward(x, t) |
| رمزگشایی کاشیوار VAE | pipe.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 | گامها |
|---|---|
DDPM | 1000 گام معکوس در مقاله اصلی |
DDIM | 20 تا 50، هدف آموزشی یکسان |
DPM-Solver++ | 10 تا 20 |
UniPC | 8 تا 16 |
Flow matching, Euler | 4 تا 8 در مسیرهای مستقیم |
Rectified flow, 2 reflows | 2 تا 4 |
Distillation, consistency | 1 تا 4، نیازمند آموزش مجدد |
VAE or GAN | یک گذر رو به جلو |
پیشفرضها و مقادیر عددی
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
$\beta$ start | 1e-4 | برنامهی زمانبندی خطی |
$\beta$ end | 0.02 | $x_T$ نزدیک به $\mathcal{N}(0, I)$ است |
Steps $T$ | 1000 | کد ساده از 40 استفاده میکند |
CFG scale $w$ | 3 | 3 تا 7 بازهی ایدهآل است |
CFG label dropout | 10% | توکن تهی در آموزش |
SD 1.x VAE scaling factor | 0.18215 | اعمال پس از کدگذاری |
LoRA rank $r$ | 4-16 | لایههای اتنشن، 64 تا 128 برای فاینتیونهای سنگین |
FID sample count | 10k | مقدار کم 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 و ارزیابی انسانی را در کنار هم گزارش کنید.