چیتشیت
مقایسهی GANها، دیفیوژن و جریان
GANs, Diffusion and Flow Compared
GAN، DDPM، دیفیوژن نهان، DiT با جریان تصحیحشده، تطبیق جریان و VAR. اهداف، گامها، کد و راهحلها.
فهرست مطالب
مقایسهی هزینهی نمونهبرداری کنار هم
مقایسه| خانواده | گذرها | نکته |
|---|---|---|
| GAN | یک گذر رو به جلو | سریع. آموزش دشوار |
| DDPM | 1000 | اسکژول بتای خطی |
| DDIM | 50 | قطعی. آموزش یکسان با DDPM |
| DPM-Solver++ 2M Karras | 20-30 | پیشفرض SD در محیط عملیاتی |
| جریان تصحیحشده (Euler) | 20-30 | SD3، FLUX، Z-Image |
| Schnell، Turbo، LCM | 1-4 | تقطیرشده از یک مدل چندگامی |
| VAR، مقیاسهای K = 10 | 10 گذر | مدل DiT به 28-50 در رزولوشن 256x256 نیاز دارد |
مقایسهی هدف آموزش کنار هم
مقایسه| خانواده | هدف | تابع زیان (loss) |
|---|---|---|
| تفکیککنندهی GAN | P(real) | آنتروپی متقاطع دودویی روی واقعی و ساختگی |
| مولد GAN | D(G(z)) | مقدار بالا مطلوب است. فرم بدون اشباع |
| DDPM | epsilon_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
معماریوظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| GAN با نرم طیفی | build_sn_discriminator() |
| اسکژول بتای خطی | linear_beta_schedule(T=1000) |
| نمونهبرداری DDPM | sample_ddpm(model, schedule, shape) |
| نمونهبرداری DDIM | sample_ddim(..., steps=50, eta=0.0) |
| گام جریان تصحیحشده | rectified_flow_train_step(model, x0, ...) |
| نمونهبرداری Euler | rectified_flow_sample(model, shape, steps=20) |
| توکنهای VQ چندمقیاسی | tokenize_multiscale(img, codebooks) |
فراخوانیهای diffusers
کار و کد| وظیفه | کد |
|---|---|
| متن به تصویر SD | guidance_scale=7.5, num_inference_steps=25 |
| تعویض اسکژولر | DPMSolverMultistepScheduler.from_config(...) |
| تصویر به تصویر | img2img(..., image=init_image, strength=0.6) |
| اینپینت ناحیهی سفید | inpaint(..., mask_image=mask) |
| ادغام یک LoRA | pipe.fuse_lora(lora_scale=0.8) |
| FLUX.1-schnell | guidance_scale=0.0, num_inference_steps=4 |
| SD 3.5 Large | guidance_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
گامبهگام- توکنایزریک کوانتیزهسازی برداری باقیمانده (residual VQ) چندمقیاسی. یکبار آموزش دهید و فریز کنید.
- مقیاس 1نمونهبرداری z_1؛ شامل 1 توکن.
- مقیاس 2نمونهبرداری موازی 4 توکن، با شرط z_1.
- مقیاس 3نمونهبرداری موازی 16 توکن، با شرط z_1 و z_2.
- رمزگشاییجمع امبدینگهای بیشنمونهبرداریشدهی تمام مقیاسها. دیکودر VAE تصویر نهایی را میسازد.
- اجرای آزمایشی
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 آموزش دیده است.