من الـ gradients لـ model ينفع يتستخدم
الـ backpropagation بيدّيك الـ gradients. وبعدين؟ صنعة تدريب الـ neural networks قاعدة في الاختيارات اللي حوالين الـ gradients دي: أنهي loss function تصغّرها، وأنهي optimizer تستخدمه، وتحدّث الـ weights بسرعة قد إيه، وحجم كل batch، وإزاي تعمل regularization للشبكة عشان تعمّم على بيانات جديدة. والقرارات دي بتأثّر جامد على إذا كان الـ model هيتقارب أصلًا، والتدريب هياخد قد إيه، وهل هيعمل overfitting.
الدرس ده بيتكلم عن الآليات العملية للتدريب — المكوّنات اللي بتركّبها كل مرة تبني فيها neural network وتدرّبها في الدنيا الحقيقية.
الـ loss functions: بنصغّر إيه؟
الـ loss function (دالة الخسارة) هي الرقم الوحيد اللي التدريب بيحاول يقلّله. واختيارها مش عشوائي — لازم يمشي مع المهمة ومع توزيع الـ output اللي بتعمله modeling.
في الـ regression (التنبؤ بقيمة مستمرة)، الاختيار المعتاد هو متوسط مربع الخطأ (MSE). بيعاقب الأخطاء الكبيرة تربيعيًا، وده بيخلّيه حسّاس للـ outliers بس مريح رياضيًا: الـ gradient ببساطة هو غلط الـ prediction مضروب في 2/n.
وفي الـ classification، الاختيار المسيطر هو الـ cross-entropy loss (خسارة الإنتروبيا المتقاطعة) (واسمها كمان log loss). بتقيس الاختلاف بين توزيع الاحتمالات المتوقع وتوزيع الـ label الحقيقي. ومع output layer بـ softmax، الـ cross-entropy بتطلّع الـ gradient الأنيق δ[L] = â − y اللي اشتقيناه في الدرس اللي فات.
الـ MSE مع outputs بـ sigmoid/softmax بيعمل شكل loss مسطّح لما الـ predictions تبقى غلط جدًا — الـ gradient تقريبًا بيختفي لأن الـ sigmoid قريب من التشبّع. والـ cross-entropy بتتجنّب ده: الـ gradient بتاعها دايمًا متناسب مع غلط الـ prediction â − y، فبتدّي إشارة قوية حتى لما الـ model يبقى غلطان وواثق.
الـ optimizers: بنطبّق الـ gradients إزاي
الـ optimizer بيحدّد الـ gradients بتتستخدم إزاي عشان تحدّث الـ weights. وأبسط optimizer هو الـ stochastic gradient descent (النزول التدرجي العشوائي) (SGD): اطرح جزء η (الـ learning rate) من الـ gradient من كل weight. وده نفس الـ learning rate اللي اتكتب α في مقدمة الـ gradient descent (الدرس 2.1)؛ وη ببساطة الرمز المشهور ليه في الـ deep learning.
الـ SGD الخالص فعّال بس بطيء على أسطح الـ loss اللي حالتها وحشة (اللي الشكل فيها بينحني جامد في اتجاهات وبنعومة في اتجاهات تانية). والـ SGD مع الـ momentum (الزخم) بيعالج ده بإنه يجمّع velocity vector بيهدّي التذبذبات ويسرّع الحركة في اتجاهات الـ gradient الثابتة — زي كورة بتتدحرج من على تل وبتكسب سرعة.
والـ deep learning الحديث بيستخدم بشكل ساحق الـ Adam (Adaptive Moment Estimation)، اللي بيجمع الـ momentum مع learning rates بتتكيّف لكل parameter. الـ Adam بيحتفظ بمتوسطين متحرّكين: تقدير الـ first moment (متوسط الـ gradients) وتقدير الـ second moment (متوسط الـ gradients المربّعة). والـ parameters اللي بتاخد gradients كبيرة بتاخد learning rate فعلي أصغر، واللي الـ gradients بتاعتها صغيرة بتاخد أكبر، فكل parameter بيتحرّك بإيقاع قريب مهما كان حجم الـ gradient بتاعه.
الـ AdamW نوع مستخدم كتير بيفصل الـ weight decay (تلاشي الأوزان) عن تحديث الـ gradient. في الـ Adam العادي، الـ L2 regularization (الـ weight decay) بيتدمج جوه الـ gradient — ومعنى كده إن الـ second moment بيكيّفه هو كمان، فبيقلّل أثره. أما الـ AdamW فبيطبّق الـ weight decay على الـ weights على طول قبل خطوة الـ gradient، فبيرجّع للـ regularization قوته المقصودة. وأغلب الـ models المتقدمة بتستخدم AdamW.
جداول الـ learning rate
الـ learning rate الثابت نادرًا ما يبقى مثالي. في أول التدريب، learning rate كبير بيسرّع التقارب؛ وفي آخر التدريب، learning rate صغير بيسمح بظبط دقيق للـ minimum. والـ learning rate schedules (جداول معدل التعلم) بتغيّر المعدل على طول مسار التدريب.
الـ step decay (الانخفاض المتدرج) بيقلّل الـ learning rate بمعامل ثابت (مثلًا ×0.1) كل عدد ثابت من الـ epochs. بسيط وسهل تفسّره، بس محتاج ظبط بالإيد لتوقيت النزول.
الـ cosine annealing (التبريد الكوسيني) بيقلّل الـ learning rate بنعومة على منحنى cosine من قيمته الأولانية لقرب الصفر. بيتجنّب النزلات المفاجئة بتاعة الـ step decay واتثبت إنه بيدّي أداء نهائي أحسن. ووصفات حديثة كتير بتستخدم الـ cosine annealing مع warm restarts (SGDR)، اللي فيها الـ learning rate بيتعاد ظبطه وبعدين يتعمل له decay تاني بشكل دوري.
الـ warmup (الإحماء) تقنية بتتستخدم في أول التدريب: بتزوّد الـ learning rate خطيًا من قيمة صغيرة للمعدل المستهدف على أول كام مية أو كام ألف خطوة. والـ warmup مهم خصوصًا لـ optimizers عيلة الـ Adam، لأن تقديرات الـ second moment فيها بتبقى متعايرة وحش عند الـ initialization. ومن غير warmup، الخطوات الكبيرة البدري ممكن تهز التدريب أو تزق الـ model لمنطقة وحشة في شكل الـ loss.
تأثير حجم الـ batch
حجم الـ batch — عدد أمثلة التدريب اللي بتتعالج في forward/backward pass واحد — من أهم زراير الظبط، مع إن تأثيره دقيق.
الـ batches الكبيرة بتدّي تقديرات gradient دقيقة (noise قليل)، وبتسمح بتوازي كفء على الـ GPU، وبتدرّب أسرع في وقت الساعة لكل epoch. بس تدريب الـ batches الكبيرة متوثّق كويس إنه بيتقارب لـ minima حادة — نقط في شكل الـ loss حواليها حيطان منحدرة جامد. والـ minima الحادة بتعمّم وحش: إزاحة صغيرة في التوزيع كفاية توقّع الـ model من على الـ minimum. وفيه كمان سقف عملي: الـ batches الضخمة جدًا بتدّي فايدة بتقل لأن تقدير الـ gradient بقى تقريبًا مظبوط أصلًا.
الـ batches الصغيرة بتدخّل noise في الـ gradient بيشتغل كـ regularization ضمني، فبيساعد تهرب من الـ minima الحادة وتلاقي minima أفرد بتعمّم أحسن. والعيب إن كل تحديث للـ parameters بيبقى فيه noise أكتر، فالتقارب محتاج تحديثات أكتر — وكمان الـ batches الصغيرة مش بتستغل توازي الـ GPU بالكامل.
لما تضرب حجم الـ batch في k، اضرب الـ learning rate في k كمان. ده بيحافظ على حجم التحديث المتوقع للـ weights. مثلًا، النقلة من batch size قده 256 لـ 2048 (8×) لازم يجي معاها زيادة 8× في الـ learning rate. والقاعدة دي بتصمد كويس عمليًا بس بتقع عند أحجام batch كبيرة جدًا، وهناك الـ warmup بيبقى مهم بالذات.
الـ dropout: الـ regularization بالـ noise
الـ dropout (التسرب) تقنية regularization بسيطة وفعّالة بشكل ملفت. في كل خطوة تدريب، كل neuron في layer الـ dropout بيتصفّر لوحده باحتمال p (معدل الـ dropout، عادةً 0.1–0.5). وoutputs الـ neurons اللي نجت بتتكبّر بمقدار 1/(1−p) عشان تحافظ على حجم الـ activation المتوقع.
الـ dropout بيمنع الـ neurons من الـ co-adaptation (التكيّف المشترك) — يعني إنها تنسج تبعيات مشتركة معقّدة مبيبقاش فيها output neuron ليه معنى غير مع output neuron تانية. ولأن أي neuron ممكن يقع في أي لحظة، كل neuron لازم يتعلّم يبقى مفيد لوحده. والنتيجة ensemble ضمني: وقت الاختبار (لما الـ dropout يتقفل وكل الـ neurons تبقى شغّالة)، الشبكة بتتصرّف زي متوسط عدد أُسّي من الـ sub-networks.
الـ dropout شغّال أثناء التدريب بس. أثناء التقييم والـ inference، كل الـ neurons موجودة وoutputs بتاعتها بتتضرب في (1−p) — أو بدل كده، الـ outputs بتتكبّر بمقدار 1/(1−p) أثناء التدريب (الـ inverted dropout، وده التنفيذ المعتاد). وإنك متقفلش الـ dropout وقت الـ inference غلطة مشهورة بتبوّظ أداء الـ model.
الـ batch normalization: تثبيت توزيع التدريب
وإحنا بندرّب الشبكة، توزيع الـ inputs لكل layer بيتغيّر لما weights الـ layers اللي قبلها تتغيّر. والظاهرة دي — اللي اسمها الـ internal covariate shift — بتجبر الـ layers اللي بعد كده تتكيّف باستمرار مع هدف بيتحرّك، وده بيبطّأ التدريب. والـ batch normalization (تطبيع الدفعة) (BN) بيعالج ده بإنه يعمل normalization لـ pre-activations كل layer على الـ mini-batch عشان تبقى بمتوسط صفر وvariance واحد، وبعدين يطبّق parameters scaling (γ) وshift (β) بيتعلّموا.
الـ batch normalization ليه آثار جانبية مفيدة كتير أبعد من تثبيت التوزيعات. بيسمح بـ learning rates أعلى (التدريب بيبقى أقل حساسية للـ initialization)، وبيشتغل كـ regularizer خفيف (الـ noise اللي جاي من إحصائيات الـ batch بيدخّل تنوّع أثناء التدريب)، وبيقلّل أهمية الـ initialization الدقيقة للـ weights. وأغلب الـ architectures الحديثة فيها batch normalization أو أنواعه (layer normalization، group normalization) كمكوّنات معتادة.
الورقة الأصلية بتطبّق الـ BN قبل الـ activation function (BN قبل الـ activation). وتنفيذات حديثة كتير — وخصوصًا شبكات الـ ResNet — بتستخدم ResNet بصيغة pre-activation، اللي فيها الـ BN بيظهر قبل الـ activation وقبل الـ skip connection، وده بيحسّن مرور الـ gradient. وعمليًا، المكانين عادةً بيشتغلوا؛ والاتساق جوه الـ model الواحد أهم من الاختيار نفسه.
وصفة تدريب كاملة
المكوّنات دي بتتجمع في إعداد تدريب معتاد لـ deep learning model حديث. ومع إن الاختيارات بالظبط بتختلف على حسب الـ architecture والمهمة، الوصفة الافتراضية المعقولة شكلها كده:
الـ loss: cross-entropy للـ classification، وMSE أو Huber loss للـ regression.
الـ optimizer: AdamW مع β1 = 0.9، β2 = 0.999، ε = 10−8، weight decay = 0.01–0.1.
الـ learning rate: cosine annealing مع linear warmup على 5–10% من الخطوات الإجمالي. المعدل الأولاني ~10−3 لـ optimizers عيلة Adam، و~10−1 للـ SGD.
حجم الـ batch: 32–256 لأغلب المهام. اعمل scaling للـ learning rate بالتناسب لما تكبّر حجم الـ batch.
الـ regularization: dropout (p = 0.1–0.3) بعد الـ dense layers. batch normalization بعد الـ linear/convolutional layers قبل الـ activation. وweight decay في الـ optimizer.
الـ initialization: He لشبكات الـ ReLU، وXavier للـ sigmoid/tanh.
الوصفة دي نقطة بداية، مش معادلة جامدة. الاختيارات الصح بتعتمد على حجم الـ dataset (البيانات الأكتر بتستحمل regularization أقل)، وحجم الـ model (الـ models الأكبر غالبًا محتاجة regularization أقوى)، وبنية المهمة. وجزء كبير من ممارسة الـ deep learning هو الـ ablation (الاستئصال) المنهجي — إنك تغيّر مكوّن واحد كل مرة وتثبّت الباقي — عشان تفهم كل حتة بتساهم بإيه.
- الـ loss function لازم تمشي مع المهمة: MSE للـ regression، والـ cross-entropy للـ classification. والـ cross-entropy بتتجنّب تشبّع الـ gradient اللي الـ MSE بيعاني منه مع outputs الـ sigmoid.
- الـ SGD هو الأساس؛ والـ momentum بيسرّعه على الأسطح اللي حالتها وحشة. والـ Adam بيكيّف الـ learning rates لكل parameter باستخدام تقديرات الـ first والـ second moment. والـ AdamW بيفصل الـ weight decay فبيرجّع تأثير الـ regularization.
- جداول الـ learning rate — الـ step decay، والـ cosine annealing، والـ warmup — بتحسّن الأداء النهائي بإنها تبدأ بجرأة وتخلّص بدقة. والـ warmup حاسم لـ optimizers عيلة Adam.
- الـ batches الكبيرة بتدرّب بسرعة بس بتخاطر بـ minima حادة بتعمّم وحش. والـ batches الصغيرة بتدخّل noise مفيد. وقاعدة الـ linear scaling: اضرب الـ learning rate في k لما تضرب حجم الـ batch في k.
- الـ dropout بيصفّر activations عشوائي أثناء التدريب، فبيمنع الـ co-adaptation وبيشتغل كـ ensemble ضمني. ولازم يتقفل وقت الـ inference.
- الـ batch normalization بيعمل normalization لـ inputs الـ layer على الـ mini-batch، فبيثبّت التوزيعات، ويسمح بـ learning rates أعلى، ويشتغل كـ regularization خفيف. والـ parameters γ وβ اللي بتتعلّم بترجّع القدرة التمثيلية.
- الوصفة الكاملة بتجمع الاختيارات دي. والـ ablation المنهجي — تغيير مكوّن واحد كل مرة — هو الطريقة المعتادة عشان تفهم مساهمة كل حتة.