چیت‌شیت

مقایسه‌ی GANها، دیفیوژن و جریان

GANs, Diffusion and Flow Compared

GAN، DDPM، دیفیوژن نهان، DiT با جریان تصحیح‌شده، تطبیق جریان و VAR. اهداف، گام‌ها، کد و راه‌حل‌ها.

  • ۱۲ بخش
  • ۶ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مقایسه‌ی هزینه‌ی نمونه‌برداری کنار هم
  2. مقایسه‌ی هدف آموزش کنار هم
  3. چه زمانی از کدام استفاده کنیم؟
  4. پایپ‌لاین Stable Diffusion
  5. وظایف در کد
  6. فراخوانی‌های diffusers
  7. مقایسه‌ی DDPM با جریان تصحیح‌شده
  8. یک گام آموزش GAN
  9. فرمول‌های کلیدی
  10. تولید مقیاس بعدی در VAR
  11. عیب‌یابی
  12. پرسش‌ها

مقایسه‌ی هزینه‌ی نمونه‌برداری کنار هم

مقایسه
خانوادهگذرهانکته
GANیک گذر رو به جلوسریع. آموزش دشوار
DDPM1000اسکژول بتای خطی
DDIM50قطعی. آموزش یکسان با DDPM
DPM-Solver++ 2M Karras20-30پیش‌فرض SD در محیط عملیاتی
جریان تصحیح‌شده (Euler)20-30SD3، FLUX، Z-Image
Schnell، Turbo، LCM1-4تقطیرشده از یک مدل چندگامی
VAR، مقیاس‌های K = 1010 گذرمدل DiT به 28-50 در رزولوشن 256x256 نیاز دارد

مقایسه‌ی هدف آموزش کنار هم

مقایسه
خانوادههدفتابع زیان (loss)
تفکیک‌کننده‌ی GANP(real)آنتروپی متقاطع دودویی روی واقعی و ساختگی
مولد GAND(G(z))مقدار بالا مطلوب است. فرم بدون اشباع
DDPMepsilon_theta(x_t, t)خطای میانگین مربعات (MSE) روی نویز واقعی
جریان تصحیح‌شده (4.23)epsilon - x0خطای میانگین مربعات (MSE) روی بردار سرعت
تطبیق جریان (8.13)x1 - x0اینجا x1 نویز است و x0 داده
VARآنتروپی متقاطعروی کدهای VQ مقیاس بعدی

چه زمانی از کدام استفاده کنیم؟

نکته‌ها
  • GAN: تولید بی‌درنگ زیر 10 میلی‌ثانیه، انتقال سبک، تبدیل با Pix2Pix یا CycleGAN.
  • دیفیوژن نهان SD 1.5: فاین‌تیون‌های جامعه‌ی متن‌باز با LoRA.
  • مدل DiT + جریان تصحیح‌شده: بهترین رویکرد روز برای متن به تصویر. مدل FLUX.1-schnell پیش‌فرض متن‌باز است.
  • جریان تقطیرشده (LCM-LoRA، schnell): تاخیر زیر 1 ثانیه، 1 تا 4 گام.
  • تطبیق جریان: صدا، ویدیو و کاربردهای علمی به همراه تصویر.
  • VAR: مقید به کلاس روی ImageNet. گذرهای کمتر، مقیاس‌پذیری مشابه با GPT.

پایپ‌لاین Stable Diffusion

معماری
امبدینگپرامپت متنیانکودر متنCLIP-L یا T5نویز4x64x64UNetکراس‌اتنشن به متناسکژولرDPM-Solver++، Eulerمتغیر نهان تمیز4x64x64دیکودر VAEتصویر512x512 RGB

وظایف در کد

کار و کد
وظیفهکد
GAN با نرم طیفیbuild_sn_discriminator()
اسکژول بتای خطیlinear_beta_schedule(T=1000)
نمونه‌برداری DDPMsample_ddpm(model, schedule, shape)
نمونه‌برداری DDIMsample_ddim(..., steps=50, eta=0.0)
گام جریان تصحیح‌شدهrectified_flow_train_step(model, x0, ...)
نمونه‌برداری Eulerrectified_flow_sample(model, shape, steps=20)
توکن‌های VQ چندمقیاسیtokenize_multiscale(img, codebooks)

فراخوانی‌های diffusers

کار و کد
وظیفهکد
متن به تصویر SDguidance_scale=7.5, num_inference_steps=25
تعویض اسکژولرDPMSolverMultistepScheduler.from_config(...)
تصویر به تصویرimg2img(..., image=init_image, strength=0.6)
این‌پینت ناحیه‌ی سفیدinpaint(..., mask_image=mask)
ادغام یک LoRApipe.fuse_lora(lora_scale=0.8)
FLUX.1-schnellguidance_scale=0.0, num_inference_steps=4
SD 3.5 Largeguidance_scale=3.5, num_inference_steps=28

مقایسه‌ی DDPM با جریان تصحیح‌شده

کد
python
t = torch.randint(0, T, (bs,), device=device)  # DDPM: گام عدد صحیح
x_t = q_sample(x0, t, noise, schedule)         # پرش فرم بسته
loss = F.mse_loss(pred, noise)                 # پیش‌بینی نویز
t = torch.rand(n, device=device)               # جریان تصحیح‌شده: t در [0, 1]
x_t = (1 - t[:, None, None, None]) * x0 + t[:, None, None, None] * epsilon
target_v = epsilon - x0                        # سرعت، داده به نویز
loss = F.mse_loss(pred_v, target_v)
dt = 1.0 / steps                               # Euler، گام‌ها=20
for _ in range(steps):
    v = model(x, t)
    x = x - dt * v                             # پیمایش از نویز به داده
    t = t - dt

یک گام آموزش GAN

کد
python
opt_d.zero_grad()
d_real = D(real)
d_fake = D(G(z).detach())                                                     # بدون گرادیان به G
loss_d = (F.binary_cross_entropy_with_logits(d_real, torch.ones_like(d_real))
          + F.binary_cross_entropy_with_logits(d_fake, torch.zeros_like(d_fake)))
loss_d.backward()
opt_d.step()
opt_g.zero_grad()
d_fake = D(G(z))
loss_g = F.binary_cross_entropy_with_logits(d_fake, torch.ones_like(d_fake))  # بدون اشباع
loss_g.backward()
opt_g.step()
opt_g = torch.optim.Adam(G.parameters(), lr=2e-4, betas=(0.5, 0.999))         # پیش‌فرض DCGAN

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

مفهوم‌ها
بازی GAN
$\min_G \max_D \; \mathbb{E}_x[\log D(x)] + \mathbb{E}_z[\log(1 - D(G(z)))]$
پرش DDPM
$x_t = \sqrt{\bar{\alpha}_t} \, x_0 + \sqrt{1 - \bar{\alpha}_t} \, \epsilon$، با $\bar{\alpha}_t = \prod_{s=1}^{t} \alpha_s$
CFG
$\epsilon = \epsilon_{\text{uncond}} + w \cdot (\epsilon_{\text{cond}} - \epsilon_{\text{uncond}})$
جریان تصحیح‌شده
$x_t = (1 - t) \, x_0 + t \, \epsilon$ برای $t \in [0, 1]$
CFG با بردار سرعت
$v_{\text{cfg}} = (1+w) v_{\text{cond}} - w v_{\text{uncond}}$
صرفه‌جویی در فضای نهان
(3*512*512)/(4*64*64) = 48 برابر محاسبات کمتر.

تولید مقیاس بعدی در VAR

گام‌به‌گام
  1. توکنایزریک کوانتیزه‌سازی برداری باقیمانده (residual VQ) چندمقیاسی. یک‌بار آموزش دهید و فریز کنید.
  2. مقیاس 1نمونه‌برداری z_1؛ شامل 1 توکن.
  3. مقیاس 2نمونه‌برداری موازی 4 توکن، با شرط z_1.
  4. مقیاس 3نمونه‌برداری موازی 16 توکن، با شرط z_1 و z_2.
  5. رمزگشاییجمع امبدینگ‌های بیش‌نمونه‌برداری‌شده‌ی تمام مقیاس‌ها. دیکودر VAE تصویر نهایی را می‌سازد.
  6. اجرای آزمایشیSCALES = (1, 2, 4, 8)، CODEBOOK = 16. در مجموع 4 گذر.

عیب‌یابی

عیب‌یابی
  • افت تنوع نمونه‌ها

    علت
    فروپاشی مُد
    راه‌حل
    نرم طیفی یا شرطی‌سازی با برچسب
  • دقت تفکیک‌کننده (D) نزدیک 100٪

    علت
    برتری D و از بین رفتن گرادیان‌های G
    راه‌حل
    کوچک‌تر کردن D، کاهش نرخ یادگیری D
  • نوسان هر دو زیان بدون روند مشخص

    علت
    جابه‌جایی مداوم برتری بین G و D
    راه‌حل
    قاعده‌ی TTUR: مدل D دو تا چهار برابر سریع‌تر یاد بگیرد
  • وابستگی نمونه‌ها به دسته

    علت
    استفاده‌ی BN از آماره‌های دسته
    راه‌حل
    فراخوانی G.eval() قبل از نمونه‌برداری
  • آرتیفکت‌های شدید

    علت
    مقیاس هدایت (guidance scale) بیش از حد بالا
    راه‌حل
    برای SD مقدار 7.5؛ برای جریان تصحیح‌شده 3.5 تا 5

پرسش‌ها

پرسش و پاسخ
چرا آموزش دیفیوژن ساده است؟
تابع زیان (loss) از نوع MSE است و بازی رقابتی وجود ندارد.
چرا جریان تصحیح‌شده به گام‌های کمتری نیاز دارد؟
مسیر بسیار به یک خط مستقیم نزدیک است.
چرا VAR سریع است؟
هر گذر تمام توکن‌های یک مقیاس را تولید می‌کند. طول به صورت لگاریتمی با مقیاس رشد می‌کند.
چرا FLUX.1-schnell از هدایت 0.0 استفاده می‌کند؟
این مدل بدون CFG آموزش دیده است.