فاز 8 · درس 3

شبکه‌های مولد متخاصم (GAN): تقابل مولد و تفکیک‌کننده

نوع
ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 3 · 02 (پس‌انتشار)، فاز 3 · 08 (بهینه‌سازها)، فاز 8 · 02 (مدل‌های VAE)
یک مجسمه‌ساز سنگی در کارگاه در حال تراشیدن تندیس و یک منتقد هنری ذره‌بین به دست در حال ارزیابی آن تندیس
فهرست مطالب
  1. صورت مسئله
  2. مفهوم پایه
  3. انواعی که GAN را به بازدهی رساندند
  4. پیاده‌سازی از صفر
  5. گام 1: تابع زیان غیراشباع‌کننده
  6. گام 2: یک گام تفکیک‌کننده به‌ازای هر گام مولد
  7. گام 3: زیر نظر گرفتن فروپاشی مُد
  8. دام‌های رایج
  9. استفاده از ابزارهای واقعی
  10. عرضه‌ی نهایی
  11. تمرین‌ها
  12. اصطلاحات کلیدی
  13. نکته‌ی پروداکشن: استنتاج تک‌ضرب، مزیت ماندگار GAN
  14. برای مطالعه‌ی بیشتر

مدل‌های مولد سنتی مانند VAE اغلب تصاویری تار تولید می‌کنند، زیرا بهینه‌سازی بر اساس خطای میانگین مربعات (MSE) ذاتاً به سمت میانگین‌گیری از داده‌ها میل می‌کند. شبکه‌های مولد متخاصم (GAN) این نقص را با طراحی یک بازی دونفره بین مولد و تفکیک‌کننده دور زدند و توانستند تصاویری با وضوح و جزئیات بسیار بالا خلق کنند.

اگرچه مدل‌های انتشار بخش عمده‌ای از فضای تولید تصویر را تسخیر کرده‌اند، درک سازوکار GAN هنوز حیاتی است. امروزه آموزش متخاصم زیربنای مدل‌های تقطیرشده و فوق‌سریع مانند SDXL-Turbo است که می‌توانند فرایند چندمرحله‌ای انتشار را به استنتاجی تک‌ضرب و کم‌هزینه تبدیل کنند.

ترفند گودفلو (Goodfellow) در سال 2014 دور زدن کامل تخمین چگالی احتمال بود: دو شبکه. یکی داده‌ی جعلی می‌سازد، دیگری مچش را می‌گیرد. آن‌قدر با هم رقابت می‌کنند تا نمونه‌های جعلی از واقعی غیرقابل‌تشخیص شوند. روی کاغذ نباید جواب بدهد؛ خیلی وقت‌ها هم جواب نمی‌دهد. اما وقتی کار می‌کند، شفاف‌ترین و دقیق‌ترین نمونه‌های موجود در مقالات را برای دامنه‌های محدود تولید می‌کند.

صورت مسئله

خروجی مدل‌های VAE تار است، چون تابع زیان MSE در بخش دیکودر از نظر بیزی برای تصویر «میانگین» بهینه است؛ و میانگین چند رقمِ محتمل، یک رقم محو و ناواضح خواهد بود. شما به تابع زیانی نیاز دارید که به «باورپذیری» پاداش دهد، نه نزدیکی پیکسل‌به‌پیکسل به یک هدف خاص. برای باورپذیری هیچ فرم بسته‌ای (closed-form) وجود ندارد؛ باید آن را یاد بگیرید.

ایده‌ی گودفلو این بود: یک طبقه‌بند D(x)D(x) آموزش دهید تا تصاویر واقعی را از جعلی تشخیص دهد. یک مولد G(z)G(z) هم آموزش دهید تا DD را فریب دهد. سیگنال تابع زیان برای GG همان برداشتی است که DD در حال حاضر از یک تصویر «واقعی» دارد. این سیگنال با پیشرفت GG مدام به‌روزرسانی می‌شود و یک هدف متحرک را دنبال می‌کند. اگر هر دو شبکه همگرا شوند، GG توزیع داده را بدون نوشتن حتی یک رابطه‌ی log p(x) یاد گرفته است.

به این سازوکار آموزش متخاصم (adversarial training) می‌گویند. مدل ریاضی آن یک بازی مینی‌ماکس (minimax) است:

min⁡Gmax⁡D  Ereal[log⁡D(x)]+Efake[log⁡(1−D(G(z)))]\min_G \max_D \; \mathbb{E}_{\text{real}}[\log D(x)] + \mathbb{E}_{\text{fake}}[\log(1 - D(G(z)))]

در سال 2026، شبکه‌های GAN دیگر بهترین مولدهای روز (SOTA) نیستند (مدل‌های انتشار و تطبیق جریان این تاج را ربوده‌اند). با این حال، StyleGAN 2/3 هنوز هم شفاف‌ترین مدل‌های چهره‌ به شمار می‌روند، تفکیک‌کننده‌های GAN به‌عنوان «توابع زیان ادراکی» در آموزش مدل‌های انتشار به کار می‌روند، و آموزش متخاصم موتور محرک روش‌های تقطیر تک‌مرحله‌ای سریع (مثل SDXL-Turbo، SD3-Turbo و LCM) است که امکان عرضه‌ی مدل‌های انتشارِ بلادرنگ را فراهم می‌کنند.

مفهوم پایه

آموزش GAN: مولد و تفکیک‌کننده در بازی مینی‌ماکس

مولد G(z)G(z). بردار نویز z∼N(0,I)z \sim \mathcal{N}(0, I) را به یک نمونه‌ی x^\hat{x} نگاشت می‌کند. شبکه‌ای با معماری شبیه دیکودر (متراکم یا کانولوشن ترانهاده).

تفکیک‌کننده D(x)D(x). نمونه را به یک احتمال اسکالر (یا امتیاز) نگاشت می‌کند؛ واقعی ← 1، جعلی ← 0.

تابع زیان (loss). دو به‌روزرسانی متناوب:

  • آموزش DD: lossD=−[log⁡D(x)+log⁡(1−D(G(z)))]\text{loss}_D = -[ \log D(x) + \log(1 - D(G(z))) ]. آنتروپی متقاطع دودویی (Binary Cross-Entropy) با برچسب 1 برای واقعی و 0 برای جعلی.
  • آموزش GG: lossG=−log⁡D(G(z))\text{loss}_G = -\log D(G(z)). این همان فرم «غیراشباع‌کننده» است که گودفلو استفاده کرد (فرم اصلیِ log⁡(1−D(G(z)))\log(1 - D(G(z))) وقتی DD اطمینان بالایی دارد، اشباع می‌شود و گرادیان‌ها را از بین می‌برد).

حلقه‌ی آموزش. یک گام برای DD، یک گام برای GG. تکرار مداوم.

دلیل کارکرد. اگر GG کاملاً با pdatap_{\text{data}} منطبق شود، DD عملکردی بهتر از شانس نخواهد داشت و همه‌جا خروجی 0.5 می‌دهد؛ در نتیجه دیگر گرادیانی به GG نمی‌رسد. نقطه‌ی تعادل.

دلایل شکست. فروپاشی مُد (Mode collapse) (وقتی GG یک مُد را پیدا می‌کند که DD قادر به تشخیصش نیست و مدام همان را ضرب می‌کند)، محو شدگی گرادیان (Vanishing gradient) (وقتی DD بیش از حد سریع یاد می‌گیرد و log⁡D\log D اشباع می‌شود)، و ناپایداری آموزش (به‌خاطر نرخ یادگیری، اندازه‌ی بچ یا هر عامل دیگر).

انواعی که GAN را به بازدهی رساندند

سال نوآوری مشکلی که حل شد
2015 DCGAN استفاده از لایه‌های کانولوشن/دیکانولوشن، Batch norm و LeakyReLU؛ اولین معماری پایدار.
2017 WGAN، WGAN-GP جایگزینی BCE با فاصله‌ی واسرشتاین (Wasserstein Distance) به‌همراه جریمه‌ی گرادیان؛ حل مشکل محو شدگی گرادیان.
2017 نرمال‌سازی طیفی (Spectral normalization) مقید کردن تفکیک‌کننده به شرط لیپ‌شیتز؛ روشی که هنوز در تفکیک‌کننده‌های سال 2026 استفاده می‌شود.
2018 Progressive GAN آموزش ابتدا با وضوح پایین و سپس افزودن تدریجی لایه‌ها؛ نخستین نتایج مگاپیکسلی.
2019 StyleGAN / StyleGAN2 شبکه‌ی نگاشت به‌همراه نرمال‌سازی تطبیقی نمونه‌ها (AdaIN)؛ بهترین سطح تصویرسازی واقع‌گرایانه برای دامنه‌های ثابت.
2021 StyleGAN3 بدون تغییر پله‌ای (Alias-free) و هم‌وردای انتقالی؛ هنوز هم تا سال 2026 استاندارد طلایی چهره است.
2022 StyleGAN-XL شرطی، آگاه از کلاس و در مقیاس بزرگ‌تر.
2024 R3GAN بازآفرینی با منظم‌سازی (regularization) قوی‌تر؛ کار روی وضوح 1024² بدون نیاز به ترفندهای جانبی.
مینی‌ماکس GANتعادل را بکشید
GAN MINIMAXA GAN is a two-player game: the generator (blue) tries to fool the discriminator (grey), which tries to tell real from fake. Both must improve together. If the discriminator wins decisively its gradient to the generator vanishes; if the generator races ahead it can collapse onto a few outputs. Healthy training stays near the dashed equilibrium.
یک GAN بازی‌ای دونفره است: مولد (آبی) سعی می‌کند تشخیص‌دهنده (خاکستری) را فریب دهد، و تشخیص‌دهنده می‌کوشد داده‌ی واقعی را از جعلی تشخیص دهد. هر دو باید همگام با هم پیشرفت کنند. اگر تشخیص‌دهنده با فاصله‌ی زیاد برنده شود، گرادیان آن به مولد ناپدید (صفر) می‌شود؛ اگر مولد خیلی جلو بیفتد، ممکن است دچار فروپاشی مد (Mode Collapse) شده و فقط چند خروجی محدود تولید کند. آموزش سالم در نزدیکی خط تعادل نقطه‌چین باقی می‌ماند.

پیاده‌سازی از صفر

اسکریپت code/main.py یک GAN بسیار کوچک را روی داده‌های 1 بعدی (ترکیبی از دو توزیع گوسی) آموزش می‌دهد. مولد و تفکیک‌کننده، MLPهایی با یک لایه‌ی پنهان هستند. ما گذر رو به جلو (forward pass)، پس‌انتشار و حلقه‌ی مینی‌ماکس را دستی می‌نویسیم. هدف این است که دو حالت شکست اصلی (فروپاشی مُد + محو شدگی گرادیان) را همان‌طور که رخ می‌دهند مشاهده کنیم.

گام 1: تابع زیان غیراشباع‌کننده

تابع زیان پایه‌ی گودفلو یعنی log⁡(1−D(G(z)))\log(1 - D(G(z)))، وقتی D با اطمینان بالا تصویر جعلی G را شناسایی کند، به سمت 0 میل می‌کند. در این نقطه، گرادیان G عملاً صفر است؛ یعنی G دیگر نمی‌تواند پیشرفت کند. فرم غیراشباع‌کننده‌ی −log⁡D(G(z))-\log D(G(z)) رفتار مجانبی معکوسی دارد: وقتی D اطمینان بالایی دارد منفجر می‌شود و سیگنال قدرتمندی به G می‌دهد.

def g_loss(d_fake):
    # maximize log D(G(z))  <=>  minimize -log D(G(z))
    return -sum(math.log(max(p, 1e-8)) for p in d_fake) / len(d_fake)

گام 2: یک گام تفکیک‌کننده به‌ازای هر گام مولد

for step in range(steps):
    # train D
    real_batch = sample_real(batch_size)
    fake_batch = [G(z) for z in sample_noise(batch_size)]
    update_D(real_batch, fake_batch)

    # train G
    fake_batch = [G(z) for z in sample_noise(batch_size)]  # fresh fakes
    update_G(fake_batch)

باید برای G نمونه‌های جعلی تازه بسازید، وگرنه گرادیان‌ها کهنه می‌شوند.

گام 3: زیر نظر گرفتن فروپاشی مُد

if step % 200 == 0:
    samples = [G(z) for z in sample_noise(500)]
    mode_a = sum(1 for s in samples if s < 0)
    mode_b = 500 - mode_a
    if min(mode_a, mode_b) < 50:
        print("  [!] mode collapse: one mode is starved")

نشانه‌ی کلاسیک این مشکل: تولید یکی از دو مُدِ واقعی متوقف می‌شود. تفکیک‌کننده هم اصلاح آن را متوقف می‌کند، چون دیگر اصلاً به‌عنوان داده‌ی جعلی دیده نمی‌شود.

دام‌های رایج

  • تفکیک‌کننده‌ی بیش از حد قوی. نرخ یادگیری D را 2 تا 5 برابر کاهش دهید، یا به ورودی‌ها/لایه‌ها نویز اضافه کنید. اگر دقت D به بالای 95% برسد، کار G تمام است.
  • به‌خاطرسپاری یک مُد توسط مولد. به ورودی‌های D نویز بیفزایید، از لایه‌ی تفکیک‌کننده‌ی مینی‌بچ استفاده کنید، یا سراغ WGAN-GP بروید.
  • نشت آمار در Batch norm. عبور بچِ داده‌های واقعی و بچِ داده‌های جعلی از یک لایه‌ی BN مشترک، آماره‌های آن‌ها را با هم ترکیب می‌کند. به‌جای آن از Instance norm یا نرمال‌سازی طیفی استفاده کنید.
  • بازی با امتیازهای Inception. معیارهای FID و IS در تعداد نمونه‌های کم دچار نوسان و نویز بالایی هستند؛ برای ارزیابی حداقل از 10k نمونه استفاده کنید.
  • نمونه‌گیری تک‌مرحله‌ای در وظایف شرطی دروغی بیش نیست. برای گرفتن خروجی قابل‌استفاده، هنوز هم به مقیاس‌های CFG، ترفندهای هرس (truncation) و نمونه‌گیری مجدد نیاز دارید.

استفاده از ابزارهای واقعی

ترکیب پیشنهادی GAN در سال 2026:

موقعیت ابزار انتخابی
چهره‌های واقع‌گرایانه‌ی انسان با ژست ثابت StyleGAN3 (شفاف‌ترین، سبک‌ترین)
چهره‌های انیمه‌ای / سبک‌دار StyleGAN-XL یا LoRA روی Stable Diffusion
تبدیل تصویر به تصویر Pix2Pix / CycleGAN (فاز 8 · 04) یا ControlNet (فاز 8 · 08)
تبدیل متن به تصویر سریع و 1 مرحله‌ای تقطیر متخاصم از مدل انتشار (SDXL-Turbo، SD3-Turbo)
تابع زیان ادراکی درون ترینر مدل انتشار تفکیک‌کننده‌ی کوچک GAN روی برش‌هایی از تصویر (crops)
هر تسک چندوجهی و بی‌پایان استفاده نکنید؛ سراغ مدل‌های انتشار یا تطبیق جریان بروید

مدل‌های GAN تصاویری بسیار شفاف و شارپ می‌سازند، اما دامنه‌شان محدود است. به‌محض اینکه دامنه‌ی کار گسترده شد (عکس‌های عمومی، پرامپت‌های متنی دلخواه، ویدیو)، سراغ مدل‌های انتشار بروید. ترفند متخاصم همچنان زنده است، اما نه به‌عنوان یک مولد مستقل، بلکه در قالب یک مؤلفه (توابع زیان ادراکی، تقطیر دانش).

عرضه‌ی نهایی

فایل outputs/skill-gan-debugger.md را ذخیره کنید. این مهارت مشخصات یک فرایند ناموفق GAN (شامل منحنی‌های تابع زیان، ماتریس نمونه‌ها و حجم دیتاست) را دریافت می‌کند و فهرستی رتبه‌بندی‌شده از دلایل احتمالی، راه‌حل‌های کوتاه تک‌خطی و پروتکل اجرای مجدد تحویل می‌دهد.

تمرین‌ها

  1. ساده. اسکریپت code/main.py را با تنظیمات پیش‌فرض اجرا کنید. سپس مقدار D_LR = 5 * G_LR را قرار دهید و دوباره اجرا کنید. تابع زیان G با چه سرعتی روی یک مقدار ثابت متوقف و فریز می‌شود؟
  2. متوسط. تابع زیان BCE گودفلو را با تابع زیان WGAN جایگزین کنید: lossD=E[D(fake)]−E[D(real)]\text{loss}_D = \mathbb{E}[D(\text{fake})] - \mathbb{E}[D(\text{real})] و lossG=−E[D(fake)]\text{loss}_G = -\mathbb{E}[D(\text{fake})]، و وزن‌های D را روی بازه‌ی [-0.01, 0.01] برش دهید (clip). آیا آموزش پایدارتر می‌شود؟ زمان واقعی (wall-clock) رسیدن به همگرایی را مقایسه کنید.
  3. سخت. این مثال 1 بعدی را به داده‌های 2 بعدی (ترکیب 8 گوسی روی یک حلقه) تعمیم دهید. بررسی کنید مولد چند مورد از این 8 مُد را در گام‌های 1k، 5k و 10k پوشش می‌دهد. تفکیک مینی‌بچ (minibatch discrimination) را پیاده‌سازی و دوباره آزمایش کنید.

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها تعریف دقیق فنی
مولد (Generator) «شبکه‌ی G» شبکه‌ی تبدیل نویز به نمونه، G: z → x̂.
تفکیک‌کننده (Discriminator) «شبکه‌ی D» طبقه‌بند D: x → [0, 1]، تفکیک داده‌ی واقعی از جعلی.
مینی‌ماکس (Minimax) «بازی» min⁡Gmax⁡D\min_G \max_D روی یک تابع هدف مشترک.
تابع زیان غیراشباع‌کننده (Non-saturating loss) «راه‌حل مشکل» استفاده از −log⁡D(G(z))-\log D(G(z)) برای G به‌جای log⁡(1−D(G(z)))\log(1 - D(G(z))).
فروپاشی مُد (Mode collapse) «G روی یک چیز قفل کرده» مولد با وجود تنوع داده‌ها، خروجی‌های بسیار محدودی تولید می‌کند.
مدل WGAN «واسرشتاین» جایگزینی BCE با فاصله‌ی جابه‌جایی بار (Earth-Mover) به‌همراه جریمه‌ی گرادیان؛ گرادیان‌های هموارتر.
نرمال‌سازی طیفی (Spectral norm) «ترفند لیپ‌شیتز» مقید کردن نُرم وزن‌های D برای مهار شیب آن؛ پایدارسازی آموزش.
مدل StyleGAN «مدلی که جواب میده» شبکه‌ی نگاشت به‌همراه AdaIN؛ هنوز تا سال 2026 برترین ابزار برای چهره.

نکته‌ی پروداکشن: استنتاج تک‌ضرب، مزیت ماندگار GAN

در تولید محتوا برای دامنه‌های نامحدود، شبکه‌های GAN دیگر از نظر کیفیت نمونه برنده نیستند، اما از نظر هزینه‌ی استنتاج همچنان دست بالا را دارند. با ادبیات فنی حوزه‌ی استنتاج در محیط پروداکشن، یک GAN این ویژگی‌ها را دارد:

  • حذف مراحل prefill و decode. فقط یک گذر رو به جلو در G(z)G(z). در نتیجه TTFT تقریباً برابر با کل تاخیر (latency) خواهد بود.
  • نبود بار روی حافظه‌ی کش KV. تنها متغیر موجود، وزن‌های مدل است. محدودیت اندازه‌ی بچ (batch size) فقط با حافظه‌ی اکتیویشن تعیین می‌شود، نه کش.
  • Continuous batching بسیار ساده. چون مصرف FLOPs برای تمام درخواست‌ها مقداری کاملاً ثابت است، معمولاً تشکیل یک بچ استاتیک بر اساس ظرفیت هدف سرور بهترین بازدهی را دارد؛ نیازی هم به اسکژولر (scheduler) برای درخواست‌های در حال اجرا (in-flight) نیست.

به همین دلیل است که تقطیر GAN (مثل SDXL-Turbo، SD3-Turbo، ADD و LCM) در سال 2026 تکنیک مسلط برای تولید سریع متن به تصویر است: این روش یک پایپ‌لاین انتشار 20 تا 50 مرحله‌ای را تنها به 1 تا 4 گذر رو به جلو از نوع GAN فشرده می‌کند، درحالی‌که توزیع مدل پایه‌ی انتشار را هم حفظ می‌کند. تابع زیان متخاصم هنوز زنده است؛ ابزاری در زمان آموزش برای تبدیل مولدهای کند به سیستم‌هایی فوق‌سریع.

برای مطالعه‌ی بیشتر

سؤالات متداول

چرا شبکه‌های GAN خروجی‌های شفاف‌تری نسبت به VAE تولید می‌کنند؟

مدل‌های VAE به دلیل کمینه‌سازی خطای پیکسلی (MSE) به سمت میانگین داده‌ها تمایل دارند که خروجی را مات می‌کند، اما GAN به‌جای فرمول‌های بسته‌ی پیکسلی، با تفکیک‌کننده یاد می‌گیرد که باورپذیری کل تصویر را بسنجد.

پدیده‌ی فروپاشی مُد (Mode Collapse) چیست و چگونه رفع می‌شود؟

زمانی رخ می‌دهد که مولد تنها یک یا چند نمونه‌ی محدود را که تفکیک‌کننده در تشخیص آن‌ها ناتوان است بارها تولید کند؛ برای رفع آن می‌توان از WGAN-GP، تزریق نویز به ورودی‌های تفکیک‌کننده یا تفکیک مینی‌بچ استفاده کرد.

مزیت اصلی GAN در استنتاج پروداکشن چیست؟

استنتاج در GAN در یک گذر رو به جلو (One-shot) انجام می‌شود و به فرایندهای چندمرحله‌ای یا حافظه‌ی کش KV نیاز ندارد؛ این ویژگی تاخیر پاسخ‌دهی را بسیار پایین می‌آورد.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.