فاز 8 · درس 5

معماری StyleGAN: از تفکیک فضای پنهان تا ویرایش چهره

نوع
ساختنی
زمان
حدود 45 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 8 · درس 03 (شبکه‌های GAN)، فاز 4 · درس 08 (روش‌های نرمال‌سازی)، فاز 3 · درس 07 (شبکه‌های عصبی کانولوشنی یا CNN)
یک کنسول میکس صدای استودیویی با اسلایدرهای عمودی متعدد که نورهای رنگی ملایمی دارند و خطوط موج صوتی دقیق را تنظیم می‌کنند
فهرست مطالب
  1. صورت مسئله
  2. مفهوم
  3. روند تکامل: StyleGAN 1 → 2 → 3
  4. پیاده‌سازی از صفر
  5. گام 1: شبکه‌ی نگاشت
  6. گام 2: نرمال‌سازی نمونه‌ای تطبیقی (AdaIN)
  7. گام 3: نویز به ازای هر لایه
  8. دام‌ها و خطاهای رایج
  9. استفاده از ابزارهای واقعی
  10. خروجی این درس
  11. تمرین‌ها
  12. اصطلاحات کلیدی
  13. نکته‌ی محیط عملیاتی: چرا در سال 2026 هنوز StyleGAN در پروداکشن استفاده می‌شود؟
  14. برای مطالعه‌ی بیشتر

در شبکه‌های زایای متخاصم کلاسیک، متغیر پنهان به صورت یک‌جا به لایه‌های اولیه تزریق می‌شد. این ساختار باعث درهم‌تنیدگی شدید ویژگی‌ها می‌شد؛ به‌طوری‌که تغییر زاویه‌ی سر، رنگ پوست یا هویت فرد را هم ناخواسته دستخوش تغییر می‌کرد. StyleGAN با بازتعریف این فرآیند و جداسازی مولفه‌های سبک از ساختار کلی، امکان کنترل دقیق و مستقل ویژگی‌های بصری را فراهم آورد.

این درس به شما نشان می‌دهد چطور شبکه‌ی نگاشت (mapping network) و لایه‌های نرمال‌سازی انطباقی (AdaIN) فضای درهم‌تنیده‌ی ورودی را به یک فضای پنهان تفکیک‌شده تبدیل می‌کنند. همچنین با بررسی تفاوت‌های StyleGAN نسخه‌ی 1، 2 و 3، یاد می‌گیرید چگونه در محیط‌های پروداکشن تصویری باکیفیت و با تأخیر کمتر از 10 میلی‌ثانیه تولید کنید.

اغلب مولدها zz را هم‌زمان به خورد همه‌ی لایه‌ها می‌دهند. StyleGAN این ساختار را تفکیک کرد: ابتدا zz را به یک فضای میانی ww نگاشت می‌کند، سپس ww را در هر سطح از تفکیک‌پذیری از طریق AdaIN تزریق می‌کند. همین یک تغییر، گره‌های فضای پنهان را باز کرد و تولید چهره‌های واقع‌گرایانه (photorealistic) را هفت سال متوالی به یک مسئله‌ی حل‌شده تبدیل ساخت.

صورت مسئله

مدل DCGAN با پشته‌ای از کانولوشن‌های ترانهاده (transposed convolutions)، zz را به یک تصویر نگاشت می‌کند. مشکل اینجاست: zz همه‌چیز را کنترل می‌کند — زاویه‌ی سر، نورپردازی، هویت فرد، پس‌زمینه — که همگی درهم‌تنیده‌اند. اگر در امتداد یک محور از zz حرکت کنید، هر چهار متغیر با هم تغییر می‌کنند. نمی‌توانید از مدل بخواهید «همان فرد، اما با زاویه‌ی سری دیگر»؛ چون بازنمایی مدل به این شکل تفکیک‌پذیر نیست.

کاراس و همکاران (2019، NVIDIA) راه‌حلی پیشنهاد دادند: تغذیه‌ی مستقیم لایه‌های کانولوشن با zz را متوقف کنید. در عوض، یک تنسور ثابت 4×4×512 را به عنوان ورودی شبکه بفرستید. یک MLP هشت‌لایه‌ای یاد بگیرید که z∈Z→w∈Wz \in Z \to w \in W را می‌نگارد. سپس ww را در هر رزولوشن از طریق نرمال‌سازی نمونه‌ای تطبیقی (AdaIN) تزریق کنید: هر نقشه‌ی ویژگی (feature map) کانولوشن را نرمال کرده و سپس با تصویر کردنِ آفینِ ww، مقیاس و جابه‌جایی آن را تغییر دهید. برای جزئیات تصادفی (روزنه‌های پوست، تارهای مو) هم به ازای هر لایه نویز جداگانه اضافه کنید.

نتیجه: WW محورهای تقریباً عمود بر هم برای «استایل سطح بالا» (زاویه‌ی سر، هویت) در برابر «استایل ریز» (نور، رنگ) پیدا می‌کند. حالا می‌توانید استایل دو تصویر را با هم جابه‌جا کنید؛ کافی است ww تصویر A را برای سطوح با رزولوشن پایین و ww تصویر B را برای سطوح با رزولوشن بالا به کار ببرید. این تغییر، قفل ویرایش، انتقال استایل بین دامنه‌ها و کل شاخه‌ی پژوهشی «وارون‌سازی StyleGAN» (StyleGAN-inversion) را باز کرد.

مفهوم

StyleGAN: mapping network + AdaIN + per-layer noise

شبکه‌ی نگاشت (Mapping network): ساختار f:Z→Wf: Z \to W، یک MLP هشت‌لایه‌ای. Z=N(0,I)512Z = \mathcal{N}(0, I)^{512}. فضای WW مجبور نیست حتماً گاوسی بماند — شکلی متناسب با توزیع داده‌ها یاد می‌گیرد.

شبکه‌ی سنتز (Synthesis network): با یک مقدار ثابتِ یادگرفتنی 4×4×512 شروع می‌شود. هر بلوک رزولوشن: upsample → conv → AdaIN(w_i) → noise → conv → AdaIN(w_i) → noise. رزولوشن‌ها دو برابر می‌شوند: 4، 8، 16، 32، 64، 128، 256، 512، 1024.

AdaIN:

AdaIN(x,y)=yscale⋅x−mean(x)std(x)+ybias\mathop{\mathrm{AdaIN}}(x, y) = y_{\text{scale}} \cdot \frac{x - \mathop{\mathrm{mean}}(x)}{\mathop{\mathrm{std}}(x)} + y_{\text{bias}}

که در آن yscaley_{\text{scale}} و ybiasy_{\text{bias}} از تصویر کردن آفینِ ww به دست می‌آیند. نرمال‌سازی برای هر نقشه‌ی ویژگی جداگانه انجام می‌شود و سپس استایل‌دهی مجدد صورت می‌گیرد. «استایل» در اینجا همان آماره‌های مرتبه اول و دوم نقشه‌ی ویژگی است.

نویزِ هر لایه: نویز گاوسی تک‌کاناله که به هر نقشه‌ی ویژگی اضافه شده و با یک ضریب یادگرفتنی به ازای هر کانال مقیاس‌بندی می‌شود. این سازوکار جزئیات تصادفی را بدون دست‌زدن به ساختار کلی تصویر کنترل می‌کند.

ترفند هرس (Truncation trick): در زمان استنتاج، ابتدا zz را نمونه‌گیری کنید، w=mapping(z)w = \text{mapping}(z) را به دست آورید و سپس w′=w^+ψ⋅(w−w^)w' = \hat{w} + \psi \cdot (w - \hat{w}) را محاسبه کنید؛ که در آن w^\hat{w} میانگین ww روی تعداد زیادی نمونه است. مقدار ψ<1\psi < 1 تنوع را فدای کیفیت می‌کند. تقریباً در تمام دموهای StyleGAN از ψ≈0.7\psi \approx 0.7 استفاده می‌شود.

روند تکامل: StyleGAN 1 → 2 → 3

نسخه سال نوآوری
StyleGAN 2019 شبکه‌ی نگاشت + AdaIN + نویز + رشد تدریجی (progressive growing).
StyleGAN2 2020 جایگزینی AdaIN با مدولاسیون‌زدایی وزن‌ها (weight demodulation برای حذف لکه‌های آب‌مانند)؛ معماری با اتصالات میان‌بر/باقی‌مانده؛ منظم‌سازی طول مسیر (path-length regularization).
StyleGAN3 2021 کانولوشن‌های بدون آلیاسینگ (Alias-free) + کرنل‌های هم‌وردا؛ حذف چسبندگی بافت به شبکه‌ی پیکسلی.
StyleGAN-XL 2022 شرطی‌شده بر پایه کلاس، رزولوشن 1024²، ImageNet.
R3GAN 2024 بازطراحی با منظم‌سازی قوی‌تر؛ بستن فاصله‌ی کیفی با مدل‌های دیفیوژن روی FFHQ-1024 با 20 برابر پارامتر کمتر.

در سال 2026، مدل StyleGAN3 همچنان گزینه‌ی پیش‌فرض برای این موارد است: (الف) خروجی واقع‌گرایانه در دامنه‌های محدود با نرخ فریم بالا، (ب) انطباق دامنه با چند نمونه (آموزش روی دیتاست جدید با 100 تصویر، فریز کردن شبکه‌ی نگاشت)، (ج) ویرایش مبتنی بر وارون‌سازی (پیدا کردن ww که یک عکس واقعی را بازسازی کند، سپس ویرایش همان ww). اما برای تولید تصویر از متن در دامنه‌های باز اصلاً ابزار مناسبی نیست؛ آنجا قلمرو دیفیوژن است.

نگاشت StyleGANتفکیک و سپس تزریق
STYLEGAN MAPPINGA plain generator feeds the noise vector z straight into the network, so every factor of variation stays tangled together. StyleGAN first maps z through an 8-layer MLP to an intermediate space W whose axes line up with meaningful factors like pose and lighting, then injects that w through AdaIN at every resolution. Disentangling first is what made style mixing and editing possible.Z: درهم‌تنیدهf (MLP هشت‌لایه)W: تفکیک‌شدهمحور حالت چهره4x416x1664x641024تزریق w از طریق AdaIN در هر رزولوشن
یک مولد معمولی، بردار نویز z را مستقیماً به شبکه تغذیه می‌کند، در نتیجه تمام عوامل تغییر به صورت درهم‌تنیده باقی می‌مانند. StyleGAN ابتدا z را از طریق یک MLP هشت‌لایه‌ای به یک فضای میانی W نگاشت می‌کند که محورهای آن با عوامل معناداری مانند حالت چهره و نورپردازی هم‌راستا هستند؛ سپس آن w را از طریق AdaIN در هر رزولوشن تزریق می‌کند. این تفکیک اولیه همان چیزی است که ترکیب و ویرایش سبک را امکان‌پذیر ساخت.

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

فایل code/main.py یک نسخه‌ی ساده و تک‌بعدی از سبکِ StyleGAN را پیاده‌سازی کرده است: یک MLP نگاشت، یک تابع سنتز که بردار ثابت یادگرفتنی را می‌گیرد و آن را با مقیاس/بایاسِ مشتق‌شده از ww مدوله می‌کند، همراه با نویز هر لایه. این پیاده‌سازی نشان می‌دهد که تزریق ww از طریق مدولاسیون آفین با الحاق (concatenate) مستقیم zz به ورودی مولد برابری می‌کند یا حتی عملکرد بهتری دارد.

گام 1: شبکه‌ی نگاشت

def mapping(z, M):
    h = z
    for i in range(num_layers):
        h = leaky_relu(add(matmul(M[f"W{i}"], h), M[f"b{i}"]))
    return h

گام 2: نرمال‌سازی نمونه‌ای تطبیقی (AdaIN)

def adain(x, w_scale, w_bias):
    mu = mean(x)
    sd = std(x)
    x_norm = [(xi - mu) / (sd + 1e-8) for xi in x]
    return [w_scale * xi + w_bias for xi in x_norm]

مقیاس و بایاس به ازای هر نقشه‌ی ویژگی، از طریق تصویر کردن خطیِ (linear projection) ww به دست می‌آیند.

گام 3: نویز به ازای هر لایه

def add_noise(x, sigma, rng):
    return [xi + sigma * rng.gauss(0, 1) for xi in x]

سیگما به ازای هر کانال یادگرفتنی است.

دام‌ها و خطاهای رایج

  • لکه‌های آب‌مانند (Droplet artifacts): در StyleGAN 1 به این دلیل که AdaIN میانگین را صفر می‌کرد، لکه‌هایی قطره‌مانند روی نقشه‌های ویژگی ایجاد می‌شد. مدولاسیون‌زدایی وزن‌ها در StyleGAN 2 این مشکل را با مقیاس‌بندی وزن‌های کانولوشن (به‌جای اکتیویشن‌ها) برطرف کرد.
  • چسبندگی بافت (Texture sticking): در StyleGAN 1 و 2، بافت‌ها مختصات پیکسلی را دنبال می‌کردند نه مختصات شیء را (که موقع درون‌یابی کاملاً مشخص بود). کانولوشن‌های بدون آلیاسینگ در StyleGAN 3 به کمک فیلترهای پنجره‌ای sinc این ایراد را برطرف کردند.
  • پوشش مُدها (Mode coverage): ترفند هرس با ψ < 0.7 خروجی بسیار تمیزی می‌دهد، اما از یک مخروط باریک نمونه‌گیری می‌کند؛ اگر به تنوع نیاز دارید، از ψ = 1.0 استفاده کنید.
  • اتلاف در فرآیند وارون‌سازی (Lossy Inversion): وارون‌سازی عکس واقعی و بردن آن به فضای WW معمولاً با بهینه‌سازی یا به کمک یک انکودر (مثل e4e ،ReStyle یا HyperStyle) انجام می‌شود. نتایج در طول تکرارهای زیاد دچار رانش (drift) می‌شوند.

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

کاربرد رویکرد
چهره‌های انسانی کاملاً واقعی (انیمه، عکاسی محصول، دامنه‌های محدود) مدل StyleGAN3 روی FFHQ / فاین‌تیون اختصاصی
ویرایش چهره از روی عکس وارون‌سازی با e4e + جهت‌های StyleSpace یا InterFaceGAN
تعویض چهره / بازآفرینی حرکات (reenactment) ترکیب StyleGAN + انکودر + ترکیب تصویر (blending)
پایپ‌لاین‌های ساخت آواتار مدل StyleGAN3 به همراه ADA برای فاین‌تیون با داده‌ی کم
انطباق دامنه با چند تصویر معدود فریز کردن شبکه‌ی نگاشت، فاین‌تیون شبکه‌ی سنتز
تولید تصویر چندحالته یا شرطی‌شده بر متن اصلاً استفاده نکنید — از دیفیوژن استفاده کنید

برای محصولات پروداکشن که پاسخ نهایی منحصراً «عکس چهره‌ی یک انسان» است، StyleGAN از نظر هزینه‌ی استنتاج (یک گذر رو به جلو، زیر 10 میلی‌ثانیه روی یک کارت 4090) و وضوح در کیفیتی برابر، دیفیوژن را کاملاً شکست می‌دهد.

خروجی این درس

فایل outputs/skill-stylegan-inversion.md را ذخیره کنید. این مهارت یک عکس واقعی دریافت می‌کند و خروجی می‌دهد: روش وارون‌سازی (e4e / ReStyle / HyperStyle)، تابع زیان (loss) پنهان مورد انتظار، حد مجاز ویرایش (اینکه چه مقدار در WW پیش بروید قبل از اینکه آرتیفکت ظاهر شود)، و فهرستی از جهت‌های ویرایشی مطمئن و آزموده‌شده (سن، حالت چهره، زاویه‌ی سر).

تمرین‌ها

  1. ساده. اسکریپت code/main.py را با دو حالت adain_on=True و adain_on=False اجرا کنید. پراکندگی خروجی‌ها را برای یک متغیر پنهانِ ثابت در برابر متغیر پنهانِ آشفته‌شده مقایسه کنید.
  2. متوسط. منظم‌سازی ترکیبی (mixing regularization) را پیاده‌سازی کنید: برای یک بچ آموزشی، مقادیر waw_a و wbw_b را محاسبه کنید؛ سپس waw_a را برای نیمه‌ی اول سنتز و wbw_b را برای نیمه‌ی دوم اعمال کنید. بررسی کنید که آیا دیکودر استایل‌های تفکیک‌شده را یاد می‌گیرد؟
  3. دشوار. یک مدل از‌پیش‌آموزش‌دیده‌ی StyleGAN3 FFHQ (فایل ffhq-1024.pkl) را بردارید. با آموزش یک SVM روی نمونه‌های برچسب‌دار، جهت بردار «لبخند» را در ww بیابید؛ گزارش دهید که چقدر می‌توانید متغیر را بدون تغییر هویت چهره push کنید.

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

اصطلاح در گفتگوها در واقعیت چه کار می‌کند
Mapping network «همان شبکه MLP» ساختار f:Z→Wf: Z \to W با 8 لایه، ساختار هندسی فضای پنهان را از آماره‌های داده‌ها تفکیک می‌کند.
W space «فضای استایل» خروجی شبکه‌ی نگاشت؛ تا حد زیادی تفکیک‌شده (disentangled).
AdaIN «نرمال‌سازی انطباقی» نرمال‌سازی نقشه‌ی ویژگی، و سپس مقیاس‌بندی + جابه‌جایی با تصویر کردنِ ww.
Truncation trick «پارامتر سای (Psi)» فرمول w=mean+ψ⋅(w−mean)w = \text{mean} + \psi \cdot (w - \text{mean})، که در آن ψ<1\psi<1 تنوع را فدای کیفیت می‌کند.
Path-length regularization «منظم‌سازی طول مسیر» تغییرات شدید تصویر را به ازای هر واحد تغییر در ww جریمه می‌کند؛ فضای WW را هموارتر می‌سازد.
Weight demodulation «ترفند اصلاحی StyleGAN2» نرمال‌سازی وزن‌های کانولوشن به‌جای اکتیویشن‌ها؛ حذف آرتیفکت‌های قطره‌ای.
Alias-free «ترفند StyleGAN3» فیلترهای پنجره‌ای sinc؛ حذف چسبندگی بافت به شبکه‌ی پیکسلی.
Inversion «پیدا کردن w برای عکس واقعی» بهینه‌سازی یا استفاده از انکودر برای یافتن x→wx \to w به گونه‌ای که G(w)≈xG(w) \approx x.

نکته‌ی محیط عملیاتی: چرا در سال 2026 هنوز StyleGAN در پروداکشن استفاده می‌شود؟

مدل StyleGAN3 روی یک 4090 تصویری با رزولوشن 1024² از FFHQ را در کمتر از 10 میلی‌ثانیه می‌سازد — یعنی num_steps = 1، بدون رمزگشایی VAE، و بدون گذرِ کراس‌اتنشن (cross-attention). در مقیاس پروداکشن، این کمترین تاخیر (latency) ممکن برای هر مولد تصویر است. یک پایپ‌لاین 50 مرحله‌ای از مدل SDXL به همراه دی‌کد VAE در همان رزولوشن حدود 3 ثانیه زمان می‌برد. یعنی 300 برابر اختلاف؛ برای محصولات با دامنه‌ی محدود (سرویس‌های آواتار، پایپ‌لاین‌های مدارک هویتی، تولید چهره‌های استوک)، این مدل از نظر هزینه‌ی کل مالکیت برنده است.

دو پیامد عملیاتی مهم:

  • نه اسکژولری در کار است، نه بچ‌سازی. یک بچ استاتیک با حد اشغال بهینه کافی است. بچ‌سازی پیوسته (continuous batching که برای LLMها و دیفیوژن ضروری است) هیچ فایده‌ای ندارد؛ چون بار محاسباتی (FLOPs) هر درخواست دقیقاً یکسان است.
  • پارامتر هرس ψ پیچ تنظیم ایمنی است. شرط ψ < 0.7 نمونه‌گیری را در مخروط باریکی از دامنه‌ی شبکه‌ی نگاشت نگه می‌دارد. این تنها اهرم لایه‌ی سرویس‌دهی برای کنترل واریانس نمونه‌هاست. در ساعات اوج بار، مقدار ψ را کم کنید و برای کاربران پریمیوم آن را افزایش دهید.

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

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

چرا با وجود مدل‌های دیفیوژن، StyleGAN همچنان در سال 2026 کاربرد دارد؟

StyleGAN برای تولید چهره و دامنه‌های متمرکز به یک گذر روبه‌جلو نیاز دارد و روی سخت‌افزارهایی مثل RTX 4090 کمتر از 10 میلی‌ثانیه زمان می‌برد؛ یعنی تا 300 برابر سریع‌تر و ارزان‌تر از پایپ‌لاین‌های چندمرحله‌ای دیفیوژن.

نقش ترفند هرس (Truncation Trick) در StyleGAN چیست؟

با ضریب هرس (ψ)، بردارهای فضای W به میانگین بردارها نزدیک‌تر می‌شوند؛ این کار تنوع خروجی را کمتر اما کیفیت بصری و واقع‌گرایی تصویر را تضمین می‌کند.

مشکل لکه‌های آب‌مانند (Droplet Artifacts) در StyleGAN چگونه رفع شد؟

در StyleGAN2 با جایگزین کردن AdaIN با مدولاسیون‌زدایی وزن‌ها (weight demodulation) و نرمال‌سازی وزن‌های کانولوشن به جای فعال‌سازها، این لکه‌ها به‌طور کامل از بین رفتند.

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

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