فاز 8 · درس 4

شبکه‌های مقابله‌ای شرطی و Pix2Pix در یادگیری ماشین

نوع
ساختنی
زمان
حدود 75 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 8 · درس 03 (GANها)، فاز 4 · درس 06 (U-Net)، فاز 3 · درس 07 (شبکه‌های عصبی کانولوشنی CNN)
یک نقشه شماتیک و ساده از خیابان‌های یک شهر که نیمی از آن به تصویر ماهواره‌ای هوایی و فوق‌العاده واقعی از همان خیابان‌ها تبدیل شده است
فهرست مطالب
  1. صورت مسئله
  2. مفاهیم کلیدی
  3. CycleGAN — وقتی داده‌های جفت‌شده ندارید
  4. پیاده‌سازی از صفر
  5. گام 1: الصاق شرط به ورودی‌های G و D
  6. گام 2: آموزش شرطی
  7. گام 3: اعتبارسنجی خروجی هر کلاس
  8. تله‌ها و خطاهای رایج
  9. استفاده در عمل
  10. خروجی نهایی
  11. تمرین‌ها
  12. اصطلاحات کلیدی
  13. نکته‌ی پروداکشن: Pix2Pix به عنوان پایه‌ای برای سیستم‌های مقید به تاخیر
  14. منابع برای مطالعه‌ی بیشتر

در سال‌های آغازین ظهور شبکه‌های مقابله‌ای زایا (GAN)، خروجی این شبکه‌ها بیشتر تصادفی و غیرقابل کنترل بود. تولید چهره‌های تصادفی جذابیت بالایی در دموها داشت، اما برای کاربردهای مهندسی واقعی، به خروجی مقید و کنترل‌شده نیاز داریم؛ مثل تبدیل خطوط نقشه به تصویر هوایی یا تبدیل اسکچ دستی به عکسی واقعی. معماری‌های شرطی (Conditional GAN) و به ویژه مدل Pix2Pix این امکان را فراهم کردند تا تصویر خروجی دقیقاً تابع ورودیِ هدایت‌کننده باشد.

اگرچه مدل‌های نوین دیفیوژن در تولید تصاویر باکیفیت و تنوع بالا عملکرد خیره‌کننده‌ای دارند، اما هزینه سنگین محاسباتی و تاخیر چندثانیه‌ای آن‌ها، استقرارشان را روی سرویس‌های حساس به زمان پاسخ با چالش روبه‌رو می‌کند. مدل Pix2Pix به دلیل استنتاج تک‌مرحله‌ای (one-shot) بر بستر مولد U-Net، همچنان انتخابی بی‌رقیب برای تسک‌های محدود با داده‌های جفت‌شده است که زمان تاخیر را به کمتر از چند ده میلی‌ثانیه می‌رساند.

با توجه به اینکه اجاره یا خرید پردازنده‌های گرافیکی قدرتمند خارجی برای توسعه‌دهندگان دشوار و پرهزینه است، یادگیری پیاده‌سازی مدل‌های سبکی مانند cGAN و بهینه‌سازی آن‌ها اهمیت دوچندانی دارد. در این درس با معماری شبکه مولد U-Net، تمایزگر محلی PatchGAN و ترفندهای آموزش پایدار این خانواده از مدل‌ها آشنا می‌شوید.

اولین تحول بزرگ سال‌های 2014 تا 2017، کنترل خروجی GAN بود؛ اینکه بتوانید یک برچسب، تصویر یا متن را به آن ضمیمه کنید. Pix2Pix نسخه‌ی تصویری این ایده را پیاده کرد و هنوز هم در تسک‌های محدود تصویربه‌تصویر، همه‌ی مدل‌های عمومی متن‌به‌تصویر را پشت سر می‌گذارد.

صورت مسئله

یک GAN غیرشرطی چهره‌هایی تصادفی تولید می‌کند؛ برای دمو جذاب است، اما در محیط پروداکشن کاربردی ندارد. نیاز واقعی شما چنین مواردی است: تبدیل اسکچ به عکس واقعی، تبدیل نقشه به تصویر هوایی، تبدیل صحنه‌ی روز به شب یا رنگی کردن عکس سیاه‌وسفید. در تمام این تسک‌ها، یک تصویر ورودی xx به شما داده می‌شود و باید خروجی yy را با حفظ هماهنگی معنایی تولید کنید. به‌ازای هر xx، چندین yy معقول وجود دارد. اگر از خطای میانگین مربعات (MSE) استفاده کنید، همه‌ی این حالت‌ها با هم ترکیب شده و خروجی شبیه به معجونی تار و غیرشفاف می‌شود. اما تابع زیان مقابله‌ای (adversarial loss) این مشکل را ندارد، چون معیار «واقعی به نظر رسیدن» بسیار شارپ و تفکیک‌شده است.

مدل Conditional GAN (میرزا و اوسیندرو، 2014) یک شرط cc را به عنوان ورودی به هر دو شبکه‌ی GG و DD اضافه می‌کند. Pix2Pix (ایزولا و همکاران، 2017) این ایده را تخصصی کرد: شرط یک تصویر ورودی کامل است، مولد (generator) از معماری U-Net بهره می‌برد، تمایزگر (discriminator) یک دسته‌بند مبتنی بر وصله (PatchGAN) است و تابع زیان (loss) ترکیبی از زیان مقابله‌ای به همراه L1 است. این فرمول حتی در سال 2026 هم در دامنه‌های محدود تصویربه‌تصویر، مدل‌های متن‌به‌تصویر آموزش‌دیده از صفر را پشت سر می‌گذارد؛ چرا که روی داده‌های جفت‌شده (paired data) آموزش می‌بیند و دقیقاً همان سیگنال نظارتی لازم را در اختیارتان می‌گذارد.

مفاهیم کلیدی

Pix2Pix: مولد U-Net و تمایزگر PatchGAN

مولد شرطی (Conditional G): G(x,z)→yG(x, z) \to y. در Pix2Pix، متغیر zz در واقع همان دراپ‌اوت درون شبکه‌ی G است (نویز ورودی جداگانه‌ای وجود ندارد؛ ایزولا دریافت که نویز صریح عملاً توسط مدل نادیده گرفته می‌شود).

تمایزگر شرطی (Conditional D): D(x,y)→[0,1]D(x, y) \to [0, 1]. ورودی تمایزگر یک جفت (شرط، خروجی) است. تفاوت کلیدی همین‌جاست: D باید قضاوت کند که آیا yy با xx همخوانی دارد یا خیر، نه اینکه صرفاً بررسی کند آیا yy واقعی به نظر می‌رسد.

مولد U-Net: یک ساختار انکودر-دیکودر همراه با اتصال جهشی (skip connection) که از روی گلوگاه مدل عبور می‌کند. این ویژگی برای تسک‌هایی که ورودی و خروجی ساختار سطح پایینی مثل لبه‌ها یا خطوط مرزی مشترک دارند، حیاتی است. بدون این اتصالات جهشی، جزئیات فرکانس‌بالا از بین می‌روند.

تمایزگر PatchGAN: شبکه‌ی D به‌جای ارائه‌ی یک امتیاز کلیِ واقعی/جعلی، یک شبکه‌ی N×NN \times N خروجی می‌دهد که در آن هر سلول، یک میدان دید (receptive field) در حدود 70×70 پیکسل را ارزیابی می‌کند؛ در نهایت از این مقادیر میانگین گرفته می‌شود. این سازوکار بر پایه‌ی فرض میدان تصادفی مارکوف عمل می‌کند: کیفیت بصری و واقع‌گرایی ماهیتی محلی دارد. این رویکرد سرعت آموزش را بسیار بالاتر می‌برد، پارامترهای کمتری می‌خواهد و خروجی‌های شارپ‌تری تحویل می‌دهد.

تابع زیان (Loss):

lossG=−log⁡D(x,G(x))+λ⋅∥y−G(x)∥1lossD=−log⁡D(x,y)−log⁡(1−D(x,G(x)))\begin{aligned} \text{loss}_G &= -\log D(x, G(x)) + \lambda \cdot \lVert y - G(x) \rVert_1 \\ \text{loss}_D &= -\log D(x, y) - \log(1 - D(x, G(x))) \end{aligned}

جمله‌ی L1 آموزش را پایدار می‌کند و G را به سمت هدف مشخص push می‌کند. خطای L1 نسبت به L2 لبه‌های شارپ‌تری تولید می‌کند (به دلیل تمرکز روی میانه‌ها به جای میانگین‌ها). مقدار پیش‌فرض در مقاله‌ی Pix2Pix برابر با λ=100\lambda = 100 بود.

CycleGAN — وقتی داده‌های جفت‌شده ندارید

مدل Pix2Pix به داده‌های جفت‌شده‌ی (x,y)(x, y) وابسته است. CycleGAN (ژو و همکاران، 2017) این نیاز را با افزودن یک تابع زیان دیگر برطرف می‌کند: تابع زیان سازگاری چرخه‌ای (cycle consistency loss). در اینجا دو مولد G:X→YG: X \to Y و F:Y→XF: Y \to X حضور دارند. آموزش به شکلی انجام می‌شود که F(G(x))≈xF(G(x)) \approx x و G(F(y))≈yG(F(y)) \approx y برقرار باشند. این ترفند به شما اجازه می‌دهد اسب را به گورخر و تابستان را به زمستان تبدیل کنید، آن هم بدون داشتن نمونه‌های نظیر‌به‌نظیر.

در سال 2026، تبدیل تصاویر بدون جفت بیش از CycleGAN از طریق مدل‌های دیفیوژن (مانند ControlNet و IP-Adapter) انجام می‌شود، اما ایده‌ی سازگاری چرخه‌ای تقریباً در تمام مقالات حوزه‌ی انطباق دامنه بدون جفت داده پابرجا مانده است.

تفکیک‌کننده PATCHGANواقع‌گرایی محلی
PATCHGAN DISCRIMINATORA PatchGAN does not output one real/fake score for the whole image. It slides a fixed receptive field across the output and judges each local patch independently, producing an NxN grid of verdicts that is then averaged. Realism is treated as a local property, which makes the discriminator smaller, faster, and sharper on high-frequency texture.تصویر تولیدشده y (مشروط به ورودی x)شبکه NxN واقعی/ساختگیمیدان دید 70x70
مدل PatchGAN یک امتیاز واقعی/ساختگی واحد برای کل تصویر خروجی نمی‌دهد، بلکه یک میدان دید ثابت را روی خروجی می‌لغزاند و هر وصله محلی را مستقلاً ارزیابی می‌کند؛ بدین ترتیب شبکه‌ای NxN از احکام تولید می‌شود که سپس میانگین‌گیری خواهند شد. واقع‌گرایی به عنوان یک ویژگی محلی در نظر گرفته می‌شود که تفکیک‌کننده را کوچک‌تر، سریع‌تر و بر روی بافت‌های با فرکانس بالا دقیق‌تر می‌سازد.

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

فایل code/main.py یک مدل cGAN بسیار کوچک را روی داده‌های 1 بعدی پیاده می‌کند. شرط cc در واقع برچسب کلاس (0 یا 1) است. هدف: تولید یک نمونه از توزیع شرطی برای کلاس داده‌شده.

گام 1: الصاق شرط به ورودی‌های G و D

def G(z, c, params):
    return mlp(concat([z, one_hot(c)]), params)

def D(x, c, params):
    return mlp(concat([x, one_hot(c)]), params)

استفاده از کدگذاری وان‌هات (one-hot encoding) ساده‌ترین روش ممکن است. مدل‌های بزرگ‌تر از امبدینگ‌های یادگرفتنی، مدولاسیون FiLM یا کراس‌اتنشن استفاده می‌کنند.

گام 2: آموزش شرطی

for step in range(steps):
    x, c = sample_real_conditional()
    noise = sample_noise()
    update_D(x_real=x, x_fake=G(noise, c), c=c)
    update_G(noise, c)

مولد باید با توزیع واقعی به‌ازای همان شرط مشخص مطابقت داشته باشد، نه با توزیع حاشیه‌ای (marginal).

گام 3: اعتبارسنجی خروجی هر کلاس

for c in [0, 1]:
    samples = [G(noise, c) for noise in batch]
    mean_c = mean(samples)
    assert_near(mean_c, real_mean_for_class_c)

تله‌ها و خطاهای رایج

  • نادیده گرفته شدن شرط: شبکه‌ی G شرط را به حاشیه می‌راند و D هم به دلیل ضعف سیگنال شرط، آن را جریمه نمی‌کند. راه‌حل: شرطی‌سازی شبکه‌ی D را تهاجمی‌تر کنید (اعمال شرط در لایه‌های ابتدایی و نه صرفاً لایه‌های پایانی)، یا از تمایزگر مبتنی بر تصویر کردن (projection discriminator؛ میاتو و کویاما، 2018) بهره بگیرید.
  • وزن بسیار کم برای L1: شبکه‌ی G به سمت تولید تصاویری می‌رود که صرفاً واقعی به نظر می‌رسند ولی به تصویر ورودی وفادار نیستند. برای تسک‌های سبک Pix2Pix مقدار را از λ≈100\lambda \approx 100 شروع کنید.
  • وزن بسیار زیاد برای L1: خروجی‌های G تار می‌شوند، زیرا L1 هم در نهایت یک نرم LpL_p است. پس از پایدار شدن روند آموزش، مقدار آن را به تدریج کاهش دهید (anneal down).
  • نشت داده‌های زمینه‌ی واقعیت (Ground-truth) در D: مقدار (x,y)(x, y) را حتماً به عنوان ورودی به D متصل (concatenate) کنید، نه فقط yy. بدون این کار، شبکه‌ی D نمی‌تواند تطابق و یکدستی میان ورودی و خروجی را بررسی کند.
  • فروپاشی مُد در هر کلاس: هر کلاس می‌تواند به‌طور مستقل دچار فروپاشی مُد شود. تنوع خروجی‌ها را به تفکیک کلاس‌ها ارزیابی کنید.

استفاده در عمل

وضعیت تسک‌های تصویربه‌تصویر در سال 2026:

تسک بهترین رویکرد
اسکچ به عکس، دامنه‌ی یکسان، داده‌های جفت‌شده Pix2Pix / Pix2PixHD (همچنان سریع و شارپ)
اسکچ به عکس، داده‌های جفت‌نشده ControlNet همراه با مدل شرطی‌ساز Scribble
بخش‌بندی معنایی به عکس SPADE / GauGAN2 یا ترکیب SD + ControlNet-Seg
انتقال استایل (Style transfer) مدل‌های دیفیوژن با IP-Adapter یا LoRA؛ روش‌های GAN دیگر قدیمی شده‌اند
عمق به عکس ControlNet-Depth روی بستر Stable Diffusion
تفکیک‌پذیری بالا (Super-resolution) Real-ESRGAN (مبتنی بر GAN)، ESRGAN-Plus یا SD-Upscale (مبتنی بر دیفیوژن)
رنگی‌سازی عکس ColTran، رنگ‌آمیزهای مبتنی بر دیفیوژن یا Pix2Pix-color
تبدیل روز به شب، فصل‌ها و وضعیت آب‌وهوا CycleGAN یا روش‌های مبتنی بر ControlNet

مدل Pix2Pix همچنان بهترین انتخاب است زمانی که: الف) هزاران نمونه‌ی جفت‌شده در اختیار دارید، ب) تسک محدود و تکرارپذیر است، و ج) به تاخیر پایین نیاز دارید. در تسک‌های عمومی با دامنه‌ی باز، مدل‌های دیفیوژن برنده هستند.

خروجی نهایی

فایل outputs/skill-img2img-chooser.md را ذخیره کنید. این مهارت با دریافت شرح تسک، وضعیت دسترسی به داده (جفت‌شده یا جفت‌نشده، N نمونه) و بودجه‌ی تاخیر/کیفیت، این موارد را خروجی می‌دهد: رویکرد مناسب (Pix2Pix، CycleGAN، انواعی از ControlNet، یا SDXL + IP-Adapter)، داده‌های آموزشی موردنیاز، هزینه‌ی استنتاج، و پروتکل ارزیابی (LPIPS، FID یا معیارهای اختصاصی تسک).

تمرین‌ها

  1. ساده. فایل code/main.py را تغییر دهید تا یک کلاس سوم هم اضافه شود. مطمئن شوید که G نویز هر کلاس را به مُد درست همان کلاس تصویر می‌کند.
  2. متوسط. در همان فضای 1 بعدی، تابع زیان L1 را با یک تابع زیان مبتنی بر ادراک (perceptual-style loss) جایگزین کنید (مثلاً با قرار دادن یک شبکه‌ی D منجمد و کوچک که مثل یک استخراج‌کننده‌ی ویژگی عمل کند). بررسی کنید که آیا این کار وضوح و دقت توزیع شرطی را تغییر می‌دهد یا خیر.
  3. سخت. طرح کلی یک CycleGAN را برای فضای 1 بعدی پیاده کنید: دو توزیع، دو مولد و تابع زیان چرخه‌ای. نشان دهید که مدل بدون هیچ داده‌ی جفت‌شده‌ای یاد می‌گیرد چطور بین آن‌ها نگاشت برقرار کند.

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

اصطلاح در گفت‌وگوهای عامیانه معنای فنی و دقیق
Conditional GAN «یک GAN برچسب‌دار» G(z, c) و D(x, c)؛ هر دو شبکه شرط را می‌بینند.
Pix2Pix «GAN تصویربه‌تصویر» یک cGAN با داده‌های جفت‌شده، مولد U-Net، تمایزگر PatchGAN و تابع زیان L1.
U-Net «انکودر-دیکودر با اتصالات جهشی» شبکه‌ی کانولوشنی متقارن؛ اتصالات جهشی جزئیات فرکانس‌بالا را حفظ می‌کنند.
PatchGAN «دسته‌بند واقع‌گرایی محلی» شبکه‌ی D به‌جای امتیاز کلی، به‌ازای هر وصله یک امتیاز محلی می‌دهد.
CycleGAN «انتقال تصویر بدون داده‌های جفت» دو مولد همراه با تابع زیان سازگاری چرخه‌ای؛ بدون نیاز به داده‌های جفت‌شده.
SPADE «همان GauGAN» نرمال‌سازی فعال‌سازی‌های میانی با نقشه‌ی معنایی؛ برای تبدیل سگمنتیشن به عکس.
FiLM «مدولاسیون خطی مبتنی بر ویژگی» اعمال تبدیل آفین روی هر ویژگی بر اساس شرط؛ روشی ارزان برای اعمال شرط.

نکته‌ی پروداکشن: Pix2Pix به عنوان پایه‌ای برای سیستم‌های مقید به تاخیر

وقتی داده‌های جفت‌شده دارید و با تسک مشخص و محدودی روبه‌رو هستید (اسکچ به رندر، نقشه‌ی سگمنتیشن به عکس، روز به شب)، استنتاج تک‌مرحله‌ای (one-shot) مدل Pix2Pix از نظر تاخیر با اختلافی نزدیک به یک مرتبه‌ی بزرگی مدل‌های دیفیوژن را شکست می‌دهد. مقایسه‌ی پروداکشن معمولاً به این صورت است:

مسیر پیاده‌سازی تعداد گام‌ها تاخیر متداول در ابعاد 512² روی یک پردازنده‌ی گرافیکی L4
Pix2Pix (یک رفت مستقیم U-Net) 1 حدود 30 میلی‌ثانیه
SD-Inpaint یا SD-Img2Img 20 حدود 1.2 ثانیه
SDXL-Turbo Img2Img 1-4 حدود 0.15-0.35 ثانیه
ControlNet + پایه‌ی SDXL 20-30 حدود 3-5 ثانیه

مدل Pix2Pix در نرخ پردازش بچ‌های ایستا برنده می‌شود (بار پردازشی یا FLOPs برای تمام درخواست‌ها یکسان است). در مقابل، مدل‌های دیفیوژن در کیفیت بصری و تعمیم‌پذیری دست بالا را دارند. راهکار مدرن در محیط‌های پروداکشن این است که برای تسک محدود یک مدل تقطیرشده به سبک Pix2Pix مستقر کنید و از مدل دیفیوژن به عنوان سیستم جایگزین و پشتیبان (fallback) برای ورودی‌های نامتعارف (tail inputs) بهره ببرید.

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

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

تفاوت اصلی بین Pix2Pix و CycleGAN چیست؟

مدل Pix2Pix برای آموزش به داده‌های نظیربه‌نظیر یا جفت‌شده (paired) نیاز دارد؛ در حالی که CycleGAN با استفاده از دو مولد و زیان سازگاری چرخه‌ای (cycle consistency)، بدون نیاز به داده‌های جفت‌شده نگاشت میان دو دامنه را یاد می‌گیرد.

چرا در Pix2Pix از تمایزگر PatchGAN استفاده می‌شود؟

شبکه PatchGAN به‌جای انتساب یک برچسب کلی واقعی/جعلی به کل تصویر، وصله‌های محلی (مثلاً حدود 70×70 پیکسل) را ارزیابی می‌کند که این کار تعداد پارامترها را کاهش داده، سرعت آموزش را بالا می‌برد و لبه‌های شارپ‌تری ایجاد می‌کند.

چرا مدل Pix2Pix در محیط پروداکشن گاهی به دیفیوژن ترجیح داده می‌شود؟

مدل Pix2Pix تنها با یک بار گذر رفت مستقیم (forward pass) از شبکه U-Net در حدود 30 میلی‌ثانیه تصویر نهایی را می‌سازد؛ در حالی که مدل‌های دیفیوژن چندمرحله‌ای به چند ثانیه زمان استنتاج نیاز دارند.

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

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