مستوى المقال: مبتدئ. هذا الشرح موجّه لأي حد عايز يفهم إزاي أدوات زي Midjourney و Stable Diffusion بترسم صور من النص، من غير خلفية في الرياضيات أو تعلّم الآلة. الأمثلة بالعربي، والكود اختياري تقدر تتخطاه.
تكتب جملة زي "قطة رائد فضاء على سطح القمر"، وفي ثوانٍ تطلع لك صورة لم تكن موجودة قبل كده. مش بحث في مكتبة صور، ولا قص ولصق. المقال ده هيوريك بالظبط إزاي بيحصل ده، وإزاي تتحكم في النتيجة بدل ما تستنى الحظ.
نماذج الانتشار (Diffusion Models): الفكرة في سطر واحد
النموذج اتعلّم حاجة واحدة بس: إزاي يشيل التشويش من صورة. وبيكرّر العملية دي عشرات المرات، يبدأ من تشويش عشوائي بالكامل، ويوصل لصورة نظيفة بتطابق وصفك. الصورة اللي تحت بتوريك الرحلة دي: من ضجيج 100% على الشمال، لمنظر واضح على اليمين.
المثال البسيط: المثّال والرخام
تخيّل نحّات قدامه كتلة رخام خشنة بلا شكل. هو شايف في دماغه التمثال جوّه الكتلة، فبيشيل من الرخام شوية شوية لحد ما الشكل يظهر. مش بيضيف رخام، هو بيشيل الزيادة.
نموذج الانتشار بيعمل نفس الحاجة بالظبط، بس الرخام الخشن عنده هو تشويش عشوائي (نقط ملوّنة بلا معنى)، والتمثال هو الصورة اللي وصفتها. وبدل المطرقة والإزميل، بيستخدم شبكة عصبية بتخمّن التشويش اللي المفروض يشيله عشان الصورة تقرب من الوصف. يكرّرها، فيظهر الشكل من العماء.
الشرح العلمي: التشويش وعكسه
تدريب النموذج بيمر بمرحلتين. المرحلة الأولى اسمها الانتشار الأمامي (Forward Diffusion): بناخد صورة حقيقية ونضيف لها تشويش جاوسي (Gaussian noise) على دفعات متتالية، لحد ما تبقى تشويش خالص. ده سهل، مفيش ذكاء فيه.
الذكاء كله في المرحلة الثانية، الانتشار العكسي (Reverse Diffusion): النموذج (شبكة من نوع U-Net) بيتدرّب على ملايين الأمثلة عشان يتعلّم يعكس الخطوة دي، يعني يتنبّأ بالتشويش اللي اتضاف في كل مرحلة عشان يقدر يشيله. لما يتقن دي، يبقى يقدر يبدأ من تشويش عشوائي تمامًا ويمشي للخلف خطوة خطوة لحد ما يطلّع صورة نظيفة.
الافتراض المهم: النموذج مابيحفظش الصور. هو بيتعلّم احصائيات كيف تبدو الصور الواقعية، فيقدر يولّد صور جديدة لم يرها قبل كده.
طب وإيه دخل الجملة اللي كتبتها؟
الوصف بتاعك بيتحوّل لأرقام عن طريق مشفّر نصوص (Text Encoder مثل CLIP). الأرقام دي بتتحقن في كل خطوة من خطوات إزالة التشويش عبر آلية اسمها Cross-Attention، فبتوجّه النموذج إن الناتج يقرب من قطة + رائد فضاء + قمر. من غير الجملة، النموذج هيطلّع صورة عشوائية واقعية، بس مالهاش علاقة بطلبك.
معامل التوجيه (Guidance Scale): مفتاح التحكم الأهم
أهم زرّ هتلعب فيه اسمه guidance_scale (أو CFG). هو بيحدد قد إيه النموذج ملتزم بوصفك مقابل حريته في الإبداع. الصورة دي بتلخّص القصة:
- قيمة منخفضة (1 إلى 3): النموذج بيتجاهل وصفك ويسرح. مفيد لو عايز مفاجآت فنية.
- قيمة متوازنة (7 إلى 8): المنطقة الذهبية. بيتبع الوصف وفي نفس الوقت الصورة طبيعية. توثيق Stable Diffusion بيوصي بقيم بين 7 و 8.5.
- قيمة مرتفعة (15 فأكثر): بيلتزم بحرفية الكلام لكن الألوان بتتحرق والتفاصيل بتتشوّه (oversaturation).
مثال تنفيذي: ولّد صورة بنفسك في 6 أسطر
ده كود Python شغّال باستخدام مكتبة diffusers من Hugging Face. تقدر تجرّبه على كارت شاشة، أو مجانًا على Google Colab.
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16,
).to("cuda")
image = pipe(
"a cat astronaut on the moon, digital art",
num_inference_steps=25,
guidance_scale=7.5,
).images[0]
image.save("output.png")
السطرين المهمين هما num_inference_steps (كام خطوة يشيل فيها التشويش) و guidance_scale اللي شرحناه فوق. غيّر فيهم وشوف الفرق بنفسك.
الأرقام والسيناريو الواقعي
القيمة الافتراضية لعدد الخطوات في diffusers هي 50 خطوة. لكن مع جدولة حديثة (scheduler مثل DPM++)، بتلاقي 20 إلى 25 خطوة بتدّي جودة قريبة جدًا. النتيجة العملية:
- السرعة: على كارت متوسط زي RTX 3060، صورة 512x512 بـ 25 خطوة بتاخد حوالي 3 إلى 5 ثوانٍ. نفس الصورة على المعالج (CPU) بدون كارت ممكن تاخد دقيقة أو أكتر.
- ليه بقت سريعة كده؟ Stable Diffusion مابيشتغلش على البكسلات مباشرة، بيشتغل في فضاء مضغوط (Latent Space) أصغر بعشرات المرات، فالحسابات بتقل بشكل هائل. ده سبب إنه يشتغل على أجهزة عادية أصلًا.
- الجودة مقابل الوقت: القفز من 25 لـ 50 خطوة بيضاعف الزمن تقريبًا، مقابل تحسّن بسيط جدًا في الجودة في أغلب الحالات.
الـ Trade-offs اللي لازم تعرفها
- خطوات أكتر تساوي جودة أعلى، بس زمن وتكلفة أعلى. ابدأ بـ 25 وارفع بس لو محتاج.
- guidance عالي يساوي التزام أكتر بالنص، بس مخاطرة تشوّه وألوان محروقة. القيمة 7.5 نقطة بداية آمنة.
- العشوائية ميزة وعيب. نفس البرومبت بيدّي صور مختلفة كل مرة بسبب التشويش الابتدائي العشوائي. لو عايز تكرار نفس النتيجة بالظبط، ثبّت قيمة الـ seed.
متى لا تستخدم نماذج الانتشار
- لو محتاج نص دقيق داخل الصورة (لافتة، لوجو بكلمات): النماذج دي تاريخيًا بتغلط في الحروف، رغم تحسّنها.
- لو محتاج مخرجات حتمية ومطابقة 100% كل مرة: طبيعتها احتمالية، مش مناسبة لرسوم هندسية أو مخططات دقيقة.
- لو محتاج توليد لحظي (real-time) داخل لعبة مثلًا: حتى الثواني القليلة دي كتير لبعض الاستخدامات.
- لو عندك شعار أو هوية بصرية محددة لازم تتكرر بدقة: استخدم أدوات تصميم vector، مش نموذج توليدي.
الخطوة التالية
افتح Google Colab (مجاني وفيه كارت شاشة)، الصق الكود اللي فوق، وغيّر guidance_scale من 2 لـ 7 لـ 16 على نفس البرومبت. هتشوف بعينك تأثير المعامل اللي شرحناه. ده أسرع طريقة تبني حدس حقيقي عن إزاي الأداة بتفكّر.
المصادر
- Ho, Jain, Abbeel - Denoising Diffusion Probabilistic Models (2020): https://arxiv.org/abs/2006.11239
- Rombach et al. - High-Resolution Image Synthesis with Latent Diffusion Models / Stable Diffusion (2022): https://arxiv.org/abs/2112.10752
- Ho and Salimans - Classifier-Free Diffusion Guidance (2022): https://arxiv.org/abs/2207.12598
- Hugging Face - Stable Diffusion with Diffusers: https://huggingface.co/blog/stable_diffusion