#gan — التعلّم العميق
GAN: مزوِّر ضدّ مفتِّش
ما ستُجرّبه
- مرحبًا بك في #gan. على الشاشة، مستوٍ يُشاهَد من الأعلى: النقاط البيضاء هي الأصلية (هنا حلقة)، والنقاط الوردية هي المزيَّفة التي تنتجها شبكة صغيرة G، أي المولِّد (generator) — في أيّ مكان في الوقت الحالي. الخلفية الرمادية هي خريطة شبكة ثانية D، أي المميِّز (discriminator): يتردّد في كلّ مكان (50%). القاعدة: G مزوِّر لا يرى الأصلية أبدًا، بل يرى حكم D فقط؛ وD مفتِّش يرى الأصلية والمزيَّفة ويتعلّم التمييز بينها. يتحسّن كلّ منهما ضدّ الآخر إلى أن يعجز المفتِّش عن الحسم — هذا هو مبدأ GAN، الذي أنتج أوّل الوجوه الاصطناعية بواقعية فوتوغرافية.
- شغِّل العشرين جولة الأولى:
/step 20. في كلّ جولة، يرى D ستّ عشرة نقطة أصلية وستّ عشرة مزيَّفة ويضبط معاييره؛ ثمّ يتلقّى G حكم D على مزيَّفاته، ويُمرِّر التدرّج (backpropagation) عبر D حتى يصل إلى أوزانه، ويعدِّلها. - تابع:
/step 100. الخطوط المتقطّعة على اللوحة تُشير إلى مستويات التوازن:ln 2 ≈ 0.69بالنسبة لـ G و2·ln 2 ≈ 1.39بالنسبة لـ D — وهذا ما تحصل عليه حين يُجيب D بنسبة 50% في كلّ مكان. خسارة D منخفضة جدًا تعني أن المفتِّش يفوز؛ وخسارة G المتصاعدة تعني أن المزوِّر يُكشَف. - مرّة أخرى
/step 100. راقب المعاينة على اليمين: دقّة D على الأصلية وعلى المزيَّفة. حين تدور القيمتان حول 50%، فإن المفتِّش لا يفعل أفضل من رمي عملة — بالضبط ما نُريده. - غيِّر الأصلية:
/real two-modes. يحتفظ المزوِّر بردود فعله على الحلقة، ويحتفظ المفتِّش بمعاييره: لا شيء يُعاد ضبطه. - إليك أشهر مطبّات GAN. اكتب
/collapse: سيلعب المزوِّر ستّ عشرة حركة بأقصى معدّل تعلّم مقابل حركة واحدة صغيرة للمفتِّش. بعبارة أخرى، يُحسَّن G ضدّ D شبه مُجمَّد. - أعد تشغيل التدريب:
/step 60. - دورك:
/collapseلإيقاف النظام، ثمّ/real spiralثمّ/step 100(شكل يصعب تقليده أكثر)،/noise 1(ضوضاء ذات بُعد واحد: لا يستطيع G رسم أكثر من منحنى)،/lr-d 0.1(مفتِّش سريع جدًا: يُصبح D مفرط الثقة ويتلاشى تدرّج G)،/sample 300لرؤية عدد أكبر من المزيَّفة،/seed 12للعبة مختلفة،/resetللبدء من جديد. الخطوة التالية: قناة #tokenization، أوّل قنوات ثيمة LLM — كيف يُقسِّم نموذج لغوي النصّ قبل أن يتعلّم منه.
أوامر القناة
/real <circle|two-modes|spiral|square>— تغيير التوزيع الأصلي المُراد تقليده (يحتفظ G وD بأوزانهما)./step <1..100>— تكرارات التدريب بالتناوب: 2 خطوتان لـ D ثمّ خطوة واحدة لـ G، دفعات من 16./noise <1..4>— بُعد الضوضاء الكامنة z (يُعاد ضبط G، ويحتفظ D بأوزانه)./lr-g <0.001..0.1>— معدّل تعلّم المولّد G./lr-d <0.001..0.1>— معدّل تعلّم المميّز D./sample <50..300>— عدد النقاط المزيَّفة المعروضة (نفس الضوضاء z، مُمدَّدة أو مُقتَطعة)./seed <1..9999>— لعبة جديدة: نقاط أصلية أخرى، أوزان ابتدائية أخرى، نفس الإعدادات./collapse— تسليح (أو إيقاف) النظام الذ ي يُطلق انهيار الأنماط: أقصى lrG، وlrD صغير جدًا، 16 خطوات لـ G مقابل خطوة واحدة لـ D./reset— العودة إلى الحلقة، d = 2، lrG = lrD = 0.02، 200 مزيَّفة، شبكات جديدة.
المسرد
- GAN (الشبكة التوليدية التنافسية)
- زوج من الشبكات يُدرَّب أحدهما ضدّ الآخر: مولِّد يفبرك نقاطًا مزيَّفة انطلاقًا من ضوضاء، ومميِّز يتعلّم تمييزها عن الأصلية. لا يرى المولِّد البيانات أبدًا، بل حكم المميِّز فقط — ومع ذلك ينتهي به الأمر إلى تقليد توزيعها.
- المولِّد (Generator)
- الشبكة
Gالتي تحوّل متّجه ضوضاءzإلى عيّنة (هنا نقطة ثنائية الأبعاد، وفي مواضع أخرى صورة). تُدرَّب لتعظيم احتمال أن يُخطئ D: يتدفّق تدرّجها عبر D حتى يصل إلى أوزانها. - المميِّز (Discriminator)
- مصنّف ثنائي
Dيتلقّى عيّنة ويُقدِّر احتمال كونها أصلية. يُدرَّب على الأصلية (هدف 1) والمزيَّفة الصادرة عن G (هدف 0). كما تُستعمل خريطة احتماله بمثابة «إشارة خطأ» للمولّد. - لعبة الصفر / minimax
- صياغة GAN: يعظّم D القيمة
ln D(x) + ln(1 − D(G(z)))، ويُصغّرها G. ما يكسبه أحدهما يخسره الآخر. عمليًا، يُحسِّن G بدلًا من ذلك القيمة−ln D(G(z))، وتُسمّى الخسارة غير المُشبِعة (non-saturating loss)، وتمنح تدرّجًا مفيدًا حتى حين يهيمن D. - الضوضاء الكامنة (latent noise)
- متّجه عشوائي
z(غاوسي، بُعدهd) يُغذّي المولِّد: هو المصدر الوحيد لتنوّع المزيَّفة. متّجها z متقاربان يعطيان نقطتين مزيَّفتين متقاربتين؛ ويحدّ بُعد z «الشكل» الذي يستطيع G إنتاجه (منحنى إن d = 1، سطح إن d ≥ 2). - انهيار الأنماط (mode collapse)
- نمط فشل كلاسيكي حيث لا يُنتج G إلّا عيّنة أو عيّنتين (نمط «mode» واحد) لكلّ متّجهات z، لأنّه عثر على المكان الذي يمنحه D أعلى تقييم. قد تبدو خسارة G جيّدة رغم ذلك: إنّها لا تقيس التنوّع. هنا نرصده بانهيار الانحراف المعياري للمزيَّفة.
- توازن ناش (Nash equilibrium)
- حالة لا مصلحة فيها لأيّ لاعب أن يُغيّر استراتيجيته وحده. بالنسبة لـ GAN مثالي: يُعيد G توزيع الأصلية بدقّة، ويُجيب D بنسبة 50% في كلّ مكان؛ تُصبح الخسائر آنذاك
ln 2لـ G و2·ln 2لـ D. عمليًا، لا نفعل أكثر من الدوران حوله. - التدريب بالتناوب (alternating training)
- لا يمكن تحسين G وD في آن واحد: في كلّ تكرار تُنفَّذ بضع خطوات لـ D (وG مُجمَّد)، ثمّ خطوة واحدة لـ G (وD مُجمَّد)، على دفعات صغيرة. النسبة بين السرعتين (معدّلات التعلّم وعدد الخطوات) هي التي تحدّد المُهيمن — ومن ثمّ استقرار اللعبة.
- تلاشي تدرّج المولّد (vanishing gradients)
- حين يصبح D جيّدًا أكثر من اللازم، تتشبّع دالّته السيغمويدية:
D(G(z)) ≈ 0في كلّ مكان، ويتّجه المشتقّ العائد إلى G نحو الصفر. يتوقّف المزوِّر عن التعلّم وهو لا يزال سيّئًا. الخسارة غير المُشبِعة وD غير السريع جدًا (lr-d معتدل) يحدّان من المشكلة. - GAN مشروط (conditional GAN)
- صيغة يتلقّى فيها G وD أيضًا سياقًا (تسمية فئة أو نصًّا أو صورة): يتعلّم G حينها إنتاج عيّنة من تلك الفئة. هذا هو أساس المولِّدات الموجَّهة (صورة من رسم تخطيطي، من كلمة…).
قنوات أخرى في التعلّم العميق
- #optimizers — SGD وMomentum وAdam: سباق إلى الأدنى.
- #batch-normalization — تطبيع الحُزَم: إبقاء التفعيلات في المدى الصحيح.
- #rnn-lstm — RNN وLSTM: تذكُّر تسلسل.
- #autoencoder — المرمّز التلقائي: اضغط ثم أعِد البناء.
- #transfer-learning — التعلّم بالنقل: انطلق من شبكة مدرَّبة سلفًا.
- #gan — GAN: مزوِّر ضدّ مفتِّش