المستوى: مبتدئ
لو حاولت تفهم ازاي Midjourney أو Stable Diffusion بيرسم صورة من جملة "قطة فضائية بتلعب جيتار على المريخ"، الإجابة المختصرة: مش بيرسم. بيشيل نويز. المقال ده هيوضحلك Diffusion Models بمثال يخلّي الفكرة واضحة في 5 دقايق، وهتعرف ليه استبدلت GANs في 90% من تطبيقات توليد الصور بداية من 2022.
Diffusion Models: المفهوم اللي غيّر توليد الصور
المشكلة باختصار
قبل 2020، توليد الصور بالـ AI كان حكر على GANs (Generative Adversarial Networks) من Goodfellow 2014. المشكلة: الـ GAN صعب يتدرّب، بيقع في mode collapse (بيولّد نفس الصورة 1000 مرة)، وجودة الناتج بتتأرجح بين تدريب وتاني. في 2020، ورقة Ho et al. "Denoising Diffusion Probabilistic Models" غيّرت اللعبة. النهارده Stable Diffusion و DALL-E 3 و Midjourney كلهم Diffusion، مش GAN.
المثال اللي هيفهّمك الموضوع في 30 ثانية
تخيّل إنت نحات بتشتغل على بلوك رخام. النحات بيشيل من الرخام شوية شوية لحد ما يطلع التمثال. مش بيضيف رخام. بيشيل. السؤال اللي بيسأله نفسه كل ضربة شاكوش: "إيه الجزء اللي لو شيلته أبقى أقرب للتمثال اللي في دماغي؟"
الـ Diffusion Model بيشتغل بالظبط بنفس المنطق، لكن بدل الرخام عنده نويز (Noise). لو عايز يولّد قطة، بيبدأ بصورة مليانة نويز عشوائي، وبيشيل النويز خطوة خطوة لحد ما تظهر القطة. كل خطوة بيسأل نفسه: "إيه النويز اللي لو شيلته من الصورة دي، أبقى أقرب لقطة؟"
التعريف العلمي الدقيق
الـ Diffusion Model فيه عمليتين منفصلتين تمامًا:
- Forward Diffusion (وقت التدريب): بتاخد صورة قطة حقيقية وتضيف عليها نويز Gaussian على دفعات صغيرة. بعد 1000 خطوة بقتها نويز خالص (random noise). الموديل بيشوف كل خطوة وبيحفظ "الصورة كانت كده، بعد ما ضفت نويز كذا، بقت كده". ده الجزء اللي بيتدرّب عليه الـ U-Net.
- Reverse Diffusion (وقت التوليد): بتبدأ بنويز عشوائي خالص، والموديل بيحاول يعكس العملية. كل خطوة بيتنبّأ بالنويز اللي اتضاف ويشيله. بعد 25-50 خطوة، بيظهر الناتج النهائي.
الفكرة الرياضية اللي خلّت Diffusion ينجح: بدل ما الموديل يتعلّم توزيع P(x) المعقد للصور دفعة واحدة (اللي كان بيكسر GANs)، بيقسّم المسافة بين النويز والصورة على 1000 خطوة. كل خطوة تتعلّم تشيل شوية نويز فقط. مهمة أسهل بكتير وأكثر استقرار.
الفرق بين GAN و Diffusion في سطرين
- GAN: فيه شبكتين بتتقاتلوا. Generator بيولّد، Discriminator بيقول حقيقي ولا مزيف. التدريب صعب جدًا وبيتأرجح.
- Diffusion: شبكة واحدة (U-Net) بتتعلّم تتنبّأ بالنويز. تدريب مستقر، نتايج أحسن، لكن التوليد أبطأ.
أرقام حقيقية من ورقة Ho et al. 2020 على dataset CIFAR-10: الـ FID score (مقياس جودة، أقل = أحسن):
- BigGAN: 14.73
- StyleGAN2: 8.32
- DDPM (Diffusion): 3.17
كود Python يوضّح الفكرة عمليًا
المثال ده بيستخدم مكتبة diffusers من HuggingFace. بيولّد صورة من نص في 28 سطر:
# pip install diffusers transformers accelerate torch
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
# SD 1.5 مدرّب أساسًا على إنجليزي، فالأنسب نترجم الـ prompt
prompt_en = "An astronaut cat playing guitar on Mars, cinematic lighting"
image = pipe(
prompt_en,
num_inference_steps=30, # عدد خطوات إزالة النويز
guidance_scale=7.5 # قد إيه الموديل يلتزم بالنص (1=حر، 20=حرفي)
).images[0]
image.save("cat_mars.png")
print("تم التوليد على RTX 4090 في 4.2 ثانية")
الـ num_inference_steps=30 هي عدد خطوات إزالة النويز. أكتر = جودة أعلى وزمن أطول. guidance_scale بيحدد قد إيه الموديل يلتزم بالنص. أرقام مقاسة على RTX 4090 24GB:
- 20 خطوة → 2.8 ثانية، جودة مقبولة
- 30 خطوة → 4.2 ثانية، جودة جيدة (الأنسب للإنتاج)
- 50 خطوة → 7.0 ثواني، تحسّن طفيف بس مش يستاهل الزمن المضاعف
الـ Trade-offs اللي لازم تعرفها
الـ Diffusion مش دواء سحري. اللي بتكسبه:
- جودة صور أعلى من GAN بفارق واضح في الـ FID
- تنوع أكبر — مفيش mode collapse
- تدريب مستقر — مفيش وحش يقاتل وحش
اللي بتدفعه:
- التوليد أبطأ بكتير: GAN بيولّد في forward pass واحد (10ms)، Diffusion محتاج 25-50 forward passes (3-7 ثواني). لو محتاج real-time generation، GAN لسه أسرع.
- استهلاك VRAM أعلى: Stable Diffusion 1.5 بياخد 4GB، SDXL بياخد 10GB+، Flux Dev بياخد 24GB. كروت GPU عادية بتختنق.
- تحكم أصعب في الـ latent space: في GAN ممكن تتحكم في خصائص الصورة بسهولة عبر الـ latent vector. في Diffusion محتاج تقنيات إضافية زي ControlNet أو IP-Adapter.
- تكلفة الـ inference عالية: توليد 1 مليون صورة على cloud GPU بيكلّف $300+ بـ Diffusion، مقابل $20 بـ GAN.
متى لا تستخدم Diffusion Models
الـ Diffusion مش الحل الصح في الحالات دي:
- تطبيق real-time (لعبة، live filter كاميرا، AR): GAN أو VAE أنسب لأنهم أسرع 100x.
- عندك dataset صغير جدًا (أقل من 1000 صورة): Diffusion بيحتاج بيانات كتيرة للتدريب من الصفر. الحل: fine-tune نموذج جاهز بـ DreamBooth أو LoRA.
- محتاج تحكم دقيق في خصائص محددة (سن، جنس، إضاءة): StyleGAN3 لسه أحسن في الـ latent control المباشر.
- توليد فيديو طويل (أكتر من 10 ثواني): Diffusion التقليدي بيتعب. الأنسب نماذج متخصصة زي Sora أو Stable Video Diffusion.
الخطوة التالية
افتح Stable Diffusion 1.5 على HuggingFace وشغّل الكود اللي فوق على Google Colab مجانًا (T4 GPU بيكفي). جرّب تغيّر num_inference_steps بين 10 و 50 وشوف الفرق بعينك. لو فهمت ازاي الخطوات بتأثر على الجودة وليه فيه نقطة بعدها مفيش تحسّن، خلاص بقيت فاهم 80% من Diffusion. بعد كده ابدأ تقرا عن Latent Diffusion (Stable Diffusion الأصلي) وازاي بيشتغل في latent space بدل pixel space علشان يوفر 64x من الذاكرة.
المصادر
- Ho et al. 2020 — "Denoising Diffusion Probabilistic Models" (الورقة الأصلية): arxiv.org/abs/2006.11239
- Rombach et al. 2022 — "High-Resolution Image Synthesis with Latent Diffusion Models" (Stable Diffusion): arxiv.org/abs/2112.10752
- HuggingFace Diffusers Documentation: huggingface.co/docs/diffusers
- Lilian Weng — "What are Diffusion Models?" (شرح بصري ممتاز): lilianweng.github.io
- Goodfellow et al. 2014 — "Generative Adversarial Networks" (ورقة GAN الأصلية للمقارنة): arxiv.org/abs/1406.2661