الشبكات المدرّبة مسبقًا والتعلم بالنقل
تدريب الشبكات العصبية الالتفافية (Convolutional Neural Networks أو CNNs) ياخذ وقت طويل، ويحتاج كمية كبيرة من البيانات. لكن جزء كبير من الوقت يروح في تعلّم أفضل المرشّحات منخفضة المستوى اللي تستخرج الأنماط من الصور. وهنا يجي سؤال طبيعي: نقدر ناخذ شبكة عصبية تدرّبت على مجموعة بيانات، ونكيّفها عشان تصنّف صور ثانية من غير ما نعيد التدريب كامل؟
هالأسلوب اسمه التعلم بالنقل (Transfer Learning)، لأننا ننقل جزء من المعرفة من نموذج شبكة عصبية إلى نموذج ثاني. عادةً نبدأ بنموذج مدرّب مسبقًا على مجموعة صور كبيرة، مثل ImageNet. هالنماذج تعرف من الأساس تستخرج سمات متنوعة من الصور العامة في مجموعة البيانات، وفي حالات كثيرة يكفينا نبني مصنّف فوق السمات المستخرجة عشان نطلع بنتيجة زينة.
✅ مصطلح التعلم بالنقل مستخدم بعد في مجالات أكاديمية ثانية، مثل التعليم؛ ومعناه إننا ناخذ معرفة من مجال ونطبّقها في مجال ثاني.
الشبكات الالتفافية اللي تكلمنا عنها بالقسم السابق فيها عدة طبقات، وكل طبقة تستخرج سمات من الصورة. تبدأ من تركيبات بسيطة بين وحدات البكسل، مثل خط أفقي أو عمودي، وتوصل لتركيبات أعلى تمثّل أشياء مثل عين أو لهب. إذا درّبنا CNN على مجموعة بيانات كبيرة ومتنوعة من الصور العامة، المفروض تتعلم الشبكة استخراج هالسمات المشتركة.
يوفّر كل من Keras وPyTorch دوال تحمّل أوزان شبكات عصبية مدرّبة مسبقًا لبنى شائعة، ومعظمها تدرّب على صور ImageNet. تلقون أشهرها في صفحة بنى CNN من الدرس السابق. وهذي ثلاثة خيارات تستاهل التجربة:
- VGG-16/VGG-19: نماذج بسيطة نسبيًا ومع هذا تعطي دقة زينة. غالبًا VGG بداية مناسبة عشان نشوف كيف يشتغل التعلم بالنقل.
- ResNet: عائلة نماذج اقترحتها Microsoft Research سنة 2015. طبقاتها أكثر، ولذلك تحتاج موارد أكثر.
- MobileNet: عائلة نماذج أصغر حجمًا ومناسبة للأجهزة المحمولة. تنفع إذا كانت الموارد محدودة ونقدر نتنازل عن قدر بسيط من الدقة.
هذي عيّنة من السمات اللي استخرجتها شبكة VGG-16 من صورة قط:
وصف الشكل: سمات استخرجتها VGG-16
مجموعة بيانات القطط والكلاب
في هالمثال بنستخدم مجموعة بيانات Cats and Dogs، وهي قريبة مرة من سيناريوهات تصنيف الصور الواقعية ضمن مهام التصنيف.
✍️ تمرين: التعلم بالنقل
خلونا نشوف التعلم بالنقل وهو يشتغل في الدفترين هذولا:
تصوّر القط المثالي
داخل «دماغ» الشبكة العصبية المدرّبة مسبقًا أنماط مختلفة، ومنها تصوّر للقط المثالي، ومثله الكلب والحمار الوحشي المثاليان. بيكون ممتع لو قدرنا نصوّر هالصورة، لكن الموضوع مب بسيط: الأنماط موزعة على أوزان الشبكة كلها ومرتبة بعد بشكل هرمي.
نقدر نبدأ بصورة عشوائية، ثم نستخدم تحسين الانحدار المتدرج (Gradient Descent) ونعدّل الصورة لين تبدأ الشبكة تشوفها قطًا.
وصف الشكل: حلقة تحسين الصورة
لو سوّينا كذا بس، غالبًا بنطلع بصورة تشبه التشويش العشوائي. السبب إن فيه طرق كثيرة تخلي الشبكة تحسب صورة الإدخال قطًا، وبعضها ما له معنى بصري بالنسبة لنا. هالصور فيها أنماط كثيرة معتادة للقطط، لكن ما فيه قيد يجبرها تكون واضحة للعين.
عشان نحسّن النتيجة، نضيف إلى دالة الخسارة حدًا ثانيًا اسمه خسارة التغاير الكلي (Total Variation Loss). هالمقياس يبيّن مدى تشابه وحدات البكسل المتجاورة. إذا قلّلنا خسارة التغاير صارت الصورة أنعم وخفّ التشويش، وبدأت تظهر أنماط أوضح بصريًا. هذي أمثلة لصور «مثالية» تصنّفها الشبكة قطًا وحمارًا وحشيًا باحتمال مرتفع:
وصف الشكل: القط المثالي | > وصف الشكل: الحمار الوحشي المثالي
-----|-----
القط المثالي | الحمار الوحشي المثالي
ونقدر نستخدم فكرة قريبة عشان ننفّذ هجمات خصومية (Adversarial Attacks) على شبكة عصبية. افترضوا إننا نبي نخدع الشبكة ونخلي الكلب يبان لها قطًا. ناخذ صورة كلب تتعرف عليها الشبكة على إنها كلب، ثم نعدّلها شوي بتحسين الانحدار المتدرج لين تبدأ الشبكة تصنّفها قطًا:
وصف الشكل: صورة كلب | > وصف الشكل: صورة كلب صنّفتها الشبكة قطًا
-----|-----
الصورة الأصلية للكلب | صورة كلب صنّفتها الشبكة قطًا
الكود اللي يعيد إنتاج النتائج موجود بالدفتر هذا:
الخلاصة
بالتعلم بالنقل نقدر نبني بسرعة مصنّفًا لمهمة مخصصة ونوصل لدقة مرتفعة. شفنا بعد إن المهام الأعقد اللي نحلها الحين تحتاج قدرة حوسبية أعلى، وما يسهل حلها على CPU. بالوحدة الجاية بنجرّب تنفيذًا أخف يدرّب النموذج نفسه بموارد حوسبة أقل، مقابل انخفاض بسيط جدًا في الدقة.
🚀 التحدي
بتلقون في آخر الدفاتر ملاحظات تقول إن نقل المعرفة يشتغل أفضل لما تكون بيانات التدريب الجديدة قريبة من البيانات الأصلية، مثل نوع حيوان جديد. جرّبوا أنواع صور مختلفة تمامًا، وشوفوا وين تنجح نماذج التعلم بالنقل ووين يضعف أداؤها.
المراجعة والدراسة الذاتية
اقرؤوا TrainingTricks.md عشان تتعمقون في طرق ثانية لتدريب النماذج.
في هالمختبر بنستخدم مجموعة بيانات الحيوانات الأليفة الواقعية Oxford-IIIT، وفيها 35 سلالة من القطط والكلاب، وبنبني مصنّفًا بالتعلم بالنقل.
حيل تدريب التعلم العميق
كل ما زاد عمق الشبكة العصبية، صار تدريبها أصعب. ومن أكبر المشاكل اللي تواجهنا تلاشي التدرجات وانفجار التدرجات. يعطيكم هالمقال مقدمة زينة عن المشكلتين.
فيه كم تقنية نقدر نستخدمها عشان يصير تدريب الشبكات العميقة أكفأ.
إبقاء القيم ضمن نطاق معقول
عشان تكون الحسابات العددية أكثر استقرارًا، نبي كل القيم داخل الشبكة العصبية تبقى ضمن مقياس معقول، وغالبًا ضمن [-1..1] أو [0..1]. هالشي مب شرطًا صارمًا، لكن طبيعة حسابات الفاصلة العائمة تعني إن التعامل مع قيم تختلف رتبها كثير ما يكون دقيقًا. مثلًا، لو جمعنا 10-10 و 1010 فالغالب تطلع النتيجة 1010؛ لأن القيمة الأصغر تُحوّل لرتبة الكبيرة، ويضيع الجزء الدال منها.
أغلب دوال التنشيط فيها لاخطية حول [-1..1]، ولذلك من المنطقي نعيد تحجيم بيانات الإدخال كلها إلى [-1..1] أو [0..1].
تهيئة الأوزان أول التدريب
بالوضع المثالي، نبي القيم تبقى في النطاق نفسه بعد ما تمر بطبقات الشبكة. لذلك تهيئة الأوزان بطريقة تحافظ على توزيع القيم مهمة.
التوزيع الطبيعي N(0,1) مب خيار زين؛ إذا كان عندنا n من المدخلات، بيكون الانحراف المعياري للمخرج n، وعلى الأغلب تطلع القيم برا نطاق [0..1].
هذي تهيئات شائعة:
- التوزيع المنتظم —
uniform
- N(0,1/n) —
gaussian
- N(0,1/√n_in) يضمن إن المدخلات اللي متوسطها صفر وانحرافها المعياري 1 تحافظ على المتوسط والانحراف نفسهما
- N(0,√2/(n_in+n_out)) — وتسمى تهيئة Xavier (
glorot)؛ تساعد الإشارات تبقى ضمن النطاق في الانتشار الأمامي والانتشار العكسي
التطبيع على مستوى الدفعة
حتى لو هيّأنا الأوزان صح، ممكن تكبر أو تصغر زيادة أثناء التدريب وتطلع الإشارات من النطاق المناسب. نقدر نرجّع الإشارات باستخدام إحدى تقنيات التطبيع. فيه أنواع متعددة، مثل تطبيع الأوزان وتطبيع الطبقات، وأكثرها استخدامًا هو التطبيع على مستوى الدفعة.
فكرة التطبيع على مستوى الدفعة (Batch Normalization) إننا ناخذ كل القيم في الدفعة المصغّرة، ثم نطبّعها بطرح المتوسط والقسمة على الانحراف المعياري المحسوب منها. تُنفّذ العملية على شكل طبقة بعد تطبيق الأوزان وقبل دالة التنشيط. غالبًا تعطينا هالطريقة دقة نهائية أعلى وتدريبًا أسرع.
هنا البحث الأصلي عن التطبيع على مستوى الدفعة، وشرح ويكيبيديا، ومقال تمهيدي زين، وفيه بعد مقال بالروسية.
الإسقاط
الإسقاط (Dropout) تقنية تشيل عشوائيًا نسبة محددة من العصبونات أثناء التدريب. وتجي على شكل طبقة لها معامل واحد، وهو نسبة العصبونات اللي تنشال — عادةً بين 10% و 50%. وقت التدريب تصفّر الطبقة عناصر عشوائية من متجه الإدخال قبل تمريره للطبقة اللي بعدها.
يمكن الفكرة تبان غريبة، لكن تقدرون تشوفون أثر الإسقاط على تدريب مصنّف أرقام MNIST في دفتر Dropout.ipynb. الإسقاط يسرّع التدريب ويساعدنا نوصل لدقة أعلى بعدد حقب تدريب أقل.
نقدر نفسر هالأثر بأكثر من طريقة:
- نعتبره عامل إرباك عشوائي للنموذج يطلع التحسين من حد أدنى محلي.
- نعتبره أخذ متوسط ضمني للنماذج؛ لأننا أثناء الإسقاط ندرّب كل مرة نموذجًا يختلف شوي.
بعض الناس يشبّهونها بشخص يحاول يتعلم وهو سكران، ويقولون إنه يمكن يتذكر أحسن اليوم الثاني لأن مخه يتكيّف مع عصبونات ما تشتغل تمام. ما اختبرنا صحة هالتشبيه بأنفسنا.
منع فرط التكيّف
من أهم جوانب التعلم العميق إننا نعرف نمنع فرط التكيّف. قد يغريكم استخدام نموذج شبكة عصبية قوي جدًا، لكن لازم نوازن دائمًا بين عدد معاملات النموذج وعدد عينات التدريب.
تأكدوا إن مفهوم فرط التكيّف اللي مرّ علينا قبل واضح لكم.
فيه أكثر من طريقة تمنع فرط التكيّف:
- الإيقاف المبكر — نراقب الخطأ على مجموعة التحقق باستمرار، ونوقف التدريب إذا بدأ خطأ التحقق يرتفع.
- اضمحلال الأوزان أو الانتظام الصريح — نضيف إلى دالة الخسارة عقوبة على القيم المطلقة العالية للأوزان، وهذا يمنع النموذج من إنتاج نتائج شديدة الاضطراب.
- أخذ متوسط النماذج — ندرّب عدة نماذج ثم نحسب متوسط النتيجة، وبكذا نقلّل التباين.
- الإسقاط — أخذ متوسط ضمني للنماذج.
المحسّنات وخوارزميات التدريب
اختيار خوارزمية تدريب زينة جانب مهم بعد. الانحدار المتدرج التقليدي خيار معقول، لكنه أحيانًا يكون بطيئًا زيادة أو يسبب مشاكل ثانية.
في التعلم العميق نستخدم الانحدار المتدرج العشوائي (Stochastic Gradient Descent أو SGD)، وهو انحدار متدرج نطبّقه على دفعات مصغّرة نختارها عشوائيًا من مجموعة التدريب. تتعدّل الأوزان بالصيغة هذي:
wt+1 = wt - η∇ℒ
الزخم
في SGD بالزخم نحتفظ بجزء من التدرج من الخطوات السابقة. الفكرة تشبه جسم يتحرك بقصور ذاتي ثم تجيه دفعة من اتجاه ثاني: مساره ما يتغيّر فورًا، ويحتفظ بجزء من حركته الأصلية. هنا نضيف متجهًا ثانيًا v يمثّل السرعة:
- vt+1 = γ vt - η∇ℒ
- wt+1 = wt+vt+1
المعامل γ يحدد مقدار القصور اللي ناخذه بالحسبان: γ=0 يطابق SGD التقليدي، وγ=1 معادلة حركة صافية.
Adam وAdagrad وغيرهما
في كل طبقة نضرب الإشارات في مصفوفة Wi. وبحسب ||Wi||، ممكن يتضاءل التدرج ويقرب من 0 أو يكبر بلا حد. هذي هي خلاصة مشكلة تلاشي التدرجات وانفجارها.
أحد الحلول إننا نستخدم اتجاه التدرج في المعادلة ونتجاهل قيمته المطلقة:
wt+1 = wt - η(∇ℒ/||∇ℒ||)، حيث ||∇ℒ|| = √∑(∇ℒ)2
اسم هالخوارزمية Adagrad، وفيه خوارزميات ثانية تستخدم الفكرة نفسها، مثل RMSProp وAdam.
Adam خوارزمية فعّالة جدًا لتطبيقات كثيرة؛ إذا ما كنتم متأكدين وش تختارون، جرّبوا Adam.
قص التدرج
قص التدرج امتداد للفكرة اللي فوق. إذا كان ||∇ℒ|| ≤ θ نستخدم التدرج الأصلي في تحسين الأوزان، وإذا صار ||∇ℒ|| > θ نقسم التدرج على معياره. θ هنا معامل، وغالبًا نقدر نخليه θ=1 أو θ=10.
اضمحلال معدل التعلم
نجاح التدريب يعتمد كثير على معامل معدل التعلم η. منطقي إن القيمة الأكبر لـ η تعطي تدريبًا أسرع، وهذا اللي نبيه غالبًا ببداية التدريب، ثم تسمح لنا القيمة الأصغر نضبط الشبكة بدقة. لذلك نبي عادةً نقلّل η مع تقدّم التدريب.
نقدر نسوي هالشي بضرب η في رقم، مثل 0.98، بعد كل حقبة تدريب، أو باستخدام جدول معدل تعلم أعقد.
بنى شبكية مختلفة
اختيار البنية المناسبة للمشكلة قد يكون صعب. عادةً ناخذ بنية ثبت نجاحها في مهمتنا أو مهمة قريبة منها. يعطيكم هالمقال نظرة عامة زينة على بنى الشبكات العصبية المستخدمة في الرؤية الحاسوبية.
مهم تختارون بنية قدرتها مناسبة لعدد عينات التدريب. اختيار نموذج أقوى من اللازم قد يسبب فرط التكيّف.
ومن الخيارات الزينة استخدام بنية تتكيف تلقائيًا مع التعقيد المطلوب. إلى حد ما، بنية ResNet وبنية Inception تتكيّفان ذاتيًا. اقرؤوا المزيد عن بنى الرؤية الحاسوبية.