الوحدة 5 — انهيار الأنماط وتثبيت التدريب
خرجنا من الوحدة السابقة بـGAN يعمل، لكن كثيرًا ما لا يعمل. المسألة ليست خطأً في الشفرة، بل عللٌ بنيويّة في اللعبة نفسها. تُخصَّص هذه الوحدة لأهمّها — انهيار الأنماط — ولمجموعة الحلول التي حوّلت GAN من فضول أكاديميّ في 2014 إلى StyleGAN في 2019 المنتج للوجوه التي يظنّها الجميع صورًا حقيقيّة.
الأعراض: كيف نعرف أنّنا في انهيار الأنماط
انهيار الأنماط حالة يُنتج فيها المولّد مجموعة صغيرة جدًّا من الصور (أحيانًا صورة واحدة)، بصرف النظر عن الضجيج المُدخَل . رياضيًّا يعني أنّ تعلّم تعميم دالّة تخدع المميّز، دون أن تُغطّي فعلًا توزيع البيانات.
الأعراض متعدّدة وأحيانًا مُخادعة:
- دائري: تُنتج ألف عيّنة عشوائيّة، فيتكرّر الرقم نفسه (أو الوجه نفسه) عشرات المرّات.
- جزئيّ: على MNIST بعشرة أصناف، المولّد يُنتج ستّة أرقام فقط، والأربعة الأخرى مفقودة تمامًا.
- دوريّ: التنوّع يعود ثمّ يختفي دوريًّا خلال التدريب، والصور تدور بين مجموعات صغيرة متعاقبة.
- رغم انخفاض الخسارة: ولهذا التحذير من الوحدة السابقة يعود بحدّة. خسارة المولّد قد تكون منخفضة تمامًا لأنّ الصور «الست» التي يُنتجها تخدع المميّز، دون أن يكشف ذلك أيّ منحنى.
لماذا يحدث؟
الفهم الأنيق يأتي من هندسة اللعبة. المولّد يبحث عن نقطة تُقلّل خسارته بمعلومية المميّز الحاليّ. إذا وجد صورة واحدة يفشل المميّز في كشفها، فأسهل شيء يفعله هو أن يُنتج هذه الصورة لكلّ . ولا شيء في الخسارة يُعاقبه على غياب التنوّع: خسارة تُحسَب صورة صورة، لا على التوزيع.
يفترض المميّز أن يُعاقب هذا السلوك بأن يتعلّم كشف الصورة المتكرّرة، ثمّ يتقدّم المولّد إلى صورة أخرى، وهكذا. لكن هذا الدوران لا يضمن التقارب، وقد يُنتج حلقة مغلقة تدور فيها اللعبة أبد الدهر دون تحسّن التنوّع.
Wasserstein GAN: تغيير ال خسارة نفسها
الحلّ الأوّل الجذريّ جاء في 2017 مع WGAN لـArjovsky وChintala وBottou. فكرته: الخسارة الأصلية تُقرّب تباعد Jensen-Shannon بين و، وهذا التباعد يعطي 0 تدرّج حين لا تتقاطع الدعامتان (أي حين تنتمي الصور المولّدة إلى منطقة مختلفة كليًّا عن الحقيقيّة).
الحلّ: استبدال Jensen-Shannon بمسافة Wasserstein (تُدعى أيضًا مسافة نقل الأتربة). هذه المسافة تعطي تدرّجًا مفيدًا حتّى حين تكون الدعامتان بعيدتين. الصيغة العمليّة تُبدّل دور المميّز إلى ناقد يعطي درجة حقيقيّة (لا احتمالًا في )، والخسارة تصبح فرقًا مباشرًا:
الشرط النظريّ: يجب أن يكون الناقد 1-ليبشتزيًّا، أي أنّ تدرّجه محدود بواحد. الاقتراح الأوّل كان قصّ الأوزان إلى ، وهو خشن ويعطي نتائج متواضعة.
عقوبة التدرّج: WGAN-GP
في وقت لاحق من 2017، اقترح Gulrajani وآخرون WGAN-GP (Wasserstein GAN with Gradient Penalty) بديلًا أنيقًا: بدل قصّ الأوزان، نُعاقب مباشرةً معيار التدرّج ونجرّه نحو 1.
حيث نقاط مستوفاة بين صور حقيقية ومزيّفة، و قيمة قياسية.
def penalite_gradient(critique, x_reel, x_faux, lam=10.0):
B = x_reel.size(0)
alpha = torch.rand(B, 1, 1, 1, device=x_reel.device)
x_hat = alpha * x_reel + (1 - alpha) * x_faux
x_hat.requires_grad_(True)
s_hat = critique(x_hat)
grads = torch.autograd.grad(
outputs=s_hat, inputs=x_hat,
grad_outputs=torch.ones_like(s_hat),
create_graph=True, retain_graph=True,
)[0]
norme = grads.view(B, -1).norm(2, dim=1)
return lam * ((norme - 1) ** 2).mean()
مع WGAN-GP تصبح خسارة الناقد دالّة مؤشِّرة فعلًا: انخفاضها المستمرّ يعني أنّ المولّد يقترب من التوزيع الحقيقيّ. هذا وحده يُبرّر التبنّي.
التسوية الطيفيّة: البديل الأخفّ
التسوية الطيفيّة (Spectral Normalization) اقترحها Miyato وآخرون في 2018 بديلًا أقلّ تكلفة من WGAN-GP. تقسّم أوزان كلّ طبقة على أكبر قيمة مفردة لها، فتضمن أنّ الطبقة 1-ليبشتزيّة بلا حسابات إضافيّة أثناء التدريب.
import torch.nn.utils.spectral_norm as sn
class MimyzSN(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
sn(nn.Conv2d(3, 64, 4, 2, 1)), nn.LeakyReLU(0.2),
sn(nn.Conv2d(64, 128, 4, 2, 1)), nn.LeakyReLU(0.2),
sn(nn.Conv2d(128, 256, 4, 2, 1)), nn.LeakyReLU(0.2),
nn.Flatten(),
sn(nn.Linear(256 * 8 * 8, 1)),
)
المكسب: تدريب أسرع من WGAN-GP، مع استقرار قابل للمقارنة على معظم مجموعات البيانات. عيبها: أقلّ متانة على معماريّات عميقة جدًّا.
وصفات عمليّة لا تخالف
أكثر من عشر سنوات من الممارسة على GAN أنتجت مجموعة قواعد يستحقّ اتّباعها دون تردّد:
- تسوية الصور إلى مع Tanh في مخرج المولّد، لا مع سيغمويد.
- تدريب المميّز أكثر من المولّد (نسبة 5 إلى 1 مثلًا في WGAN-GP)، حتّى يبقى ناقدًا موثوقًا.
- معدّل تعلّم صغير (2e-4 أو أقلّ) مع Adam بـ لا ، وإلّا التذبذبات تخرج عن السيطرة.
- صور تُحفَظ في كلّ حقبة، من عيّنة ثابتة لتتمكّن من مقارنة التقدّم بصريًّا.
- حساب FID كلّ عدد ثابت من الحقبات (مثلًا كلّ 5) وليس في كلّ حقبة (حسابه غالٍ).
إذا لاحظت انهيار أنماط دون سبب واضح، جرّب زيادة حجم دفعة المميّز إلى الضعف: يعطيه رؤية أوسع على تنوّع الحقيقيّ، فيكشف بسهولة أكبر تكرار المولّد. هذه الحيلة الصغيرة أنقذت الكثير من التدريبات من انهيار كامل، ولا تحتاج إلى تغيير أيّ سطر في المعمارية.
StyleGAN في لمحة
StyleGAN من NVIDIA (2018-2020) هو ذروة GAN للوجوه، والنماذج التي تجدها على thispersondoesnotexist مبنيّة عليه. الأفكار الأربع الرئيسية:
- شبكة تشفير: تحويل إلى فضاء وسيط قبل حقنه في المولّد، فيصير الفضاء الكامن أكثر قابليّة للفصل.
- حقن الأسلوب في كلّ دقّة: بدل حقن مرّة واحدة في البداية، يُحقَن في كلّ طبقة عبر تطبيع بالحالات الأدائيّة (AdaIN)، فتتحكّم كلّ دقّة في مستوى تفصيل مختلف.
- ضجيج تحت-بكسليّ: يضاف في كلّ طبقة لتنوّع تفاصيل الشعر والجلد دون تعديل الملامح الأساسية.
- التدرّج التقدّميّ: البدء بدقّة 4 في 4 والصعود تدريجيًّا إلى 1024 في 1024، مع تسخين طبقات جديدة.
النتيجة: صور وجوه بدقّة سينمائيّة، ومسائل حقوق وأخلاق سنعالجها في الوحدة 10.
في الخلاصة
- انهيار الأنماط حالة يُنتج فيها المولّد صورًا قليلة متكرّرة، والخسارة لا تكشفه؛ فيُكتشف بالنظر إلى العيّنات وحساب FID.
- WGAN يستبدل الخسارة الأصلية بمسافة Wasserstein التي تعطي تدرّجًا مفيدًا حتّى حين لا تتقاطع الدعامات؛ ويحتاج ناقدًا 1-ليبشتزيًّا.
- عقوبة التدرّج بديل أنيق لقصّ الأوزان، تعطي خسارة ذات معنى؛ والتسوية الطيفيّة أخفّ ويكفي في أغلب الحالات.
- الوصفات العمليّة (تسوية إلى ، معدّل تعلّم صغير، عيّنة ثابتة للمراقبة، FID دوريّ) تُجنّب معظم أعطال التدريب.
الوحدة التالية تفتح الأسرة الثالثة الكبرى، التي حلّت مسألة الاستقرار جذريًّا: نماذج الانتشار.