چیت‌شیت

مدل‌های GAN از DCGAN تا StyleGAN

GANs from DCGAN to StyleGAN

توابع زیان، کد DCGAN، مدل‌های Pix2Pix، CycleGAN و StyleGAN. مقادیر پیش‌فرض، نشانه‌های شکست و راه‌حل‌ها.

  • ۱۲ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مولد StyleGAN
  2. یک گام آموزش
  3. توابع زیان و فرمول‌ها
  4. تابع train_step در DCGAN
  5. وظایف در قالب کد
  6. مقایسه‌ی چهار مدل GAN کنار هم
  7. یک گذر در برابر گام‌های متعدد
  8. مقادیر پیش‌فرض
  9. عیب‌یابی
  10. اصطلاحات
  11. چه زمانی از چه مدلی استفاده کنیم
  12. پرسش‌ها

مولد StyleGAN

معماری
اعمال AdaIN در هر بلوکتفکیک‌پذیری دو برابر می‌شودzتوزیع N(0, I)، 512 بعدشبکه‌ی نگاشتیک MLP هشت‌لایه‌ایw در Wتا حدودی درهم‌تنیدگی‌زدایی‌شدهثابت یادگرفته‌شده4×4×512بلوک سنتزبیش‌نمونه‌برداری، کانولوشن، AdaIN، نوفهتصویر4 تا 1024نوفه‌ی اختصاصی هر لایهمقیاس یادگرفته‌شده برای هر کانال

یک گام آموزش

گام‌به‌گام
  1. نمونه‌برداریگرفتن یک دسته داده‌ی واقعی و نوفه‌ی z از N(0, I).
  2. گام Dامتیازدهی به تصاویر واقعی در برابر 1 و G(z).detach() در برابر 0.
  3. گام Gتولید نمونه‌های جعلی تازه. امتیازدهی به D(G(z)) در برابر 1.
  4. تکراریک گام D، سپس یک گام G، در هر دسته.
  5. آزمون ارزیابیهر 100 گام، شمارش نمونه‌ها در هر مُد. هشدار در صورت کمتر بودن از 50.
  6. بررسیمشاهده‌ی 64 نمونه در پایان هر دوره (epoch).
  7. تعادلبرابری p_G = p_data و خروجی 0.5 برای D در همه‌جا.

توابع زیان و فرمول‌ها

مفهوم‌ها
مینی‌ماکس
$\min_G \max_D \; \mathbb{E}_x[\log D(x)] + \mathbb{E}_z[\log(1 - D(G(z)))]$
تابع زیان D
آنتروپی متقاطع دودویی با real = 1 و fake = 0.
تابع زیان G
مقداری برابر با $-\log D(G(z))$. این فرم غیراشباع‌کننده است.
مدل WGAN
تابع $\text{loss}_D = \mathbb{E}[D(\text{fake})] - \mathbb{E}[D(\text{real})]$ و $\text{loss}_G = -\mathbb{E}[D(\text{fake})]$
تابع زیان G در Pix2Pix
$-\log D(x, G(x)) + \lambda \cdot \lVert y - G(x) \rVert_1$
سازگاری چرخه‌ای
$F(G(x)) \approx x$ و $G(F(y)) \approx y$.
فرمول AdaIN
$y_{\text{scale}} \cdot \frac{x - \mathrm{mean}(x)}{\mathrm{std}(x)} + y_{\text{bias}}$
کوتاه‌سازی
رابطه $w' = \hat{w} + \psi \cdot (w - \hat{w})$. شرط $\psi < 1$ تنوع را فدای کیفیت می‌کند.

تابع train_step در DCGAN

کد
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()          # تابع زیان غیراشباع‌کننده برای G
opt_g.step()

وظایف در قالب کد

کار و کد
وظیفهکد
ساخت مولدGenerator(z_dim=64, img_channels=3, feat=32)
پوشش کانولوشن D با SNspectral_norm(c)
ساخت بهینه‌سازهاAdam(lr=2e-4, betas=(0.5, 0.999))
نمونه‌برداری در حالت evalsample(G, n=8, z_dim=z_dim, device=device)
شمارش پارامترهاsum(p.numel() for p in G.parameters())
شرطی‌سازی G یا Dinp = z + one_hot(c, num_classes)
نگاشت z به ww = mapping(z, mapping_net)
کوتاه‌سازی ww_bar[i] + psi * (w_test[i] - w_bar[i])

مقایسه‌ی چهار مدل GAN کنار هم

مقایسه
فاکتورDCGANPix2PixCycleGANStyleGAN
ورودینوفه‌ی zتصویر x، دراپ‌اوت به عنوان نوفهتصویر از دامنه‌ی Xنگاشت z به w
مولدکانولوشن‌های ترانهاده، خروجی با tanhشبکه‌ی U-Net با اتصالات میان‌بُرتبدیل G: X to Y و F: Y to Xمقدار ثابت به همراه AdaIN در هر بلوک
تابع زیان اضافینداردضریب λ در L1سازگاری چرخه‌ایتنظیم طول مسیر در StyleGAN2
دادهفقط تصاویرجفت‌شده (x, y)غیرجفت‌شدهدامنه‌ی محدود، چهره‌ها
کاربردخط مبنا برای 32x32طرح اولیه به عکس واقعیاسب به گورخر، فصل‌هاچهره‌های واقع‌گرایانه، ویرایش تصویر

یک گذر در برابر گام‌های متعدد

مقایسه
فاکتورPix2PixSD-Img2ImgSDXL-TurboControlNet + SDXL
گام‌ها1201-420-30
ابعاد 512² روی یک پردازنده‌ی L4حدود 30 میلی‌ثانیهحدود 1.2 ثانیهحدود 0.15-0.35 ثانیهحدود 3-5 ثانیه

مقادیر پیش‌فرض

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
Adam `lr`2e-4پیش‌فرض DCGAN برای G و D
Adam `betas`(0.5, 0.999)مقدار کم برای beta1
z_dim64نوفه برای مدل 32x32 DCGAN
D LeakyReLU slope0.2تمام لایه‌های D
Pix2Pix λ on L1100شروع از اینجا، کاهش تدریجی
PatchGAN field~70×70تعداد پیکسل به ازای هر سلول خروجی
Truncation ψ0.7استفاده از 1.0 برای حفظ تنوع
TTUR ratio2-4یادگیری سریع‌تر D نسبت به G

عیب‌یابی

عیب‌یابی
  • زیان D پایین، نوسان زیان G، افت تنوع

    علت
    فروپاشی مُد
    راه‌حل
    تبعیض مینی‌دسته، بهنجارسازی طیفی، برچسب‌ها
  • دقت D حدود 100٪، زیان G بالا و بدون تغییر

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

    علت
    نوسان شدید
    راه‌حل
    استفاده از TTUR یا فاصله‌ی واسرشتاین
  • دقت D بالای 95٪

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

    علت
    حفظ کردن یک مُد توسط G
    راه‌حل
    افزودن نوفه به ورودی‌های D، یا WGAN-GP
  • خروجی شرط را نادیده می‌گیرد

    علت
    سیگنال شرطی ضعیف در D
    راه‌حل
    شرطی‌سازی زودهنگام D، استفاده از تصویرسازی D
  • تاری خروجی Pix2Pix

    علت
    وزن بیش از حد زیان L1
    راه‌حل
    کاهش تدریجی λ پس از رسیدن به پایداری
  • دست‌سازه‌های قطره‌ای (droplet)

    علت
    صفر شدن میانگین توسط AdaIN
    راه‌حل
    مدولاسیون‌زدایی وزن‌ها در StyleGAN2

اصطلاحات

اصطلاح‌ها
DCGAN
کانولوشن‌های استرایددار، بهنجارسازی دسته‌ای، ReLU در G و LeakyReLU در D.
WGAN-GP
فاصله‌ی واسرشتاین به همراه جریمه‌ی گرادیان.
SN
بهنجارسازی طیفی (spectral norm). ثابت لیپ‌شیتز هر لایه‌ی D را محدود می‌کند.
TTUR
قاعده‌ی به‌روزرسانی دو مقیاس زمانی. استفاده از دو نرخ یادگیری مختلف.
cGAN
مدل GAN شرطی. هر دو شبکه‌ی G(z, c) و D(x, c) شرط ورودی را می‌بینند.
PatchGAN
مدل D یک شبکه‌ی N × N از امتیازهای هر پچ تولید می‌کند.
AdaIN
بهنجارسازی نمونه‌ای تطبیقی. بهنجارسازی و سپس تغییر مقیاس و شیفت با w.
FID
معیار Fréchet Inception Distance؛ هرچه کمتر باشد بهتر است.

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

نکته‌ها
  • GAN: تولید تصویر بلادرنگ زیر 10 میلی‌ثانیه، انتقال سبک، تبدیل تصویر به تصویر.
  • StyleGAN3: چهره‌های واقعی انسان با ژست و زاویه‌ی ثابت.
  • Pix2Pix: هزاران نمونه‌ی داده‌ی جفت‌شده، یک وظیفه‌ی محدود و استنتاج سریع.
  • CycleGAN: تبدیل تصویر به تصویر بدون داده‌های جفت‌شده.
  • شبکه‌ی نگاشت فریز‌شده: انطباق دامنه تنها با چند تصویر معدود.
  • دیفیوژن یا تطبیق جریان: مسائل چندوجهی یا بدون ساختار مشخص.

پرسش‌ها

پرسش و پاسخ
چرا در گام D از G(z).detach() استفاده می‌شود؟
مانع از جریان گرادیان به G هنگام به‌روزرسانی D می‌شود.
چرا تابع زیان غیراشباع‌کننده به کار می‌رود؟
در اوایل آموزش مقدار D(G(z)) نزدیک به صفر است؛ تابع زیان اولیه‌ی G دچار محوشدگی گرادیان می‌شود.
چرا قبل از نمونه‌برداری به حالت eval می‌رویم؟
تا بهنجارسازی دسته‌ای از آماره‌های انباشته استفاده کند.
چرا D جفت (x, y) را می‌بیند؟
بدون دیدن x، مدل D قادر به سنجش سازگاری خروجی نیست.
چرا StyleGAN هنوز کاربرد دارد؟
فقط یک گذر رو به جلو دارد. تولید چهره‌ی 1024² زیر 10 میلی‌ثانیه روی یک کارت 4090.
آیا GAN می‌تواند مقدار p(x) را بدهد؟
خیر، این یک مدل چگالی ضمنی است و فقط نمونه‌برداری می‌کند.