You are on page 1of 277

‫بسمه تعالى‬

‫تأليف‪:‬‬
‫آ ستون زانغ وآخرون‬

‫ترجمة‪:‬‬
‫د‪ .‬عالء طعيمة‬
‫على مدى السنوات القليلة الماضية‪ ،‬طور فريق من علماء أمازون كتاباً " ‪Dive into Deep‬‬
‫‪ "Learning‬يكتسب شعبية بين الطالب والمطورين الذين ينجذبون إلى مجال التعلم العميق‬
‫المزدهر‪ ،‬وهو مجموعة فرعية من التعلم اآللي تركز على الشبكات العصبية االصطناعية واسعة‬
‫النطاق‪.‬‬

‫عند انتهائي من قراءه هذا الكتاب‪ ،‬احببت ان اترجم هذا الكتاب وأشارككم هذه الترجمة الن‬
‫هناك عدد من األشياء الرائعة حول هذا الكتاب وأكثر ما يعجبني هو أنه يغطي كل مجاالت التعلم‬
‫العميق تقريبًا مثالً للمبتدئين هناك فصول مثل الشبكات العصبية والبيرسيبترون متعدد الطبقات‬
‫واالنحدار والتصنيف باإلضافة الى المفاهيم األساسية من الجبر الخطي‪ ،‬وحساب التفاضل‬
‫والتكامل‪ ،‬واالحتمال الى فصول متقدمة مثل الشبكات العصبية االلتفافية ‪ ،CNN‬تم تضمين‬
‫الشبكات العصبية المتكررة ‪ RNN‬والرؤية الحاسوبية ‪ CV‬ومعالجة اللغات الطبيعية ‪NLP‬‬
‫أيضًا‪.‬‬

‫هذا كتاب تفاعلي مفتوح المصدر مقدميف شكل فريد يدمج النص والرياضيات والكود‪،‬‬
‫ويدعم اآلن أطر برمجة ‪ TensorFlow‬و‪ PyTorch‬و‪ ،Apache MXNet‬والتي تمت‬
‫صياغتها بالكامل من خالل ‪.Jupyter Notebook‬‬

‫يمكن تقسيم الكتاب إلى ثالثة أجزاء تقريبًا‪ ،‬لقد قمنايف الوقت الحالي بترجمة الجزء األول‬
‫والذي يشمل األساسيات والمقدمات وان شاء اللهيف المستقبل القريب سنقوم بنشر الجزء الثاني‬
‫والذي يشمل التقنيات الحديثة للتعلم العميق وبعده الجزء الثالث والذي يشمل مواضيع مثل‬
‫الرؤية الحاسوبية ومعالجة اللغات الطبيعية‪.‬‬

‫لقد اخترت كتاب "‪ "Dive into Deep Learning‬لما رأيته من جودة هذا الكتاب‪،‬‬
‫وللمنهجية التي اتبعها المؤلفونيف ترتيبه وبساطة شرحه‪ .‬لقد حاولت قدر المستطاع ان اخرج‬
‫بترجمة ذات جودة عالية‪ ،‬ومع هذا يبقى عمالً بشرياً يحتمل النقص‪ ،‬فاذا كان لديك أي مالحظات‬
‫حول هذا الكتاب‪ ،‬فال تتردد بمراسلتنا عبر بريدنا االلكتروني ‪. alaa.taima@qu.edu.iq‬‬

‫نأمل ان يساعد هذا الكتاب كل من يريد ان يدخليف مجال التعلم العميق ومساعدة القارئ‬
‫العربي على تعلم هذا المجال‪ .‬اسأل الله التوفيقيف هذا العمل ألثراء المحتوى العربي الذي يفتقر‬
‫أشد االفتقار إلى محتوى جيد ورصينيف مجال الذكاء االصطناعي وتعلم االلة والتعلم العميق‪.‬‬
‫ونرجو لك االستمتاع مع التعلم العميق وال تنسونا من صالح الدعاء‪.‬‬
‫قبل بضع سنوات فقط‪ ،‬لم يكن هناك جحافل من علماء التعلم العميق ‪deep learning‬‬
‫يطورون منتجات وخدمات ذكيةيف الشركات الكبرى والشركات الناشئة‪ .‬عندما دخلنا هذا‬
‫المجال‪ ،‬لم يكن التعلم اآللي ‪ machine learning‬يتصدر عناوين الصحف اليومية‪ .‬لم يكن‬
‫لدى والدينا أي فكرة عن ماهية التعلم اآللي‪ ،‬ناهيك عن سبب تفضيلنا له على مهنةيف الطب أو‬
‫القانون‪ .‬ك ان التعلم اآللي تخصصًا أكاديميًايف السماء الزرقاء اقتصرت أهميته الصناعية على‬
‫مجموعة ضيقة من تطبيقات العالم الحقيقي‪ ،‬بمايف ذلك التعرف على الكالم ‪speech‬‬
‫‪ recognition‬والرؤية الحاسوبية ‪ .computer vision‬عالوة على ذلك‪ ،‬تطلب العديد من هذه‬
‫التطبيقات قدرًا كبيرًا من المعرفة بالمجال لدرجة أنه غالبًا ما كان يُنظر إليها على أنها مناطق‬
‫منفصلة تمامًا كان التعلم اآللي مكونًا صغيرًا لها‪.‬يف ذلك الوقت‪ ،‬كانت الشبكات العصبية ‪neural‬‬
‫‪ - networks‬أسالف أساليب التعلم العميق التي نركز عليهايف هذا الكتاب ‪ -‬تعتبر بشكل عام‬
‫عفا عليها الزمن‪.‬‬

‫في السنوات القليلة الماضية فقط‪ ،‬فاجأ التعلم العميق العالم‪ ،‬مما أدى إلى تقدم سريعيف ‬
‫مجاالت متنوعة مثل لرؤية الحاسوبية ‪ ،computer vision‬ومعالجة اللغة الطبيعية ‪natural‬‬
‫‪ ،language processing‬والتعرف التلقائي على الكالم ‪،automatic speech recognition‬‬
‫والتعلم المعزز ‪ ،reinforcement learning‬والمعلوماتية الطبية الحيوية ‪biomedical‬‬
‫‪ .informatics‬عالوة على ذلك‪ ،‬أدى نجاح التعلم العميقيف العديد من المهام ذات األهمية‬
‫العملية إلى تحفيز التطوراتيف التعلم اآللي النظري واإلحصاءات‪ .‬مع هذه التطوراتيف متناول‬
‫اليد‪ ،‬يمكننا اآلن بناء سيارات تقود نفسها باستقاللية أكثر من أي وقت مضى (واستقاللية أقل‬
‫مما قد تعتقده بعض الشركات)‪ ،‬أنظمة الرد الذكية التي تقوم تلقائيًا بصياغة معظم رسائل البريد‬
‫اإللكتروني العادية‪ ،‬مما يساعد الناس مساعدة الناس على الخروج من البريد الوارد الكبير بشكل‬
‫قمعي‪ ،‬ووكالء برمجيات يهيمنون على أفضل البشريف العالميف ألعاب الطاولة مثل ‪ ،Go‬وهو‬
‫إنجاز كان يُعتقديف السابق أنه يبعد عقودًا‪ .‬بالفعل‪ ،‬تمارس هذه األدوات تأثيرات واسعة النطاق‬
‫على الصناعة والمجتمع‪ ،‬وتغير طريقة صناعة األفالم‪ ،‬وتشخيص األمراض‪ ،‬وتلعب دورًا متزايدًا‬
‫في العلوم األساسية ‪ -‬من الفيزياء الفلكية إلى علم األحياء‪.‬‬

‫يمثل هذا الكتاب محاولتنا لجعل التعلم العميق سهل المنال‪ ،‬ويعلمك المفاهيم والسياق‬
‫والبرمجة‪.‬‬
‫‪HTML‬‬
‫لكي تصل أي تقنية حوسبة إلى تأثيرها الكامل‪ ،‬يجب أن تكون مفهومة جيدًا وموثقة جيدًا‬
‫ومدعومة بأدوات ناضجة وجيدة الصيانة‪ .‬يجب أن تكون األفكار الرئيسية موجزة بوضوح‪ ،‬مما‬
‫يقلل من وقت اإلعداد الالزم لتحديث الممارسين الجدد‪ .‬يجب أن تقوم المكتبات الناضجة‬
‫بأتمتة المهام الشائعة‪ ،‬ويجب أن تسهل التعليمات البرمجية النموذجية على الممارسين تعديل‬
‫التطبيقات الشائعة وتطبيقها وتوسيعها لتناسب احتياجاتهم‪ .‬خذ تطبيقات الويب الديناميكية‬
‫كمثال‪ .‬على الرغم من وجود عدد كبير من الشركات‪ ،‬مثل ‪ ،Amazon‬التي طورت تطبيقات‬
‫ويب ناجحة تعتمد على قواعد البياناتيف التسعينيات‪ ،‬فقد تم تحقيق إمكانات هذه التكنولوجيا‬
‫لمساعدة رواد األعمال المبدعين إلى درجة أكبر بكثيريف السنوات العشر الماضية‪ ،‬ويرجع ذلك‬
‫جزئيًا إلى التطور من األطر القوية والموثقة جيدًا‪.‬‬

‫يمثل اختبار إمكانات التعلم العميق تحديات فريدة ألن أي تطبيق فردي يجمع بين مختلف‬
‫التخصصات‪ .‬يتطلب تطبيق التعلم العميق فهمًا متزامنًا (‪ )1‬لدوافع طرح مشكلة بطريقة معينة؛‬
‫(‪ )2‬الشكل الرياضي لنموذج معين‪ )3( .‬خوارزميات التحسين لتالئم النماذج مع البيانات؛ (‪)4‬‬
‫المبا دئ اإلحصائية التي تخبرنا متى يجب أن نتوقع أن تعمم نماذجنا على البيانات غير المرئية‬
‫والطرق العملية للتصديق على أنها‪،‬يف الواقع‪ ،‬معممة؛ و (‪ )5‬التقنيات الهندسية المطلوبة لتدريب‬
‫النماذج بكفاءة‪ ،‬والتغلب على مخاطر الحوسبة الرقمية وتحقيق أقصى استفادة من األجهزة‬
‫المتاحة‪ .‬يمثل تدريس كل من مهارات التفكير النقدي المطلوبة لصياغة المشكالت‪ ،‬والرياضيات‬
‫لحلها‪ ،‬واألدوات البرمجية لتنفيذ هذه الحلول كلهايف مكان واحد تحديات هائلة‪ .‬هدفنايف هذا‬
‫الكتاب هو تقديم مورد موحد إلطالع الممارسين المحتملين على السرعة‪.‬‬

‫عندما بدأنا مشروع الكتاب هذا‪ ،‬لم تكن هناك موارد (‪ )1‬ظلت محدثةيف نفس الوقت؛ (‪)2‬‬
‫تغطية اتساع نطاق ممارسات التعلم اآللي الحديثة بعمق تقني كافٍ؛ و (‪ )3‬عرض معشق للجودة‬
‫التي يتوقعها المرء من كتاب مدرسي مع الكود النظيف القابل للتشغيل الذي يتوقعه المرء من‬
‫برنامج تعليمي عملي‪ .‬لقد وجدنا الكثير من أمثلة التعليمات البرمجية لكيفية استخدام إطار عمل‬
‫تعليمي عميق معين (على سبيل المثال‪ ،‬كيفية إجراء الحوسبة الرقمية األساسية باستخدام‬
‫المصفوفاتيف ‪ )TensorFlow‬أو لتنفيذ تقنيات معينة (على سبيل المثال‪ ،‬مقتطفات التعليمات‬
‫البرمجية لـ ‪ LeNet‬و ‪ AlexNet‬و ‪ ResNet‬وما إلى ذلك) المتناثرة عبر العديد من منشورات‬
‫المدونة ومستودعات ‪ .GitHub‬ومع ذلك‪ ،‬ركزت هذه األمثلة عادةً على كيفية تنفيذ نهج معين‪،‬‬
‫لكنها استبعدت مناقشة سبب اتخاذ قرارات خوارزمية معينة‪ .‬بينما ظهرت بعض الموارد التفاعلية‬
‫بشكل متقطع لمعالجة موضوع معين‪ ،‬على سبيل المثال‪ ،‬منشورات المدونة الجذابة المنشورة‬
‫على موقع الويب ‪ Distill‬أو المدونات الشخصية‪ ،‬فإنها تغطي فقط موضوعات محددةيف التعلم‬
‫العميق‪ ،‬وغالبًا ما تفتقر إلى التعليمات البرمجية المرتبطة‪ .‬من ناحية أخرى‪ ،‬بينما ظهرت العديد‬
‫من كتب التعلم العميق ‪ -‬على سبيل المثال‪ ،)2016 ،Goodfellow et al.( ،‬والتي تقدم‬
‫مسحًا شامالً ألساسيات التعلم العميق ‪ -‬فإن هذه الموارد ال تقرن األوصاف بإدراك المفاهيميف ‬
‫الكود‪ .‬وأحيانًا يترك القراء جاهلين بكيفية تنفيذها‪ .‬عالوة على ذلك‪ ،‬يتم إخفاء عدد كبير جدًا‬
‫من الموارد خلف جدران حظر االشتراك المدفوعة لمقدمي الدورات التدريبية التجارية‪.‬‬

‫شرعنايف إنشاء مورد يمكن (‪ )1‬أن يكون متاحًا للجميع؛ (‪ )2‬توفر عمقًا تقنيًا كافيًا لتوفير‬
‫نقطة انطالق على الطريق لتصبح بالفعل عالمًا تطبيقيًا للتعلم اآللي؛ (‪ )3‬تضمين التعليمات‬
‫البرمجية القابلة للتشغيل‪ ،‬والتي توضح للقراء كيفية حل المشكالت عمليًا؛ (‪ )4‬السماح‬
‫بالتحديثات السريعة‪ ،‬سواء من جانبنا أو من قبل المجتمع ‪ community‬ككل؛ و (‪ )5‬استكماله‬
‫بمنتدى للمناقشة التفاعلية للتفاصيل التقنية ولإلجابة على األسئلة‪.‬‬

‫كانت هذه األهدافيف كثير من األحيان متعارضة‪ .‬من األفضل إدارة المعادالت والنظريات‬
‫واالستشهادات ووضعهايف ‪ .LaTeX‬أفضل وصف للكوديف بايثون‪ .‬وصفحات الويب أصلية‬
‫بتنسيق ‪ HTML‬و‪ .JavaScript‬عالوة على ذلك‪ ،‬نريد أن يكون المحتوى متاحًا سواء أكان‬
‫رمزًا قابالً للتنفيذ أو كتابًا ماديًا أو ملف ‪ PDF‬قابل للتنزيل أو على اإلنترنت كموقع ويب‪ .‬لم يبدُ‬
‫أي سير عمل مناسبًا لهذه المطالب‪ ،‬لذلك قررنا تجميع مهامنا الخاصة (القسم ‪ .)20.6‬اتفقنا‬
‫على ‪ GitHub‬لمشاركة المصدر وتسهيل مساهمات المجتمع؛ دفاتر جوبيتر ‪Jupyter‬‬
‫‪ notebooks‬لخلط الكود والمعادالت والنص؛ ‪ Sphinx‬كمحرك تقديم؛ و‪ Discourse‬كمنصة‬
‫مناقشة‪.‬يف حين أن نظامنا ليس مثاليًا‪ ،‬إال أن هذه الخيارات تقدم حالً وسطًا بين االهتمامات‬
‫المتنافسة‪ .‬نعتقد أن كتاب ‪ Dive into Deep Learning‬قد يكون الكتاب األول الذي يتم‬
‫نشره باستخدام سير العمل المتكامل ‪ integrated workflow‬هذا‪.‬‬

‫تقدم العديد من الكتب المدرسية المفاهيم على التوالي‪ ،‬وتغطي كل منها بتفصيل شامل‪ .‬على‬
‫سبيل المثال‪ ،‬يُعلِّم الكتاب المدرسي الممتاز لكريس بيشوب ‪Chris Bishop’s excellent‬‬
‫‪ )2006 ،Bishop( textbook‬كل موضوع بدقة شديدة لدرجة أن الوصول إلى فصل االنحدار‬
‫الخطي يتطلب قدرً ا غير ضئيل من العمل‪ .‬بينما يحب الخبراء هذا الكتاب على وجه التحديد‬
‫لشموله‪ ،‬بالنسبة للمبتدئين الحقيقيين‪ ،‬فإن هذه الخاصية تحد من فائدته كنص تمهيدي‪.‬‬

‫في هذا الكتاب‪ ،‬نقوم بتدريس معظم المفاهيميف الوقت المناسب‪ .‬بمعنى آخر‪ ،‬سوف تتعلم‬
‫المفاهيميف نفس اللحظة التي تكون فيها ضرورية لتحقيق بعض األهداف العملية‪ .‬بينما نأخذ‬
‫بعض الوقتيف البداية لتدريس المقدمات األساسية‪ ،‬مثل الجبر الخطي ‪linear algebra‬‬
‫واالحتمالية ‪ ،probability‬نريدك أن تتذوق الرضا بتدريب نموذجك األول قبل القلق بشأن‬
‫المزيد من المفاهيم الباطنية ‪.esoteric concepts‬‬
‫بصرف النظر عن بعض النوتبوكس ‪ notebooks‬األولية التي توفر دورة تدريبية مكثفةيف ‬
‫الخلفية الرياضية األساسية‪ ،‬يقدم كل فصل الحق عددًا معقولًا من المفاهيم الجديدة ويوفر‬
‫العديد من أمثلة العمل المستقلة‪ ،‬باستخدام مجموعات بيانات حقيقية‪ .‬قدم هذا تحديا تنظيميا‪.‬‬
‫قد يتم بشكل منطقي تجميع بعض الطرز معًايف دفتر مالحظات واحد‪ .‬وأفضل طريقة لتدريس‬
‫بعض األفكار هي تنفيذ عدة نماذج متتالية‪ .‬من ناحية أخرى‪ ،‬هناك ميزة كبيرة لاللتزام بسياسة‬
‫مثال عملي واحد‪ ،‬نوتبوك واحد‪ :‬هذا يجعل األمر سهالً قدر اإلمكان بالنسبة لك لبدء مشاريع‬
‫البحث الخاصة بك من خالل االستفادة من التعليمات البرمجية الخاصة بنا‪ .‬فقط انسخ النوتبوك‬
‫وابدأيف تعديله‪.‬‬

‫طوال الوقت‪ ،‬نقوم بإدخال الكود القابل للتشغيل مع مواد الخلفية حسب الحاجة‪ .‬بشكل عام‪،‬‬
‫نخطئيف جانب إتاحة األدوات قبل شرحها بالكامل (غالبًا ما يتم ملء الخلفية الحقًا)‪ .‬على سبيل‬
‫المثال‪ ،‬قد نستخدم التدرج االشتقاقي العشوائي ‪ stochastic gradient descent‬قبل شرح‬
‫سبب فائدته أو تقديم حدس حول سبب نجاحه‪ .‬يساعد هذايف إعطاء الممارسين الذخيرة الالزمة‬
‫لحل المشكالت بسرعة‪ ،‬على حساب مطالبة القارئ بالثقة بنايف بعض القرارات التنظيمية‪.‬‬

‫يعلم هذا الكتاب مفاهيم التعلم العميق من الصفر‪.‬يف بعض األحيان‪ ،‬نتعمقيف التفاصيل‬
‫الدقيقة حول النماذج التي عادةً ما تكون مخفية عن المستخدمين بواسطة أطر التعلم العميق‬
‫الحديثة‪ .‬يظهر هذا بشكل خاصيف البرامج التعليمية األساسية‪ ،‬حيث نريد منك أن تفهم كل ما‬
‫يحدثيف طبقة أو مُحسِّن معين‪.‬يف هذه الحاالت‪ ،‬غالبًا ما نقدم نسختين من المثال‪ :‬أحدهما ننفذ‬
‫فيه كل شيء من البداية‪ ،‬ونعتمد فقط على دوال تشبه ‪ NumPy‬والتمايز التلقائي ‪automatic‬‬
‫‪ ،differentiation‬ومثال عملي أكثر‪ ،‬حيث نكتب كودًا موجزًا باستخدام واجهات برمجة‬
‫التطبيقات عالية المستوى ‪ high-level API‬لـ أطر التعلم العميق‪ .‬بعد شرح كيفية عمل بعض‬
‫المكونات‪ ،‬نعتمد على واجهة برمجة التطبيقات عالية المستوىيف البرامج التعليمية الالحقة‪.‬‬

‫يمكن تقسيم الكتاب إلى ثالثة أجزاء تقريبًا‪ ،‬مع التركيز على المقدمات وتقنيات التعلم العميق‬
‫والموضوعات المتقدمة التي تركز على األنظمة والتطبيقات الحقيقية (الشكل ‪.)1‬‬

‫الجزء األول‪ :‬األساسيات والمقدمات‪ .‬يقدم القسم االول مقدمة للتعلم العميق‪ .‬بعد‬ ‫•‬
‫ذلك‪،‬يف القسم الثاني‪ ،‬نطلعك بسرعة على المتطلبات األساسية الالزمة للتعلم العميق‬
‫العملي‪ ،‬مثل كيفية تخزين البيانات ومعالجتها‪ ،‬وكيفية تطبيق العمليات العددية‬
‫المختلفة بناءً على المفاهيم األساسية من الجبر الخطي‪ ،‬وحساب التفاضل والتكامل‪،‬‬
‫واالحتمال‪ .‬يغطي القسم الرابع والقسم والخامس المفاهيم والتقنيات األساسيةيف ‬
‫التعلم العميق‪ ،‬بمايف ذلك االنحدار ‪ regression‬والتصنيف ‪classification‬؛ نماذج‬
‫خطية ‪linear models‬؛ البيرسبيترون متعددة الطبقات ‪.multilayer perceptron‬‬
‫وفرط التجهيز ‪ overfitting‬والتنظيم ‪regularization.‬‬
‫الجزء الثاني‪ :‬تقنيات التعلم العميق الحديثة‪ .‬يصف القسم السادس المكونات‬ ‫•‬
‫الحسابية الرئيسية ألنظمة التعلم العميق ويضع األساس لتطبيقاتنا الالحقة لنماذج أكثر‬
‫تعقيدًا‪ .‬بعد ذلك‪ ،‬يقدم القسم السابع والقسم الثامن الشبكات العصبية التالفيفية‬
‫)‪ ،(CNNs‬وهي أدوات قوية تشكل العمود الفقري لمعظم أنظمة الرؤية الحاسوبية‬
‫الحديثة‪ .‬وبالمثل‪ ،‬يقدم القسم التاسع والقسم العاشر الشبكات العصبية المتكررة‬
‫)‪ ،(RNNs‬وهي نماذج تستغل البنية المتسلسلة (على سبيل المثال‪ ،‬الزمنية)يف ‬
‫البيانات وتستخدم بشكل شائع لمعالجة اللغة الطبيعية والتنبؤ بالسالسل الزمنية‪.‬يف ‬
‫القسم الحادي عشر‪ ،‬قدمنا فئة جديدة نسبيًا من النماذج تعتمد على ما يسمى بآليات‬
‫االنتباه ‪ attention mechanisms‬التي حلت محل ‪ RNNs‬باعتبارها البنية المهيمنة‬
‫لمعظم مهام معالجة اللغة الطبيعية‪ .‬ستُطلعك هذه األقسام على أقوى األدوات‬
‫واألدوات العامة المستخدمة على نطاق واسع من قبل ممارسي التعلم العميق‪.‬‬
‫الجزء الثالث‪ :‬قابلية التوسع والكفاءة والتطبيقات‪.‬يف القسم الثاني عشر‪ ،‬نناقش العديد‬ ‫•‬
‫من خوارزميات التحسين الشائعة المستخدمة لتدريب نماذج التعلم العميق‪ .‬بعد ذلك‪،‬‬
‫في القسم الثالث عشر‪ ،‬ندرس العديد من العوامل الرئيسية التي تؤثر على األداء‬
‫الحسابي لكود التعلم العميق‪ .‬بعد ذلك‪،‬يف القسم الرابع عشر‪ ،‬نوضح التطبيقات‬
‫الرئيسية للتعلم العميقيف الرؤية الحاسوبية‪ .‬أخيرًا‪،‬يف القسم الخامس عشر والقسم‬
‫السادس عشر‪ ،‬نوضح كيفية التدريب المسبق لنماذج تمثيل اللغة وتطبيقها على مهام‬
‫معالجة اللغة الطبيعية‪ .‬هذا الجزء متاح على اإلنترنت‪.‬‬
‫تتميز معظم أقسام هذا الكتاب بكود قابل للتنفيذ‪ .‬نعتقد أن أفضل طريقة لتطوير بعض‬
‫البديهيات هي التجربة والخطأ ‪ ،trial and error‬وتعديل الكود بطرق صغيرة ومراقبة النتائج‪.‬‬
‫من الناحية المثالية‪ ،‬قد تخبرنا النظرية الرياضية األنيقة بدقة كيفية تعديل الكود الخاص بنا لتحقيق‬
‫النتيجة المرجوة‪ .‬ومع ذلك‪ ،‬يجب على ممارسي التعلم العميق اليوم أن يسيروايف كثير من األحيان‬
‫حيث ال توجد نظرية قوية توفر التوجيه‪ .‬على الرغم من أفضل محاوالتنا‪ ،‬ال تزال التفسيرات‬
‫الرسمية لفعالية التقنيات المختلفة غير متوفرة‪ ،‬ألن الرياضيات لتوصيف هذه النماذج يمكن أن‬
‫تكون صعبة للغاية‪ ،‬ألن التفسير يعتمد على األرجح على خصائص البيانات التي تفتقر حاليًا إلى‬
‫تعريفات واضحة‪ ،‬وألن التحقيق الجاد حول هذه الموضوعات مؤخرًا إلى مستوى عالٍ‪ .‬نأمل أنه‬
‫مع تقدم نظرية التعلم العميق‪ ،‬ستوفر كل طبعة مستقبلية من هذا الكتاب رؤى تتفوق على تلك‬
‫المتاحة حاليًا‪.‬‬

‫لتجنب التكرار غير الضروري‪ ،‬نقوم بتغليف بعض الدوال والفئات األكثر استخدامًا واستيرادًا‬
‫في حزمة ‪ .d2l‬طوال الوقت‪ ،‬نقوم بتمييز كتل التعليمات البرمجية (مثل الدوال أو الفئات أو‬
‫مجموعة عبارات االستيراد) باستخدام ‪ #@save‬لإلشارة إلى أنه سيتم الوصول إليها الحقًا عبر‬
‫حزمة ‪ .d2l‬نقدم نظرة عامة مفصلة عن هذه الدوال والفئاتيف القسم ‪ .20.8‬حزمة ‪d2l‬‬
‫خفيفة الوزن وتتطلب فقط التبعيات التالية‪:‬‬

‫‪#@save‬‬
‫‪import collections‬‬
‫‪import hashlib‬‬
‫‪import inspect‬‬
‫‪import math‬‬
‫‪import os‬‬
‫‪import random‬‬
‫‪import re‬‬
‫‪import shutil‬‬
‫‪import sys‬‬
‫‪import tarfile‬‬
‫‪import time‬‬
‫‪import zipfile‬‬
‫‪from collections import defaultdict‬‬
‫‪import pandas as pd‬‬
‫‪import requests‬‬
‫‪from IPython import display‬‬
‫‪from matplotlib import pyplot as plt‬‬
‫‪from matplotlib_inline import backend_inline‬‬

‫]__‪d2l = sys.modules[__name‬‬
‫يعتمد معظم الكوديف هذا الكتاب على ‪ ،TensorFlow‬وهو إطار مفتوح المصدر للتعلم‬
‫العميق يتم اعتماده على نطاق واسعيف الصناعة ويحظى بشعبية بين الباحثين‪ .‬اجتازت جميع‬
‫التعليمات البرمجية الموجودةيف هذا الكتاب االختبارات بموجب أحدث إصدار ثابت من‬
‫‪ .TensorFlow‬ومع ذلك‪ ،‬نظرًا للتطور السريعيف التعلم العميق‪ ،‬فقد ال تعمل بعض التعليمات‬
‫البرمجيةيف النسخة المطبوعة بشكل صحيحيف اإلصدارات المستقبلية من ‪ .TensorFlow‬نحن‬
‫نخطط لتحديث النسخة عبر اإلنترنت‪.‬يف حالة مواجهة أي مشاكل‪ ،‬يرجى الرجوع إلى التثبيت‬
‫لتحديث التعليمات البرمجية وبيئة وقت التشغيل‪.‬‬

‫إليك كيفية استيراد الوحدات النمطية من ‪.TensorFlow‬‬

‫‪#@save‬‬
‫‪import numpy as np‬‬
‫‪import tensorflow as tf‬‬

‫هذا الكتاب مخصص للطالب (الجامعيين أو الخريجين) والمهندسين والباحثين الذين‬


‫يسعون إلى فهم قوي للتقنيات العملية للتعلم العميق‪ .‬نظرًا ألننا نشرح كل مفهوم من البداية‪ ،‬فال‬
‫يلزم وجود خلفية سابقةيف التعلم العميق أو التعلم اآللي‪ .‬يتطلب التفسير الكامل ألساليب التعلم‬
‫العميق بعض الرياضيات والبرمجة‪ ،‬لكننا سنفترض فقط أنك تأتي ببعض األساسيات‪ ،‬بمايف ذلك‬
‫كميات متواضعة من الجبر الخطي وحساب التفاضل والتكامل واالحتماالت وبرمجة بايثون‪.‬‬
‫فقطيف حالة نسيان األساسيات‪ ،‬يوفر الملحق تجديدًا لمعظم الرياضيات التي ستجدهايف هذا‬
‫الكتاب‪.‬يف معظم األحيان‪ ،‬سنمنح الحدس واألفكار األولوية على الدقة الرياضية‪ .‬إذا كنت ترغب‬
‫في توسيع هذه األسس إلى ما هو أبعد من المتطلبات األساسية لفهم كتابنا‪ ،‬فإننا نوصي بسعادة‬
‫ببعض الموارد الرائعة األخرى‪ :‬التحليل الخطي بواسطة ‪، Bollobas( Bela Bollobas‬‬
‫يغطي الجبر الخطي والتحليل الدالي بعمق كبير‪ .‬توفر كافة اإلحصائيات‬ ‫‪)1999‬‬
‫(‪ )2013 ،Wasserman‬مقدمة رائعة لإلحصاءات‪ .‬تعد كتب ودورات جو بليتزشتاين حول‬
‫االحتماالت واالستدالل جواهر تربوية‪ .‬وإذا لم تكن قد استخدمت بايثون من قبل‪ ،‬فقد ترغبيف ‬
‫االطالع على برنامج بايثون التعليمي هذا ‪. Python tutorial‬‬

‫مرتبطًا بهذا الكتاب‪ ،‬أطلقنا منتدى للمناقشة‪ ،‬يقعيف ‪ . discuss.d2l.ai‬عندما يكون لديك‬
‫أسئلة حول أي قسم من الكتاب‪ ،‬يمكنك العثور على ارتباط إلى صفحة المناقشة المرتبطةيف نهاية‬
‫كل نوتبوك‪.‬‬

‫نحن مدينون لمئات المساهمينيف كل من المسودتين اإلنجليزية والصينية‪ .‬لقد ساعدوايف ‬


‫تحسين المحتوى وقدموا مالحظات قيمة‪ .‬على وجه التحديد‪ ،‬نشكر كل مساهميف هذه المسودة‬
‫اإلنجليزية لجعلها أفضل للجميع‪ .‬معرفات أو أسماء ‪ GitHub‬الخاصة بهم (بدون ترتيب‬
‫معين)‪alxnorden, avinashingit, bowen0701, brettkoonce, Chaitanya :‬‬
‫‪Prakash Bapat, cryptonaut, Davide Fiocco, edgarroman, gkutiel, John‬‬
‫)‪Mitro, Liang Pu, Rahul Agarwal, Mohamed Ali Jamaoui, Michael (Stu‬‬
‫‪Stewart, Mike Müller, NRauschmayr, Prakhar Srivastav, sad-, sfermigier,‬‬
‫‪Sheng Zha, sundeepteki, topecongiro, tpdi, vermicelli, Vishaal Kapoor,‬‬
‫‪Vishwesh Ravi Shrimali, YaYaB, Yuhong Chen, Evgeniy Smirnov, lgov,‬‬
‫‪Simon Corston-Oliver, Igor Dzreyev, Ha Nguyen, pmuens, Andrei‬‬
‫‪Lukovenko, senorcinco, vfdev-5, dsweet, Mohammad Mahdi Rahimi,‬‬
‫‪Abhishek Gupta, uwsd, DomKM, Lisa Oakley, Bowen Li, Aarush Ahuja,‬‬
‫‪Prasanth Buddareddygari, brianhendee, mani2106, mtn, lkevinzc,‬‬
‫‪caojilin, Lakshya, Fiete Lüer, Surbhi Vijayvargeeya, Muhyun Kim,‬‬
‫‪dennismalmgren, adursun, Anirudh Dagar, liqingnz, Pedro Larroy, lgov,‬‬
‫‪ati-ozgur, Jun Wu, Matthias Blume, Lin Yuan, geogunow, Josh Gardner,‬‬
Maximilian Böther, Rakib Islam, Leonard Lausen, Abhinav Upadhyay,
rongruosong, Steve Sedlmeyer, Ruslan Baratov, Rafael Schlatter,
liusy182, Giannis Pappas, ati-ozgur, qbaza, dchoi77, Adam Gerson, Phuc
Le, Mark Atwood, christabella, vn09, Haibin Lin, jjangga0214,
RichyChen, noelo, hansent, Giel Dops, dvincent1337, WhiteD3vil,
Peter Kulits, codypenta, joseppinilla, ahmaurya, karolszk, heytitle, Peter
Goetz, rigtorp, Tiep Vu, sfilip, mlxd, Kale-ab Tessera, Sanjar Adilov,
MatteoFerrara, hsneto, Katarzyna Biesialska, Gregory Bruss, Duy–Thanh
Doan, paulaurel, graytowne, Duc Pham, sl7423, Jaedong Hwang, Yida
Wang, cys4, clhm, Jean Kaddour, austinmw, trebeljahr, tbaums, Cuong
V. Nguyen, pavelkomarov, vzlamal, NotAnotherSystem, J-Arun-Mani,
jancio, eldarkurtic, the-great-shazbot, doctorcolossus, gducharme,
cclauss, Daniel-Mietchen, hoonose, biagiom, abhinavsp0730,
jonathanhrandall, ysraell, Nodar Okroshiashvili, UgurKap, Jiyang Kang,
StevenJokes, Tomer Kaftan, liweiwp, netyster, ypandya, NishantTharani,
heiligerl, SportsTHU, Hoa Nguyen, manuel-arno-korfmann-
webentwicklung, aterzis-personal, nxby, Xiaoting He, Josiah Yoder,
mathresearch, mzz2017, jroberayalas, iluu, ghejc, BSharmi, vkramdev,
simonwardjones, LakshKD, TalNeoran, djliden, Nikhil95, Oren Barkan,
guoweis, haozhu233, pratikhack, Yue Ying, tayfununal, steinsag,
charleybeller, Andrew Lumsdaine, Jiekui Zhang, Deepak Pathak, Florian
Donhauser, Tim Gates, Adriaan Tijsseling, Ron Medina, Gaurav Saha,
Murat Semerci, Lei Mao, Levi McClenny, Joshua Broyde, jake221,
jonbally, zyhazwraith, Brian Pulfer, Nick Tomasino, Lefan Zhang,
Hongshen Yang, Vinney Cavallo, yuntai, Yuanxiang Zhu, amarazov,
pasricha, Ben Greenawald, Shivam Upadhyay, Quanshangze Du, Biswajit
Sahoo, Parthe Pandit, Ishan Kumar, HomunculusK, Lane Schwartz,
varadgunjal, Jason Wiener, Armin Gholampoor, Shreshtha13, eigen-
arnav, Hyeonggyu Kim, EmilyOng, Bálint Mucsányi, Chase DuBois,
Juntian Tao, Wenxiang Xu, Lifu Huang, filevich, quake2005, nils-
werner, Yiming Li, Marsel Khisamutdinov, Francesco “Fuma” Fumagalli,
Peilin Sun, Vincent Gurgul, qingfengtommy, Janmey Shukla, Mo Shan,
‫‪Kaan Sancak, regob, AlexSauer, Gopalakrishna Ramachandra, Tobias‬‬
‫‪Uelwer, Chao Wang, Tian Cao, Nicolas Corthorn, akash5474, kxxt,‬‬
‫‪zxydi1992, Jacob Britton, Shuangchi He, zhmou, krahets, Jie-Han Chen,‬‬
‫‪Atishay Garg, Marcel Flygare, adtygan, Nik Vaessen, bolded, Louis‬‬
‫‪Schlessinger, Balaji Varatharajan, atgctg, Kaixin Li, Victor Barbaros,‬‬
‫‪Riccardo Musto, Elizabeth Ho, azimjonn, Guilherme Miotto, Alessandro‬‬
‫‪.Finamore, Joji Joseph, Anthony Biel, Sere1nz.‬‬

‫نشكر ‪ ،Amazon Web Services‬وخاصة ‪ Swami Sivasubramanian‬و ‪Peter‬‬


‫‪ DeSantis‬و‪ Adam Selipsky‬و‪ Andrew Jassy‬لدعمهم السخييف كتابة هذا الكتاب‪ .‬لوال‬
‫الوقت والموارد المتاحة والمناقشات مع الزمالء والتشجيع المستمر لما حدث هذا الكتاب‪.‬‬

‫أحدث التعلم العميق ثورةيف التعرف على األنماط ‪ ،pattern recognition‬حيث أدخل‬
‫التكنولوجيا التي تعمل اآلن على تشغيل مجموعة واسعة من التقنيات‪،‬يف مجاالت متنوعة مثل‬
‫الرؤية الحاسوبية‪ ،‬ومعالجة اللغة الطبيعية‪ ،‬والتعرف التلقائي على الكالم‪ .‬لتطبيق التعلم العميق‬
‫بنجاح‪ ،‬يجب أن تفهم كيفية طرح مشكلة‪ ،‬والرياضيات األساسية للنمذجة‪ ،‬والخوارزميات‬
‫لتناسب النماذج الخاصة بك مع البيانات‪ ،‬والتقنيات الهندسية لتنفيذها جميعًا‪ .‬يقدم هذا الكتاب‬
‫مورداً شامالً‪ ،‬بمايف ذلك النثر واألرقام والرياضيات واالكواد‪ ،‬كل ذلكيف مكان واحد‪ .‬لطرح (أو‬
‫اإلجابة) أسئلة تتعلق بهذا الكتاب‪ ،‬قم بزيارة منتدانا على ‪ . https://discuss.d2l.ai/‬جميع‬
‫النوتبوكس الخاصة بنا متاحة للتنزيل على موقع الويب ‪ D2L.ai website‬وعلى ‪.GitHub‬‬

‫قم بتسجيل حسابيف منتدى المناقشة الخاص بهذا الكتاب ‪.discuss.d2l.ai‬‬ ‫•‬
‫قم بتثبيت بايثون على جهاز الكمبيوتر الخاص بك‪.‬‬ ‫•‬
‫اتبع الروابط الموجودةيف الجزء السفلي من قسم المنتدى‪ ،‬حيث ستتمكن من طلب‬ ‫•‬
‫المساعدة ومناقشة الكتاب والعثور على إجابات ألسئلتك من خالل إشراك المؤلفين‬
‫والمجتمع األوسع‪.‬‬

‫من أجل البدء والتشغيل‪ ،‬سنحتاج إلى بيئة لتشغيل بايثون و‪ Jupyter Notebook‬والمكتبات‬
‫ذات الصلة والكود الالزم لتشغيل الكتاب نفسه‪.‬‬
‫‪Miniconda‬‬
‫أبسط خيار لك هو تثبيت ‪ .Miniconda‬الحظ أن إصدار ‪ Python 3.x‬مطلوب‪ .‬يمكنك تخطي‬
‫الخطوات التالية إذا كان جهازك مثبتًا بالفعل على ‪.conda‬‬

‫قم بزيارة موقع ‪ Miniconda‬على الويب وحدد اإلصدار المناسب لنظامك بناءً على إصدار‬
‫‪ Python 3.x‬وبنية الجهاز‪ .‬افترض أن إصدار بايثون الخاص بك هو ‪( 3.9‬اإلصدار الذي تم‬
‫اختباره)‪ .‬إذا كنت تستخدم ‪ ،macOS‬فيمكنك تنزيل برنامج ‪ bash‬النصي الذي يحتوي اسمه‬
‫على السالسل "‪ ،”MacOSX‬وانتقل إلى موقع التنزيل‪ ،‬وقم بتنفيذ التثبيت على النحو التالي‬
‫(مع أخذ ‪ Intel Macs‬كمثال)‪:‬‬

‫‪# The file name is subject to changes‬‬


‫‪sh Miniconda3-py39_4.12.0-MacOSX-x86_64.sh -b‬‬
‫يقوم مستخدم ‪ Linux‬بتنزيل الملف الذي يحتوي اسمه على السالسل "‪ "Linux‬وتنفيذ ما يلي‬
‫في موقع التنزيل‪:‬‬

‫‪# The file name is subject to changes‬‬


‫‪sh Miniconda3-py39_4.12.0-Linux-x86_64.sh -b‬‬
‫بعد ذلك‪ ،‬قم بتهيئة ‪ shell‬حتى نتمكن من تشغيل ‪ conda‬مباشرةً‪.‬‬

‫‪~/miniconda3/bin/conda init‬‬
‫ثم أغلق وأعد فتح ‪ shell‬الحالي‪ .‬يجب أن تكون قادرًا على إنشاء بيئة جديدة على النحو التالي‪:‬‬

‫‪conda create --name d2l python=3.9 -y‬‬


‫اآلن يمكننا تنشيط بيئة ‪:d2l‬‬

‫‪conda activate d2l‬‬

‫‪d2l‬‬
‫قبل تثبيت أي إطار عمل للتعلم العميق‪ ،‬يرجى أوالً التحقق مما إذا كان لديك وحدات معالجة‬
‫رسومات ‪ GPU‬مناسبة على جهازك أم ال (وحدات معالجة الرسومات التي تشغل الشاشة على‬
‫كمبيوتر محمول قياسي ليست ذات صلة بأغراضنا)‪ .‬على سبيل المثال‪ ،‬إذا كان جهاز الكمبيوتر‬
‫الخاص بك يحتوي على وحدات معالجة رسومات ‪ NVIDIA‬وقام بتثبيت ‪ ،CUDA‬فأنت‬
‫جاهز تمامًا‪ .‬إذا كان جهازك ال يحتوي على أي وحدة معالجة رسومات‪ ،‬فال داعي للقلق اآلن‪.‬‬
‫توفر وحدة المعالجة المركزية ‪ CPU‬الخاصة بك أكثر من قوة حصانية كافية لتصفح الفصول‬
‫القليلة األولى‪ .‬فقط تذكر أنك سترغبيف الوصول إلى وحدات معالجة الرسومات قبل تشغيل‬
‫النماذج األكبر‪.‬‬
‫يمكنك تثبيت ‪ TensorFlow‬باستخدام دعم وحدة المعالجة المركزية ‪ CPU‬أو وحدة معالجة‬
‫الرسومات ‪ GPU‬على النحو التالي‪:‬‬

‫‪pip install tensorflow tensorflow-probability‬‬


‫خطوتنا التالية هي تثبيت حزمة ‪ d2l‬التي قمنا بتطويرها لتغليف الدوال والفئات (الكالسات)‬
‫المستخدمة بشكل متكرر والموجودةيف هذا الكتاب‪:‬‬

‫‪pip install d2l==1.0.0a1‬‬

‫بعد ذلك‪ ،‬ستحتاج إلى تنزيل النوتبوكس بحيث يمكنك تشغيل كل من كتل التعليمات البرمجية‬
‫للكتاب‪ .‬ما عليك سوى النقر فوق عالمة التبويب "‪ "Notebooks‬أعلى أي صفحة ‪HTML‬‬
‫على موقع ‪ D2L.ai‬لتنزيل الرمز ثم فك ضغطه‪ .‬بدالً من ذلك‪ ،‬يمكنك جلب دفاتر المالحظات‬
‫من سطر األوامر على النحو التالي‪:‬‬
‫‪mkdir d2l-en && cd d2l-en‬‬
‫‪curl https://d2l.ai/d2l-en.zip -o d2l-en.zip‬‬
‫‪unzip d2l-en.zip && rm d2l-en.zip‬‬
‫‪cd tensorflow‬‬

‫إذا لم يكن لديك برنامج ‪ unzip‬مثبتًا بالفعل‪ ،‬فقم أوالً بتشغيل ‪.sudo apt-get install unzip‬‬
‫يمكننا اآلن بدء تشغيل خادم ‪ Jupyter Notebook‬من خالل تشغيل‪:‬‬
‫‪jupyter notebook‬‬

‫في هذه المرحلة‪ ،‬يمكنك فتح ‪( http://localhost:8888‬ربما تم فتحه تلقائيًا بالفعل)يف ‬


‫مستعرض الويب الخاص بك‪ .‬ثم يمكننا تشغيل الكود لكل قسم من الكتاب‪ .‬عندما تفتح نافذة‬
‫‪ )conda‬لتنشيط بيئة وقت‬ ‫سطر أوامر جديدة‪ ،‬ستحتاج إلى تنفيذ (‪activate d2l‬‬
‫التشغيل قبل تشغيل نوتبوكس ‪ ، D2L‬أو تحديث الحزم الخاصة بك (إما إطار عمل التعلم‬
‫العميق أو حزمة ‪ .)d2l‬للخروج من البيئة‪ ،‬قم بتشغيل ‪.conda deactivate‬‬
‫المحتويات‬
4
5 HTML
6
7
9
10
11
11
13
13
13
14 Miniconda
14 d2l
15
28 1
29 1.1
32 1.2
32 Data 1.2.1
34 Models 1.2.2
34 Objective Functions 1.2.3
35 Optimization Algorithms 1.2.4
36 1.3
36 Supervised Learning 1.3.1
37 Regression 1.3.1.1
39 classification 1.3.1.2
41 Tagging 1.3.1.3
42 Search 1.3.1.4
43 Recommender Systems 1.3.1.5
44 Sequence Learning 1.3.1.6
Self-Supervised Unsupervised 1.3.2
46
48 Interacting with an Environment 1.3.3
49 Reinforcement Learning 1.3.4
51 Roots 1.4
54 The Road to Deep Learning 1.5
58 Success Stories 1.6
60 The Essence of Deep Learning 1.7
62 1.8
62 1.9
65 Preliminaries 2
65 Data Manipulation 2.1
65 2.1.1
68 Indexing and Slicing 2.1.2
69 Operations 2.1.3
71 Broadcasting 2.1.4
72 Saving Memory 2.1.5
73 2.1.6
74 2.1.7
74 2.1.8
74 Data Preprocessing 2.2
74 Reading the Dataset 2.2.1
75 Data Preparation 2.2.2
76 Tensor 2.2.3
77 2.2.4
77 2.2.5
78 Linear Algebra 2.3
78 Scalars 2.3.1
79 Vectors 2.3.2
80 Matrices 2.3.3
81 Tensors 2.3.4
82 2.3.5
83 Reduction 2.3.6
84 Non-Reduction Sum 2.3.7
85 Dot Products 2.3.8
86 Matrix-Vector 2.3.9
87 Matrix-Matrix Multiplication – 2.3.10
88 Norms 2.3.11
90 2.3.12
91 2.3.13
92 Calculus 2.4
92 Derivatives and Differentiation 2.4.1
94 Visualization Utilities 2.4.2
97 Partial Derivatives and Gradients 2.4.3.
98 Chain Rule 2.4.4
98 2.4.5
99 2.4.6
99 Automatic Differentiation 2.5
100 A Simple Function 2.5.1
Backward for Non-Scalar 2.5.2
101 Variables
102 Detaching Computation 2.5.3
Gradients and Python Control Flow 2.5.4
102
103 2.5.5
104 2.5.6
104 Probability and Statistics 2.6
105 Tossing Coins 2.6.1
108 A More Formal Treatment 2.6.2
109 Random Variables 2.6.3
110 Multiple Random Variables 2.6.4
114 2.6.5
116 Expectations 2.6.6
118 2.6.7
119 2.6.8
120 Documentation 2.7
120 Functions and Classes in a Module 2.7.1
120 Specific Functions and Classes 2.7.2
124 Linear Neural Networks for Regression 3
124 Linear Regression 3.1
125 Basics 3.1.1
126 Loss Function 3.1.1.2
128 Analytic Solution 3.1.1.3
Minibatch Stochastic 3.1.1.4
128 Gradient Descent
131 Predictions 3.1.1.5
131 Vectorization for Speed 3.1.2
The Normal Distribution and Squared Loss 3.1.3
132
Linear Regression as a Neural Network 3.1.4
134
135 Biology 3.1.4.1
136 3.1.5
137 3.1.6
138 Object-Oriented Design for Implementation 3.2
139 Utilities 3.2.1
141 Models 3.2.2
143 Data 3.2.3
143 Training 3.2.4
144 3.2.5
145 Synthetic Regression Data 3.3
145 Generating the Dataset 3.3.1
146 Reading the Dataset 3.3.2
Concise Implementation of the Data 3.3.3
148 Loader
149 3.3.5
Linear Regression Implementation from 3.4
150 Scratch
150 Defining the Model 3.4.1
151 Defining the Loss Function 3.4.2
151 Defining the Optimization Algorithm 3.4.3
152 Training 3.4.4
155 3.4.5
155 3.4.6
156 Concise Implementation of 3.5
156 Linear Regression
157 Defining the Model 3.5.1
158 Defining the Loss Function 3.5.2
158 Defining the Optimization Algorithm 3.5.3
158 Training 3.5.4
159 3.5.5
160 3.5.6
160 Generalization 3.6
Training Error and Generalization 3.6.1
162 Error
163 Model Complexity 3.6.1.1
164 Overfitting Underfitting 3.6.2
165 Polynomial Curve Fitting 3.6.2.1
166 Dataset Size 3.6.2.2
166 Model Selection 3.6.3
167 Cross-Validation 3.6.3.1
167 3.6.4
168 3.6.5
168 Weight Decay 3.7
169 Norms and Weight Decay 3.7.1
171 High-Dimensional Linear Regression 3.7.2
172 Implementation from Scratch 3.7.3
172 Defining ℓ2 Norm Penalty ℓ2 3.7.3.1
172 Defining the Model 3.7.3.2
173 Training without Regularization 3.7.3.3
173 Using Weight Decay 3.7.3.4
174 Concise Implementation 3.7.4
175 3.7.5
176 3.7.6
Linear Neural Networks for Classification 4
178
178 Softmax 4.1
179 Classification 4.1.1
180 Linear Model 4.1.1.1
181 Softmax 4.1.1.2
182 Vectorization 4.1.1.3
182 Loss Function 4.1.2
183 Log-Likelihood 4.1.2.1
184 Softmax and Cross-Entropy Loss Softmax 4.1.2.2
185 Information Theory Basics 4.1.3
185 Entropy 4.1.3.1
185 Surprisal 4.1.3.2
186 Cross-Entropy Revisited 4.1.3.3
186 4.1.4
187 4.1.5
188 The Image Classification Dataset 4.2
189 Loading the Dataset 4.2.1
190 Reading a Minibatch 4.2.2
191 Visualization 4.2.3
192 4.2.4
192 4.2.5
193 The Base Classification Model 4.3
193 The Classifier Class 4.3.1
194 Accuracy 4.3.2
194 4.3.3
195 4.3.4
Softmax Regression Implementation from Softmax 4.4
195 Scratch
195 The Softmax 4.4.1
196 The Model 4.4.2
197 The Cross-Entropy Loss 4.4.3
198 Training 4.4.4
199 Prediction 4.4.5
199 4.4.6
200 4.4.7
200 Softmax 4.5
201 Defining the Model 4.5.1
201 Softmax Revisited 4.5.2
202 Training 4.5.3
203 4.5.4
203 4.5.5
204 Generalization in Classification 4.6
205 The Test Set 4.6.1
207 Test Set Reuse 4.6.2
209 Statistical Learning Theory 4.6.3
211 4.6.4
212 4.6.5
212 Environment and Distribution Shift 4.7
213 Types of Distribution Shift 4.7.1
214 Covariate Shift 4.7.1.1
215 Label Shift 4.7.1.2
215 Concept Shift 4.7.1.3
216 Examples of Distribution Shift 4.7.2
216 Medical Diagnostics 4.7.2.1
217 Self-Driving Cars 4.7.2.2
217 Nonstationary Distributions 4.7.2.3
218 More Anecdotes 4.7.2.4
218 Correction of Distribution Shift 4.7.3
218 Empirical Risk and Risk 4.7.3.1
219 Covariate Shift Correction 4.7.3.2
221 Label Shift Correction 4.7.3.3
222 Concept Shift Correction 4.7.3.4
223 A Taxonomy of Learning Problems 4.7.4
223 Batch Learning 4.7.4.1
223 Online Learning 4.7.4.2
223 Bandits 4.7.4.3
224 Control 4.7.4.4
224 Reinforcement Learning 4.7.4.5
224 Considering the Environment 4.7.4.6
Fairness, Accountability, 4.7.5
225 and Transparency in Machine Learning
226 4.7.6
226 4.7.7
228 Multilayer Perceptrons 5
228 Multilayer Perceptrons 5.1
228 Hidden Layers 5.1.1
229 Limitations of Linear Models 5.1.1.1
230 Incorporating Hidden Layers 5.1.1.2
231 From Linear to Nonlinear 5.1.1.3
232 Universal Approximators 5.1.1.4
233 Activation Functions 5.1.2
233 ReLU 5.1.2.1
235 Sigmoid . 5.1.2.2
237 Tanh 5.1.2.3
238 . 5.1.3
238 5.1.4
Implementation of Multilayer Perceptron 5.2
239
239 Implementation from Scratch 5.2.1
239 Initializing Model Parameters 5.2.1.1
240 Model 5.2.1.2
240 Training 5.2.1.3
241 Concise Implementation 5.2.2
241 Model 5.2.2.1
241 Training 5.2.2.2
242 5.2.3
242 5.2.4
Backward Propagation Forward Propagation 5.3
243 Computational Graphs
243 Forward Propagation 5.3.1
Computational Graph of Forward 5.3.2
244 Propagation
246 Training Neural Networks 5.3.4
247 5.3.5
247 5.3.6
248 Numerical Stability and Initialization 5.4
248 Vanishing and Exploding Gradients 5.4.1
249 Vanishing Gradients 5.4.1.1
250 Exploding Gradients 5.4.1.2
251 Breaking the Symmetry 5.4.1.3
251 Parameter Initialization 5.4.2
251 Default Initialization 5.4.2.1
252 Xavier 5.4.2.2
253 Beyond 5.4.2.3
253 5.4.3
254 5.4.4
254 Generalization in Deep Learning 5.5
Revisiting Overfitting and 5.5.1
255 Regularization
257 Inspiration from Nonparametrics 5.5.2
258 Early Stopping 5.5.3
Classical Regularization 5.5.4
259 Methods for Deep Networks
259 5.5.5
260 5.5.6
260 Dropout 5.6
261 Dropout in Practice 5.6.1
262 Implementation from Scratch 5.6.2
263 Defining the Model 5.6.2.1
264 Training 5.6.2.2
264 Concise Implementation 5.6.3
266 5.6.4
266 5.6.5
266 Predicting House Prices on Kaggle 5.7
267 Downloading Data 5.7.1
268 Kaggle 5.7.2
Accessing and Reading the Dataset 5.7.3
268
270 Data Preprocessing 5.7.4
272 Error Measure 5.7.5
273 K-Fold Cross Validation 5.7.6
274 Model Selection 5.7.7
275 Submitting Predictions on Kaggle 5.7.8
276 5.7.9
276 5.7.10
‫المقدمة‬
‫‪1‬‬

‫مقد‬
‫مها‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪28‬‬

‫‪1‬‬
‫حتى وقت قريب‪ ،‬تم ترميز كل برنامج كمبيوتر تقريبًا قد تتفاعل معهيف يوم عادي كمجموعة‬
‫صارمة من القواعد التي تحدد بدقة كيف يجب أن يتصرف‪ .‬لنفترض أننا أردنا كتابة تطبيق إلدارة‬
‫منصة التجارة اإللكترونية ‪ .e-commerce platform‬بعد االلتفاف حول السبورة لبضع‬
‫ساعات للتفكيريف المشكلة‪ ،‬قد نستقر على الخطوط العريضة لحل عملي‪ ،‬على سبيل المثال‪:‬‬
‫(‪ ) 1‬يتفاعل المستخدمون مع التطبيق من خالل واجهة تعمليف متصفح الويب أو تطبيق الهاتف‬
‫المحمول؛ (‪ ) 2‬يتفاعل تطبيقنا مع محرك قاعدة بيانات من الدرجة التجارية لتتبع حالة كل‬
‫مستخدم واالحتفاظ بسجالت المعامالت التاريخية؛ و(‪)3‬يف قلب تطبيقنا ‪ ،‬يوضح منطق العمل‬
‫(يمكنك القول ‪ ،‬العقول ‪ ) brains‬لتطبيقنا مجموعة من القواعد التي تحدد كل ظرف يمكن‬
‫تصوره لإلجراء المقابل الذي يجب أن يتخذه برنامجنا‪.‬‬

‫لبناء عقول تطبيقنا‪ ،‬قد نقوم بتعداد جميع األحداث المشتركة التي يجب أن يتعامل معها‬
‫برنامجنا‪ .‬على سبيل المثال‪ ،‬عندما ينقر أحد العمالء إلضافة عنصر إلى سلة التسوق الخاصة به‪،‬‬
‫يجب على برنامجنا إضافة إدخال إلى جدول قاعدة بيانات عربة التسوق‪ ،‬مع ربط معرف‬
‫المستخدم بمعرف المنتج المطلوب‪ .‬قد نحاول بعد ذلك مراجعة كل حالة ركنية محتملة‪ ،‬واختبار‬
‫مدى مالءمة قواعدنا وإجراء أي تعديالت ضرورية‪ .‬ماذا يحدث إذا بدأ المستخدم الشراء بسلة‬
‫تسوق فارغة؟يف حين أن عددًا قليالً من المطورين قد فهموا األمر بشكل صحيح تمامًايف المرة‬
‫األولى (قد يستغرق األمر بعض االختبارات التجريبية لحل الخلل)‪،‬يف الغالب‪ ،‬يمكننا كتابة مثل‬
‫هذه البرامج وإطالقها بثقة قبل رؤية عميل حقيقي‪ .‬إن قدرتنا على تصميم األنظمة اآللية التي‬
‫تقود المنتجات واألنظمة العاملة يدويًا‪ ،‬غالبًايف المواقف الجديدة‪ ،‬هي إنجاز معرفي رائع‪ .‬وعندما‬
‫تكون قادرًا على ابتكار حلول تعمل ‪%100‬يف ذلك الوقت‪ ،‬فال داعي للقلق بشأن التعلم اآللي‪.‬‬

‫لحسن الحظ بالنسبة للمجتمع المتنامي لعلماء التعلم اآللي ‪ ،‬فإن العديد من المهام التي نرغب‬
‫في أتمتة ال تنحني بسهولة إلى براعة اإلنسان‪ .‬تخيل أنك تتجمع حول السبورة البيضاء مع أذكى‬
‫العقول التي تعرفها ‪ ،‬لكنك هذه المرة تعالج إحدى المشكالت التالية‪:‬‬

‫اكتب برنامجًا يتنبأ بطقس الغد بناءً على المعلومات الجغرافية وصور القمر‬ ‫•‬
‫الصناعي ونافذة تتبع الطقس السابق‪.‬‬
‫اكتب برنامجًا يأخذ سؤاالً واقعيًا ‪ ،‬معبرًا عنه بنص حر ‪ ،‬واإلجابة عليه بشكل‬ ‫•‬
‫صحيح‪.‬‬
‫اكتب برنامجًا ‪،‬من خالل تقديم صورة ‪ ،‬يحدد جميع األشخاص الذين تم تصويرهم‬ ‫•‬
‫فيه ويرسم الخطوط العريضة حول كل منهم‪.‬‬
‫‪29‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫اكتب برنامجًا يقدم للمستخدمين منتجات من المحتمل أن يستمتعوا بها ولكن من‬ ‫•‬
‫غير المحتمل أن يواجهوها في سياق التصفح الطبيعي‪.‬‬

‫بالنسبة لهذه المشكالت ‪ ،‬سيواجه حتى نخبة المبرمجين صعوبة في ترميز الحلول من الصفر‪.‬‬
‫يمكن أن تختلف األسباب‪ .‬في بعض األحيان ‪ ،‬يتبع البرنامج الذي نبحث عنه نمطًا يتغير بمرور‬
‫الوقت ‪ ،‬لذلك ال توجد إجابة صحيحة ثابتة! في مثل هذه الحاالت ‪ ،‬يجب أن يتكيف أي حل‬
‫ناجح برشاقة مع عالم متغير‪ .‬في أوقات أخرى ‪ ،‬قد تكون العالقة (على سبيل المثال بين وحدات‬
‫البكسل والفئات المجردة ‪ )abstract categories‬معقدة للغاية ‪ ،‬وتتطلب آالف أو ماليين‬
‫الحسابات واتباع مبادئ غير معروفة‪ .‬في حالة التعرف على الصور ‪ ،‬تكمن الخطوات الدقيقة‬
‫المطلوبة ألداء المهمة خارج فهمنا الواعي ‪ ،‬على الرغم من أن عمليات اإلدراك الالواعي لدينا‬
‫تنفذ المهمة دون عناء‪.‬‬

‫التعلم اآللي ‪ Machine learning‬هو دراسة الخوارزميات التي يمكن أن تتعلم من التجربة‪.‬‬
‫نظرًا ألن خوارزمية التعلم اآللي تجمع المزيد من الخبرة ‪ ،‬عادةً في شكل بيانات رصد أو تفاعالت‬
‫مع بيئة ‪ ،‬فإن أدائها يتحسن‪ .‬قارن هذا بمنصة التجارة اإللكترونية الحتمية الخاصة بنا ‪ ،‬والتي تتبع‬
‫نفس منطق األعمال ‪ ،‬بغض النظر عن مقدار الخبرة المتراكمة ‪ ،‬حتى يتعلم المطورون أنفسهم‬
‫ويقررون أن الوقت قد حان لتحديث البرنامج‪ .‬في هذا الكتاب ‪ ،‬سنعلمك أساسيات التعلم اآللي‪،‬‬
‫مع التركيز بشكل خاص على التعلم العميق ‪ ،‬ومجموعة قوية من التقنيات التي تقود االبتكارات‬
‫في مجاالت متنوعة مثل الرؤية الحاسوبية ‪ ،computer vision‬ومعالجة اللغة الطبيعية‬
‫‪ ،natural language processing‬والرعاية الصحية ‪ ،healthcare‬وعلم الجينوم‬
‫‪.genomics‬‬

‫‪1.1‬‬
‫قبل البدء في الكتابة ‪ ،‬كان على مؤلفي هذا الكتاب ‪ ،‬مثل الكثير من القوى العاملة ‪ ،‬أن يتناولوا‬
‫الكافيين‪ .‬قفزنا في السيارة وبدأنا في القيادة‪ .‬باستخدام جهاز ‪ ، iPhone‬دعا أليكس "يا ‪، "Siri‬‬
‫لتنبيه نظام التعرف على الصوت في الهاتف‪ .‬ثم أمر ‪ Mu‬بـ "االتجاهات إلى مقهى ‪Blue‬‬
‫‪ ." Bottle‬عرض الهاتف بسرعة نسخ أمره‪ .‬كما أدركنا أننا كنا نطلب االتجاهات وأطلقنا تطبيق‬
‫الخرائط (التطبيق) لتلبية طلبنا‪ .‬بمجرد إطالقه ‪ ،‬حدد تطبيق الخرائط عددًا من المسارات‪ .‬بجانب‬
‫كل مسار ‪ ،‬عرض الهاتف وقت عبور متوقع‪ .‬بينما قمنا بتلفيق هذه القصة لتوفير الراحة التربوية‪،‬‬
‫فإنها توضح أنه في غضون بضع ثوانٍ فقط ‪ ،‬يمكن أن تتفاعل تفاعالتنا اليومية مع الهاتف الذكي‬
‫مع العديد من نماذج التعلم اآللي‪.‬‬

‫تخيل مجرد كتابة برنامج للرد على كلمة تنبيه مثل "‪ "Alexa‬و "‪ "OK Google‬و " ‪Hey‬‬
‫‪ ."Siri‬جرب برمجتها في غرفة بمفردك باستخدام جهاز كمبيوتر ومحرر كود ‪ ،‬كما هو موضح‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪30‬‬

‫في الشكل ‪ .1.1.1‬كيف تكتب مثل هذا البرنامج من المبادئ األولى؟ فكر في األمر ‪ ...‬المشكلة‬
‫صعبة‪ .‬كل ثانية ‪ ،‬سيجمع الميكروفون ما يقرب من ‪ 44000‬عينة‪ .‬كل عينة هي قياس لسعة‬
‫الموجة الصوتية‪ .‬ما القاعدة التي يمكن تعيينها بشكل موثوق من مقتطف صوت خام إلى تنبؤات‬
‫واثقة حول ما إذا كان المقتطف يحتوي على كلمة التنبيه ‪wake‬؟ إذا كنت عالقًا ‪ ،‬فال تقلق‪ .‬نحن‬
‫ال نعرف كيف نكتب مثل هذا البرنامج من الصفر أيضًا‪ .‬لهذا السبب نستخدم التعلم اآللي‪.‬‬

‫الشكل ‪ 1.1.1‬تحديد كلمة ‪.Wake‬‬

‫ها هي الحيلة‪ .‬في كثير من األحيان ‪ ،‬حتى عندما ال نعرف كيفية إخبار الكمبيوتر بشكل صريح‬
‫بكيفية التعيين من المدخالت إلى المخرجات ‪ ،‬فإننا مع ذلك قادرون على أداء العمل الفذ‬
‫المعرفي بأنفسنا‪ .‬بمعنى آخر ‪ ،‬حتى إذا كنت ال تعرف كيفية برمجة جهاز كمبيوتر للتعرف على‬
‫كلمة "‪ ، "Alexa‬فأنت نفسك قادر على التعرف عليها‪ .‬مسلحين بهذه اإلمكانية ‪ ،‬يمكننا جمع‬
‫مجموعة بيانات ضخمة تحتوي على أمثلة من المقتطفات الصوتية والتسميات المرتبطة بها ‪،‬‬
‫مما يشير إلى المقتطفات التي تحتوي على كلمة التنبيه‪ .‬في النهج السائد للتعلم اآللي ‪ ،‬ال نحاول‬
‫تصميم نظام بشكل صريح للتعرف ع لى كلمات التنبيه‪ .‬بدالً من ذلك ‪ ،‬نحدد برنامجًا مرنًا يتم‬
‫تحديد سلوكه من خالل عدد من المعلمات‪ .‬ثم نستخدم مجموعة البيانات لتحديد أفضل قيم‬
‫المعلمات الممكنة ‪ ،‬أي تلك التي تعمل على تحسين أداء برنامجنا فيما يتعلق بمقياس األداء‬
‫المختار‪.‬‬

‫يمكنك التفكير في المعلمات ‪ parameters‬على أنها مقابض يمكننا تشغيلها ‪ ،‬والتالعب‬


‫بسلوك البرنامج‪ .‬بتحديد المعلمات‪ ،‬نسمي البرنامج نموذجًا ‪ .model‬تسمى مجموعة جميع‬
‫البرامج المميزة (تعيينات المدخالت والمخرجات ‪ )input-output mappings‬التي يمكننا‬
‫إنتاجها فقط من خالل معالجة المعلمات بمجموعة من النماذج‪ .‬والبرنامج الفوقي الذي يستخدم‬
‫مجموعة البيانات الخاصة بنا الختيار المعلمات يسمى خوارزمية التعلم ‪.learning algorithm‬‬

‫قبل أن نتمكن من المضي قدمًا وإشراك خوارزمية التعلم ‪ ،‬يتعين علينا تحديد المشكلة بدقة ‪،‬‬
‫وتحديد الطبيعة الدقيقة للمدخالت والمخرجات ‪ ،‬واختيار عائلة نموذجية مناسبة‪ .‬في هذه‬
‫الحالة‪ ،‬يتلقى نموذجنا مقتطفًا من الصوت كمدخالت ‪ ،‬ويقوم النموذج بإنشاء تحديد من بين‬
‫}‪ {yes,no‬المخرجات‪ .‬إذا سارت األمور وفقًا للخطة ‪ ،‬فعادة ما تكون تخمينات النموذج‬
‫صحيحة فيما يتعلق بما إذا كان المقتطف يحتوي على كلمة ‪.wake‬‬
‫‪31‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫إذا اخترنا مجموعة النماذج المناسبة ‪ ،‬فيجب أن يكون هناك إعداد واحد للمقابض بحيث‬
‫يطلق النموذج "نعم" في كل مرة يسمع فيها كلمة "‪ ."Alexa‬نظرًا ألن االختيار الدقيق لكلمة‬
‫االستيقاظ ‪ Wake‬عشوائي ‪ ،‬فربما نحتاج إلى عائلة نموذجية غنية بما يكفي ‪ ،‬من خالل إعداد‬
‫آخر للمقابض ‪ ،‬يمكنها إطالق "نعم" فقط عند سماع كلمة "مشمش"‪ .‬نتوقع أن تكون نفس العائلة‬
‫النموذجية مناسبة للتعرف على "‪ "Alexa‬وتقدير "المشمش ‪ "Apricot‬ألنهما يبدوان ‪ ،‬بشكل‬
‫حدسي ‪ ،‬مهمتين متشابه تين‪ .‬ومع ذلك ‪ ،‬قد نحتاج إلى مجموعة مختلفة من النماذج تمامًا إذا‬
‫أردنا التعامل مع مدخالت أو مخرجات مختلفة اختالفًا جذريًا ‪ ،‬لنقل إذا أردنا التعيين من الصور‬
‫إلى التسميات التوضيحية ‪ ،‬أو من الجمل اإلنجليزية إلى الجمل الصينية‪.‬‬

‫كما قد تتخيل ‪ ،‬إذا قمنا بتعيين جميع المقابض بشكل عشوائي ‪ ،‬فمن غير المرجح أن يتعرف‬
‫نموذجنا على "‪ "Alexa‬أو "‪ " Apricot‬أو أي كلمة إنجليزية أخرى‪ .‬في التعلم اآللي ‪ ،‬التعلم هو‬
‫العملية التي نكتشف من خاللها اإلعداد الصحيح للمقابض التي تفرض السلوك المطلوب من‬
‫نموذجنا‪ .‬بمعنى آخر ‪ ،‬نقوم بتدريب نموذجنا بالبيانات‪ .‬كما هو مبين في الشكل ‪ ، 1.1.2‬عادة ما‬
‫تبدو عملية التدريب كما يلي‪:‬‬

‫‪ .1‬ابدأ بنموذج مهيأ عشوائيًا ال يمكنه فعل أي شيء مفيد‪.‬‬


‫‪ .2‬احصل على بعض البيانات الخاصة بك (على سبيل المثال ‪ ،‬المقتطفات الصوتية‬
‫والتسميات }‪ {yes,no‬المقابلة )‪.‬‬
‫‪ .3‬قم بتعديل المقابض لجعل النموذج يعمل بشكل أفضل كما تم تقييمه في تلك‬
‫األمثلة‪.‬‬
‫‪ .4‬كرر الخطوتين ‪ 2‬و ‪ 3‬حتى يصبح النموذج رائعًا‪.‬‬

‫الشكل ‪ 1.1.2‬عملية تدريب نموذجية‪.‬‬

‫للتلخيص ‪ ،‬بدالً من ترميز أداة التعرف على كلمة التنبيه ‪ ، Wake‬نقوم بترميز برنامج يمكنه‬
‫تعلم التعرف على كلمات التنبيه ‪ ،‬إذا تم تقديمها مع مجموعة بيانات كبيرة معنونة‪ .‬يمكنك التفكير‬
‫في هذا الفعل المتمثل في تحديد سلوك البرنامج من خالل تقديمه مع مجموعة بيانات ‪dataset‬‬
‫كبرمجة مع البيانات ‪ .programming with data‬وهذا يعني أنه يمكننا "برمجة" جهاز الكشف‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪32‬‬

‫عن القطط من خالل تزويد نظام التعلم اآللي الخاص بنا بالعديد من األمثلة على القطط والكالب‪.‬‬
‫بهذه الطريقة سيتعلم الكاشف في النهاية إصدار رقم موجب كبير جدًا إذا كان قطة ‪ ،‬ورقمًا سالبًا‬
‫كبيرًا جدًا إذا كان كلبًا ‪ ،‬وشيء أقرب إلى الصفر إذا لم يكن متأكدًا‪ .‬هذا بالكاد يخدش سطح ما‬
‫يمكن أن يفعله التعلم اآللي‪ .‬التعلم العميق ‪ ،Deep learning‬الذي سنشرحه بمزيد من التفصيل‬
‫الحقًا ‪ ،‬هو مجرد واحد من بين العديد من الطرق الشائعة لحل مشاكل التعلم اآللي‪.‬‬

‫‪1.2‬‬
‫في مثال كلمة التنبيه ‪ ،wake‬وصفنا مجموعة بيانات تتكون من مقتطفات صوتية وتسميات‬
‫ثنائية ‪ ،‬وقدمنا إحساسًا مموجًا يدويًا لكيفية تدريب نموذج لتقريب الخرائط من المقتطفات إلى‬
‫التصنيفات‪ .‬هذا النوع من المشاكل ‪ ،‬حيث نحاول التنبؤ بعالمة غير معروفة محددة بناءً على‬
‫المدخالت المعروفة بمجموعة بيانات تتكون من أمثلة معروفة تسمياتها ‪ ، labels‬يسمى التعلم‬
‫الخاضع لإلشراف ‪ .supervised learning‬هذه مجرد واحدة من بين العديد من مشكالت‬
‫التعلم اآللي‪ .‬قبل أن نستكشف أصنافًا أخرى ‪ ،‬نود أن نلقي مزيدًا من الضوء على بعض المكونات‬
‫األساسية التي ستتبعنا ‪ ،‬بغض النظر عن نوع مشكلة التعلم اآللي التي نتعامل معها‪:‬‬

‫‪ .1‬البيانات ‪ data‬التي يمكننا التعلم منها‪.‬‬


‫‪ .2‬النموذج ‪ model‬لكيفية تحويل البيانات‪.‬‬
‫‪ .3‬دالة الهدف ‪ objective function‬تحدد مدى جودة (أو سوء) النموذج‪.‬‬
‫‪ .4‬الخوارزمية ‪ algorithm‬لضبط معلمات النموذج لتحسين دالة الهدف‪.‬‬

‫‪Data‬‬ ‫‪1.2.1‬‬
‫قد يكون من نافلة القول أنه ال يمكنك القيام بعلم البيانات ‪ data science‬بدون بيانات‪ .‬قد‬
‫نفقد مئات الصفحات عند التفكير في ماهية البيانات بالضبط ‪ ،‬ولكن في الوقت الحالي ‪ ،‬سنركز‬
‫على الخصائص الرئيسية لمجموعات البيانات التي سنهتم بها‪ .‬بشكل عام ‪ ،‬نحن مهتمون‬
‫بمجموعة من األمثلة‪ .‬من أجل العمل مع البيانات بشكل مفيد ‪ ،‬نحتاج عادةً إلى التوصل إلى‬
‫تمثيل رقمي مناسب‪ .‬يتكون كل مثال (أو نقطة بيانات ‪ ،data point‬مثيل بيانات ‪data‬‬
‫‪ ،instance‬عينة ‪ )sample‬عادةً من مجموعة من السمات تسمى الميزات ‪( features‬تسمى‬
‫أحيانًا المتغيرات المشتركة أو المدخالت) ‪ ،‬بناءً على النموذج الذي يجب أن يقوم بتنبؤاته‪ .‬في‬
‫مشاكل التعلم الخاضعة لإلشراف ‪ ،‬هدفنا هو التنبؤ بقيمة سمة خاصة ‪ ،‬تسمى التسمية ‪( label‬أو‬
‫الهدف ‪، )target‬والتي ليست جزءًا من مدخالت النموذج‪.‬‬

‫إذا كنا نعمل مع بيانات الصورة ‪ ،‬فقد يتكون كل مثال من صورة فردية (الميزات ‪)features‬‬
‫ورقم يشير إلى الفئة التي تنتمي إليها الصورة (التسمية ‪ .)label‬سيتم تمثيل الصورة عدديًا على‬
‫شكل ثالث شبكات من القيم الرقمية التي تمثل سطوع الضوء األحمر واألخضر واألزرق في كل‬
‫‪33‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫موقع بكسل‪ .‬على سبيل المثال ‪ ، 200 × 200‬قد تتكون الصورة الملونة من‬
‫‪ 200 × 200 × 3 = 120000‬قيم عددية‪.‬‬

‫بدالً من ذلك ‪ ،‬قد نعمل مع بيانات السجالت الصحية اإللكترونية ونتعامل مع مهمة التنبؤ‬
‫باحتمالية بقاء مريض معين على قيد الحياة خالل الثالثين يومًا القادمة‪ .‬هنا ‪ ،‬قد تتكون ميزاتنا‬
‫من مجموعة من السمات المتاحة بسهولة والقياسات المسجلة بشكل متكرر ‪ ،‬بما في ذلك العمر‬
‫والعالمات الحيوية واألمراض المصاحبة واألدوية الحالية واإلجراءات الحديثة‪ .‬سيكون التسمية‬
‫المتاحة ‪ label‬للتدريب عبارة عن قيمة ثنائية تشير إلى ما إذا كان كل مريض في البيانات التاريخية‬
‫قد نجا خالل نافذة الثالثين يومًا‪.‬‬

‫في مثل هذه الحاالت‪ ،‬عندما يتميز كل مثال بنفس عدد السمات العددية‪ ،‬نقول إن المدخالت‬
‫عبارة عن متجهات ذات طول ثابت ونطلق على الطول (الثابت) للمتجهات أبعاد البيانات‬
‫‪ .dimensionality of the data‬كما قد تتخيل‪ ،‬يمكن أن تكون المدخالت ذات الطول الثابت‬
‫مريحة‪ ،‬مما يمنحنا تعقيدًا أقل للقلق‪ .‬ومع ذلك‪ ،‬ال يمكن بسهولة تمثيل جميع البيانات‬
‫كمتجهات ثابتة الطول ‪ .fixed-length vectors‬بينما قد نتوقع أن تأتي الصور المجهرية من‬
‫معدات قياسية‪ ،‬ال يمكننا أن نتوقع أن تظهر الصور الملغومة من اإلنترنت جميعها بنفس الدقة أو‬
‫الشكل‪ .‬بالنسبة للصور‪ ،‬قد نفكريف اقتصاصها جميعًا إلى الحجم القياسي‪ ،‬لكن هذه اإلستراتيجية‬
‫تصلنا فقط حتى اآلن‪ .‬نحن نجازف بفقدان المعلوماتيف األجزاء المقتطعة‪ .‬عالوة على ذلك‪،‬‬
‫تقاوم البيانات النصية التمثيالت ذات الطول الثابت بشكل أكثر عنادًا‪ .‬ضعيف اعتبارك تقييمات‬
‫العمالء المتبقية على مواقع التجارة اإللكترونية مثل ‪ Amazon‬و‪ IMDb‬و‪.TripAdvisor‬‬
‫بعضها قصير‪" :‬ينتن! ‪ ."!it stinks‬يتجول آخرون للصفحات‪ .‬تتمثل إحدى الميزات الرئيسية‬
‫للتعلم العميق على الطرق التقليديةيف النعمة المقارنة التي يمكن للنماذج الحديثة من خاللها‬
‫التعامل مع بيانات متفاوتة الطول ‪.varying-length data‬‬

‫بشكل عام‪ ،‬كلما زادت البيانات المتوفرة لدينا‪ ،‬أصبحت مهمتنا أسهل‪ .‬عندما يكون لدينا‬
‫المزيد من البيانات‪ ،‬يمكننا تدريب نماذج أكثر قوة واالعتماد بشكل أقل على االفتراضات‬
‫المسبقة‪ .‬يعد تغيير النظام من البيانات الصغيرة (نسبيًا) إلى البيانات الكبيرة مساهماً رئيسياًيف ‬
‫نجاح التعلم العميق الحديث‪ .‬لتوجيه هذه النقطة الرئيسية‪ ،‬ال تعمل العديد من النماذج األكثر‬
‫إثارةيف التعلم العميق بدون مجموعات البيانات الكبيرة‪ .‬يعمل البعض اآلخريف نظام البيانات‬
‫الصغيرة‪ ،‬لكنها ليست أفضل من األساليب التقليدية‪.‬‬

‫أخيرًا‪ ،‬ال يكفي وجود الكثير من البيانات ومعالجتها بذكاء‪ .‬نحن بحاجة إلى البيانات‬
‫الصحيحة‪ .‬إذا كانت البيانات مليئة باألخطاء‪ ،‬أو إذا كانت الميزات المختارة ال تنبئ بالكمية‬
‫المستهدفة من االهتمام‪ ،‬فإن التعلم سيفشل‪ .‬يتم التقاط الموقف جيدًا من خالل الكليشيهات‪:‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪34‬‬

‫القمامةيف الداخل‪ ،‬والقمامة خارج ‪ .garbage in, garbage out‬عالوة على ذلك‪ ،‬فإن ضعف‬
‫األداء التنبئي ليس هو النتيجة المحتملة الوحيدة‪.‬يف التطبيقات الحساسة للتعلم اآللي‪ ،‬مثل‬
‫السياسة التنبؤية ‪ ،predictive policing‬واستئناف الفحص ‪ ،resume screening‬ونماذج‬
‫المخاطر ‪ risk models‬المستخدمة لإلقراض ‪ ،lending‬يجب أن نكون متيقظين بشكل خاص‬
‫لعواقب البيانات المهملة ‪ .garbage data‬يحدث أحد أوضاع الفشل الشائعةيف مجموعات‬
‫البيانات حيث ال يتم تمثيل بعض مجموعات األشخاصيف بيانات التدريب‪ .‬تخيل تطبيق نظام‬
‫التعرف على سرطان الجلديف البرية لم يسبق له مثيل من قبل‪ .‬يمكن أن يحدث الفشل أيضًا عندما‬
‫ال تكون البيانات مجرد تمثيل ناقص لبعض المجموعات ولكنها تعكس التحيزات المجتمعية‪.‬‬
‫على سبيل المثال‪ ،‬إذا تم استخدام قرارات التوظيف السابقة لتدريب نموذج تنبؤي سيتم‬
‫استخدامه لفحص السير الذاتية‪ ،‬فيمكن لنماذج التعلم اآللي عن غير قصد التقاط المظالم‬
‫التاريخية التلقائيًا ‪ .automate historical injustices‬الحظ أن كل هذا يمكن أن يحدث دون‬
‫أن يتآمر عالم البيانات بنشاط‪ ،‬أو حتى أن يكون على علم‪.‬‬

‫‪Models‬‬ ‫‪1.2.2‬‬
‫يتضمن معظم التعلم اآللي تحويل البيانات إلى حد ما‪ .‬قد نرغبيف بناء نظام يستوعب الصور‬
‫ويتنبأ باالبتسامة‪ .‬بدالً من ذلك‪ ،‬قد نرغبيف استيعاب مجموعة من قراءات أجهزة االستشعار‬
‫والتنبؤ بمدى طبيعية مقارنة القراءات الشاذة‪ .‬حسب النموذج‪ ،‬نشير إلى اآللية الحسابية الستيعاب‬
‫البيانات من نوع واحد‪ ،‬وإخراج تنبؤات من نوع مختلف محتمل‪ .‬على وجه الخصوص‪ ،‬نحن‬
‫مهتمون بالنماذج اإلحصائية التي يمكن تقديرها من البيانات‪.‬يف حين أن النماذج البسيطة قادرة‬
‫تمامًا على معالجة المشكالت البسيطة بشكل مناسب‪ ،‬فإن المشكالت التي نركز عليهايف هذا‬
‫الكت اب تزيد من حدود الطرق الكالسيكية‪ .‬يختلف التعلم العميق عن األساليب الكالسيكية‬
‫بشكل أساسي من خالل مجموعة النماذج القوية التي يركز عليها‪ .‬تتكون هذه النماذج من العديد‬
‫من التحوالت المتتالية للبيانات التي يتم ربطها ببعضها البعض من أعلى إلى أسفل‪ ،‬وبالتالي‬
‫يُطلق عليها اسم التعلم العميق ‪.deep learning‬يف طريقنا لمناقشة النماذج العميقة‪ ،‬سنناقش‬
‫أيضًا بعض األساليب التقليدية‪.‬‬

‫‪Objective Functions‬‬ ‫‪1.2.3‬‬


‫في وقت سابق ‪ ،‬قدمنا التعلم اآللي باعتباره التعلم من التجربة‪ .‬من خالل التعلم هنا ‪ ،‬فإننا‬
‫نعني التحسين في بعض المهام بمرور الوقت‪ .‬ولكن من سيقول ما الذي يشكل تحسنا؟ قد تتخيل‬
‫أنه يمكننا اقتراح تحديث نموذجنا ‪ ،‬وقد يختلف بعض األشخاص حول ما إذا كان التحديث‬
‫المقترح يمثل تحسينًا أم رفضًا‪.‬‬
‫‪35‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫من أجل تطوير نظام رياضي رسمي آلالت التعلم ‪ ،‬نحتاج إلى مقاييس رسمية لمدى جودة‬
‫(أو سوء) نماذجنا‪ .‬في التعلم اآللي والتحسين بشكل عام ‪ ،‬نسمي هذه دوال الهدف ‪Objective‬‬
‫‪ .Functions‬حسب االصطالح ‪ ،‬نحدد عادة دوال الهدف بحيث يكون األقل أفضل‪ .‬هذه مجرد‬
‫اتفاقية‪ .‬يمكنك أن تأخذ أي دالة أعلى هو أفضل ‪ ،‬وتحويلها إلى دالة جديدة متطابقة نوعيا ولكن‬
‫األقل أفضل من خالل قلب العالمة‪ .‬ألن األقل هو األفضل ‪ ،‬تسمى هذه الدوال أحيانًا دوال‬
‫الخسارة او الخطأ ‪.loss functions‬‬

‫عند محاولة التنبؤ بالقيم العددية ‪ ،‬فإن دالة الخطأ األكثر شيوعًا هي الخطأ التربيعي ‪squared‬‬
‫‪ ،error‬أي مربع الفرق بين التنبؤ والهدف الحقيقي ‪ .ground truth target‬بالنسبة للتصنيف‪،‬‬
‫فإن الهدف األكثر شيوعًا هو تقليل معدل الخطأ ‪ ،‬أي جزء من األمثلة التي ال تتفق توقعاتنا معها‬
‫مع الحقيقة األساسية‪ .‬من السهل تحسين بعض األهداف (على سبيل المثال‪ ،‬الخطأ التربيعي‬
‫‪ ، )squared error‬بينما يصعب تحسين أهداف أخرى (على سبيل المثال ‪ ،‬معدل الخطأ ‪error‬‬
‫‪ ) rate‬بشكل مباشر ‪ ،‬بسبب عدم التفاضل أو المضاعفات األخرى‪ .‬في هذه الحاالت ‪ ،‬من الشائع‬
‫تحسين هدف بديل ‪.surrogate objective‬‬

‫أثناء التحسين ‪ ،‬نفكر في الخطأ كدالة لمعلمات النموذج ‪ ،‬ونتعامل مع مجموعة بيانات‬
‫التدريب باعتبارها ثابتة‪ .‬نتعلم أفضل القيم لمعلمات نموذجنا من خالل تقليل الخطأ المتكبد‬
‫على مجموعة تتكون من عدد من األمثلة التي تم جمعها للتدريب‪ .‬ومع ذلك ‪ ،‬فإن األداء الجيد‬
‫في بيانات التدريب ال يضمن أننا سنعمل بشكل جيد على البيانات غير المرئية‪ .‬لذلك سنريد عادةً‬
‫تقسيم البيانات المتاحة إلى قسمين‪ :‬مجموعة بيانات التدريب ‪( training dataset‬أو مجموعة‬
‫التدريب ‪ ،)training set‬من أجل معلمات نموذج التعلم ؛ ومجموعة بيانات االختبار ‪test‬‬
‫‪( dataset‬أو مجموعة االختبار ‪ ،) test set‬والتي تم تعليقها للتقييم‪ .‬في نهاية اليوم ‪ ،‬نُبلغ عادةً‬
‫عن أداء نماذجنا على كال القسمين‪ .‬يمكنك التفكير في األداء التدريبي باعتباره مشابهًا للدرجات‬
‫التي يحققها الطالب في امتحانات الممارسة المستخدمة للتحضير المتحان نهائي حقيقي‪ .‬حتى‬
‫لو كانت النتائج مشجعة ‪ ،‬فهذا ال يضمن النجاح في االمتحان النهائي‪ .‬خالل فترة الدراسة ‪ ،‬قد‬
‫يبدأ الطالب في حفظ أسئلة الممارسة ‪ ،‬ويبدو أنه يتقن الموضوع ولكنه يتعثر عند مواجهة أسئلة‬
‫لم تتم رؤيتها من قبل في االختبار النهائي الفعلي‪ .‬عندما يكون أداء النموذج جيدًا في مجموعة‬
‫التدريب ولكنه يفشل في التعميم على البيانات غير المرئية ‪ ،‬فإننا نقول إنه يعاني من فرط التجهيز‬
‫او التعلم ‪ overfitting‬مع بيانات التدريب‪.‬‬

‫‪Optimization Algorithms‬‬ ‫‪1.2.4‬‬


‫بمجرد حصولنا على بعض مصادر البيانات والتمثيل ‪ ،‬ونموذج ‪ ،‬ودالة هدف محددة جيدًا ‪،‬‬
‫نحتاج إ لى خوارزمية قادرة على البحث عن أفضل المعلمات الممكنة لتقليل دالة الخطأ‪ .‬تعتمد‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪36‬‬

‫خوارزميات التحسين الشائعة للتعلم العميق على نهج يسمى التدرج االشتقاقي ‪gradient‬‬
‫‪ descent‬باختصار ‪ ،‬في كل خطوة ‪ ،‬تتحقق هذه الطريقة لترى ‪ ،‬لكل معلمة ‪ ،‬الطريقة التي‬
‫ستتحرك بها خطأ مجموعة التدريب إذا قمت بتشويش هذه المعلمة بمقدار صغير فقط‪ .‬ثم يقوم‬
‫بتحديث المعلمة في االتجاه الذي يقلل من الخطأ‪.‬‬

‫‪1.3‬‬
‫مشكلة كلمة االستيقاظ ‪ Wake‬في مثالنا التحفيزي هي مجرد واحدة من بين العديد من‬
‫المشكالت التي يمكن أن يعالجها التعلم اآللي‪ .‬لتحفيز القارئ بشكل أكبر وتزويدنا ببعض اللغة‬
‫المشتركة التي ستتبعنا في جميع أنحاء الكتاب ‪ ،‬نقدم اآلن نظرة عامة واسعة على مشهد تركيبات‬
‫مشكلة التعلم اآللي‪.‬‬

‫‪Supervised Learning‬‬ ‫‪1.3.1‬‬


‫يصف التعلم الخاضع لإلشراف المهام حيث يتم تزويدنا بمجموعة بيانات تحتوي على كل‬
‫من الميزات ‪ features‬والتسميات ‪ labels‬ويتم تكليفنا بإنتاج نموذج للتنبؤ بالتسميات المعطاة‬
‫لميزات اإلدخال‪ .‬يُطلق على كل زوج من السمات والتسمية (‪ )feature–label pair‬مثاالً‬
‫‪ . Example‬في بعض األحيان ‪ ،‬عندما يكون السياق واضحًا‪ ،‬قد نستخدم مصطلح األمثلة‬
‫لإلشارة إلى مجموعة من المدخالت ‪ ،‬حتى عندما تكون التسميات المقابلة غير معروفة‪ .‬يتم‬
‫تشغيل اإلشراف ألنه من أجل اختيار المعلمات ‪ ،‬فإننا (المشرفون) نوفر للنموذج مجموعة بيانات‬
‫تتكون من أمثلة مصنفة‪ .‬من الناحية االحتمالية ‪ ،‬نحن مهتمون عادةً بتقدير االحتمال الشرطي‬
‫لسمات إدخال معينة‪ .‬في حين أنه مجرد نموذج واحد من بين عدة نماذج في التعلم اآللي ‪ ،‬فإن‬
‫التعلم الخاضع لإلشراف يمثل غالبية التطبيقات الناجحة للتعلم اآللي في الصناعة‪ .‬يرجع ذلك‬
‫جزئيًا إلى أنه يمكن وصف العديد من المهام المهمة بدقة على أنها تقدير احتمالية وجود شيء‬
‫غير معروف في ضوء مجموعة معينة من البيانات المتاحة‪:‬‬

‫توقع اإلصابة بالسرطان مقابل ليس السرطان ‪ ،‬في ضوء صورة التصوير المقطعي‬ ‫•‬
‫بالكمبيوتر‪.‬‬
‫توقع الترجمة الصحيحة باللغة الفرنسية ‪ ،‬مع إعطاء جملة باإلنجليزية‪.‬‬ ‫•‬
‫توقع سعر السهم الشهر المقبل بناءً على بيانات التقارير المالية لهذا الشهر‪.‬‬ ‫•‬

‫بينما يتم التقاط جميع مشكالت التعلم الخاضع لإلشراف من خالل الوصف البسيط "التنبؤ‬
‫بالتسميات المقدمة لميزات اإلدخال" ‪ ،‬يمكن أن يتخذ التعلم تحت اإلشراف أشكالًا متنوعة‬
‫ويتطلب الكثير من قرارات النمذجة ‪ ،‬اعتمادًا على (من بين اعتبارات أخرى) نوع وحجم وكمية‬
‫المدخالت والمخرجات‪ .‬على سبيل المثال ‪ ،‬نستخدم نماذج مختلفة لمعالجة متواليات أطوال‬
‫عشوائية ‪ sequences of arbitrary lengths‬ومعالجة تمثيالت المتجهات ذات الطول الثابت‬
‫‪37‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫‪ .fixed-length vector representations‬سوف نتعمق في العديد من هذه المشاكل خالل‬


‫هذا الكتاب‪.‬‬

‫بشكل غير رسمي ‪ ،‬تبدو عملية التعلم كما يلي‪ .‬أوالً ‪ ،‬احصل على مجموعة كبيرة من األمثلة‬
‫التي تُعرف بها الميزات واختر منها مجموعة فرعية عشوائية ‪ ،‬واكتسب تسميات الحقيقة‬
‫األساسية لكل منها‪ .‬في بعض األحيان ‪ ،‬قد تكون هذه التسميات هي البيانات المتاحة التي تم‬
‫جمعها بالفعل (على سبيل المثال ‪ ،‬هل مات مريض خالل العام التالي؟) وفي أحيان أخرى قد‬
‫نحتاج إلى توظيف شروح بشرية لتسمية البيانات ‪( ،‬على سبيل المثال ‪ ،‬تعيين الصور للفئات)‪.‬‬
‫تشكل هذه المدخالت والتسميات المقابلة معًا مجموعة التدريب‪ .‬نقوم بتغذية مجموعة بيانات‬
‫التدريب في خوارزمية تعلم خاضعة لإلشراف ‪ ،‬وهي دالة تأخذ مجموعة بيانات كمدخالت‬
‫وتخرج دالة أخرى‪ :‬النموذج الذي تم تعلمه‪ .‬أخيرًا ‪ ،‬يمكننا تغذية المدخالت غير المرئية سابقًا‬
‫إلى النموذج الذي تم تعلمه ‪ ،‬باستخدام مخرجاته كتنبؤات للتسمية المقابلة‪ .‬تم رسم العملية‬
‫الكاملة في الشكل ‪.1.3.1‬‬

‫الشكل ‪ 1.3.1‬التعلم الخاضع لإلشراف‪.‬‬

‫‪Regression‬‬ ‫‪1.3.1.1‬‬
‫ربما يكون االنحدار هو أبسط مهمة تعليمية خاضعة لإلشراف لتلتف حولها‪ .‬ضع في اعتبارك‪،‬‬
‫على سبيل المثال ‪ ،‬مجموعة من البيانات التي تم جمعها من قاعدة بيانات مبيعات المنازل‪ .‬قد‬
‫نقوم ببناء جدول ‪ ،‬حيث يتوافق كل صف مع منزل مختلف ‪ ،‬وكل عمود يتوافق مع بعض‬
‫الس مات ذات الصلة ‪ ،‬مثل المساحة المربعة للمنزل ‪ ،‬وعدد غرف النوم ‪ ،‬وعدد الحمامات ‪،‬‬
‫وعدد الدقائق (المشي) ) إلى وسط المدينة‪ .‬في مجموعة البيانات هذه ‪ ،‬سيكون كل مثال منزلًا‬
‫محددًا ‪ ،‬وسيكون متجه الميزة المقابل في صف واحد في الجدول‪ .‬إذا كنت تعيش في نيويورك‬
‫أو سان فرانسيسكو ‪ ،‬ولم تكن الرئيس التنفيذي لشركة ‪ Amazon‬أو ‪ Google‬أو ‪Microsoft‬‬
‫أو ‪ ، Facebook‬فإن (لقطات مربعة ‪ ،‬عدد غرف النوم ‪ ،‬عدد الحمامات ‪ ،‬مسافة سير) ميزة‬
‫متجه لمنزلك قد يبدو مثل‪ .[600,1,1,60] :‬ومع ذلك ‪ ،‬إذا كنت تعيش في بيتسبرغ ‪ ،‬فقد يبدو‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪38‬‬

‫األمر أشبه ]‪ .[3000,4,3,10‬تعد متجهات الميزات ذات الطول الثابت مثل هذه ضرورية لمعظم‬
‫خوارزميات التعلم اآللي الكالسيكية‪.‬‬

‫ما يجعل مشكلة ما هو االنحدار هو في الواقع شكل الهدف‪ .‬قل أنك في السوق للحصول على‬
‫منزل جديد‪ .‬قد ترغب في تقدير القيمة السوقية العادلة للمنزل ‪ ،‬مع األخذ في االعتبار بعض‬
‫الميزات مثل أعاله‪ .‬قد تتكون البيانات هنا من قوائم المنازل التاريخية وقد تكون التسميات هي‬
‫أسعار المبيعات المرصودة‪ .‬عندما تأخذ التسميات قيمًا رقمية عشوائية (حتى ضمن فترة زمنية‬
‫معينة) ‪ ،‬فإننا نسمي هذا مشكلة االنحدار‪ .‬الهدف هو إنتاج نموذج تقارب تنبؤاته بشكل وثيق قيم‬
‫التسمية الفعلية‪.‬‬

‫الكثير من المشاكل العملية توصف بسهولة بأنها مشاكل انحدار‪ .‬يمكن اعتبار توقع التصنيف‬
‫الذي سيخصصه المستخدم لفيلم ما مشكلة انحدار وإذا صممت خوارزمية رائعة إلنجاز هذا‬
‫العمل الفذ في عام ‪ ، 2009‬فربما تكون قد فزت بجائزة ‪ Netflix‬البالغة مليون دوالر‪ .‬توقع‬
‫طول إقامة المرضى في المستشفى هو أيضا مشكلة االنحدار‪ .‬من القواعد األساسية الجيدة أن أي‬
‫كم؟ أو كم عددها؟ يجب أن تشير المشكلة إلى االنحدار ‪ ،‬على سبيل المثال‪:‬‬

‫كم ساعة ستستغرق هذه الجراحة؟‬ ‫•‬


‫كم ستهطل االمطار في هذه البلدة خالل الساعات الست القادمة؟‬ ‫•‬

‫حتى لو لم تكن قد عملت مع التعلم اآللي من قبل‪ ،‬فمن المحتمل أنك عملت من خالل‬
‫مشكلة االنحدار بشكل غير رسمي‪ .‬تخيل ‪ ،‬على سبيل المثال ‪ ،‬أنك قمت بإصالح البالوعات‬
‫الخاصة بك وأن السباك الخاص بك أمضى ‪ 3‬ساعات في إزالة األوساخ من أنابيب الصرف‬
‫الصحي الخاصة بك‪ .‬ثم أرسل لك فاتورة بقيمة ‪ 350‬دوالرًا‪ .‬تخيل اآلن أن صديقك استأجر‬
‫نفس السباك لمدة ساعتين وأنه تلقى فاتورة بقيمة ‪ 250‬دوالرًا‪ .‬إذا سألك شخص ما بعد ذلك‬
‫عن المبلغ الذي تتوقعه في فاتورته القادمة إلزالة المواد غير المرغوب فيها ‪ ،‬فقد تضع بعض‬
‫االفتراضات المعقولة ‪ ،‬مثل زيادة ساعات العمل التي تكلف المزيد من الدوالرات‪ .‬قد تفترض‬
‫أيضًا أن هناك بعض الرسوم األساسية وأن المقاول يتقاضى رسومًا في الساعة‪ .‬إذا كانت هذه‬
‫االفتراضات صحيحة ‪ ،‬فبالنظر إلى هذين المثالين من البيانات ‪ ،‬يمكنك بالفعل تحديد هيكل‬
‫تسعير المقاول‪ 100 :‬دوالر للساعة باإلضافة إلى ‪ 50‬دوالرًا لتظهر في منزلك‪ .‬إذا اتبعت هذا‬
‫كثيرًا ‪ ،‬فأنت بالفعل تفهم الفكرة رفيعة المستوى وراء االنحدار الخطي ‪.linear regression‬‬

‫في هذه الحالة ‪ ،‬يمكننا إنتاج المعلمات التي تتطابق تمامًا مع أسعار السباك‪ .‬في بعض األحيان‬
‫ال يكون هذا ممكنًا ‪ ،‬على سبيل المثال ‪ ،‬إذا كان بعض التباين مدينًا بعدة عوامل إلى جانب‬
‫الميزتين‪ .‬في هذه الحاالت ‪ ،‬سنحاول تعلم النماذج التي تقلل المسافة بين تنبؤاتنا والقيم‬
‫المرصودة‪ .‬في معظم فصولنا ‪ ،‬سنركز على تقليل دالة الخطأ التربيعية ‪squared error loss‬‬
‫‪39‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫‪ .function‬كما سنرى الحقًا ‪ ،‬تتوافق هذه الخطأ مع االفتراض بأن بياناتنا قد تعرضت للتلف‬
‫بسبب الضوضاء الغاوسية ‪.Gaussian noise‬‬

‫‪classification‬‬ ‫‪1.3.1.2‬‬
‫بينما تعتبر نماذج االنحدار رائعة لمعالجة كم عدد؟ األسئلة ‪ ،‬الكثير من المشاكل ال تنحني‬
‫بشكل مريح لهذا القالب‪ .‬ضع في اعتبارك ‪ ،‬على سبيل المثال ‪ ،‬بنكًا يريد تطوير ميزة مسح‬
‫الشيكات لتطبيقه على الهاتف المحمول‪ .‬من الناحية المثالية ‪ ،‬يقوم العميل ببساطة بالتقاط صورة‬
‫للشيك وسيقوم التطبيق تلقائيًا بالتعرف على النص من الصورة‪ .‬بافتراض أن لدينا بعض القدرة‬
‫على تجزئة تصحيحات الصور المقابلة لكل حرف مكتوب بخط اليد ‪ ،‬فإن المهمة األساسية‬
‫المتبقية ستكون تحديد أي حرف من بين مجموعة معروفة يتم تصويره في كل تصحيح صورة‪.‬‬
‫هذه األنواع من أي واحد؟ تسمى المشاكل التصنيف ‪ classification‬وتتطلب مجموعة من‬
‫األدوات مختلفة عن تلك المستخدمة في االنحدار ‪ ،‬على الرغم من أن العديد من التقنيات‬
‫ستستمر‪.‬‬

‫في التصنيف ‪ ،‬نريد أن ينظر نموذجنا في الميزات ‪ ،‬على سبيل المثال ‪ ،‬قيم البكسل في صورة‬
‫ما‪ ،‬ثم يتنبأ بالصنف ‪( category‬تسمى أحيانًا فئة ‪ )class‬من بين مجموعة منفصلة من‬
‫الخيارات ‪ ،‬مثال ينتمي‪ .‬بالنسبة لألرقام المكتوبة بخط اليد ‪ ،‬قد يكون لدينا عشر فئات ‪ ،‬مطابقة‬
‫لألرقام من ‪ 0‬إلى ‪ . 9‬أبسط شكل من أشكال التصنيف هو عندما يكون هناك فئتان فقط ‪ ،‬وهي‬
‫مشكلة نسميها التصنيف الثنائي‪ .binary classification‬على سبيل المثال ‪ ،‬يمكن أن تتكون‬
‫مجموعة البيانات الخاصة بنا من صور للحيوانات وقد تكون تسمياتنا هي الفئات }‪.{cat, dog‬‬
‫بينما في االنحدار ‪ ،‬سعينا إلى معادل إلخراج قيمة عددية ‪ ،‬في التصنيف ‪ ،‬نبحث عن مصنف‬
‫‪ ،classifier‬يكون ناتجه هو تعيين الفئة المتوقعة‪.‬‬

‫ألسباب سوف ندخل فيها عندما يصبح الكتاب أكثر تقنية ‪ ،‬قد يكون من الصعب تحسين‬
‫نموذج يمكن ه فقط إخراج مهمة فئوية صعبة‪ ،‬على سبيل المثال ‪ ،‬إما "قطة" أو "كلب"‪ .‬في هذه‬
‫الحاالت ‪ ،‬يكون من األسهل عادةً التعبير عن نموذجنا بلغة االحتماالت‪ .‬بالنظر إلى ميزات أحد‬
‫األمثلة ‪ ،‬يقوم نموذجنا بتعيين احتمالية لكل فئة ممكنة‪ .‬بالعودة إلى مثال تصنيف الحيوانات‬
‫الخاص ب نا حيث توجد الفئات ‪ ،‬قد يرى المصنف صورة ويخرج احتمالية أن الصورة قطة بقيمة‬
‫‪ . 0.9‬يمكننا تفسير هذا الرقم بالقول إن المصنف متأكد بنسبة ‪ ٪90‬من أن الصورة تصور قطة‪.‬‬
‫ينقل حجم االحتمالية للفئة المتوقعة فكرة واحدة عن عدم اليقين ‪ .uncertainty‬إنها ليست‬
‫الفكرة الوحيدة لعدم اليقين وسنناقش اآلخرين في فصول أكثر تقدمًا‪.‬‬

‫عندما يكون لدينا أكثر من فئتين محتملتين ‪ ،‬فإننا نسمي المشكلة تصنيف متعدد الفئات‬
‫‪ .multiclass classification‬تشمل األمثلة الشائعة التعرف على األحرف المكتوبة بخط اليد‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪40‬‬

‫} … ‪ . {0,1,2, … 9, a, b, c,‬بينما هاجمنا مشاكل االنحدار من خالل محاولة تقليل دالة خسارة‬
‫الخطأ التربيعية ‪ ،‬فإن دالة الخسارة الشائعة لمشاكل التصنيف تسمى االنتروبيا المتقاطعة ‪cross-‬‬
‫‪ ،entropy‬والتي يمكن إزالة الغموض عن اسمها من خالل مقدمة لنظرية المعلومات في الفصول‬
‫الالحقة‪.‬‬

‫الحظ أن الفئ ة األكثر ترجيحًا ليست بالضرورة هي التي ستستخدمها التخاذ قرارك‪ .‬افترض‬
‫أنك وجدت فطرًا جميلًا في الفناء الخلفي الخاص بك كما هو موضح في الشكل ‪.1.3.2‬‬

‫الشكل ‪ - Death cap 1.3.2‬ال تأكل!‬

‫اآلن ‪ ،‬افترض أنك قمت ببناء مصنف ودربته على التنبؤ بما إذا كان الفطر سامًا بناءً على صورة‬
‫فوتوغرافية‪ .‬لنفترض أن مخرجات مصنف اكتشاف السموم لدينا تشير إلى أن احتمال احتواء‬
‫الشكل ‪ 1.3.2‬على فطر سام ‪ Death cap‬هو ‪ .0.2‬بعبارة أخرى ‪ ،‬المصنف متأكد بنسبة ‪٪80‬‬
‫أن الفطر ليس ساماً ‪ .Death cap‬ومع ذلك ‪ ،‬يجب أن تكون أحمق لتأكله‪ .‬وذلك ألن الفائدة‬
‫المؤكدة من تناول عشاء لذيذ ال تساوي ‪ ٪20‬خطر الموت منه‪ .‬وبعبارة أخرى ‪ ،‬فإن تأثير المخاطر‬
‫غير المؤكدة يفوق المنفعة إلى حد بعيد‪ .‬وبالتالي ‪ ،‬من أجل اتخاذ قرار بشأن تناول الفطر ‪ ،‬نحتاج‬
‫إلى حساب عدم االنتظام المتوقع المرتبط بكل إجراء والذي يعتمد على كل من النتائج المحتملة‬
‫والفوائد أو األضرار المرتبطة بكل منها‪ .‬في هذه الحالة ‪ ،‬قد يكون الفقد الناتج عن تناول الفطر‬
‫∞ = ‪ ، 0.2 × ∞ + 0.8 × 0‬في حين أن فقدان التخلص منه هو = ‪0.2 × 0 + 0.8 × 1‬‬
‫‪ . 0.8‬كان حذرنا مبررًا‪ :‬كما يخبرنا أي اختصاصي فطريات ‪ ،‬فإن الفطر في الشكل ‪ 1.3.2‬هو في‬
‫الواقع ‪.Death cap‬‬

‫يمكن أن يصبح التصنيف أكثر تعقيدًا من مجرد التصنيف الثنائي أو متعدد الفئات‪ .‬على سبيل‬
‫المثال ‪ ،‬هناك بعض متغيرات التصنيف التي تتناول الفئات المهيكلة بشكل هرمي‪ .‬في مثل هذه‬
‫الحاالت ‪ ،‬ليست كل األخطاء متساوية ‪ -‬إذا كان يجب علينا أن نخطئ ‪ ،‬فقد نفضل أن نخطئ‬
‫‪41‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫في التصنيف إلى فئة ذات صلة بدالً من فئة بعيدة‪ .‬عادة ‪ ،‬يشار إلى هذا التصنيف الهرمي‬
‫‪ .hierarchical classification‬لإللهام‪ ،‬قد تفكر في ‪ ، Linnaeus‬الذي نظم الحيوانات في‬
‫تسلسل هرمي‪.‬‬

‫في حالة تصنيف الحيوانات‪ ،‬قد ال يكون من السيئ جدًا الخلط بين كلب بودل وشنوزر ‪ ،‬لكن‬
‫نموذجنا سيدفع غرامة كبيرة إذا خلط بين كلب بودل وديناصور‪ .‬قد يعتمد التسلسل الهرمي‬
‫المناسب على كيفية التخطيط الستخدام النموذج‪ .‬على سبيل المثال ‪ ،‬قد تكون األفاعي الجرسية‬
‫والثعابين ذات األربطة قريبة من شجرة النشوء والتطور ‪ ،‬ولكن يمكن أن يكون الخلط بين أفعى‬
‫الجرذ وجرباب مميتًا‪.‬‬

‫‪Tagging‬‬ ‫‪1.3.1.3‬‬
‫تتالءم بعض مشكالت التصنيف بدقة مع إعدادات التصنيف الثنائي أو متعدد الفئات‪ .‬على‬
‫سبيل المثال ‪ ،‬يمكننا تدريب مصنف ثنائي عادي لتمييز القطط عن الكالب‪ .‬نظرًا للحالة الحالية‬
‫للرؤية الحاسوبية ‪ ،‬يمكننا القيام بذلك بسهولة باستخدام أدوات جاهزة‪ .‬ومع ذلك ‪ ،‬بغض النظر‬
‫عن مدى دقة نموذجنا ‪ ،‬فقد نجد أنفسنا في مأزق عندما يصادف المصنف صورة لموسيقي‬
‫المدينة في بريمن ‪ ، Town Musicians of Bremen‬وهي قصة خيالية ألمانية شهيرة تضم‬
‫أربعة حيوانات (الشكل ‪.)1.3.3‬‬

‫الشكل‪ 1.3.3 :‬حمار ‪ ،‬كلب ‪ ،‬قطة ‪ ،‬وديك‪.‬‬


‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪42‬‬

‫كما ترى ‪ ،‬تظهر الصورة قطة وديك وكلب وحمار مع بعض األشجار في الخلفية‪ .‬عندما نتوقع‬
‫مواجهة مثل هذه الصور ‪ ،‬قد ال يكون التصنيف متعدد الفئات هو الصيغة الصحيحة للمشكلة‪.‬‬
‫بدالً من ذلك ‪ ،‬قد نرغب في منح النموذج خيار قول أن الصورة تصور قطة وكلبًا وحمارًا وديكًا‪.‬‬

‫تسمى مشكلة تعلم التنبؤ بالفئات التي ال تستبعد بعضها البعض بالتصنيف متعدد التسميات‬
‫‪ .multi-label classification‬أفضل وصف لمشاكل وضع العالمات التلقائي هو مشاكل‬
‫التصنيف متعدد التصنيفات ‪ .multi-label classification problems‬فكر في العالمات التي‬
‫قد يطبقها األشخاص على المنشورات في مدونة تقنية ‪ ،‬على سبيل المثال ‪" ،‬التعلم اآللي" ‪،‬‬
‫"التكنولوجيا" ‪" ،‬األدوات" ‪" ،‬لغات البرمجة" ‪" ، "Linux" ،‬الحوسبة السحابية" ‪ ."AWS" ،‬قد‬
‫يتم تطبيق ‪ 10-5‬عالمات على المقالة النموذجية‪ .‬عادةً ‪ ،‬ستعرض العالمات بعض بنية االرتباط‬
‫‪ .correlation structure‬من المرجح أن تشير المنشورات حول "الحوسبة السحابية" إلى‬
‫"‪ " AWS‬ومن المرجح أن تشير المشاركات حول "التعلم اآللي" إلى "وحدات معالجة الرسومات‬
‫‪." GPUs‬‬

‫في بعض األحيان ‪ ،‬تعتمد مشاكل وضع العالمات هذه على مجموعات تصنيف هائلة‪ .‬توظف‬
‫المكتبة الوطنية للطب العديد من المعلقين المحترفين الذين يربطون كل مقالة ليتم فهرستها في‬
‫‪ PubMed‬بمجموعة من العالمات المستمدة من األنطولوجيا لعناوين الموضوعات الطبية‬
‫(‪ ، )MeSH‬وهي مجموعة من ‪ 28000‬عالمة تقريبًا‪ .‬يعد وضع عالمات على المقاالت بشكل‬
‫صحيح أمرًا مهمًا ألنه يسمح للباحثين بإجراء مراجعات شاملة لألدبيات‪ .‬هذه عملية تستغرق‬
‫وقتًا طويالً وعادةً ما يكون للمضيفين فترة تأخير لمدة عام واحد بين األرشفة ووضع العالمات‪.‬‬
‫يمكن أن يوفر التعلم اآل لي عالمات مؤقتة حتى يمكن الحصول على مراجعة يدوية مناسبة لكل‬
‫مقالة‪ .‬في الواقع ‪ ،‬لعدة سنوات ‪ ،‬استضافت منظمة ‪ BioASQ‬مسابقات لهذه المهمة‪.‬‬

‫‪Search‬‬ ‫‪1.3.1.4‬‬
‫في مجال استرجاع المعلومات ‪ ،information retrieval‬غالبًا ما نفرض تصنيفات على‬
‫مجموعات من العناصر‪ .‬خذ بحث الويب على سبيل المثال‪ .‬ال يتمثل الهدف في تحديد ما إذا‬
‫كانت صفحة معينة ذات صلة باستعالم ما ‪ ،‬ولكن بدالً من ذلك ‪ ،‬من بين مجموعة النتائج ذات‬
‫الصلة التي يجب عرضها بشكل بارز لمستخدم معين‪ .‬قد يكون أحد الحلول الممكنة هو تعيين‬
‫درجة لكل عنصر في المجموعة أوالً ثم استرداد العناصر ذات التصنيف األعلى‪ .‬كانت‬
‫‪ ، PageRank‬وهي الخلطة السرية األصلية وراء محرك بحث ‪ ، Google‬مثالًا مبكرًا على نظام‬
‫التسجيل هذا‪ .‬ومن الغريب أن الدرجات التي يوفرها نظام ترتيب الصفحات ال تعتمد على‬
‫االستعالم الفعلي‪ .‬بدالً من ذلك ‪ ،‬اعتمدوا على عامل تصفية بسيط لألهمية لتحديد مجموعة‬
‫المرشحين ذوي الصلة ثم استخدموا نظام ترتيب الصفحات ‪ PageRank‬لتحديد أولويات‬
‫الصفحات األكثر موثوقية‪ .‬في الوقت الحاضر ‪ ،‬تستخدم محركات البحث التعلم اآللي والنماذج‬
‫‪43‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫السلوكية ‪ behavioral models‬للحصول على درجات ذات صلة تعتمد على االستعالم‪ .‬هناك‬
‫مؤتمرات أكاديمية كاملة مخصصة لهذا الموضوع‪.‬‬

‫‪Recommender Systems‬‬ ‫‪1.3.1.5‬‬


‫أنظمة التوصية ‪ Recommender Systems‬هي إعداد مشكلة آخر يتعلق بالبحث‬
‫والتصنيف‪ .‬تتشابه المشكالت بقدر ما يتمثل الهدفيف عرض مجموعة من العناصر ذات الصلة‬
‫للمستخدم‪ .‬االختالف الرئيسي هو التركيز على التخصيص لمستخدمين محددينيف سياق أنظمة‬
‫التوصية‪ .‬على سبيل المثال‪ ،‬بالنسبة لتوصيات األفالم‪ ،‬قد تختلف صفحة النتائج لمحبي الخيال‬
‫العلمي وصفحة النتائج لمتذوقي األعمال الكوميدية لبيتر سيلرز اختالفًا كبيرًا‪ .‬تظهر مشكالت‬
‫مماثلةيف إعدادات التوصية األخرى‪ ،‬على سبيل المثال‪ ،‬لمنتجات البيع بالتجزئة والموسيقى‬
‫والتوصية باألخبار‪.‬‬

‫في بعض الحاالت‪ ،‬يقدم العمالء مالحظات صريحة‪ ،‬إلبالغهم بمدى إعجابهم بمنتج معين‬
‫(على سبيل المثال‪ ،‬تقييمات المنتج والمراجعات على ‪ Amazon‬و‪ IMDb‬و‪.)Goodreads‬‬
‫في حاالت أخرى‪ ،‬يقدمون تعليقات ضمنية‪ ،‬على سبيل المثال‪ ،‬عن طريق تخطي العناوينيف ‬
‫قائمة التشغيل‪ ،‬مما قد يشير إلى عدم الرضا‪ ،‬أو قد يشير فقط إلى أن األغنية كانت غير مناسبةيف ‬
‫السياق‪.‬يف أبسط الصيغ‪ ،‬يتم تدريب هذه األنظمة لتقدير بعض النقاط‪ ،‬مثل التصنيف النجمي‬
‫المتوقع أو احتمال قيام مستخدم معين بشراء عنصر معين‪.‬‬

‫بالنظر إلى مثل هذا النموذج‪ ،‬ألي مستخدم معين‪ ،‬يمكننا استرداد مجموعة الكائنات ذات‬
‫الدرجات األكبر‪ ،‬والتي يمكن بعد ذلك التوصية بها للمستخدم‪ .‬تعد أنظمة اإلنتاج أكثر تقدمًا‬
‫بشكل كبير وتأخذيف االعتبار نشاط المستخدم المفصل وخصائص العنصر عند حساب مثل هذه‬
‫الدرجات‪ .‬يعرض الشكل ‪ 1.3.4‬كتب التعلم العميق التي أوصت بها أمازون بناءً على خوارزميات‬
‫التخصيص التي تم ضبطها اللتقاط تفضيالت أستون ‪.Aston’s preferences‬‬

‫على الرغم من قيمتها االقتصادية الهائلة‪ ،‬فإن أنظمة التوصية المبنية بسذاجة على النماذج‬
‫التنبؤية تعاني من بعض العيوب المفاهيمية الخطيرة‪ .‬للبدء‪ ،‬نالحظ فقط التعليقات الخاضعة‬
‫للرقابة‪ :‬يفضل المستخدمون تقييم األفالم التي يشعرون بقوة تجاهها‪ .‬على سبيل المثال‪ ،‬على‬
‫مقياس مكون من خمس نقاط‪ ،‬قد تالحظ أن العناصر تتلقى العديد من التقييمات ذات النجمة‬
‫الواحدة والخمس نجوم ولكن هناك عددًا قليالً من التقييمات الثالث نجوم بشكل واضح‪ .‬عالوة‬
‫على ذلك‪ ،‬غالبًا ما تكون عادات الشراء الحالية نتيجة لخوارزمية التوصية المعمول بها حاليًا‪،‬‬
‫لكن خوارزميات التعلم ال تأخذ دائمًا هذه التفاصيليف االعتبار‪ .‬وبالتالي‪ ،‬من الممكن أن تتشكل‬
‫حلقات التغذية الراجعة حيث يدفع نظام التوصية بشكل تفضيلي عنصرًا يتم أخذه ليكون أفضل‬
‫(بسبب عمليات الشراء األكبر) وبالتالي يوصى به بشكل متكرر أكثر‪ .‬العديد من هذه المشاكل‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪44‬‬

‫المتعلقة بكيفية التعامل مع الرقابة والحوافز وحلقات التغذية الراجعة هي أسئلة بحثية مفتوحة‬
‫ومهمة‪.‬‬

‫الشكل ‪ 1.3.4‬كتب التعلم العميق التي أوصت بها أمازون‪.‬‬

‫‪Sequence Learning‬‬ ‫‪1.3.1.6‬‬


‫حتى اآلن ‪ ،‬نظرنا في المشكالت حيث لدينا عددًا ثابتًا من المدخالت وننتج عددًا ثابتًا من‬
‫المخرجات‪ .‬على سبيل المثال ‪ ،‬أخذنا في االعتبار توقع أسعار المنازل في ضوء مجموعة ثابتة‬
‫من الميزات‪ :‬المساحة بالقدم ال مربع ‪ ،‬وعدد غرف النوم ‪ ،‬وعدد الحمامات ‪ ،‬ووقت العبور إلى‬
‫وسط المدينة‪ .‬ناقشنا أيضًا التعيين من صورة (ذات بُعد ثابت) إلى االحتماالت المتوقعة التي‬
‫تنتمي إليها كل واحدة من بين عدد ثابت من الفئات والتنبؤ بتصنيفات النجوم المرتبطة‬
‫بالمشتريات بناءً على معرف المستخدم ومعرف المنتج وحده‪ .‬في هذه الحاالت ‪ ،‬بمجرد تدريب‬
‫نموذجن ا ‪ ،‬بعد إدخال كل مثال اختبار في نموذجنا ‪ ،‬يتم نسيانه على الفور‪ .‬افترضنا أن المالحظات‬
‫المتتالية كانت مستقلة وبالتالي لم تكن هناك حاجة للتمسك بهذا السياق‪.‬‬

‫ولكن كيف نتعامل مع مقاطع الفيديو ‪video snippets‬؟ في هذه الحالة ‪ ،‬قد يتكون كل‬
‫مقطع ‪ snippet‬من عدد مختلف من اإلطارات‪ .‬وقد يكون تخميننا لما يحدث في كل إطار أقوى‬
‫بكثير إذا أخذنا في االعتبار اإلطارات السابقة أو الالحقة‪ .‬الشيء نفسه ينطبق على اللغة‪ .‬إحدى‬
‫مشكالت التعلم العميق الشائعة هي الترجمة اآللية ‪ :machine translation‬مهمة استيعاب‬
‫الجمل في بعض اللغات المصدر والتنبؤ بترجماتها بلغة أخرى‪.‬‬
‫‪45‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫تحدث هذه المشاكل أيضًا في الطب‪ .‬قد نرغب في نموذج لمراقبة المرضى في وحدة العناية‬
‫المركزة وإطالق التنبيهات عندما يتجاوز خطر الوفاة خالل الـ ‪ 24‬ساعة القادمة بعض العتبة‪ .‬هنا‪،‬‬
‫لن نتخلص من كل ما نعرفه عن تاريخ المريض كل ساعة ‪ ،‬ونقوم بالتنبؤات بناءً على أحدث‬
‫القياسات فقط‪.‬‬

‫تعد هذه المشكالت من بين أكثر التطبيقات إثارة للتعلم اآللي وهي أمثلة على التعلم المتسلسل‬
‫‪ .sequence learning‬إنها تتطلب نموذجًا إما الستيعاب تسلسالت من المدخالت أو إلصدار‬
‫تسلسالت من المخرجات (أو كليهما)‪ .‬على وجه التحديد ‪ ،‬يأخذ التعلم من التسلسل إلى‬
‫التسلسل ‪ sequence-to-sequence learning‬في االعتبار المشكالت التي تتكون فيها‬
‫المدخالت والمخرجات من متواليات متغيرة الطول‪ .‬تشمل األمثلة الترجمة اآللية ونسخ الكالم‬
‫إلى نص ‪ .speech-to-text transcription‬في حين أنه من المستحيل مراعاة جميع أنواع‬
‫تحويالت التسلسل ‪ ،‬فإن الحاالت الخاصة التالية تستحق الذكر‪.‬‬

‫العالمات والتحليل ‪ .Tagging and Parsing‬يتضمن هذا التعليق على تسلسل نصي‬
‫بالسمات‪ .‬هنا ‪ ،‬تتم محاذاة المدخالت والمخرجات ‪ ،‬أي أنها من نفس العدد وتحدث بترتيب‬
‫مطابق‪ .‬على سبيل المثال ‪ ،‬في وضع العالمات على جزء من الكالم )‪part-of-speech (PoS‬‬
‫‪ ، tagging‬نقوم بتعليق توضيحي لكل كلمة في جملة مع الجزء المقابل من الكالم ‪ ،‬أي "اسم"‬
‫أو "كائن مباشر"‪ .‬بدالً من ذلك ‪ ،‬قد نرغب في معرفة مجموعات الكلمات المتجاورة التي تشير‬
‫إلى كيانات محددة ‪ ،‬مثل األشخاص أو األماكن أو المؤسسات‪ .‬في المثال الكرتوني البسيط أدناه‪،‬‬
‫قد نرغب فقط في اإلشارة ‪ ،‬لكل كلمة في الجملة ‪ ،‬إلى ما إذا كانت جزءًا من كيان مسمى (يُشار‬
‫‪ tagged‬إليه باسم "‪.) "Ent‬‬

‫‪Tom has dinner in Washington with Sally‬‬


‫‪Ent -‬‬ ‫‪-‬‬ ‫‪-‬‬ ‫‪Ent‬‬ ‫‪-‬‬ ‫‪Ent‬‬
‫التعرف التلقائي على الكالم ‪ .Automatic Speech Recognition‬مع التعرف على‬
‫الكالم ‪ ،‬يكون تسلسل اإلدخال عبارة عن تسجيل صوتي لمكبر الصوت (الشكل ‪،)1.3.5‬‬
‫واإلخراج عبارة عن نسخة نصية لما قاله المتحدث‪ .‬التحدي هو أن هناك العديد من اإلطارات‬
‫الصوتية (يتم أخذ عينات الصوت عادةً عند ‪ 8‬كيلو هرتز أو ‪ 16‬كيلو هرتز) من النص ‪ ،‬أي أنه ال‬
‫يوجد تطابق ‪ 1 :1‬بين الصوت والنص ‪ ،‬حيث قد تتوافق آالف العينات مع كلمة منطوقة واحدة‪.‬‬
‫هذه هي مشاكل التعلم من التسلسل إلى التسلسل ‪ ،‬حيث يكون الناتج أقصر بكثير من المدخالت‪.‬‬

‫الشكل ‪ - D-e-e-p- L-ea-r-ni-ng:1.3.5‬في تسجيل صوتي‪.‬‬


‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪46‬‬

‫النص إلى الكالم ‪ .Text to Speech‬هذا هو عكس التعرف التلقائي على الكالم‪ .‬هنا‪،‬‬
‫اإلدخال عبارة عن نص والمخرج عبارة عن ملف صوتي‪ .‬في هذه الحالة ‪ ،‬يكون اإلخراج أطول‬
‫بكثير من اإلدخال‪ .‬في حين أن البشر بارعون بشكل ملحوظ في التعرف على الكالم ‪ ،‬حتى من‬
‫الصوت منخفض الجودة ‪ ،‬فإن جعل أجهزة الكمبيوتر تؤدي هذا العمل الفذ يمثل تحديًا هائالً‪.‬‬

‫الترجمة اآللية ‪ .Machine Translation‬على عكس حالة التعرف على الكالم ‪ ،‬حيث‬
‫تحدث المدخالت والمخرجات المقابلة بنفس الترتيب ‪ ،‬في الترجمة اآللية ‪ ،‬تشكل البيانات غير‬
‫المحاذاة تحديًا جديدًا‪ .‬هنا يمكن أن يكون لتسلسل اإلدخال واإلخراج أطوال مختلفة ‪ ،‬وقد تظهر‬
‫المناطق المقابلة من التسلسالت المعنية في أوامر مختلفة‪ .‬تأمل المثال التوضيحي التالي للميل‬
‫الغريب لأللمان لوضع األفعال في نهاية الجمل‪:‬‬

‫‪German:‬‬ ‫‪Haben Sie sich schon dieses grossartige‬‬


‫?‪Lehrwerk angeschaut‬‬
‫‪English:‬‬ ‫‪Did you already check out this excellent‬‬
‫?‪tutorial‬‬
‫‪Wrong alignment:‬‬ ‫‪Did you yourself already this excellent‬‬
‫?‪tutorial looked-at‬‬
‫تظهر العديد من المشكالت ذات الصلة في مهام التعلم األخرى‪ .‬على سبيل المثال ‪ ،‬تحديد‬
‫الترتيب الذي يقرأ به المستخدم صفحة ويب هو مشكلة تحليل تخطيط ثنائي األبعاد ‪Modern‬‬
‫‪ .drowsiness detection in Deep Learning: a review‬تعرض مشاكل الحوار جميع‬
‫أنواع التعقيدات اإلضافية ‪ ،‬حيث يتطلب تحديد ما سيقال بعد ذلك مراعاة معرفة العالم الحقيقي‬
‫والحالة السابقة للمحادثة عبر مسافات زمنية طويلة‪ .‬هذه هي مجاالت البحث النشطة‪.‬‬

‫‪Self-‬‬ ‫‪Unsupervised‬‬ ‫‪1.3.2‬‬


‫‪Supervised‬‬
‫ركزت األمثلة السابقة على التعلم الخاضع لإلشراف ‪ ،supervised learning‬حيث نقوم‬
‫بتغذية النموذج ب مجموعة بيانات عمالقة تحتوي على كل من الميزات وقيم التسمية المقابلة‪.‬‬
‫يمكنك التفكير في أن المتعلم الخاضع لإلشراف لديه وظيفة متخصصة للغاية ورئيس ديكتاتوري‬
‫للغاية‪ .‬يقف الرئيس فوق كتفه ويخبره بالضبط بما يجب القيام به في كل موقف حتى تتعلم‬
‫التخطيط من المواقف إلى اإلجراءات‪ .‬يبدو أن العمل لدى مثل هذا الرئيس ضعيف جدًا‪ .‬من‬
‫ناحية أخرى ‪ ،‬فإن إرضاء مثل هذا الرئيس أمر سهل للغاية‪ .‬أنت فقط تتعرف على النمط بأسرع‬
‫ما يمكن وتقليد أفعالهم‪.‬‬

‫بالنظر إلى الموقف المعاكس ‪ ،‬قد يكون من المحبط العمل لدى رئيس ليس لديه فكرة عما‬
‫يريدون منك القيام به‪ .‬ومع ذلك ‪ ،‬إذا كنت تخطط ألن تكون عالم بيانات ‪ ،‬فمن األفضل أن تعتاد‬
‫عليها‪ .‬قد يقوم المدير بتسليمك كمية هائلة من البيانات ويخبرك بالقيام ببعض علوم البيانات‬
‫‪47‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫باستخدامها! هذا يبدو غامضا ألنه كذلك‪ .‬نحن نطلق على هذه الفئة من المشكالت اسم التعلم‬
‫غير الخاضع لإلشراف ‪ ،unsupervised learning‬ونوع وعدد األسئلة التي يمكن أن نطرحها‬
‫يقتصر على إبداعنا فقط‪ .‬سوف نتناول تقنيات التعلم غير الخاضعة لالشراف في فصول الحقة‪.‬‬
‫إلثارة شهيتك في الوقت الحالي ‪ ،‬نصف بعض األسئلة التالية التي قد تطرحها‪.‬‬

‫هل يمكننا العثور على عدد صغير من النماذج األولية التي تلخص البيانات بدقة؟‬ ‫•‬
‫بالنظر إلى مجموعة من الصور ‪ ،‬هل يمكننا تجميعها في صور مناظر طبيعية وصور‬
‫للكالب والرضع والقطط وقمم الجبال؟ وبالمثل ‪ ،‬في ضوء مجموعة من أنشطة‬
‫تصفح المستخدمين‪ ،‬هل يمكننا تجميعها في مستخدمين لديهم سلوك مشابه؟‬
‫تُعرف هذه المشكلة عادةً باسم التجميع ‪.clustering‬‬
‫هل يمكننا العثور على عدد صغير من المعلمات التي تلتقط بدقة الخصائص ذات‬ ‫•‬
‫الصلة للبيانات؟ مسارات الكرة موصوفة جيدًا حسب سرعة الكرة وقطرها وكتلتها‪.‬‬
‫لقد طور الخياطون عددًا صغيرًا من المعلمات التي تصف شكل جسم اإلنسان بدقة‬
‫إلى حد ما لغرض مالءمة المالبس‪ .‬يشار إلى هذه المشاكل باسم تقدير الفضاء‬
‫الجزئي ‪ .subspace estimation‬إذا كان االعتماد خطيًا ‪ ،linear‬فإنه يسمى‬
‫تحليل المكون األساسي )‪.Principal Component Analysis(PCA‬‬
‫هل هناك تمثيل للكائنات (منظم بشكل تعسفي ‪ )arbitrarily structured‬في‬ ‫•‬
‫الفضاء اإلقليدي بحيث يمكن مطابقة الخصائص الرمزية بشكل جيد؟ يمكن‬
‫استخدام هذا لوصف الكيانات وعالقاتها ‪ ،‬مثل "روما" ‪" -‬إيطاليا" ‪" +‬فرنسا" =‬
‫"باريس"‪.‬‬
‫هل هناك وصف لألسباب الجذرية لكثير من البيانات التي نالحظها؟ على سبيل‬ ‫•‬
‫المثا ل ‪ ،‬إذا كانت لدينا بيانات ديموغرافية حول أسعار المنازل والتلوث والجريمة‬
‫والموقع والتعليم والرواتب ‪ ،‬فهل يمكننا اكتشاف كيفية ارتباطها بناءً على البيانات‬
‫التجريبية ‪empirical data‬؟ المجاالت المعنية بالسببية ‪ causality‬والنماذج‬
‫الرسومية االحتمالية ‪ probabilistic graphical models‬تعالج مثل هذه األسئلة‪.‬‬
‫التطور األخير المهم والمثير في التعلم غير الخاضع لإلشراف هو ظهور النماذج‬ ‫•‬
‫التوليدية العميقة ‪ .deep generative models‬تقدر هذه النماذج كثافة البيانات‪،‬‬
‫سواء بشكل صريح أو ضمني‪ .‬بمجرد التدريب ‪ ،‬يمكننا استخدام نموذج توليدي إما‬
‫لتسجيل األمثلة وفقًا لمدى احتمالية وجودها ‪ ،‬أو ألخذ عينات من األمثلة التركيبية‬
‫من التوزيع المكتسب‪ .‬جاءت اختراقات التعلم العميق المبكرة في النمذجة التوليدية‬
‫مع اختراع المشفرات التلقائية المتنوعة ‪variational autoencoders‬‬
‫( ‪ )2014 ،Kingma and Welling‬واستمرت في تطوير شبكات الخصومة‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪48‬‬

‫التوليدية ‪،Goodfellow et al. ( generative adversarial networks‬‬


‫‪ .)2014‬تشمل التطورات الحديثة تطبيع التدفقات ‪ normalizing flows‬ونماذج‬
‫االنتشار ‪ diffusion models‬والنماذج القائمة على النقاط ‪score-based‬‬
‫‪.models‬‬

‫كان أحد التطورات الرئيسيةيف التعلم غير الخاضع لإلشراف هو ظهور التعلم تحت اإلشراف‬
‫الذاتي ‪ ،self-supervised learning‬وهي التقنيات التي تستفيد من بعض جوانب البيانات غير‬
‫المصنفة لتوفير اإلشراف‪ .‬بالنسبة للنصوص‪ ،‬يمكننا تدريب النماذج على "ملء الفراغات ‪fill in‬‬
‫‪ " the blanks‬من خالل التنبؤ بالكلمات المقنعة عشوائيًا باستخدام الكلمات المحيطة بها‬
‫(السياقات ‪) contexts‬يف مجموعات كبيرة دون بذل أي جهديف وضع العالمات ( ‪Devlin et‬‬
‫‪ !)2018 ،al.‬بالنسبة للصور‪ ،‬قد نقوم بتدريب النماذج إلخبار الموضع النسبي بين منطقتين تم‬
‫اقتصاصهما من نفس الصورة (‪ ،)2015 ،Doersch et al.‬للتنبؤ بجزء مغلق من الصورة بناءً‬
‫على األجزاء المتبقية من الصورة‪ ،‬أو للتنبؤ بما إذا كان مثاالن هما إصدارات مضطربة من نفس‬
‫الصورة األساسية‪ .‬غالبًا ما تتعلم النماذج الخاضعة لإلشراف الذاتي التمثيالت التي يتم االستفادة‬
‫منها الحقًا عن طريق ضبط النماذج الناتجةيف بعض المهام النهائية ذات األهمية‪.‬‬

‫‪Interacting with an Environment‬‬ ‫‪1.3.3‬‬


‫حتى اآلن‪ ،‬لم نناقش من أين تأتي البيانات فعليًا‪ ،‬أو ما يحدث بالفعل عندما يولد نموذج التعلم‬
‫اآللي مخرجات‪ .‬وذلك ألن التعلم تحت اإلشراف والتعلم غير الخاضع لإلشراف ال يعالجان هذه‬
‫القضايا بطريقة معقدة للغاية‪.‬يف كلتا الحالتين‪ ،‬نحصل على كومة كبيرة من البيانات مقدمًا‪ ،‬ثم‬
‫نضع آالت التعرف على األنماط الخاصة بنايف حالة حركة دون التفاعل مع البيئة مرة أخرى‪ .‬نظرًا‬
‫ألن التعلم كله يحدث بعد فصل الخوارزمية عن البيئة‪ ،‬يُسمى هذا أحيانًا التعلم االوفالين‬
‫‪ .offline learning‬على سبيل المثال‪ ،‬يفترض التعلم الخاضع لإلشراف نمط التفاعل البسيط‬
‫الموضحيف الشكل ‪.1.3.6‬‬

‫الشكل ‪ 1.3.6‬جمع البيانات للتعلم الخاضع لإلشراف من بيئة ما‪.‬‬


‫‪49‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫إن بساطة التعلم االوفالين له سحره‪ .‬الجانب اإليجابي هو أنه يمكننا القلق بشأن التعرف على‬
‫األنماط بشكل منفصل ‪ ،‬دون القلق بشأن المضاعفات الناشئة عن التفاعالت مع بيئة ديناميكية‪.‬‬
‫لكن صياغة هذه المشكلة محدودة‪ .‬إذا نشأت في قراءة روايات روبوت ‪ ، Asimov‬فقد تتخيل‬
‫عمالء ذكاء اصطناعيًا ليسوا ف قط قادرين على التنبؤ ‪ ،‬ولكن أيضًا على اتخاذ اإلجراءات في‬
‫العالم‪ .‬نريد أن نفكر في العوامل الذكية‪ ،‬وليس فقط النماذج التنبؤية‪ .‬هذا يعني أننا بحاجة إلى‬
‫التفكير في اختيار اإلجراءات‪ ،‬وليس مجرد التنبؤ‪ .‬على عكس مجرد التنبؤات ‪ ،‬تؤثر اإلجراءات‬
‫فعليًا على البيئة‪ .‬إذا أردنا تدريب وكيل ذكي ‪ ،,intelligent agent‬يجب أن نحسب الطريقة‬
‫التي قد تؤثر بها أفعاله على المالحظات المستقبلية للوكيل ‪.agent‬‬

‫إن التفكير في التفاعل مع البيئة يفتح مجموعة كاملة من أسئلة النمذجة الجديدة‪ .‬ما يلي مجرد‬
‫أمثلة قليلة‪.‬‬

‫هل تتذكر البيئة ما فعلناه سابقًا؟‬ ‫•‬


‫هل تريد البيئة مساعدتنا‪ ،‬على سبيل المثال‪ ،‬مستخدم يقرأ النص في أداة التعرف‬ ‫•‬
‫على الكالم؟‬
‫هل تريد البيئة التغلب علينا‪ ،‬على سبيل المثال‪ ،‬تغيير مرسلي البريد اإللكتروني‬ ‫•‬
‫العشوائي لتفادي عوامل تصفية البريد العشوائي؟‬
‫هل البيئة لديها ديناميات متغيرة؟ على سبيل المثال‪ ،‬هل تشبه البيانات المستقبلية‬ ‫•‬
‫الماضي دائمًا أم أن األنماط تتغير بمرور الوقت‪ ،‬إما بشكل طبيعي أو استجابة ألدواتنا‬
‫اآللية؟‬

‫تثير هذه األسئلة مشكلة تحول التوزيع ‪ ،distribution shift‬حيث تختلف بيانات التدريب‬
‫واالختبار‪ .‬لقد واجه معظمنا هذه المشكلة عند إجراء اال ختبارات التي كتبها محاضر ‪ ،‬بينما كان‬
‫الواجب المنزلي مؤلفًا من قبل مساعديهم التدريسيين‪ .‬بعد ذلك ‪ ،‬نصف بإيجاز التعلم المعزز‬
‫‪ ،reinforcement learning‬وهو إطار عمل ثري لطرح مشاكل التعلم التي يتفاعل فيها الوكيل‬
‫مع البيئة‪.‬‬

‫‪Reinforcement Learning‬‬ ‫‪1.3.4‬‬


‫إذا كنت مهتمًا باستخدام التعلم اآللي لتطوير عامل يتفاعل مع بيئة ويتخذ إجراءات‪ ،‬فمن‬
‫المحتمل أن ينتهي بك األمر بالتركيز على التعلم المعزز ‪ .reinforcement learning‬قد يشمل‬
‫ذلك تطبيقات للروبوتات وأنظمة الحوار وحتى تطوير الذكاء االصطناعي (‪ )AI‬أللعاب الفيديو‪.‬‬
‫لقد ازدادت شعبية التعلم المعزز العميق ‪ ، Deep reinforcement learning‬الذي يطبق‬
‫التعلم العميق لمشاكل التعلم المعزز‪ .‬إن شبكة ‪ Q-network‬العميقة التي تغلبت على البشر‬
‫في ألعاب ‪ Atari‬باستخدام المدخالت المرئية فقط( ‪ ، )2015 ،Mnih et al.‬وبرنامج‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪50‬‬

‫‪ AlphaGo‬الذي فاز عالى بطل العالم في لعبة اللوحة ‪ )2016 ،.Silver et al( Go‬هما مثاالن‬
‫بارزان‪.‬‬

‫يقدم التعلم المعزز بيانًا عامًا جدًا للمشكلة ‪ ،‬حيث يتفاعل الوكيل ‪ agent‬مع بيئة عبر سلسلة‬
‫من الخطوات الزمنية ‪ .time steps‬في كل خطوة زمنية ‪ ،‬يتلقى الوكيل بعض المالحظات‬
‫‪ observation‬من البيئة ويجب عليه اختيار إجراء ‪ action‬يتم نقله الحقًا إلى البيئة عبر آلية ما‬
‫(تسمى أحيانًا المشغل ‪ .)actuator‬أخيرًا ‪ ،‬يتلقى الوكيل مكافأة ‪ reward‬من البيئة‪ .‬هذه العملية‬
‫موضحة في الشكل ‪ .1.3.7‬ثم يتلقى الوكيل مالحظة الحقة ‪،subsequent observation‬‬
‫ويختار إجراءً الحقًا ‪ ،‬وما إلى ذلك‪ .‬يخضع سلوك عامل التعلم المعزز لسياسة ‪ .policy‬باختصار‪،‬‬
‫السياسة هي مجرد دالة تقوم بالتخطيط من مالحظات البيئة إلى اإلجراءات‪ .‬الهدف من التعلم‬
‫المعزز هو إنتاج سياسات جيدة‪.‬‬

‫الشكل ‪ 1.3.7‬التفاعل بين التعلم المعزز والبيئة‪.‬‬

‫من الصعب المبالغة في عمومية إطار التعلم المعزز‪ .‬على سبيل المثال ‪ ،‬يمكننا أن نلقي‬
‫بمشاكل التعلم الخاضع ل إلشراف على أنها مشاكل تعلم معزز‪ .‬لنفترض أن لدينا مشكلة في‬
‫التصنيف‪ .‬يمكننا إنشاء عامل تعلم معزز بإجراء واحد يتوافق مع كل فئة‪ .‬يمكننا بعد ذلك إنشاء‬
‫بيئة تمنح مكافأة تساوي تمامًا دالة الخطأ من مشكلة التعلم األصلية الخاضعة لإلشراف‪.‬‬

‫ومع ذلك ‪ ،‬يمكن أن يعالج التعلم المعزز أيضًا العديد من المشكالت التي ال يستطيع التعلم‬
‫الخاضع لإلشراف القيام بها‪ .‬على سبيل المثال ‪ ،‬في التعلم الخاضع لإلشراف‪ ،‬نتوقع دائمًا أن‬
‫تكون مدخالت التدريب مرتبطة بالتسمية الصحيحة‪ .‬لكن في التعلم المعزز‪ ،‬ال نفترض أنه بالنسبة‬
‫لكل مالحظة تخبرنا البيئة بالعمل األمثل‪ .‬بشكل عام ‪ ،‬نحن فقط نحصل على بعض المكافآت‪.‬‬
‫عالوة على ذلك ‪ ،‬قد ال تخبرنا البيئة حتى عن اإلجراءات التي أدت إلى المكافأة‪.‬‬
‫‪51‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫تأمل في لعبة الشطرنج‪ .‬تأتي إشارة المكافأة الحقيقية الوحيدة في نهاية اللعبة عندما نفوز ‪،‬‬
‫ونكسب مكافأة ‪ ،‬على سبيل المثال‪ ، 1 ،‬أو عندما نخسر ‪ ،‬نحصل على مكافأة ‪ ،‬على سبيل‬
‫المثال‪ .-1 ،‬لذا يجب على المتعلمين المعززين ‪ Reinforcement learners‬التعامل مع‬
‫مشكلة تعيين االئتمان ‪ :credit assignment problem‬تحديد اإلجراءات التي يجب إلقاء‬
‫اللوم عليها في النتيجة‪ .‬الشيء نفسه ينطبق على الموظف الذي حصل على ترقية في ‪ 11‬أكتوبر‪.‬‬
‫من المحتمل أن تعكس هذه الترقية عددًا كبيرًا من اإلجراءات المختارة جيدًا خالل العام السابق‪.‬‬
‫يتطلب الحصول على المزيد من الترقيات في المستقبل معرفة اإلجراءات التي أدت إلى الترقية‪.‬‬

‫قد يضطر المتعلمون المعززون أيضًا إلى التعامل مع مشكلة المالحظة الجزئية ‪partial‬‬
‫‪ .observability‬أي أن المالحظة الحالية قد ال تخبرك بكل شيء عن حالتك الحالية‪ .‬لنفترض‬
‫أن روبوت التنظيف وجد نفسه محاصرًا في واحدة من العديد من الخزانات المماثلة في المنزل‪.‬‬
‫قد يتطلب استنتاج الموقع الدقيق للروبوت النظر في مالحظاته السابقة قبل دخول الخزانة‪.‬‬

‫أخيرًا ‪ ،‬في أي نقطة معينة‪ ،‬قد يعرف متعلمو التعزيز سياسة جيدة واحدة ‪ ،‬ولكن قد يكون‬
‫هناك العديد من السياسات األفضل األخرى التي لم يجربها الوكيل مطلقًا‪ .‬يجب على متعلم‬
‫التعزيز أن يختار باستمرار ما إذا كان سيستغل أفضل استراتيجية معروفة (حاليًا) كسياسة ‪ ،‬أو‬
‫استكشاف مساحة االستراتيجيات‪ ،‬مما قد يتخلى عن بعض المكافآت قصيرة المدى في مقابل‬
‫المعرفة‪.‬‬

‫مشكلة التعلم المعزز العامة هي بيئة عامة للغاية ‪ .very general setting‬تؤثر اإلجراءات‬
‫على المالحظات الالحقة‪ .‬يتم مالحظة المكافآت فقط وفقًا لإلجراءات المختارة‪ .‬قد تتم مالحظة‬
‫البيئة بشكل كامل أو جزئي‪ .‬قد يسأل الكثير من الباحثين عن تفسير كل هذا التعقيد دفعة واحدة‪.‬‬
‫عالوة على ذلك‪ ،‬ال تظهر كل مشكلة عملية كل هذا التعقيد‪ .‬نتيجة لذلك ‪ ،‬درس الباحثون عددًا‬
‫من الحاالت الخاصة لمشاكل التعلم المعزز‪.‬‬

‫عندما تتم مالحظة البيئة بالكامل‪ ،‬فإننا نطلق على مشكلة التعلم المعزز عملية قرار ماركوف‬
‫‪ .Markov decision process‬عندما ال تعتمد الحالة على اإلجراءات السابقة ‪ ،‬فإننا نطلق على‬
‫المشكلة اسم مشكلة قطاع الطرق السياقية ‪ .contextual bandit problem‬عندما ال تكون‬
‫هناك حالة ‪ ،‬فقط مجموعة من اإلجراءات المتاحة مع مكافآت غير معروفة في البداية ‪ ،‬فإن هذه‬
‫المشكلة هي مشكلة ماكينات األلعاب المتعددة الكالسيكية ‪classic multi-armed bandit‬‬
‫‪.problem‬‬

‫‪Roots‬‬ ‫‪1.4‬‬
‫لقد راجعنا للتو مجموعة فرعية صغيرة من المشكالت التي يمكن للتعلم اآللي معالجتها‪.‬‬
‫بالنسبة لمجموعة متنوعة من مشكالت التعلم اآللي‪ ،‬يوفر التعلم العميق أدوات قوية لحلها‪ .‬على‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪52‬‬

‫الرغم من أن العديد من أساليب التعلم العميق هي اختراعات حديثة ‪ ،‬فقد تمت دراسة األفكار‬
‫األساسية وراء التعلم من البيانات لعدة قرون‪ .‬في الواقع ‪ ،‬كان لدى البشر الرغبة في تحليل البيانات‬
‫والتنبؤ بالنتائج المستقبلية لفترة طويلة والكثير من العلوم الطبيعية لها جذورها في ذلك‪ .‬على‬
‫سبيل المثال ‪ ،‬تمت تسمية توزيع برنولي ‪ Bernoulli distribution‬على اسم جاكوب برنولي‬
‫(‪ ،)1655-1705‬واكتشف كارل فريدريش غاوس(‪ )1855-1777‬التوزيع الغاوسي‬
‫‪ .Gaussian distribution‬اخترع‪ ،‬على سبيل المثال ‪ ،‬خوارزمية المربعات األقل متوسطًا ‪least‬‬
‫‪ ، mean squares algorithm‬والتي ال تزال تُستخدم حتى اليوم لمشاكل ال حصر لها من‬
‫حسابات التأمين إلى التشخيص الطبي‪ .‬أدت هذه األدوات إلى ظهور نهج تجريبي في العلوم‬
‫الطبيعية ‪ -‬على سبيل المثال ‪ ،‬قانون أوم المتعلق بالتيار والجهد في المقاوم موصوفًا تمامًا‬
‫بواسطة نموذج خطي‪.‬‬

‫حتى في العصور الوسطى ‪ ،‬كان لدى علماء الرياضيات حدس شديد للتقديرات‪ .‬على سبيل‬
‫المثال ‪ ،‬يوضح كتاب الهندسة لجاكوب كوبيل (‪ )1533-1460‬متوسط طول قدم الرجل البالغ‬
‫‪ 16‬لتقدير متوسط طول القدم في السكان (الشكل ‪.)1.4.1‬‬

‫شكل ‪ 1.4.1‬تقدير طول القدم‪.‬‬


‫‪53‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫عندما خرجت مجموعة من األفراد من الكنيسة ‪ ،‬طُلب من ‪ 16‬رجالً بالغًا الوقوف في صف‬
‫واحد وقياس أقدامهم‪ .‬ثم تم قسمة مجموع هذه القياسات على ‪ 16‬للحصول على تقدير لما‬
‫يصل اآلن إلى قدم واحدة‪ .‬تم تحسين هذه "الخوارزمية" فيما بعد للتعامل مع األقدام المشوهة‪.‬‬
‫تم طرد الرجلين ذوي أقصر وأطول أقدام ‪ ،‬بمتوسط أكثر من الباقي فقط‪ .‬هذا من بين األمثلة‬
‫المبكرة لتقدير المتوسط المقطوع ‪.trimmed mean estimate‬‬

‫لقد انطلقت اإلحصائيات حقًا من خالل جمع البيانات وتوافرها‪ .‬ساهم أحد روادها ‪ ،‬رونالد‬
‫فيشر (‪ ، )1962-1890‬بشكل كبير في نظريتها وتطبيقاتها أيضًا في علم الوراثة‪ .‬ال تزال العديد‬
‫من خوارزمياته (مثل تحليل التمايز الخطي ‪ )linear discriminant analysis‬والصيغ (مثل‬
‫مصفوفة معلومات فيشر ‪ )Fisher information matrix‬تحتل مكانة بارزة في أسس اإلحصاء‬
‫الحديث‪ .‬حتى موارد البيانات الخاصة به كان لها تأثير دائم‪ .‬ال تزال مجموعة بيانات ‪ Iris‬التي‬
‫أصدرها فيشر في عام ‪ 1936‬مستخدمة أحيانًا إلثبات خوارزميات التعلم اآللي‪ .‬كان فيشر أيضًا‬
‫مؤيدًا لعلم تحسين النسل ‪ ،eugenics‬والذي يجب أن يذكرنا بأن االستخدام المشكوك فيه‬
‫أخالقياً لعلم البيانات له تاريخ طويل ودائم مثل استخدامه المنتج في الصناعة والعلوم الطبيعية‪.‬‬

‫جاء التأثير الثاني للتعلم اآللي من نظرية المعلومات لكلود شانون (‪ )2001-1916‬ونظرية‬
‫الحساب عبر آالن تورينج (‪ .)1954-1912‬طرح تورينج السؤال "هل يمكن لآلالت أن تفكر؟"‬
‫في مقالته الشهيرة ‪ .)Turing, 1950( Computing Machinery and Intelligence‬في‬
‫ما وصفه باختبار تورينج ‪ ،Turing test‬يمكن اعتبار اآللة ذكية ‪ intelligent‬إذا كان من الصعب‬
‫على المقيم البشري التمييز بين الردود من اآللة واإلنسان بناءً على التفاعالت النصية‪.‬‬

‫يمكن العثور على تأثير آخر في علم األعصاب ‪ neuroscience‬وعلم النفس ‪.psychology‬‬
‫بعد كل شيء‪ ،‬من الواضح أن البشر يظهرون سلوكًا ذكيًا‪ .‬تساءل العديد من العلماء عما إذا كان‬
‫بإمكان المرء تفسير هذه القدرة وربما عكسها‪ .‬أحد أقدم الخوارزميات المستوحاة من الناحية‬
‫البيولوجية صاغها دونالد هب (‪ .)1985-1904‬في كتابه الرائد تنظيم السلوك ‪The‬‬
‫‪ ، )1949 ،Hebb and Hebb( Organization of Behavior‬افترض أن الخاليا العصبية‬
‫تتعلم من خالل التعزيز اإليجابي‪ .‬أصبح هذا معروفًا باسم قاعدة التعلم ‪ .Hebbian‬هذه األفكار‬
‫المستوحاة من أعمال الحقة مثل خوارزمية تعلم اإلدراك الحسي لروزنبالت ‪Rosenblatt’s‬‬
‫‪ perceptron learning‬ووضعت األسس للعديد من خوارزميات التدرج االشتقاقي العشوائي‬
‫التي تدعم التعلم العميق اليوم‪ :‬تعزيز السلوك المرغوب وتقليل السلوك غير المرغوب فيه‬
‫للحصول على إعدادات جيدة للمعلمات في الشبكة العصبية‪.‬‬

‫اإللهام البيولوجي ‪ Biological inspiration‬هو ما أعطى الشبكات العصبية اسمها‪ .‬ألكثر‬


‫من قرن (يعود تاريخها إلى نماذج ألكسندر باين ‪ 1873 ،‬وجيمس شيرينجتون ‪ ، )1890 ،‬حاول‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪54‬‬

‫الباحثون تجميع دوائر حسابية تشبه شبكات الخاليا العصبية المتفاعلة‪ .‬بمرور الوقت ‪ ،‬أصبح‬
‫تفسير علم األحياء أقل حرفية ‪ ،‬لكن االسم عالق‪ .‬تكمن في جوهرها بعض المبادئ األساسية‬
‫التي يمكن العثور عليها في معظم الشبكات اليوم‪:‬‬

‫غالبًا ما يشار إلى تبديل وحدات المعالجة الخطية وغير الخطية باسم الطبقات‬ ‫•‬
‫‪.layers‬‬
‫استخدام قاعدة السلسلة ‪( chain rule‬المعروفة أيضًا باسم ‪)backpropagation‬‬ ‫•‬
‫لضبط المعلمات في الشبكة بأكملها مرة واحدة‪.‬‬

‫بعد التقدم السريع األولي‪ ،‬ضعفت األبحاث في الشبكات العصبية من حوالي عام ‪ 1995‬حتى‬
‫عام ‪ . 2005‬وهذا يرجع أساسًا إلى سببين‪ .‬أوالً ‪ ،‬يعد تدريب شبكة ما مكلفًا للغاية من الناحية‬
‫الحسابية‪ .‬بينما كانت ذاكرة الوصول العشوائي وفيرة في نهاية القرن الماضي ‪ ،‬كانت القوة‬
‫الح سابية نادرة‪ .‬ثانيًا ‪ ،‬كانت مجموعات البيانات صغيرة نسبيًا‪ .‬في الواقع ‪ ،‬كانت مجموعة بيانات‬
‫‪ Fisher's Iris‬من عام ‪ 1932‬أداة شائعة الختبار فاعلية الخوارزميات‪ .‬اعتبرت مجموعة بيانات‬
‫‪ MNIST‬بأرقامها المكتوبة بخط اليد البالغ عددها ‪ 60000‬ضخمة‪.‬‬

‫نظرًا لندرة البيانات والحسابات‪ ،‬أثبتت األدوات اإلحصائية القوية مثل طرق النواة ‪kernel‬‬
‫‪ methods‬وأشجار القرار ‪ decision trees‬والنماذج الرسومية ‪ graphical models‬أنها‬
‫متفوقة تجريبيًا في العديد من التطبيقات‪ .‬عالوة على ذلك ‪ ،‬على عكس الشبكات العصبية‬
‫‪ ، neural networks‬لم يحتاجوا إلى أسابيع للتدريب وقدموا نتائج يمكن التنبؤ بها مع ضمانات‬
‫نظرية قوية‪.‬‬

‫‪The Road to Deep Learning‬‬ ‫‪1.5‬‬


‫تغير الكثير من ه ذا مع توفر كميات كبيرة من البيانات ‪ ،‬بسبب شبكة الويب العالمية ‪ ،‬وظهور‬
‫الشركات التي تخدم مئات الماليين من المستخدمين عبر اإلنترنت ‪ ،‬ونشر أجهزة استشعار‬
‫رخيصة وعالية الجودة ‪ ،‬وتخزين بيانات رخيص (قانون ‪ ، )Kryder‬والحساب الرخيص (قانون‬
‫‪ .)Moore‬على وجه الخصوص‪ ،‬تم إحداث ثورة في مشهد الحساب في التعلم العميق من خالل‬
‫التقدم في وحدات معالجة الرسومات ‪ ،GPU‬والتي تم تصميمها في األصل أللعاب الكمبيوتر‪.‬‬
‫فجأة ‪ ،‬أصبحت الخوارزميات والنماذج التي بدت غير مجدية من الناحية الحسابية ذات صلة‬
‫(والعكس صحيح)‪ .‬هذا هو أفضل توضيح في القسم ‪.1.5‬‬
‫‪55‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫الجدول‪ :‬مجموعة البيانات مقابل ذاكرة الكمبيوتر والقدرة الحسابية‬

‫الحظ أن ذاكرة الوصول العشوائي لم تواكب نمو البيانات‪.‬يف الوقت نفسه‪ ،‬فاقت الزياداتيف ‬
‫القوة الحسابية النمويف مجموعات البيانات‪ .‬هذا يعني أن النماذج اإلحصائية تحتاج إلى أن تصبح‬
‫أكثر كفاءةيف استخدام الذاكرة‪ ،‬وأن تكون حرةيف إنفاق المزيد من دورات الكمبيوتر لتحسين‬
‫المعلمات‪ ،‬بسبب زيادة ميزانية الحساب‪ .‬وبالتالي‪ ،‬انتقلت النقطة المثاليةيف التعلم اآللي‬
‫واإلحصاءات من النماذج الخطية (المعممة) وطرق النواة إلى الشبكات العصبية العميقة‪ .‬هذا‬
‫أيضًا أحد األسباب التي تجعل العديد من الدعائم األساسية للتعلم العميق‪ ،‬مثل البيرسيبترون‬
‫متعدد الطبقات ‪ ،)1943 ،McCulloch and Pitts( multilayer perceptron‬والشبكات‬
‫العصبية التالفيفية ‪ ،)1998 ،LeCun et al.( convolutional neural networks‬والذاكرة‬
‫طويلة قصيرة المدى ‪Hochreiter and Schmidhuber, ( long short-term memory‬‬
‫‪ ،)1997‬و ‪ )1992 ،)1992 ،Watkins and Dayan(Q-Learning‬بشكل أساسي "أعيد‬
‫اكتشافهما"يف العقد الماضي ‪ ،‬بعد أن ظل خامدًا نسبيًا لفترة طويلة‪.‬‬

‫تم تشبيه التقدم األخيريف النماذج والتطبيقات والخوارزميات اإلحصائيةيف بعض األحيان‬
‫باالنفجار الكمبري ‪ :Cambrian explosion‬لحظة تقدم سريعيف تطور األنواع‪.‬يف الواقع‪،‬‬
‫ليست أحدث ما توصلت إليه التكنولوجيا مجرد نتيجة للموارد المتاحة‪ ،‬المطبقة على خوارزميات‬
‫عمرها عقود‪ .‬الحظ أن القائمة أدناه بالكاد تخدش سطح األفكار التي ساعدت الباحثين على‬
‫تحقيق تقدم هائل خالل العقد الماضي‪.‬‬

‫ساعدت األساليب الجديدة للتحكميف السعة‪ ،‬مثل الحذف العشوائي ‪dropout‬‬ ‫•‬
‫(‪)2014 ،.Srivastava et al‬يف التخفيف من فرط التعلم ‪ .overfitting‬هنا‪ ،‬يتم‬
‫حقن الضوضاء (‪)1995 ،Bishop‬يف جميع أنحاء الشبكة العصبية أثناء التدريب‪.‬‬
‫حلت آليات االنتباه ‪ Attention mechanisms‬مشكلة ثانية ابتليت بها‬ ‫•‬
‫اإلحصائيات ألكثر من قرن‪ :‬كيفية زيادة الذاكرة وتعقيد النظام دون زيادة عدد‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪56‬‬

‫المعلمات القابلة للتعلم‪ .‬وجد الباحثون حالً أنيقًا باستخدام ما يمكن اعتباره هيكل‬
‫مؤشر قابل للتعلم ‪،Bahdanau et al.( learnable pointer structure‬‬
‫‪ .)2014‬بدالً من االضطرار إلى تذكر تسلسل نصي كامل‪ ،‬على سبيل المثال‪،‬‬
‫للترجمة اآلليةيف تمثيل ثابت األبعاد‪ ،‬كان كل ما يلزم تخزينه هو مؤشر إلى الحالة‬
‫الوسيطة لعملية الترجمة‪ .‬سمح ذلك بزيادة الدقة بشكل كبير للتسلسالت الطويلة‪،‬‬
‫حيث لم يعد النموذج بحاجة إلى تذكر التسلسل بالكامل قبل البدءيف إنشاء تسلسل‬
‫جديد‪ .‬مبنية فقط على آليات االنتباه‪ ،‬أظهرت بنية المحوالت ‪transformer‬‬
‫(‪ ) 2017 ،Vaswani et al.‬نجاحًا مقنعًايف مجموعة واسعة من المجاالت‪ .‬على‬
‫سبيل المثال‪ ،‬يمكن لمحول واحد تم اختباره مسبقًا على طرائق متنوعة مثل‬
‫النصوص والصور وعزم الدوران ‪ joint torques‬المشتركة والضغط على األزرار‬
‫تشغيل ‪ Atari‬والصور التوضيحية والدردشة والتحكميف الروبوت (‪،Reed et al.‬‬
‫‪.)2022‬‬
‫سمحت التصاميم متعددة المراحل ‪ ، Multi-stage designs‬على سبيل المثال‪،‬‬ ‫•‬
‫عبر شبكات الذاكرة ( ‪ )2015 ،Sukhbaatar et al.‬والمبرمج العصبي ‪-‬‬
‫المترجم ‪،Reed and De Freitas ( neural programmer-interpreter‬‬
‫‪ )2015‬للمصممين اإلحصائيين لوصف األساليب التكرارية لالستدالل‪ .‬تسمح‬
‫هذه األدوات بتعديل الحالة الداخلية للشبكة العصبية العميقة بشكل متكرر‪ ،‬وبالتالي‬
‫تنفيذ خطوات الحقةيف سلسلة من التفكير‪ ،‬على غرار الطريقة التي يمكن بها‬
‫للمعالج تعديل الذاكرة إلجراء عملية حسابية‪.‬‬
‫تطور رئيسي آخر كان اختراع شبكات الخصومة التوليدية ‪Generative‬‬ ‫•‬
‫)‪ .)2014 ،Goodfellow et al.( Adversarial Networks(GAN‬تقليديا‪،‬‬
‫ركزت الطرق اإلحصائية لتقدير الكثافة والنماذج التوليدية على إيجاد توزيعات‬
‫احتمالية مناسبة وخوارزميات (تقريبية غالبًا) ألخذ العينات منها‪ .‬نتيجة لذلك‪،‬‬
‫كانت هذه الخوارزميات محدودة إلى حد كبير بسبب االفتقار إلى المرونة الكامنةيف ‬
‫النماذج اإلحصائية‪ .‬كان االبتكار الحاسميف شبكات الخصومة التوليدية هو استبدال‬
‫جهاز أخذ العينات بخوارزمية تعسفية بمعلمات قابلة للتفاضل‪ .‬ثم يتم تعديلها‬
‫بطريقة تجعل المميز ‪( discriminator‬اختبار من عينتين فعليًا) ال يستطيع التمييز‬
‫بين البيانات المزيفة والحقيقية‪ .‬من خالل القدرة على استخدام الخوارزميات‬
‫التعسفية لتوليد البيانات‪ ،‬فقد فتح تقدير الكثافة لمجموعة متنوعة من التقنيات‪.‬‬
‫أمثلة على ركض الحمر الوحشية ‪)2017 ،Zhu et al.( galloping Zebras‬‬
‫ووجوه المشاهير المزيفة (‪ )2017 ،Karras et al.‬دليل على هذا التقدم‪ .‬يمكن‬
‫حتى لرسامي رسومات الشعار المبتكرة الهواة إنتاج صور واقعية استنادًا إلى‬
‫‪57‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫الرسومات التخطيطية فقط التي تصف كيف يبدو تخطيط المشهد (‪،Park et al.‬‬
‫‪.)2019‬‬
‫في كثير من الحاالت‪ ،‬ال تكفي وحدة معالجة الرسومات الواحدة لمعالجة الكميات‬ ‫•‬
‫الكبيرة من البيانات المتاحة للتدريب‪ .‬على مدى العقد الماضي‪ ،‬تحسنت القدرة‬
‫على بناء خوارزميات تدريب متوازية وموزعة بشكل كبير‪ .‬أحد التحديات الرئيسية‬
‫في تصميم خوارزميات قابلة للتطوير هو أن العمود الفقري لتحسين التعلم العميق‪،‬‬
‫التدرج االشتقاقي العشوائي ‪ ،stochastic gradient descent‬يعتمد على دفعات‬
‫صغيرة ‪ minibatches‬نسبيًا من البيانات المراد معالجتها‪.‬يف الوقت نفسه‪ ،‬تحد‬
‫الدفعات الصغيرة من كفاءة وحدات معالجة الرسومات‪ .‬وبالتالي‪ ،‬فإن التدريب على‬
‫‪ 1024‬وحدة معالجة رسومات بحجم صغير يبلغ ‪ 32‬صورة على سبيل المثال لكل‬
‫دفعة يصل إلى مجموعة مصغرة مجمعة من حوالي ‪ 32000‬صورة‪ .‬العمل األخير‪،‬‬
‫أوالً بواسطة ‪ ،)2017( Li‬وبعد ذلك بواسطة ‪ )2017( .You et al‬و ‪..Jia et al‬‬
‫(‪ )2018‬دفع الحجم إلى ‪ 64000‬مالحظة‪ ،‬مما قلل من وقت التدريب لنموذج‬
‫‪ ResNet-50‬على مجموعة بيانات ‪ ImageNet‬إلى أقل من ‪ 7‬دقائق‪ .‬للمقارنة‬
‫‪ -‬تم قياس أوقات التدريبيف البداية بترتيب األيام‪.‬‬
‫ساهمت القدرة على موازاة الحساب أيضًا في التقدم في التعلم المعزز ‪ ،‬وقد أدى‬ ‫•‬
‫ذلك إلى تقدم كبير في أجهزة الكمبيوتر التي تحقق أداءً خارقًا في مهام مثل ‪، Go‬‬
‫وألعاب ‪ ، Atari‬و ‪ ، Starcraft‬وفي محاكاة الفيزياء (على سبيل المثال ‪ ،‬باستخدام‬
‫‪ ،) MuJoCo‬حيث توجد محاكيات البيئة متوفرة‪ .‬انظر ‪ ،‬على سبيل المثال‬
‫‪ )2016 .Silver et al(،‬للحصول على وصف لكيفية تحقيق ذلك في‬
‫‪ .AlphaGo‬باختصار ‪ ،‬يعمل التعلم المعزز بشكل أفضل إذا توفر الكثير من‬
‫مجموعات (الحالة ‪ ،state‬اإلجراء ‪ ، action‬المكافأة ‪ .)reward‬المحاكاة توفر‬
‫مثل هذا الطريق‪.‬‬
‫لعبت أطر التعلم العميق دورًا مهمًا في نشر األفكار‪ .‬يتكون الجيل األول من األطر‬ ‫•‬
‫مفتوحة المصدر لنمذجة الشبكة العصبية من ‪ Caffe‬و ‪ Torch‬و ‪ .Theano‬تمت‬
‫كتابة العديد من األوراق األساسية باستخدام هذه األدوات‪ .‬حتى اآلن ‪ ،‬حلت محلها‬
‫‪( TensorFlow‬غالبًا ما تستخدم عبر ‪ API Keras‬عالي المستوى) و ‪CNTK‬‬
‫و ‪ Caffe 2‬و ‪ .Apache MXNet‬يتكون الجيل الثالث من األدوات مما يسمى‬
‫باألدوات اإللزامية ‪ imperative tools‬للتعلم العميق ‪ ،‬وهو اتجاه أشعله تشينر‬
‫على األرجح‪ ،‬والذي استخدم صيغة مشابهة لـ ‪ Python NumPy‬لوصف‬
‫النماذج‪ .‬تم تبني هذه الفكرة من قبل كل من ‪ PyTorch‬و ‪ Gluon API‬من‬
‫‪ MXNet‬و ‪.Jax‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪58‬‬

‫أدى تقسيم العمل بين الباحثين في النظام الذين يبنون أدوات أفضل والمصممين اإلحصائيين‬
‫لبناء شبكات عصبية أفضل إلى تبسيط األمور إلى حد كبير‪ .‬على سبيل المثال ‪ ،‬كان تدريب نموذج‬
‫االنحدار اللوجستي الخطي ‪ linear logistic regression‬يمثل مشكلة واجبات منزلية غير‬
‫بديهية ‪ ،‬تستحق أن تمنح لطالب دكتوراه التعلم اآللي الجدد في جامعة كارنيجي ميلون في‬
‫‪ .2014‬حتى اآلن ‪ ،‬يمكن إنجاز هذه المهمة بأقل من ‪ 10‬أسطر من التعليمات البرمجية ‪ ،‬مما‬
‫يضعها بقوة في متناول المبرمجين‪.‬‬

‫‪Success Stories‬‬ ‫‪1.6‬‬


‫للذكاء االصطناعي تاريخ طويل في تقديم النتائج التي يصعب تحقيقها بخالف ذلك‪ .‬على‬
‫سبيل المثال ‪ ،‬تم نشر أنظمة فرز البريد باستخدام التعرف الضوئي على األحرف منذ التسعينيات‪.‬‬
‫هذا ‪ ،‬بعد كل شيء ‪ ،‬مصدر مجموعة بيانات ‪ MNIST‬الشهيرة لألرقام المكتوبة بخط اليد‪.‬‬
‫األمر نفسه ينطبق على قراءة الشيكات للودائع المصرفية وتسجيل الجدارة االئتمانية لمقدمي‬
‫الطلبات‪ .‬يتم فح ص المعامالت المالية تلقائيًا بحثًا عن االحتيال‪ .‬يشكل هذا العمود الفقري‬
‫للعديد من أنظمة الدفع للتجارة اإللكترونية ‪ ،‬مثل ‪ PayPal‬و ‪ Stripe‬و ‪ AliPay‬و ‪WeChat‬‬
‫و ‪ Apple‬و ‪ Visa‬و ‪ .MasterCard‬كانت برامج الكمبيوتر للشطرنج تنافسية منذ عقود‪ .‬يغذي‬
‫التعلم اآللي البحث والتوصية والتخصيص والترتيب على اإلنترنت‪ .‬بمعنى آخر ‪ ،‬التعلم اآللي‬
‫منتشر ‪ ،‬وإن كان غالبًا ما يكون مخفيًا عن األنظار‪.‬‬

‫في اآلونة األخيرة فقط‪ ،‬أصبح الذكاء االصطناعي في دائرة الضوء ‪ ،‬ويرجع ذلك في الغالب‬
‫إلى حلول المشكالت التي كانت تعتبر مستعصية في السابق والتي تتعلق مباشرة بالمستهلكين‪.‬‬
‫يُعزى العديد من هذه التطورات إلى التعلم العميق‪.‬‬

‫يمكن للمساعدين الرقميين األذكياء ‪ ،‬مثل ‪ Siri‬من ‪ Apple‬و ‪ Alexa‬من‬ ‫•‬


‫‪ Amazon‬ومساعد ‪ ، Google‬اإلجابة على األسئلة المنطوقة بدرجة معقولة من‬
‫الدقة‪ .‬يتضمن ذلك المهام البسيطة‪ ،‬مثل تشغيل مفاتيح اإلضاءة ‪ ،‬والمهام األكثر‬
‫تعقيدًا‪ ،‬مثل ترتيب مواعيد الحالق وتقديم مربع حوار الدعم عبر الهاتف‪ .‬من‬
‫المحتمل أن تكون هذه هي العالمة األكثر وضوحًا على أن الذكاء االصطناعي يؤثر‬
‫على حياتنا‪.‬‬
‫أحد المكونات الرئيسية في المساعدين الرقميين هو القدرة على التعرف على الكالم‬ ‫•‬
‫بدقة‪ .‬تدريجيًا‪ ،‬زادت دقة هذه األنظمة إلى حد تحقيق التكافؤ البشري لبعض‬
‫التطبيقات ( ‪.)2018 ،Xiong et al.‬‬
‫كما قطع التعرف على األشياء ‪ Object recognition‬شوطًا طويالً‪ .‬كان تقدير‬ ‫•‬
‫الكائن في صورة مهمة صعبة إلى حد ما في عام ‪ .2010‬حقق باحثو معيار‬
‫‪59‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫‪ ImageNet‬من ‪ NEC Labs‬وجامعة إلينوي في ‪Urbana-Champaign‬‬


‫معدل خطأ أعلى ‪ 5‬بنسبة ‪ .)2010 ،Lin et al. ( ٪28‬بحلول عام ‪ ، 2017‬انخفض‬
‫معدل الخطأ هذا إلى ‪ .)2018 ،Hu et al.( ٪2.25‬وبالمثل ‪ ،‬تم تحقيق نتائج‬
‫مذهلة في التعرف على الطيور وتشخيص سرطان الجلد‪.‬‬
‫تُستخدم البراعة ‪ Prowess‬في األلعاب لتوفير عصا قياس للذكاء البشري‪ .‬بدءًا من‬ ‫•‬
‫‪ ، TD-Gammon‬أدى برنامج لعب الطاولة باستخدام التعلم المعزز للفرق‬
‫الزمني والتقدم الحسابي والخوارزمي إلى خوارزميات لمجموعة واسعة من‬
‫التطبيقات‪ .‬على عكس لعبة الطاولة ‪ ،backgammon‬فإن لعبة الشطرنج بها‬
‫مساحة أكثر تعقيدًا ومجموعة من اإلجراءات‪ .‬تغلب ‪ DeepBlue‬على ‪Garry‬‬
‫‪ Kasparov‬باستخدام التوازي الهائل ‪ massive parallelism‬واألجهزة ذات‬
‫األغراض الخاصة والبحث الفعال من خالل شجرة اللعبة ( ‪،Campbell et al.‬‬
‫‪ .)2002‬ال يزال ‪ Go‬أكثر صعوبة ‪ ،‬بسبب مساحة الحالة الضخمة‪ .‬وصل‬
‫‪ AlphaGo‬إلى التكافؤ البشري في عام ‪ ، 2015‬باستخدام التعلم العميق جنبًا إلى‬
‫جنب مع أخذ عينات شجرة مونت كارلو ( ‪ .)2016 ،Silver et al.‬كان التحدي‬
‫في لعبة البوكر هو أن مساحة الحالة كبيرة وال يتم مالحظتها إال جزئيًا (ال نعرف‬
‫بطاقات الخصم)‪ .‬تجاوز ‪ Libratus‬األداء البشري في البوكر باستخدام‬
‫استراتيجيات منظمة بكفاءة (‪.)2017 ،Brown and Sandholm‬‬
‫مؤشر آخر على التقدم في الذكاء االصطناعي هو ظهور السيارات والشاحنات ذاتية‬ ‫•‬
‫القيادة ‪ .self-driving cars and trucks‬في حين أن االستقاللية الكاملة ليست‬
‫في متناول اليد تمامًا ‪ ،‬فقد تم إحراز تقدم ممتاز في هذا االتجاه ‪ ،‬مع منتجات شحن‬
‫مثل ‪ Tesla‬و ‪ NVIDIA‬و ‪ Waymo‬التي تتيح االستقالل الذاتي الجزئي على‬
‫األقل‪ .‬ما يجعل االستقاللية الكاملة صعبة للغاية هو أن القيادة المناسبة تتطلب‬
‫القدرة على اإلدراك والتفكير ودمج القواعد في النظام‪ .‬في الوقت الحاضر ‪ ،‬يتم‬
‫استخدام التعلم العميق بشكل أساسي في جانب رؤية الكمبيوتر لهذه المشاكل‪ .‬يتم‬
‫ضبط الباقي بشكل كبير من قبل المهندسين‪.‬‬

‫هذا بالكاد يخدش السطح للتطبيقات المؤثرة للتعلم اآللي‪ .‬على سبيل المثال ‪ ،‬تدين‬
‫الروبوتات واللوجستيات وعلم األحياء الحسابي وفيزياء الجسيمات وعلم الفلك ببعض‬
‫التطورات الحديثة األكثر إثارة لإلعجاب على األقل في أجزاء من التعلم اآللي‪ .‬وهكذا أصبح‬
‫التعلم اآللي أداة منتشرة في كل مكان للمهندسين والعلماء‪.‬‬

‫في كثير من األحيان ‪ ،‬أثيرت أسئلة حول نهاية العالم القادمة للذكاء االصطناعي ومعقولية‬
‫التفرد في مقاالت غير تقنية عن الذكاء االصطناعي‪ .‬الخوف هو أن أنظمة التعلم اآللي ستصبح‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪60‬‬

‫بطر يقة ما واعية وتتخذ القرارات ‪ ،‬بشكل مستقل عن مبرمجيها الذين يؤثرون بشكل مباشر على‬
‫حياة البشر‪ .‬إلى حد ما ‪ ،‬يؤثر الذكاء االصطناعي بالفعل على سبل عيش البشر بطرق مباشرة‪ :‬يتم‬
‫تقييم الجدارة االئتمانية تلقائيًا ‪ ،‬ويتنقل الطيارون اآلليون في الغالب في المركبات ‪ ،‬واتخاذ‬
‫قرارات بشأن منح بيانات إحصائية الستخدام الكفالة كمدخالت‪ .‬بشكل تافه ‪ ،‬يمكننا أن نطلب‬
‫من ‪ Alexa‬تشغيل آلة القهوة‪.‬‬

‫لحسن الحظ ‪ ،‬نحن بعيدون عن نظام ذكاء اصطناعي واعي ‪ sentient AI system‬يمكنه‬
‫التالعب عمدا بمنشئيه البشريين‪ .‬أوالً ‪ ،‬يتم تصميم أنظمة الذكاء االصطناعي وتدريبها ونشرها‬
‫بطريقة محددة وموجهة نحو الهدف‪ .‬في حين أن سلوكهم قد يعطي وهم الذكاء العام ‪ ،‬إال أنه‬
‫مزيج من القواعد واالستدالل والنماذج اإلحصائية التي تكمن وراء التصميم‪ .‬ثانيًا ‪ ،‬في الوقت‬
‫الحالي‪ ،‬ال توجد أدوات للذكاء العام االصطناعي قادرة على تحسين نفسها ‪ ،‬والتفكير حول‬
‫نفسها‪ ،‬والقادرة على تعديل بنيتها الخاصة وتوسيعها وتحسينها أثناء محاولة حل المهام العامة‪.‬‬

‫من أكثر األمور إلحاحًا كيفية استخدام الذكاء االصطناعي في حياتنا اليومية‪ .‬من المحتمل أن‬
‫تتم أتمتة العديد من المهام الوضيعة التي ينجزها سائقي الشاحنات ومساعدو المتاجر‪ .‬من‬
‫المحتمل أن تقلل روبوتات المزرعة من تكلفة الزراعة العضوية ولكنها ستعمل أيضًا على أتمتة‬
‫عمليات الحصاد‪ .‬قد يكون لهذه المرحلة من الثورة الصناعية عواقب وخيمة على قطاعات واسعة‬
‫من المجتمع‪ ،‬حيث أن سائقي الشاحنات ومساعدي المتاجر هم من أكثر الوظائف شيوعًا في‬
‫العديد من البلدان‪ .‬عالوة على ذلك ‪ ،‬يمكن أن تؤدي النماذج اإلحصائية‪ ،‬عند تطبيقها دون عناية‪،‬‬
‫إلى تحيز عرقي أو جنساني أو عمري وتثير مخاوف معقولة بشأن اإلنصاف اإلجرائي إذا كانت‬
‫مؤتمتة لقيادة القرارات الالحقة‪ .‬من المهم التأكد من استخدام هذه الخوارزميات بعناية‪ .‬مع ما‬
‫نعرفه اليوم ‪ ،‬فإن هذا يثير قلقنا أكثر إلحاحًا من قدرة الذكاء الخارق الخبيث على تدمير البشرية‪.‬‬

‫‪The Essence of Deep Learning‬‬ ‫‪1.7‬‬


‫حتى اآلن ‪ ،‬تحدثنا عن التعلم اآللي على نطاق واسع‪ .‬التعلم العميق هو مجموعة فرعية من‬
‫التعلم اآللي تهتم بالنماذج القائمة على الشبكات العصبية متعددة الطبقات‪ .‬إنه عميق ‪deep‬‬
‫بمعنى أن نماذجها تتعلم طبقات ‪ layers‬كثيرة من التحوالت‪ .‬في حين أن هذا قد يبدو ضيقًا ‪،‬‬
‫فقد أدى التعلم العميق إلى ظهور مجموعة مذهلة من النماذج والتقنيات وصياغات المشكالت‬
‫وا لتطبيقات‪ .‬تم تطوير العديد من الحدس لشرح فوائد العمق‪ .‬يمكن القول أن التعلم اآللي يحتوي‬
‫على العديد من طبقات الحساب‪ ،‬تتكون األولى من خطوات معالجة الميزات‪ .‬ما يميز التعلم‬
‫العميق هو أن العمليات التي تم تعلمها في كل طبقة من طبقات التمثيالت العديدة يتم تعلمها‬
‫بشكل مشترك من البيانات‪.‬‬
‫‪61‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫المشاكل التي ناقشناها حتى اآلن‪ ،‬مثل التعلم من إشارة الصوت الخام ‪ ،‬أو قيم البكسل األولية‬
‫للصور‪ ،‬أو التعيين بين الجمل ذات األطوال التعسفية ونظيراتها في اللغات األجنبية ‪ ،‬هي تلك‬
‫التي يتفوق فيها التعلم العميق وتعثر األساليب التقليدية‪ .‬اتضح أن هذه النماذج متعددة الطبقات‬
‫قادرة على معالجة البيانات اإلدراكية منخفضة المستوى ‪low-level perceptual data‬‬
‫بطريقة لم تستطع األدوات السابقة القيام بها‪ .‬يمكن القول إن أهم عامل مشترك في أساليب التعلم‬
‫العميق هو التدريب الشامل ‪ .end-to-end training‬بمعنى ‪ ،‬بدالً من تجميع نظام يعتمد‬
‫على المكونات التي يتم ضبطها بشكل فردي‪ ،‬يقوم المرء ببناء النظام ثم ضبط أدائه بشكل مشترك‪.‬‬
‫على سبيل المثال‪ ،‬استخدم العلماء في رؤية الكمبيوتر لفصل عملية هندسة الميزات ‪feature‬‬
‫‪ engineering‬عن عملية بناء نماذج التعلم اآللي‪ .‬ساد كاشف الحواف ‪،Canny ( Canny‬‬
‫‪ )1987‬ومستخرج ميزة ‪ SIFT‬من ‪ )2004 ،Lowe (Lowe‬ألكثر من عقد من الزمن‬
‫كخوارزميات لتعيين الصور في متجهات الميزات ‪ .feature vectors‬في األيام الخوالي ‪ ،‬كان‬
‫الجزء األساسي من تطبيق التعلم اآللي على هذه المشكالت يتألف من التوصل إلى طرق مصممة‬
‫يدويًا لتحويل البيانات إلى شكل قابل للنماذج الضحلة ‪ .shallow models‬لسوء الحظ ‪ ،‬ال‬
‫يوجد سوى القليل جدًا الذي يمكن للبشر تحقيقه بالبراعة مقارنةً بالتقييم المتسق لماليين‬
‫الخيارات التي يتم تنفيذها تلقائيًا بواسطة خوارزمية‪ .‬عندما تولى التعلم العميق زمام األمور ‪ ،‬تم‬
‫استبدال مستخلصات الميزات ‪ feature extractors‬هذه بفالتر تم ضبطها تلقائيًا‬
‫‪ ،automatically tuned filters‬مما أدى إلى الحصول على دقة فائقة‪.‬‬

‫وبالتالي ‪ ،‬فإن إحدى الميزات الرئيسية للتعلم العميق هي أنه ال يستبدل النماذج الضحلة في‬
‫نهاية خطوط التعلم التقليدية فحسب‪ ،‬بل يستبدل أيضًا عملية هندسة الميزات كثيفة العمالة‬
‫‪ .labor-intensive‬عالوة على ذلك ‪ ،‬من خالل استبدال الكثير من المعالجة المسبقة الخاصة‬
‫بالمجال‪ ،‬أزال التعلم العميق العديد من الحدود التي كانت تفصل سابقًا بين الرؤية الحاسوبية ‪،‬‬
‫والتعرف على الكالم ‪ ،‬ومعالجة اللغة الطبيعية ‪ ،‬والمعلوماتية الطبية ‪ ،‬ومجاالت التطبيق األخرى‪،‬‬
‫مما يوفر مجموعة موحدة من األدوات لمعالجة مشاكل متنوعة‪.‬‬

‫إلى جانب التدريب الشامل ‪ ،end-to-end training‬نشهد انتقالًا من األوصاف اإلحصائية‬


‫البارامترية ‪ parametric‬إلى النماذج الالبارامترية ‪ nonparametric‬بالكامل‪ .‬عندما تكون‬
‫البيانات شحيحة‪ ،‬يحتاج المرء إلى االعتماد على افتراضات مبسطة حول الواقع من أجل الحصول‬
‫على نماذج مفيدة‪ .‬عندما تكون البيانات وفيرة ‪ ،‬يمكن استبدالها بنماذج غير بارامترية تناسب‬
‫البيانات بشكل أفضل‪ .‬إلى ح د ما‪ ،‬يعكس هذا التقدم الذي شهدته الفيزياء في منتصف القرن‬
‫الماضي مع توافر أجهزة الكمبيوتر‪ .‬بدالً من حل التقريبات البارامترية لكيفية تصرف اإللكترونات‬
‫يدويًا ‪ ،‬يمكن للمرء اآلن اللجوء إلى المحاكاة العددية للمعادالت التفاضلية الجزئية المرتبطة بها‪.‬‬
‫وقد أدى ذلك إ لى نماذج أكثر دقة ‪ ،‬وإن كان ذلك في كثير من األحيان على حساب قابلية الشرح‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪62‬‬

‫هناك اختالف آخر عن العمل السابق وهو قبول الحلول دون المثالية ‪ ، suboptimal‬والتعامل‬
‫مع مشاكل التحسين غير الخطية غير المحدبة ‪، nonconvex nonlinear optimization‬‬
‫واالستعداد لتجربة األشياء قبل إثباتها‪ .‬أدت هذه التجريبية ‪ empiricism‬المكتشفة حديثًا في‬
‫التعامل مع المشكالت اإلحصائية ‪ ،‬جنبًا إلى جنب مع التدفق السريع للمواهب إلى تقدم سريع‬
‫في الخوارزميات العملية ‪ ،‬وإن كان ذلك في كثير من الحاالت على حساب تعديل وإعادة اختراع‬
‫األدوات التي كانت موجودة منذ عقود‪.‬‬

‫في النهاية‪ ،‬يفخر مجتمع التعلم العميق بنفسه لمشاركة األدوات عبر الحدود األكاديمية‬
‫والشركات‪ ،‬وإطالق العديد من المكتبات الممتازة‪ ،‬والنماذج اإلحصائية ‪ ،‬والشبكات المدربة‬
‫كمصدر مفتوح‪ .‬وبهذه الروح ‪ ،‬فإن النوتبوك ‪ notebooks‬التي تشكل هذا الكتاب متاحة مجانًا‬
‫للتوزيع واالستخدام‪ .‬لقد عملنا بجد لخفض حواجز الوصول للجميع للتعرف على التعلم العميق‬
‫ونأمل أن يستفيد قرائنا من ذلك‪.‬‬

‫‪1.8‬‬
‫يدرس التعلم اآللي كيف يمكن ألنظمة الكمبيوتر االستفادة من الخبرة (غالبًا البيانات)‬
‫لتحسين األداء في مهام محددة‪ .‬فهو يجمع بين األفكار من اإلحصائيات ‪ ،‬واستخراج البيانات ‪،‬‬
‫والتحسين‪ .‬في كثير من األحيان ‪ ،‬يتم استخدامه كوسيلة لتنفيذ حلول الذكاء االصطناعي‪ .‬بصفته‬
‫فئة من فئات التعلم اآللي ‪ ،‬يركز التعلم التمثيلي ‪ representational learning‬على كيفية العثور‬
‫تلقائ يًا على الطريقة المناسبة لتمثيل البيانات‪ .‬نظرًا ألن التعلم التمثيلي متعدد المستويات من‬
‫خالل تعلم العديد من طبقات التحوالت‪ ،‬فإن التعلم العميق ال يحل محل النماذج الضحلة في‬
‫نهاية خطوط أنابيب التعلم اآللي التقليدية فحسب‪ ،‬بل يستبدل أيضًا عملية هندسة الميزات كثيفة‬
‫العمالة‪ .‬تم إطالق الكثير من التقدم األخير في التعلم العميق من خالل وفرة البيانات الناشئة عن‬
‫أجهزة االستشعار الرخيصة والتطبيقات على نطاق اإلنترنت‪ ،‬والتقدم الكبير في الحساب ‪ ،‬في‬
‫الغالب من خالل وحدات معالجة الرسومات‪ .‬إلى جانب ذلك ‪ ،‬فإن توافر أطر عمل التعلم العميق‬
‫الفعالة قد جعل تصميم وتنفيذ تحسين النظام بالكامل أسهل بشكل كبير ‪ ،‬وهو عنصر أساسي في‬
‫الحصول على أداء عالٍ‪.‬‬

‫‪1.9‬‬
‫‪ .1‬أي أجزاء من التعليمات البرمجية التي تكتبها حاليًا يمكن "تعلمها" ‪ ،‬أي تحسينها‬
‫بالتعلم وتحديد خيارات التصميم تلقائيًا التي يتم إجراؤها في التعليمات البرمجية‬
‫الخاصة بك؟ هل تتضمن التعليمات البرمجية الخاصة بك خيارات تصميم‬
‫إرشادية؟ ما هي البيانات التي قد تحتاجها لتعلم السلوك المطلوب؟‬
‫‪63‬‬ ‫الفصل االول‪ :‬المقدمة‬

‫‪ .2‬ما هي المشاكل التي تواجهها والتي لديها العديد من األمثلة على كيفية حلها ‪ ،‬ولكن‬
‫ال توجد طريقة محددة ألتمتتها؟ قد يكون هؤالء مرشحين رئيسيين الستخدام‬
‫التعلم العميق‪.‬‬
‫‪ .3‬وصف العالقات بين الخوارزميات والبيانات والحساب‪ .‬كيف تؤثر خصائص‬
‫البيانات والموارد الحسابية الحالية المتاحة على مالءمة الخوارزميات المختلفة؟‬
‫‪ .4‬قم بتسمية بعض اإلعدادات حيث ال يكون التدريب الشامل ‪end-to-end‬‬
‫‪ training‬هو األسلوب االفتراضي حاليًا ولكنه قد يكون كذلك‪.‬‬
‫االساسيات‬ ‫‪2‬‬
‫‪65‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪Preliminaries‬‬ ‫‪2‬‬
‫للتحضير للغوص (للتعمق)يف التعلم العميق ‪ ،‬ستحتاج إلى بعض مهارات البقاء‪ )1( :‬تقنيات‬
‫تخزين البيانات ومعالجتها ؛ (‪ )2‬مكتبات الستيعاب ومعالجة البيانات من مجموعة متنوعة من‬
‫المصادر؛ (‪ ) 3‬معرفة العمليات الجبرية الخطية األساسية التي نطبقها على عناصر البيانات عالية‬
‫األبعاد ؛ (‪ )4‬ما يكفي من حساب التفاضل والتكامل لتحديد االتجاه الذي يضبط كل معلمة‬
‫لتقليل دالة الخطأ ؛ (‪ ) 5‬القدرة على حساب المشتقات تلقائيًا بحيث يمكنك نسيان الكثير من‬
‫حسابات التفاضل والتكامل التي تعلمتها للتو ؛ (‪ )6‬بعض الطالقة األساسيةيف االحتمالية ‪ ،‬لغتنا‬
‫األساسية لالستدالليف ظل عدم اليقين ؛ و (‪ )7‬بعض القدرة على العثور على إجاباتيف الوثائق‬
‫الرسمية عندما تتعثر‪.‬‬

‫باختصار‪ ،‬يوفر هذا الفصل مقدمة سريعة لألساسيات التي ستحتاجها لمتابعة معظم المحتوى‬
‫الفنييف هذا الكتاب‪.‬‬

‫‪Data Manipulation‬‬ ‫‪2.1‬‬


‫من أجل إنجاز أي شيء‪ ،‬نحتاج إلى طريقة ما لتخزين البيانات ومعالجتها‪ .‬بشكل عام‪ ،‬هناك‬
‫شيئان مهمان نحتاج إلى القيام بهما بالبيانات‪ )1( :‬الحصول عليها؛ و (‪ )2‬معالجتها بمجرد‬
‫دخولها إلى الكمبيوتر‪ .‬ال جدوى من الحصول على البيانات دون طريقة ما لتخزينها‪ ،‬لذا فلنبدأ‪،‬‬
‫دع نا نتسخ أيدينا باستخدام المصفوفات ذات األبعاد 𝑠𝑦𝑎𝑟𝑟𝑎 𝑙𝑎𝑛𝑜𝑖𝑠𝑛𝑒𝑚𝑖𝑑 ‪ ،𝑛 −‬والتي‬
‫نسميها أيضًا الموترات ‪ .tensors‬إذا كنت تعرف بالفعل حزمة الحوسبة العلمية ‪،NumPy‬‬
‫فسيكون هذا أمرًا سهالً‪ .‬بالنسبة لجميع أطر التعلم العميق الحديثة‪ ،‬فإن فئة الموتر (‪ndarray‬يف ‬
‫‪ MXNet‬و ‪Tensor‬يف ‪ PyTorch‬و ‪ )TensorFlow‬تشبه ‪ ndarray‬من ‪ ،NumPy‬مع‬
‫إضافة بعض الميزات القاتلة‪ .‬أوالً‪ ،‬تدعم فئة الموتر التمايز التلقائي‪ .‬ثانيًا‪ ،‬يستفيد من وحدات‬
‫معالجة الرسومات ‪ GPU‬لتسريع الحساب العددي‪ ،‬بينما يعمل ‪ NumPy‬فقط على وحدات‬
‫المعالجة المركزية (‪ .) CPU‬تجعل هذه الخصائص الشبكات العصبية سهلة البرمجة وسريعة‬
‫التشغيل‪.‬‬

‫‪2.1.1‬‬
‫للبدء‪ ،‬نستورد ‪ .Tensorflow‬لإليجاز‪ ،‬غالبًا ما يقوم الممارسون بتعيين االسم المستعار ‪.tf‬‬

‫‪import tensorflow as tf‬‬


‫يمثل الموتر مجموعة (ربما متعددة األبعاد) من القيم العددية‪ .‬مع محور واحد‪ ،‬يسمى موتر متجه‬
‫‪ .vector‬مع محورين‪ ،‬يسمى الموتر مصفوفة ‪ .matrix‬باستخدام المحاور ‪ ، 𝑘 > 2‬نسقط‬
‫األسماء المتخصصة ونشير فقط إلى الكائن باعتباره موتر ترتيب (‪.)𝑘 th − order tensor‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪66‬‬

‫يوفر ‪ TensorFlow‬مجموعة متنوعة من الدوال إلنشاء موترات جديدة معبأة مسبقًا بالقيم‪ .‬على‬
‫سبيل المثال‪ ،‬من خالل استدعاء النطاق (‪ ،)n‬يمكننا إنشاء متجه لقيم متباعدة بشكل متساوٍ‪،‬‬
‫بدءًا من ‪( 0‬مضمّن) وينتهي عند ‪( n‬غير مضمن)‪ .‬بشكل افتراضي‪ ،‬يكون حجم الفاصل الزمني‬
‫هو ‪ .1‬ما لم يتم تحديد خالف ذلك‪ ،‬يتم تخزين الموترات الجديدةيف الذاكرة الرئيسية‬
‫وتخصيصها للحسابات المعتمدة على وحدة المعالجة المركزية ‪.CPU‬‬

‫)‪x = tf.range(12, dtype=tf.float32‬‬


‫‪x‬‬
‫=‪<tf.Tensor: shape=(12,), dtype=float32, numpy‬‬
‫‪array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.,‬‬
‫‪10., 11.],‬‬
‫>)‪dtype=float32‬‬
‫كل من هذه القيم تسمى عنصر من موتر ‪ .element of the tensor‬يحتوي الموتر ‪ x‬على ‪12‬‬
‫عنصرًا‪ .‬يمكننا فحص العدد اإلجمالي للعناصريف موتر عبر دالة الحجم‪.‬‬

‫)‪tf.size(x‬‬
‫يمكننا الوصول إلى شكل الموتر ‪( tensor’s shape‬الطول على طول كل محور) من خالل فحص‬
‫سمة الشكل الخاصة به‪ .‬نظرًا ألننا نتعامل مع متجه هنا‪ ،‬فإن الشكل ‪ shape‬يحتوي على عنصر‬
‫واحد فقط وهو مطابق للحجم‪.‬‬

‫‪x.shape‬‬
‫)]‪TensorShape([12‬‬
‫يمكننا تغيير شكل الموتر دون تغيير حجمه أو قيمه‪ ،‬عن طريق استدعاء إعادة الشكل ‪.reshape‬‬
‫على سبيل المثال‪ ،‬يمكننا تحويل المتجه ‪ x‬الذي شكله (‪ )12,‬إلى مصفوفة ‪ X‬بالشكل (‪.)3, 4‬‬
‫يحتفظ هذا الموتر الجديد بجميع العناصر ولكنه يعيد تكوينهايف مصفوفة‪ .‬الحظ أن عناصر‬
‫المتجه الخاصة بنا يتم وضعهايف صف واحديف كل مرة وبالتالي ]‪.x[3] == X[0, 3‬‬

‫))‪X = tf.reshape(x, (3, 4‬‬


‫‪X‬‬
‫=‪<tf.Tensor: shape=(3, 4), dtype=float32, numpy‬‬
‫‪array([[ 0., 1., 2., 3.],‬‬
‫‪[ 4., 5., 6., 7.],‬‬
‫>)‪[ 8., 9., 10., 11.]], dtype=float32‬‬
‫الحظ أن تحديد كل مكون من مكونات الشكل إلعادة تشكيله ‪ reshape‬أمر زائد‪ .‬نظرًا ألننا‬
‫نعرف بالفعل حجم الموتر الخاص بنا‪ ،‬فيمكننا إيجاد مكون واحد من الشكل بالنظر إلى الباقي‪.‬‬
‫على سبيل المثال‪ ،‬بالنظر إلى موتر الحجم 𝑛 والشكل المستهدف (𝑤 ‪ ،)ℎ،‬فإننا نعرف = 𝑤‬
‫‪ .𝑛/ℎ‬الستنتاج مكون واحد للشكل تلقائيًا‪ ،‬يمكننا وضع ‪-1‬لمكون الشكل الذي يجب استنتاجه‬
‫‪67‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫تلقائيًا‪.‬يف حالتنا‪ ،‬بدالً من استدعاء )‪ ،x.reshape(3, 4‬كان بإمكاننا استدعاء‬


‫)‪ x.reshape(-1, 4‬أو )‪.x.reshape(3, -1‬‬

‫غالبًا ما يحتاج الممارسون إلى العمل مع الموترات المهيأة الحتواء جميع األصفار أو اآلحاد‪.‬‬
‫يمكننا بناء موتر مع ضبط جميع العناصر على الصفر وشكل )‪ (2, 3, 4‬عبر دالة األصفار ‪.zeros‬‬

‫))‪tf.zeros((2, 3, 4‬‬
‫=‪<tf.Tensor: shape=(2, 3, 4), dtype=float32, numpy‬‬
‫‪array([[[0., 0., 0., 0.],‬‬
‫‪[0., 0., 0., 0.],‬‬
‫‪[0., 0., 0., 0.]],‬‬

‫‪[[0., 0., 0., 0.],‬‬


‫‪[0., 0., 0., 0.],‬‬
‫>)‪[0., 0., 0., 0.]]], dtype=float32‬‬
‫وبالمثل‪ ،‬يمكننا إنشاء موتر مع كل اآلحاد باستدعاء اآلحاد ‪.ones‬‬

‫))‪tf.ones((2, 3, 4‬‬
‫=‪<tf.Tensor: shape=(2, 3, 4), dtype=float32, numpy‬‬
‫‪array([[[1., 1., 1., 1.],‬‬
‫‪[1., 1., 1., 1.],‬‬
‫‪[1., 1., 1., 1.]],‬‬

‫‪[[1., 1., 1., 1.],‬‬


‫‪[1., 1., 1., 1.],‬‬
‫>)‪[1., 1., 1., 1.]]], dtype=float32‬‬
‫غالبًا ما نرغبيف أخذ عينة من كل عنصر بشكل عشوائي (وبشكل مستقل) من توزيع احتمالي‬
‫معين‪ .‬على سبيل المثال‪ ،‬غالبًا ما تتم تهيئة معلمات الشبكات العصبية بشكل عشوائي‪ .‬يُنشئ‬
‫المقتطف التالي موترًا بعناصر مستمدة من توزيع غاوسي قياسي (عادي) بمتوسط ‪ 0‬وانحراف‬
‫معياري ‪.1‬‬

‫)]‪tf.random.normal(shape=[3, 4‬‬
‫=‪<tf.Tensor: shape=(3, 4), dtype=float32, numpy‬‬
‫‪array([[ 1.5391479 , -1.7407725 , 0.44389075,‬‬
‫‪0.8466314 ],‬‬
‫‪[-0.486678 , -1.3573753 , 0.09524103, -1.758265‬‬
‫‪],‬‬
‫‪[ 0.7030494 , 1.1621033 , 0.98620087,‬‬
‫‪1.6612175 ]],‬‬
‫>)‪dtype=float32‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪68‬‬

‫أخيرًا‪ ،‬يمكننا إنشاء الموترات من خالل توفير القيم الدقيقة لكل عنصر من خالل توفير (ربما‬
‫تكون متداخلة) قائمة (قوائم) بايثون تحتوي على حرفية رقمية‪ .‬هنا‪ ،‬نقوم ببناء مصفوفة بقائمة‬
‫من القوائم‪ ،‬حيث تتوافق القائمة الخارجية مع المحور ‪ ،0‬والقائمة الداخلية مع المحور ‪.1‬‬

‫)]]‪tf.constant([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1‬‬


‫=‪<tf.Tensor: shape=(3, 4), dtype=int32, numpy‬‬
‫‪array([[2, 1, 4, 3],‬‬
‫‪[1, 2, 3, 4],‬‬
‫>)‪[4, 3, 2, 1]], dtype=int32‬‬
‫‪Indexing and Slicing‬‬ ‫‪2.1.2‬‬
‫كما هو الحال مع قوائم بايثون‪ ،‬يمكننا الوصول إلى عناصر الموتر عن طريق الفهرسة ‪indexing‬‬
‫(بدءًا من ‪ .) 0‬للوصول إلى عنصر بناءً على موضعه بالنسبة إلى نهاية القائمة‪ ،‬يمكننا استخدام‬
‫الفهرسة السلبية ‪ .negative indexing‬أخيرًا‪ ،‬يمكننا الوصول إلى نطاقات كاملة من المؤشرات‬
‫عبر التقطيع ‪( slicing‬على سبيل المثال‪ ، )X[start:stop] ،‬حيث تتضمن القيمة المُعادة‬
‫الفهرس األول (‪ )start‬وليس األخير (‪ .)stop‬أخيرًا‪ ،‬عندما يتم تحديد فهرس ‪ index‬واحد‬
‫فقط (أو شريحة ‪ )slice‬لموتّر ترتيب (‪ ،)𝑘 th − order tensor‬يتم تطبيقه على طول المحور‬
‫‪ .0‬وهكذا‪،‬يف الكود التالي‪[-1] ،‬يحدد الصف األخير و ]‪ [1:3‬يحدد الثاني والثالث صفوف‪.‬‬

‫]‪X[-1], X[1:3‬‬
‫[(‪(<tf.Tensor: shape=(4,), dtype=float32, numpy=array‬‬
‫‪8., 9., 10., 11.], dtype=float32)>,‬‬
‫=‪<tf.Tensor: shape=(2, 4), dtype=float32, numpy‬‬
‫‪array([[ 4., 5., 6., 7.],‬‬
‫)>)‪[ 8., 9., 10., 11.]], dtype=float32‬‬
‫الموترات ‪Tensors‬يف ‪ TensorFlow‬غير قابلة للتغيير ‪ immutable‬وال يمكن التخصيص‬
‫لها‪ .‬المتغيرات ‪Variables‬في ‪ TensorFlow‬عبارة عن حاويات قابلة للتغيير ‪mutable‬‬
‫يف ‬ ‫للحالة تدعم التعيينات ‪ .assignments‬ضعيف اعتبارك أن التدرجات ‪gradients‬‬
‫‪ TensorFlow‬ال تتدفق للخلف من خالل المهام المتغيرة‪.‬‬

‫باإلضافة إلى تعيين قيمة للمتغير بأكمله‪ ،‬يمكننا كتابة عناصر المتغير ‪ Variable‬عن طريق‬
‫تحديد المؤشرات‪.‬‬

‫)‪X_var = tf.Variable(X‬‬
‫)‪X_var[1, 2].assign(9‬‬
‫‪X_var‬‬
‫‪<tf.Variable 'Variable:0' shape=(3, 4) dtype=float32,‬‬
‫=‪numpy‬‬
‫‪array([[ 0., 1., 2., 3.],‬‬
‫‪69‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪[ 4., 5., 9., 7.],‬‬


‫>)‪[ 8., 9., 10., 11.]], dtype=float32‬‬
‫إذا أردنا تعيين عناصر متعددة بنفس القيمة‪ ،‬فإننا نطبق الفهرسة على الجانب األيسر من عملية‬
‫]‪[:2,:‬إلى الصفين األول والثاني‪ ،‬حيث‪ :‬يأخذ جميع‬ ‫اإلسناد‪ .‬على سبيل المثال‪ ،‬يصل‬
‫العناصر على طول المحور ‪( 1‬العمود)‪ .‬بينما ناقشنا فهرسة المصفوفات‪ ،‬فإن هذا يعمل أيضًا مع‬
‫المتجهات والموترات التي تزيد عن بعدين‪.‬‬

‫)‪X_var = tf.Variable(X‬‬
‫‪X_var[:2, :].assign(tf.ones(X_var[:2,:].shape,‬‬
‫)‪dtype=tf.float32) * 12‬‬
‫‪X_var‬‬
‫‪<tf.Variable 'Variable:0' shape=(3, 4) dtype=float32,‬‬
‫=‪numpy‬‬
‫‪array([[12., 12., 12., 12.],‬‬
‫‪[12., 12., 12., 12.],‬‬
‫>)‪[ 8., 9., 10., 11.]], dtype=float32‬‬
‫‪Operations‬‬ ‫‪2.1.3‬‬
‫اآلن بعد أن عرفنا كيفية بناء الموترات وكيفية القراءة من عناصرها والكتابة إليها‪ ،‬يمكننا البدءيف ‬
‫معالجتها بعمليات رياضية مختلفة‪ .‬من بين األدوات األكثر فائدة هي عمليات العناصر‬
‫‪ .elementwise operations‬هذه تطبق عملية ‪ scalar‬قياسية على كل عنصر من عناصر‬
‫الموتر‪ .‬بالنسبة للدوال التي تأخذ موترتين كمدخالت‪ ،‬تطبق العمليات األولية بعض العوامل‬
‫الثنائية القياسية على كل زوج من العناصر المقابلة‪ .‬يمكننا إنشاء دالة عنصرية ‪elementwise‬‬
‫‪ function‬من أي دالة تقوم بتعيينها من عددي إلى عددي‪.‬‬

‫في التدوين الرياضي ‪ ،mathematical notation‬نشير إلى هذه العوامل العددية األحادية (مع‬
‫إدخال مدخل واحد) من خالل التوقيع ‪ .𝑓: ℝ → ℝ‬هذا يعني فقط أن الدالة ترسم من أي رقم‬
‫حقيقي إلى عدد حقيقي آخر‪ .‬يمكن تطبيق معظم العوامل المعيارية بطريقة أساسية بمايف ذلك‬
‫المشغلين األحاديين مثل 𝑥 𝑒‪.‬‬

‫)‪tf.exp(x‬‬
‫=‪<tf.Tensor: shape=(12,), dtype=float32, numpy‬‬
‫‪array([1.0000000e+00, 2.7182817e+00, 7.3890562e+00,‬‬
‫‪2.0085537e+01,‬‬
‫‪5.4598148e+01, 1.4841316e+02, 4.0342877e+02,‬‬
‫‪1.0966332e+03,‬‬
‫‪2.9809580e+03, 8.1030840e+03, 2.2026465e+04,‬‬
‫‪5.9874141e+04],‬‬
‫>)‪dtype=float32‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪70‬‬

‫وبالمثل‪ ،‬فإننا نشير إلى العوامل العددية الثنائية‪ ،‬والتي تقوم بتعيين أزواج من األرقام الحقيقية‬
‫إلى رقم حقيقي (واحد) عبر التوقيع ‪ .𝑓: ℝ, ℝ → ℝ‬بالنظر إلى أي متجهين 𝐮 و𝐯 من نفس‬
‫الشكل‪ ،‬وعامل ثنائي 𝑓 ‪ ،‬يمكننا إنتاج متجه )𝐯 ‪ 𝐜 = 𝐹(𝐮,‬عن طريق تعيين عناصر المتجهات‬
‫) 𝑖𝑣 ‪ 𝑐𝑖 ← 𝑓(𝑢𝑖 ,‬لكل 𝑖‪ ،‬وأين 𝑖𝑢 ‪ ،𝑐𝑖 ,‬و ‪𝑖 th‬عناصر المتجهات 𝐮 ‪ ،𝐜,‬و‪ .‬هنا‪ ،‬أنتجنا قيمة المتجه‬
‫𝑑‪ 𝐹: ℝ𝑑 , ℝ𝑑 → ℝ‬برفع الدالة العددية إلى عملية متجه عنصري‪ .‬تم رفع جميع العوامل‬
‫الحسابية القياسية الشائعة للجمع (‪ ،)+‬والطرح (‪ ،)-‬والضرب (*)‪ ،‬والقسمة (‪ ،)/‬واألس‬
‫(**) إلى العمليات األولية لموترات متطابقة الشكل ذات شكل عشوائي‪.‬‬

‫)]‪x = tf.constant([1.0, 2, 4, 8‬‬


‫)]‪y = tf.constant([2.0, 2, 2, 2‬‬
‫‪x + y, x - y, x * y, x / y, x ** y‬‬
‫[(‪(<tf.Tensor: shape=(4,), dtype=float32, numpy=array‬‬
‫‪3., 4., 6., 10.], dtype=float32)>,‬‬
‫‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array([-‬‬
‫‪1., 0., 2., 6.], dtype=float32)>,‬‬
‫[(‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array‬‬
‫‪2., 4., 8., 16.], dtype=float32)>,‬‬
‫‪<tf.Tensor: shape=(4,), dtype=float32,‬‬
‫‪numpy=array([0.5, 1. , 2. , 4. ], dtype=float32)>,‬‬
‫[(‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array‬‬
‫)>)‪1., 4., 16., 64.], dtype=float32‬‬
‫باإلضافة إلى الحسابات األولية‪ ،‬يمكننا أيضًا إجراء عمليات الجبر الخطي ‪ ،linear algebra‬مثل‬
‫حاصل الضرب النقطي ‪ dot products‬وضرب المصفوفات ‪.matrix multiplications‬‬
‫سنشرح هذه األمور بالتفصيل قريبًايف القسم ‪.2.3‬‬

‫يمكننا أيضًا ربط العديد من الموترات معًا‪ ،‬وتكديسها من طرف إلى طرف لتشكيل موتر أكبر‪.‬‬
‫نحتاج فقط إلى تقديم قائمة بالموترات وإخبار النظام بالمحور المراد ربطه‪ .‬يوضح المثال أدناه‬
‫ما يحدث عندما نجمع مصفوفتين على طول الصفوف (المحور ‪ )0‬مقابل األعمدة (المحور ‪.)1‬‬
‫يمكننا أن نرى أن طول المحور ‪ 0‬للمخرج األول (‪ )6‬هو مجموع أطوال المحور ‪ 0‬لموتر اإلدخال‬
‫(‪)3 + 3‬؛ بينما طول المحور ‪ 1‬للمخرج الثاني (‪ )8‬هو مجموع أطوال محور ‪ 1‬لموتر اإلدخال‬
‫(‪.)4 + 4‬‬

‫))‪X = tf.reshape(tf.range(12, dtype=tf.float32), (3, 4‬‬


‫‪Y = tf.constant([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2,‬‬
‫)]]‪1‬‬
‫)‪tf.concat([X, Y], axis=0), tf.concat([X, Y], axis=1‬‬
‫=‪(<tf.Tensor: shape=(6, 4), dtype=float32, numpy‬‬
‫‪array([[ 0., 1., 2., 3.],‬‬
‫‪71‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪[ 4., 5., 6., 7.],‬‬


‫‪[ 8., 9., 10., 11.],‬‬
‫‪[ 2., 1., 4., 3.],‬‬
‫‪[ 1., 2., 3., 4.],‬‬
‫‪[ 4., 3., 2., 1.]], dtype=float32)>,‬‬
‫=‪<tf.Tensor: shape=(3, 8), dtype=float32, numpy‬‬
‫‪array([[ 0., 1., 2., 3., 2., 1., 4., 3.],‬‬
‫‪[ 4., 5., 6., 7., 1., 2., 3., 4.],‬‬
‫‪[ 8., 9., 10., 11., 4., 3., 2., 1.]],‬‬
‫)>)‪dtype=float32‬‬
‫في بعض األحيان‪ ،‬نريد بناء موتر ثنائي عبر البيانات المنطقية‪ .‬خذ ‪ X == Y‬كمثال‪ .‬لكل موضع‬
‫‪ ، i, j‬إذا كانت ]‪ X[i, j‬و ]‪ Y[i, j‬متساوية ‪ ،‬فإن اإلدخال المقابليف النتيجة يأخذ‬
‫القيمة ‪ ، 1‬وإال فإنه يأخذ القيمة ‪.0‬‬

‫‪X == Y‬‬
‫=‪<tf.Tensor: shape=(3, 4), dtype=bool, numpy‬‬
‫‪array([[False, True, False, True],‬‬
‫‪[False, False, False, False],‬‬
‫>)]]‪[False, False, False, False‬‬
‫يؤدي جمع كل العناصريف الموتر إلى إنتاج موتر بعنصر واحد فقط‪.‬‬

‫)‪tf.reduce_sum(X‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=66.0‬‬

‫‪Broadcasting‬‬ ‫‪2.1.4‬‬
‫اآلن‪ ،‬أنت تعرف كيفية إجراء عمليات ثنائية العناصر على موترين من نفس الشكل‪.‬يف ظل ظروف‬
‫معينة‪ ،‬حتى عندما تختلف األشكال‪ ،‬ال يزال بإمكاننا إجراء عمليات ثنائية العناصر عن طريق‬
‫استدعاء آلية البث ‪ .Broadcasting‬يعمل البث وفقًا لإلجراء التالي المكون من خطوتين‪)1( :‬‬
‫توسيع أحد المصفوفتين أو كليهما عن طريق نسخ العناصر على طول المحاور بطول ‪ 1‬بحيث‬
‫يكون للموترين نفس الشكل بعد هذا التحويل؛ (‪ )2‬إجراء عملية عنصرية ‪elementwise‬‬
‫‪ operation‬على المصفوفات الناتجة‪.‬‬

‫))‪a = tf.reshape(tf.range(3), (3, 1‬‬


‫))‪b = tf.reshape(tf.range(2), (1, 2‬‬
‫‪a, b‬‬
‫=‪(<tf.Tensor: shape=(3, 1), dtype=int32, numpy‬‬
‫‪array([[0],‬‬
‫‪[1],‬‬
‫‪[2]], dtype=int32)>,‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪72‬‬

‫‪<tf.Tensor: shape=(1, 2), dtype=int32, numpy=array([[0,‬‬


‫)>)‪1]], dtype=int32‬‬
‫بما أن ‪ a‬و ‪ b‬هما ‪ 3 × 1‬و ‪ 1 × 2‬مصفوفتان‪ ،‬على التوالي‪ ،‬فإن أشكالهما ال تتطابق‪ .‬ينتج عن‬
‫البث مصفوفة أكبر من خالل تكرار المصفوفة ‪ a‬على طول األعمدة والمصفوفة ‪ b‬على طول‬
‫الصفوف قبل إضافتها إلى العناصر‪.‬‬

‫‪a + b‬‬
‫=‪<tf.Tensor: shape=(3, 2), dtype=int32, numpy‬‬
‫‪array([[0, 1],‬‬
‫‪[1, 2],‬‬
‫>)‪[2, 3]], dtype=int32‬‬
‫‪Saving Memory‬‬ ‫‪2.1.5‬‬
‫يمكن أن تؤدي العمليات الجارية إلى تخصيص ذاكرة جديدة لنتائج المضيف‪ .‬على سبيل المثال‪،‬‬
‫إذا كتبنا ‪ ،Y = X + Y‬فإننا نلغي اإلشارة إلى الموتر الذي استخدمه ‪ Y‬لإلشارة إليه وبدالً من‬
‫ذلك نشير إلى ‪Y‬يف الذاكرة المخصصة حديثًا‪ .‬يمكننا توضيح هذه المشكلة باستخدام دالة )(‪id‬‬
‫في بايثون ‪ ،‬والتي تعطينا العنوان الدقيق للكائن المشار إليهيف الذاكرة‪ .‬الحظ أنه بعد تشغيل‬
‫)‪ ،Y = Y + X, id(Y‬يشير المعرف (‪ )Y‬إلى موقع مختلف‪ .‬هذا ألن بايثون أول من يقيّم‬
‫‪ ،Y + X‬ويخصص ذاكرة جديدة للنتيجة ثم يشير ‪ Y‬إلى هذا الموقع الجديديف الذاكرة‪.‬‬

‫)‪before = id(Y‬‬
‫‪Y = Y + X‬‬
‫‪id(Y) == before‬‬
‫‪False‬‬

‫قد يكون هذا غير مرغوب فيه لسببين‪ .‬أوالً‪ ،‬ال نريد االلتفاف حول تخصيص الذاكرة دون داعٍ‬
‫طوال الوقت‪.‬يف التعلم اآللي‪ ،‬غالبًا ما يكون لدينا مئات الميجابايت من المعلمات ونقوم بتحديثها‬
‫جميعًا عدة مراتيف الثانية‪ .‬كلما كان ذلك ممكنًا‪ ،‬نريد إجراء هذه التحديثاتيف مكانها الصحيح‪.‬‬
‫ثانيًا‪ ،‬قد نشير إلى نفس المعلمات من متغيرات متعددة‪ .‬إذا لم نقم بالتحديثيف مكانه الصحيح‪،‬‬
‫فيجب أن نكون حريصين على تحديث كل هذه المراجع‪ ،‬لئال نتسببيف تسرب للذاكرة أو نشير‬
‫عن غير قصد إلى معلمات قديمة‪.‬‬

‫المتغيرات ‪ Variables‬عبارة عن حاويات قابلة للتغيير للحالةيف ‪ .TensorFlow‬أنها توفر‬


‫طريقة لتخزين معلمات النموذج الخاص بك‪ .‬يمكننا إسناد نتيجة العملية إلى متغير‬
‫‪ Variable‬مع تعيين ‪ .assign‬لتوضيح هذا المفهوم‪ ،‬قمنا بالكتابة فوق قيم‬
‫‪ Variable Z‬بعد تهيئته‪ ،‬باستخدام ‪ ،zeros_like‬ليكون لها نفس شكل ‪.Y‬‬

‫))‪Z = tf.Variable(tf.zeros_like(Y‬‬
‫))‪print('id(Z):', id(Z‬‬
‫‪73‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫)‪Z.assign(X + Y‬‬
‫))‪print('id(Z):', id(Z‬‬
‫‪id(Z): 140011833215008‬‬
‫‪id(Z): 140011833215008‬‬
‫حتى بعد تخزين الحالة باستمراريف متغير ‪ ،Variable‬قد ترغبيف تقليل استخدام الذاكرة‬
‫بشكل أكبر عن طريق تجنب التخصيصات الزائدة لموترات ليست معلمات نموذجك‪ .‬نظرًا ألن‬
‫موترات ‪TensorFlow‬غير قابلة للتغيير ‪ immutable‬وال تتدفق التدرجات ‪ gradients‬من‬
‫خالل التعيينات المتغيرة‪ ،‬ال يوفر ‪ TensorFlow‬طريقة واضحة لتشغيل عملية فرديةيف المكان‪.‬‬

‫ومع ذلك‪ ،‬يوفر ‪ TensorFlow‬مصمم ‪ tf.function‬اللتفاف الحساب داخل الرسم‬


‫البياني ‪ TensorFlow‬الذي يتم تجميعه وتحسينه قبل التشغيل‪ .‬يتيح ذلك لـ ‪TensorFlow‬‬
‫تقليم ‪ prune‬القيم غير المستخدمة وإعادة استخدام التخصيصات السابقة التي لم تعد مطلوبة‪.‬‬
‫هذا يقلل من حمل الذاكرة لحسابات ‪.TensorFlow‬‬

‫‪@tf.function‬‬
‫‪def computation(X, Y):‬‬
‫‪Z = tf.zeros_like(Y) # This unused value will be‬‬
‫‪pruned out‬‬
‫‪A = X + Y # Allocations will be reused when no‬‬
‫‪longer needed‬‬
‫‪B = A + Y‬‬
‫‪C = B + Y‬‬
‫‪return C + Y‬‬

‫)‪computation(X, Y‬‬
‫=‪<tf.Tensor: shape=(3, 4), dtype=float32, numpy‬‬
‫‪array([[ 8., 9., 26., 27.],‬‬
‫‪[24., 33., 42., 51.],‬‬
‫>)‪[56., 57., 58., 59.]], dtype=float32‬‬
‫‪2.1.6‬‬
‫يعد التحويل إلى موتر )‪ NumPy (ndarray‬أو العكس أمرًا سهالً‪ .‬النتيجة المحولة ال تشترك‬
‫في الذاكرة‪ .‬هذا اإلزعاج البسيط مهم جدًايف الواقع‪ :‬عند إجراء عمليات على وحدة المعالجة‬
‫المركزية ‪ CPU‬أو على وحدات معالجة الرسومات ‪ ،GPUs‬فأنت ال تريد إيقاف الحساب‪،‬يف ‬
‫انتظار معرفة ما إذا كانت حزمة ‪ NumPy‬من بايثون قد ترغبيف القيام بشيء آخر بنفس جزء‬
‫الذاكرة‪.‬‬

‫)(‪A = X.numpy‬‬
‫)‪B = tf.constant(A‬‬
‫)‪type(A), type(B‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪74‬‬

‫‪(numpy.ndarray,‬‬
‫)‪tensorflow.python.framework.ops.EagerTensor‬‬

‫لتحويل موتر بحجم ‪ 1‬إلى ‪ ،Python scalar‬يمكننا استدعاء دالة العنصر ‪ item‬أو دوال بايثون‬
‫المضمنة‪.‬‬

‫)(‪a = tf.constant([3.5]).numpy‬‬
‫)‪a, a.item(), float(a), int(a‬‬
‫)‪(array([3.5], dtype=float32), 3.5, 3.5, 3‬‬

‫‪2.1.7‬‬
‫كالس الموتر ‪ tensor class‬هي الواجهة الرئيسية لتخزين البيانات ومعالجتها في‬ ‫•‬
‫مكتبات التعلم العميق‪.‬‬
‫توفر ‪ Tensors‬مجموعة متنوعة من الدوال بما في ذلك إجراءات البناء‬ ‫•‬
‫‪ construction routines‬؛ الفهرسة ‪ indexing‬والتقطيع ‪ slicing‬العمليات‬
‫الرياضيات األساسية ؛ البث ‪ .broadcasting‬التخصيص الفعال للذاكرة ‪memory-‬‬
‫‪ efficient assignment‬؛ والتحويل من وإلى كائنات بايثون األخرى‪.‬‬

‫‪2.1.8‬‬
‫قم بتشغيل الكود في هذا القسم‪ .‬قم بتغيير العبارة الشرطية ‪ X == Y‬إلى ‪X < Y‬‬ ‫•‬
‫أو ‪ ، X > Y‬ثم انظر إلى نوع الموتر الذي يمكنك الحصول عليه‪.‬‬
‫استبدل الموترتين اللتين تعمالن بواسطة عنصر في آلية البث بأشكال أخرى ‪ ،‬على‬ ‫•‬
‫سبيل المثال ‪ ،‬موترات ثالثية األبعاد‪ .‬هل النتيجة هي نفسها كما هو متوقع؟‬

‫‪Data Preprocessing‬‬ ‫‪2.2‬‬


‫حتى اآلن‪ ،‬كنا نعمل مع البيانات التركيبية التي وصلتيف موترات جاهزة‪ .‬ومع ذلك‪ ،‬لتطبيق التعلم‬
‫العميقيف البرية‪ ،‬يجب علينا استخراج البيانات الفوضوية ‪ messy data‬المخزنة بتنسيقات‬
‫عشوائية‪ ،‬ومعالجتها مسبقًا لتناسب احتياجاتنا‪ .‬لحسن الحظ‪ ،‬يمكن لمكتبة ‪ pandas‬القيام‬
‫بالكثير من الرفع الثقيل‪ .‬هذا القسم‪ ،‬على الرغم من عدم وجود بديل عن برنامج تعليمي مناسب‬
‫لـ ‪ ، pandas‬سيمنحك دورة مكثفة حول بعض اإلجراءات الروتينية األكثر شيوعًا‪.‬‬

‫‪Reading the Dataset‬‬ ‫‪2.2.1‬‬


‫ملفات القيم المفصولة بفواصل (‪ )CSV‬موجودةيف كل مكان لتخزين البيانات الجدولية (مثل‬
‫جداول البيانات)‪ .‬هنا‪ ،‬يتوافق كل سطر مع سجل واحد ويتكون من عدة حقول (مفصولة بفواصل‬
‫‪ ،)comma-separated‬على سبيل المثال‪" ،‬ألبرت أينشتاين‪ 14 ،‬مارس ‪ ،1879‬أولم ‪ ،‬مدرسة‬
‫الفنون التطبيقية الفيدرالية ‪ ،‬اإلنجازاتيف مجال فيزياء الجاذبية"‪ .‬لتوضيح كيفية تحميل ملفات‬
‫‪75‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪ CSV‬مع ‪ ،pandas‬نقوم بإنشاء ملف ‪ CSV‬أدناه ‪ ../data/house_tiny.csv‬يمثل‬


‫هذا الملف مجموعة بيانات للمنازل‪ ،‬حيث يتوافق كل صف مع منزل مميز وتتوافق األعمدة مع‬
‫عدد الغرف (‪ )NumRooms‬ونوع السقف (‪ )RoofType‬والسعر (‪.)Price‬‬

‫‪import os‬‬

‫)‪os.makedirs(os.path.join('..', 'data'), exist_ok=True‬‬


‫)'‪data_file = os.path.join('..', 'data', 'house_tiny.csv‬‬
‫‪with open(data_file, 'w') as f:‬‬
‫‪f.write('''NumRooms,RoofType,Price‬‬
‫‪NA,NA,127500‬‬
‫‪2,NA,106000‬‬
‫‪4,Slate,178100‬‬
‫)'''‪NA,NA,140000‬‬
‫دعنا اآلن نستورد ‪ pandas‬ونحمِّل مجموعة البيانات مع ‪.read_csv‬‬

‫‪import pandas as pd‬‬

‫)‪data = pd.read_csv(data_file‬‬
‫)‪print(data‬‬
‫‪NumRooms RoofType‬‬ ‫‪Price‬‬
‫‪0‬‬ ‫‪NaN‬‬ ‫‪NaN 127500‬‬
‫‪1‬‬ ‫‪2.0‬‬ ‫‪NaN 106000‬‬
‫‪2‬‬ ‫‪4.0‬‬ ‫‪Slate 178100‬‬
‫‪3‬‬ ‫‪NaN‬‬ ‫‪NaN 140000‬‬
‫‪Data Preparation‬‬ ‫‪2.2.2‬‬
‫في التعلم الخاضع لإلشراف‪ ،‬نقوم بتدريب النماذج للتنبؤ بقيمة مستهدفة معينة‪ ،‬مع األخذيف ‬
‫االعتبار مجموعة معينة من قيم اإلدخال‪ .‬خطوتنا األولىيف معالجة مجموعة البيانات هي فصل‬
‫األعمدة المقابلة لإلدخال ‪ input‬مقابل القيم المستهدفة ‪ .target values‬يمكننا تحديد األعمدة‬
‫إما باالسم أو عن طريق الفهرسة القائمة على الموقع الصحيح ‪integer-location based‬‬
‫‪.)iloc( indexing‬‬

‫ربما الحظت أن ‪ pandas‬استبدلت جميع إدخاالت ‪ CSV‬بالقيمة ‪ NA‬بقيمة ‪ NaN‬خاصة‬


‫(ليس رقمًا ‪ .)not a number‬يمكن أن يحدث هذا أيضًا عندما يكون اإلدخال فارغًا ‪،empty‬‬
‫على سبيل المثال‪ ." 3,,,270000" ،‬تسمى هذه القيم المفقودة ‪ missing values‬وهي " ‪bed‬‬
‫‪"bugs‬يف علم البيانات‪ ،‬وهو تهديد دائم ستواجهه طوال حياتك المهنية‪ .‬اعتمادًا على السياق‪،‬‬
‫يمكن معالجة القيم المفقودة إما عن طريق التضمين ‪ imputation‬أو الحذف ‪.deletion‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪76‬‬

‫يستبدل التضمين ‪ Imputation‬القيم المفقودة بتقديرات لقيمها بينما يتجاهل الحذف‬


‫‪ deletion‬ببساطة إما تلك الصفوف أو تلك األعمدة التي تحتوي على قيم مفقودة‪.‬‬

‫فيما يلي بعض أساليب التضمين الشائعة‪ .‬بالنسبة لحقول اإلدخال الفئوية ‪categorical input‬‬
‫‪ ،fields‬يمكننا التعامل مع ‪ NaN‬كفئة‪ .‬نظرًا ألن العمود ‪ RoofType‬يأخذ القيم ‪ Slate‬و‬
‫‪ ،NaN‬يمكن للـ ‪ pandas‬تحويل هذا العمود إلى عمودين ‪ RoofType_Slate‬و‬
‫‪ Slate‬قيم‬ ‫‪ .RoofType_nan‬سيحدد الصف الذي يكون نوع زقاقه هو‬
‫‪ RoofType_Slate‬و ‪ RoofType_nan‬على ‪ 1‬و ‪ 0‬على التوالي‪ .‬يحمل العكس لصف‬
‫به قيمة ‪ RoofType‬مفقودة‪.‬‬

‫]‪inputs, targets = data.iloc[:, 0:2], data.iloc[:, 2‬‬


‫)‪inputs = pd.get_dummies(inputs, dummy_na=True‬‬
‫)‪print(inputs‬‬
‫‪NumRooms RoofType_Slate RoofType_nan‬‬
‫‪0‬‬ ‫‪NaN‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪2.0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪4.0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪NaN‬‬ ‫‪0‬‬ ‫‪1‬‬
‫بالنسبة للقيم العددية المفقودة ‪ ،missing numerical values‬يتمثل أحد األساليب اإلرشادية‬
‫‪ heuristic‬الشائعةيف استبدال إدخاالت ‪ NaN‬بالقيمة المتوسطة للعمود المقابل‪.‬‬

‫))(‪inputs = inputs.fillna(inputs.mean‬‬
‫)‪print(inputs‬‬
‫‪NumRooms RoofType_Slate RoofType_nan‬‬
‫‪0‬‬ ‫‪3.0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪1‬‬ ‫‪2.0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪2‬‬ ‫‪4.0‬‬ ‫‪1‬‬ ‫‪0‬‬
‫‪3‬‬ ‫‪3.0‬‬ ‫‪0‬‬ ‫‪1‬‬
‫‪Tensor‬‬ ‫‪2.2.3‬‬
‫اآلن بعد أن أصبحت جميع اإلدخاالتيف المدخالت واألهداف رقمية‪ ،‬يمكننا تحميلهايف موتر‬
‫(تذكر القسم ‪.)2.1‬‬

‫‪import tensorflow as tf‬‬

‫‪X, y = tf.constant(inputs.values),‬‬
‫)‪tf.constant(targets.values‬‬
‫‪X, y‬‬
‫=‪(<tf.Tensor: shape=(4, 3), dtype=float64, numpy‬‬
‫‪array([[3., 0., 1.],‬‬
‫‪77‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪[2., 0., 1.],‬‬


‫‪[4., 1., 0.],‬‬
‫‪[3., 0., 1.]])>,‬‬
‫‪<tf.Tensor: shape=(4,), dtype=int64,‬‬
‫)>)]‪numpy=array([127500, 106000, 178100, 140000‬‬
‫‪2.2.4‬‬
‫أنت تعرف اآلن كيفية تقسيم أعمدة البيانات‪ ،‬وإسناد المتغيرات المفقودة‪ ،‬وتحميل بيانات‬
‫‪ Pandas‬إلى موترات‪.‬يف القسم ‪ ،5.7‬سوف تكتسب المزيد من مهارات معالجة البيانات‪.‬يف حين‬
‫أن هذه الدورة التدريبية المكثفة تبقي األمور بسيطة‪ ،‬يمكن أن تصبح معالجة البيانات صعبة‪ .‬على‬
‫سبيل المثال‪ ،‬بدالً من الوصول إلى ملف ‪ CSV‬واحد‪ ،‬قد تنتشر مجموعة البيانات الخاصة بنا‬
‫عبر ملفات متعددة مستخرجة من قاعدة بيانات عالئقية‪ .‬على سبيل المثال‪،‬يف تطبيق التجارة‬
‫اإللكترونية ‪ ،e-commerce‬قد تكون عناوين العمالء موجودةيف جدول وشراء البياناتيف جدول‬
‫آخر‪ .‬عالوة على ذلك‪ ،‬يواجه الممارسون أنواعًا ال تعد وال تحصى من البيانات تتجاوز الفئوية‬
‫والرقمية‪ .‬تتضمن أنواع البيانات األخرى سالسل نصية وصور وبيانات صوتية وسُحب النقاط‬
‫‪.point clouds‬يف كثير من األحيان‪ ،‬تكون األدوات المتقدمة والخوارزميات الفعالة مطلوبة لمنع‬
‫معالجة البيانات من أن تصبح أكبر عنق زجاجةيف خط أنابيب التعلم اآللي‪ .‬ستظهر هذه المشاكل‬
‫عندما نصل إلى الرؤية الحاسوبية ومعالجة اللغة الطبيعية‪ .‬أخيرًا‪ ،‬يجب أن ننتبه إلى جودة البيانات‬
‫‪ .data quality‬غالبًا ما تعاني مجموعات البيانات الواقعية من القيم المتطرفة ‪،outliers‬‬
‫والقياسات الخاطئة من أجهزة االستشعار ‪ ،sensors‬وأخطاء التسجيل‪ ،‬والتي يجب معالجتها‬
‫قبل تغذية البياناتيف أي نموذج‪ .‬يمكن أن تساعدك أدوات تصور البيانات مثل ‪ seaborn‬أو‬
‫‪ Bokeh‬أو ‪ matplotlib‬على فحص البيانات يدويًا وتطوير حدس حول المشكالت التي قد‬
‫تحتاج إلى معالجتها‪.‬‬

‫‪2.2.5‬‬
‫‪ .1‬حاول تحميل مجموعات البيانات ‪ ،datasets‬على سبيل المثال‪ Abalone ،‬من‬
‫مستودع ‪ UCI Machine Learning Repository‬وفحص خصائصها‪ .‬أي جزء‬
‫منهم يحتوي على قيم مفقودة ‪missing values‬؟ ما هو جزء المتغيرات العددية‬
‫‪ numerical‬أو الفئوية ‪ categorical‬أو النصية ‪text‬؟‬
‫‪ .2‬جرب فهرسة واختيار أعمدة البيانات باالسم بدالً من رقم العمود‪ .‬تحتوي وثائق‬
‫‪ Pandas‬الخاصة بالفهرسة على مزيد من التفاصيل حول كيفية القيام بذلك‪.‬‬
‫‪ .3‬ما حجم مجموعة البيانات التي تعتقد أنه يمكنك تحميلها بهذه الطريقة؟ ما قد تكون‬
‫القيود؟ تلميح‪ :‬ضع في اعتبارك الوقت الالزم لقراءة البيانات والتمثيل والمعالجة‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪78‬‬

‫وبصمة الذاكرة‪ .‬جرب هذا على الكمبيوتر المحمول الخاص بك‪ .‬ما الذي يتغير إذا‬
‫جربته على الخادم؟‬
‫‪ .4‬كيف ستتعامل مع البيانات التي تحتوي على عدد كبير جدًا من الفئات ‪categories‬؟‬
‫ماذا لو كانت تسميات الفئات كلها فريدة ‪ unique‬؟ هل يجب عليك تضمين األخير؟‬
‫‪ .5‬ما هي بدائل الباندا ‪ Pandas‬التي يمكنك التفكير فيها؟ ماذا عن تحميل موترات‬
‫‪ NumPy‬من ملف؟ تحقق من ‪ ، Pillow‬مكتبة تصوير ‪.Python‬‬

‫‪Linear Algebra‬‬ ‫‪2.3‬‬


‫في الوقت الحالي‪ ،‬يمكننا تحميل مجموعات البيانات إلى موترات ومعالجة هذه الموترات من‬
‫خالل العمليات الحسابية األساسية‪ .‬لبدء بناء نماذج متطورة‪ ،‬سنحتاج أيضًا إلى بعض األدوات‬
‫من الجبر الخطي ‪ .linear algebra‬يقدم هذا القسم مقدمة لطيفة ألهم المفاهيم‪ ،‬بدءًا من‬
‫الحساب العددي ‪ scalar arithmetic‬والتكثيف ‪ ramping up‬وصوالً إلى ضرب المصفوفة‬
‫‪.matrix multiplication‬‬

‫‪Scalars‬‬ ‫‪2.3.1‬‬
‫تتكون معظم الرياضيات اليومية من معالجة األرقام واحدًا تلو اآلخر‪ .‬رسميًا‪ ،‬نسمي هذه القيم‬
‫الكميات القياسية ‪ .Scalars‬على سبيل المثال‪ ،‬درجة الحرارةيف بالو ألتو هي ‪ 72‬درجات‬
‫فهرنهايت معتدلة‪ .‬إذا أردت تحويل درجة الحرارة إلى درجات سيليزية‪ ،‬فعليك تقييم التعبير = 𝑐‬
‫‪5‬‬
‫)‪ ، (𝑓 − 32‬وضبط 𝑓 على ‪.72‬يف هذه المعادلة‪ ،‬القيم ‪ 9 ، 5‬و‪ 32‬هي كميات قياسية‪.‬‬
‫‪9‬‬
‫المتغيرات 𝑐 و𝑓 تمثل الكميات القياسية غير المعروفة ‪.unknown scalars‬‬

‫نشير إلى الكميات القياسية ‪ scalars‬بأحرف عادية صغيرة (على سبيل المثال‪ 𝑥 ،‬و𝑦 و𝑧 ) ومساحة‬
‫جميع المقاييس ذات القيمة الحقيقية (المستمرة) بواسطة ‪ .ℝ‬من أجل المنفعة‪ ،‬سوف نتخطى‬
‫التعريفات الصارمة للمساحات السابقة ‪ .spaces‬فقط تذكر أن التعبير ‪ 𝑥 ∈ ℝ‬هو طريقة رسمية‬
‫للقول بأن هذا عدد حقيقي ذو قيمة 𝑥 ‪ .‬يشير الرمز ∈ (يُنطق "‪ )"in‬إلى العضويةيف مجموعة‪ .‬على‬
‫سبيل المثال‪ 𝑥, 𝑦 ∈ {0,1}،‬يشير إلى أن والمتغيرات التي يمكن أن تأخذ فقط قي ًما ‪ 0‬أو‪. 1‬‬

‫‪import tensorflow as tf‬‬

‫)‪x = tf.constant(3.0‬‬
‫)‪y = tf.constant(2.0‬‬

‫‪x + y, x * y, x / y, x**y‬‬
‫‪(<tf.Tensor: shape=(), dtype=float32, numpy=5.0>,‬‬
‫‪<tf.Tensor: shape=(), dtype=float32, numpy=6.0>,‬‬
‫‪<tf.Tensor: shape=(), dtype=float32, numpy=1.5>,‬‬
‫‪79‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫)>‪<tf.Tensor: shape=(), dtype=float32, numpy=9.0‬‬


‫‪Vectors‬‬ ‫‪2.3.2‬‬
‫ألغراضنا‪ ،‬يمكنك التفكيريف المتجهات ‪ Vectors‬على أنها مصفوفات ذات طول ثابت من‬
‫الكميات القياسية ‪ .scalars‬كما هو الحال مع نظرائهميف الكود‪ ،‬نسمي هذه القيم عناصر المتجه‬
‫‪( elements of the vector‬المرادفات تشمل اإلدخاالت والمكونات)‪ .‬عندما تمثل المتجهات‬
‫أمثلة من مجموعات بيانات من العالم الحقيقي‪ ،‬فإن قيمها تحمل بعض األهميةيف العالم‬
‫الحقيقي‪ .‬على سبيل المثال‪ ،‬إذا كنا ندرب نموذجًا للتنبؤ بمخاطر التخلف عن سداد القرض‬
‫‪ ،loan defaulting‬فقد نربط كل متقدم بمتجه تتطابق مكوناته مع كميات مثل دخله أو طول‬
‫فترة التوظيف أو عدد حاالت التخلف عن السداد السابقة‪ .‬إذا كنا ندرس مخاطر النوبات القلبية‬
‫‪ ،heart attack risk‬فقد يمثل كل متجه مريضًا وقد تتوافق مكوناته مع أحدث عالماته الحيوية‬
‫ومستويات الكوليسترول ودقائق من التمارينيف اليوم وما إلى ذلك‪ 𝐱.‬و𝐲 و 𝐳)‪.‬‬

‫‪1st‬‬ ‫ترتيب‬ ‫كموترات‬ ‫المتجهات‬ ‫تنفيذ‬ ‫يتم‬


‫‪ .-order tensors‬بشكل عام‪ ،‬يمكن أن يكون لمثل هذه الموترات أطوال عشوائية‪ ،‬تخضع‬
‫لقيود الذاكرة‪ .‬تحذير‪:‬يف بايثون‪ ،‬كما هو الحاليف معظم لغات البرمجة‪ ،‬تبدأ مؤشرات المتجهات‬
‫‪ vector indices‬عند ‪ ، 0‬والمعروفة أيضًا باسم الفهرسة الصفرية ‪،zero-based indexing‬‬
‫بينمايف الجبر الخطي‪ ،‬تبدأ نصوص الجبر الخطي من ‪( 1‬الفهرسة على أساس واحد ‪one-based‬‬
‫‪.)indexing‬‬

‫)‪x = tf.range(3‬‬
‫‪x‬‬
‫‪<tf.Tensor: shape=(3,), dtype=int32, numpy=array([0, 1,‬‬
‫>)‪2], dtype=int32‬‬
‫يمكننا اإلشارة إلى عنصر متجه باستخدام حرف منخفض ‪ .subscript‬على سبيل المثال‪𝑥2 ،‬‬
‫يشير إلى العنصر الثاني من 𝐱‪ .‬نظرًا ألنه قيمة قياسية ‪ ،scalar‬فإننا ال نظهره بخط عريض‪ .‬بشكل‬
‫افتراضي‪ ،‬نحن نتخيل المتجهات عن طريق تكديس عناصرها عموديًا‪.‬‬
‫‪𝑥1‬‬
‫‪𝐱 = [ ⋮ ],‬‬
‫𝑛𝑥‬
‫فيما يلي عناصر المتجه 𝑛𝑥 ‪.𝑥1 , … ,‬يف وقت الحق‪ ،‬سوف نميز بين متجهات األعمدة ‪column‬‬
‫‪ vectors‬ومتجهات الصفوف ‪ row vectors‬التي يتم تكديس عناصرها أفقيًا‪ .‬تذكر أننا نصل‬
‫إلى عناصر الموتر عبر الفهرسة ‪.indexing‬‬

‫]‪x[2‬‬
‫>‪<tf.Tensor: shape=(), dtype=int32, numpy=2‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪80‬‬

‫لإلشارة إلى أن المتجه يحتوي على عناصر 𝑛 ‪ ،‬نكتب 𝑛‪ .𝐱 ∈ ℝ‬بشكل رسمي‪ ،‬نطلق 𝑛 على‬
‫أبعاد المتجه ‪.dimensionality of the vector‬يف الكود‪ ،‬هذا يتوافق مع طول الموتر‪ ،‬ويمكن‬
‫الوصول إليه عبر دالة ‪ len‬المدمجةيف بايثون‪.‬‬

‫)‪len(x‬‬
‫‪3‬‬
‫يمكننا أيضًا الوصول إلى الطول عبر سمة الشكل ‪ .shape‬الشكل عبارة عن مجموعة تشير إلى‬
‫طول الموتر على طول كل محور‪ .‬الموترات التي لها محور واحد فقط لها أشكال تحتوي على‬
‫عنصر واحد فقط‪.‬‬

‫‪x.shape‬‬
‫)]‪TensorShape([3‬‬
‫في كثير من األحيان‪ ،‬يتم تحميل كلمة "بُعد ‪ " dimension‬بشكل زائد لتعني كالً من عدد المحاور‬
‫والطول على طول محور معين‪ .‬لتجنب هذا االلتباس‪ ،‬نستخدم الترتيب ‪ order‬لإلشارة إلى عدد‬
‫المحاور واألبعاد ‪ dimensionality‬حصريًا لإلشارة إلى عدد المكونات‪.‬‬

‫‪Matrices‬‬ ‫‪2.3.3‬‬
‫كما أن الكميات القياسية ‪ scalars‬هي موترات الترتيب ‪ 0 -order tensors‬والمتجهات‬
‫‪th‬‬

‫‪ vectors‬هي ‪ ، 1st-order tensors‬فإن المصفوفات ‪ matrices‬هي موترات ترتيب ‪2nd-‬‬


‫‪ .order tensors‬نشير إلى المصفوفات بأحرف كبيرة غامقة (على سبيل المثال‪ 𝐗،‬و𝐘 و𝐙)‪،‬‬
‫ونمثلهايف رمز بواسطة موترات بمحورين‪ .‬يشير التعبير 𝑛×𝑚‪ 𝐀 ∈ ℝ‬إلى أن المصفوفة 𝐀 تحتوي‬
‫على قيم قياسية ‪ scalers‬حقيقية القيمة 𝑛 × 𝑚 ‪ ،‬مرتبةيف شكل 𝑚 صفوف و𝑛 أعمدة‪ .‬عندما‬
‫𝑛 = 𝑚 نقول إن المصفوفة مربعة ‪ .square‬بصريا‪ ،‬يمكننا توضيح أي مصفوفة كجدول‪ .‬لإلشارة‬
‫إلى عنصر فردي‪ ،‬نقوم بتدوين كل من فهارس الصفوف واألعمدة ‪ ،‬على سبيل المثال ‪ 𝑎𝑖𝑗 ،‬القيمة‬
‫التي تنتمي إلى ‪ 𝐀′ 𝒔𝑖 th‬صف و ‪ 𝑗 th‬عمود‪:‬‬
‫‪𝑎11‬‬ ‫‪𝑎12‬‬ ‫𝑛‪⋯ 𝑎1‬‬
‫‪𝑎21‬‬ ‫‪𝑎22‬‬ ‫𝑛‪⋯ 𝑎2‬‬
‫⋮ [=𝐀‬ ‫⋮‬ ‫⋱‬ ‫‪⋮ ].‬‬
‫‪𝑎𝑚1‬‬ ‫‪𝑎𝑚2‬‬ ‫𝑛𝑚𝑎 ⋯‬
‫في الكود‪ ،‬نحن نمثل مصفوفة 𝑛×𝑚‪ 𝐀 ∈ ℝ‬بواسطة موتر الترتيب ‪2nd-order tensors‬‬
‫بالشكل (𝑛 ‪ .)𝑚،‬يمكننا تحويل أي موتر بحجم مناسب 𝑛 × 𝑚 إلى مصفوفة 𝑛 × 𝑚 بتمرير‬
‫الشكل المطلوب إلعادة تشكيله ‪:reshape‬‬

‫))‪A = tf.reshape(tf.range(6), (3, 2‬‬


‫‪A‬‬
‫=‪<tf.Tensor: shape=(3, 2), dtype=int32, numpy‬‬
‫‪81‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪array([[0, 1],‬‬
‫‪[2, 3],‬‬
‫>)‪[4, 5]], dtype=int32‬‬
‫في بعض األحيان‪ ،‬نريد قلب المحاور‪ .‬عندما نتبادل صفوف وأعمدة المصفوفة‪ ،‬فإن النتيجة‬
‫تسمى تبديلها ‪ .transpose‬بشكل رسمي‪ ،‬نشير إلى تبديل المصفوفة 𝐀 بواسطة ⊤𝐀 و اذا = 𝐁‬
‫⊤𝐀 ‪ ،‬ثم 𝑖𝑗𝑎 = 𝑗𝑖𝑏 لجميع 𝑖 و𝑗‪ .‬وبالتالي‪ ،‬فإن تبديل المصفوفة 𝑛 × 𝑚 عبارة عن مصفوفة‬
‫𝑚 × 𝑛‪:‬‬
‫‪𝑎11‬‬ ‫‪𝑎21‬‬ ‫‪… 𝑎𝑚1‬‬
‫‪𝑎12‬‬ ‫‪𝑎22‬‬ ‫‪… 𝑎𝑚2‬‬
‫⋮ [ = ⊤𝐀‬ ‫⋮‬ ‫⋱‬ ‫‪⋮ ].‬‬
‫𝑛‪𝑎1‬‬ ‫𝑛‪𝑎2‬‬ ‫𝑛𝑚𝑎 …‬
‫في الكود‪ ،‬يمكننا الوصول إلى تبديل أي مصفوفة ‪ matrix’s transpose‬على النحو التالي‪:‬‬

‫)‪tf.transpose(A‬‬
‫=‪<tf.Tensor: shape=(2, 3), dtype=int32, numpy‬‬
‫‪array([[0, 2, 4],‬‬
‫>)‪[1, 3, 5]], dtype=int32‬‬
‫المصفوفات المتماثلة ‪ Symmetric matrices‬هي مجموعة فرعية من المصفوفات المربعة‬
‫‪ square matrices‬التي تساوي التبادالت الخاصة بها‪ .𝐀 = 𝐀⊤ :‬المصفوفة التالية متماثلة‪:‬‬

‫)]]‪A = tf.constant([[1, 2, 3], [2, 0, 4], [3, 4, 5‬‬


‫)‪A == tf.transpose(A‬‬
‫=‪<tf.Tensor: shape=(3, 3), dtype=bool, numpy‬‬
‫‪array([[ True, True, True],‬‬
‫‪[ True, True, True],‬‬
‫>)]]‪[ True, True, True‬‬
‫المصفوفات مفيدةيف تمثيل مجموعات البيانات‪ .‬عادةً ما تتوافق الصفوف مع السجالت الفردية‬
‫وتتوافق األعمدة مع سمات مميزة‪.‬‬

‫‪Tensors‬‬ ‫‪2.3.4‬‬
‫بينما يمكنك الذهاب بعيدًايف رحلة التعلم اآللي الخاصة بك باستخدام الكميات القياسية‬
‫‪Scalars‬والمتجهات ‪ vectors‬والمصفوفات ‪ Matrices‬فقط‪ ،‬فقد تحتاجيف النهاية إلى العمل‬
‫مع الموترات ذات الترتيب األعلى ‪ .higher-order tensors‬تقدم لنا الموترات طريقة عامة‬
‫لوصف االمتدادات لمصفوفات الترتيب ‪ . nth-order arrays‬نحن نطلق على كالسات البرامج‬
‫من فئة الموتر "موترات ‪ " tensors‬على وجه التحديد ألنها يمكن أن تحتوي أيضًا على أعداد‬
‫عشوائية من المحاور‪.‬يف حين أنه قد يكون من المربك استخدام كلمة موتر لكل من الكائن الرياضي‬
‫وإدراكهيف الكود‪ ،‬يجب أن يكون معنانا واضحًا من السياق‪ .‬نشير إلى الموترات العامة بأحرف‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪82‬‬

‫كبيرة مع وجه خط خاص (على سبيل المثال‪ 𝖸، 𝖷،‬و𝖹) وآلية الفهرسة الخاصة بهم (على سبيل‬
‫المثال‪ 𝑥𝑖𝑗𝑘 ،‬و‪ )[𝖷]1,2𝑖−1,3‬تتبع بشكل طبيعي من المصفوفات‪.‬‬

‫ستصبح الموترات أكثر أهمية عندما نبدأ العمل مع الصور‪ .‬تصل كل صورة على هيئة موتر بترتيب‬
‫‪ 3rd-order tensor‬مع محاور مقابلة لالرتفاع والعرض والقناة ‪.channel‬يف كل موقع مكاني‪،‬‬
‫تتراكم شدة كل لون (أحمر وأخضر وأزرق) على طول القناة‪ .‬عالوة على ذلك‪ ،‬يتم تمثيل مجموعة‬
‫من الصوريف رمز بواسطة موتر ترتيب ‪ ، 4th-order tensor‬حيث يتم فهرسة الصور المميزة‬
‫على طول المحور األول‪ .‬يتم إنشاء الموترات ذات الترتيب األعلى بشكل مشابه للمتجهات‬
‫والمصفوفات‪ ،‬من خالل زيادة عدد مكونات الشكل‪.‬‬

‫))‪tf.reshape(tf.range(24), (2, 3, 4‬‬


‫=‪<tf.Tensor: shape=(2, 3, 4), dtype=int32, numpy‬‬
‫‪array([[[ 0, 1, 2, 3],‬‬
‫‪[ 4, 5, 6, 7],‬‬
‫‪[ 8, 9, 10, 11]],‬‬

‫‪[[12, 13, 14, 15],‬‬


‫‪[16, 17, 18, 19],‬‬
‫>)‪[20, 21, 22, 23]]], dtype=int32‬‬
‫‪2.3.5‬‬
‫الكميات القياسية والمتجهات والمصفوفات والموترات ذات الترتيب األعلى جميعها لها بعض‬
‫الخصائص المفيدة‪ .‬على سبيل المثال‪ ،‬تنتج عمليات ‪ elementwise‬مخرجات لها نفس شكل‬
‫معامالتها‪.‬‬

‫))‪A = tf.reshape(tf.range(6, dtype=tf.float32), (2, 3‬‬


‫‪B = A # No cloning of `A` to `B` by allocating new‬‬
‫‪memory‬‬
‫‪A, A + B‬‬
‫=‪(<tf.Tensor: shape=(2, 3), dtype=float32, numpy‬‬
‫‪array([[0., 1., 2.],‬‬
‫‪[3., 4., 5.]], dtype=float32)>,‬‬
‫=‪<tf.Tensor: shape=(2, 3), dtype=float32, numpy‬‬
‫‪array([[ 0., 2., 4.],‬‬
‫)>)‪[ 6., 8., 10.]], dtype=float32‬‬
‫يسمى الضرب األولي ‪ elementwise product‬لمصفوفتين ضرب ‪( Hadamard‬يشار إليه‬
‫⊙)‪ .‬أدناه‪ ،‬نوضح إدخاالت منتج ‪ Hadamard‬لمصفوفتين 𝑛×𝑚‪:𝐀, 𝐁 ∈ ℝ‬‬
‫‪83‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪𝑎11 𝑏11‬‬ ‫‪𝑎12 𝑏12‬‬ ‫𝑛‪… 𝑎1𝑛 𝑏1‬‬


‫‪𝑎21 𝑏21‬‬ ‫‪𝑎22 𝑏22‬‬ ‫𝑛‪… 𝑎2𝑛 𝑏2‬‬
‫[= 𝐁⊙𝐀‬ ‫‪].‬‬
‫⋮‬ ‫⋮‬ ‫⋱‬ ‫⋮‬
‫‪𝑎𝑚1 𝑏𝑚1‬‬ ‫‪𝑎𝑚2 𝑏𝑚2‬‬ ‫𝑛𝑚𝑏 𝑛𝑚𝑎 …‬
‫‪A * B‬‬
‫=‪<tf.Tensor: shape=(2, 3), dtype=float32, numpy‬‬
‫‪array([[ 0., 1., 4.],‬‬
‫>)‪[ 9., 16., 25.]], dtype=float32‬‬
‫إضافة أو مضاعفة قيمة قياسية ‪ scalar‬وموتر ‪ tensor‬ينتج عنه نتيجة بنفس شكل الموتر‬
‫األصلي‪ .‬هنا ‪ ،‬يضاف كل عنصر من عناصر الموتر إلى (أو يضرب في) القيمة القياسية‪.‬‬

‫‪a = 2‬‬
‫))‪X = tf.reshape(tf.range(24), (2, 3, 4‬‬
‫‪a + X, (a * X).shape‬‬
‫=‪(<tf.Tensor: shape=(2, 3, 4), dtype=int32, numpy‬‬
‫‪array([[[ 2, 3, 4, 5],‬‬
‫‪[ 6, 7, 8, 9],‬‬
‫‪[10, 11, 12, 13]],‬‬

‫‪[[14, 15, 16, 17],‬‬


‫‪[18, 19, 20, 21],‬‬
‫‪[22, 23, 24, 25]]], dtype=int32)>,‬‬
‫))]‪TensorShape([2, 3, 4‬‬
‫‪Reduction‬‬ ‫‪2.3.6‬‬
‫في كثير من األحيان‪ ،‬نرغبيف حساب مجموع عناصر الموتر‪ .‬للتعبير عن مجموع العناصريف ‬
‫‪ .∑𝑛𝑖=1‬هناك دالة بسيطة لها‪:‬‬ ‫متجه 𝐱 الطول 𝑛 ‪ ،‬نكتب 𝑖𝑥‬

‫)‪x = tf.range(3, dtype=tf.float32‬‬


‫)‪x, tf.reduce_sum(x‬‬
‫‪(<tf.Tensor: shape=(3,), dtype=float32, numpy=array([0.,‬‬
‫‪1., 2.], dtype=float32)>,‬‬
‫)>‪<tf.Tensor: shape=(), dtype=float32, numpy=3.0‬‬
‫للتعبير عن المجاميع ‪ sums‬على عناصر الموترات ذات الشكل التعسفي ‪،arbitrary shape‬‬
‫فإننا ببساطة نجمع جميع محاورها‪ .‬على سبيل المثال‪ ،‬يمكن كتابة مجموع عناصر 𝑛 × 𝑚‬
‫𝑚‬
‫𝑛‬
‫∑‪.‬‬ ‫∑‬ ‫المصفوفة 𝐀 كـ 𝑗𝑖𝑎‬
‫‪𝑗=1‬‬
‫‪𝑖=1‬‬

‫)‪A.shape, tf.reduce_sum(A‬‬
‫‪(TensorShape([2, 3]), <tf.Tensor: shape=(),‬‬
‫)>‪dtype=float32, numpy=15.0‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪84‬‬

‫بشكل افتراضي‪ ،‬يؤدي استدعاء دالة الجمع إلى تقليل الموتر على طول جميع محاوره‪ ،‬مما‬
‫يؤدييف النهاية إلى إنتاج قيمة قياسية ‪ .scalar‬تتيح لنا مكتباتنا أيضًا تحديد المحاور التي يجب‬
‫أن يتم تقليل الموتر على طولها‪ .‬لتجميع جميع العناصر على طول الصفوف (المحور ‪ ،)0‬نحدد‬
‫‪ axis=0‬يف ‪ .sum‬نظرًا ألن مصفوفة اإلدخال تقلل على طول المحور ‪ 0‬لتوليد متجه اإلخراج‪،‬‬
‫فإن هذا المحور مفقود من شكل المخرجات‪.‬‬

‫‪A.shape, tf.reduce_sum(A, axis=0).shape‬‬


‫))]‪(TensorShape([2, 3]), TensorShape([3‬‬
‫سيؤدي تحديد ‪ axis=1‬إلى تقليل بُعد العمود (المحور ‪ )1‬عن طريق جمع عناصر جميع‬
‫األعمدة‪.‬‬

‫‪A.shape, tf.reduce_sum(A, axis=1).shape‬‬


‫))]‪(TensorShape([2, 3]), TensorShape([2‬‬
‫إن اختزال مصفوفة على طول كل من الصفوف واألعمدة عن طريق الجمع يعادل تلخيص كل‬
‫عناصر المصفوفة‪.‬‬

‫‪tf.reduce_sum(A, axis=[0, 1]), tf.reduce_sum(A) # Same‬‬


‫`)‪as `tf.reduce_sum(A‬‬
‫‪(<tf.Tensor: shape=(), dtype=float32, numpy=15.0>,‬‬
‫)>‪<tf.Tensor: shape=(), dtype=float32, numpy=15.0‬‬
‫الكمية ذات الصلة هي المتوسط ‪ ،mean‬وتسمى أيضًا ‪ .average‬نحسب المتوسط بقسمة‬
‫المجموع على العدد اإلجمالي للعناصر‪ .‬نظرًا ألن حساب المتوسط شائع جدًا‪ ،‬فإنه يحصل على‬
‫دالة مكتبة مخصصة تعمل بشكل مماثل للجمع ‪.sum‬‬

‫)(‪tf.reduce_mean(A), tf.reduce_sum(A) / tf.size(A).numpy‬‬


‫‪(<tf.Tensor: shape=(), dtype=float32, numpy=2.5>,‬‬
‫)>‪<tf.Tensor: shape=(), dtype=float32, numpy=2.5‬‬
‫وبالمثل‪ ،‬يمكن لدالة حساب المتوسط أن تقلل من موتر على طول محاور معينة‪.‬‬

‫‪tf.reduce_mean(A, axis=0), tf.reduce_sum(A, axis=0) /‬‬


‫]‪A.shape[0‬‬
‫‪(<tf.Tensor: shape=(3,), dtype=float32,‬‬
‫‪numpy=array([1.5, 2.5, 3.5], dtype=float32)>,‬‬
‫‪<tf.Tensor: shape=(3,), dtype=float32,‬‬
‫)>)‪numpy=array([1.5, 2.5, 3.5], dtype=float32‬‬
‫‪Non-Reduction Sum‬‬ ‫‪2.3.7‬‬
‫قد يكون من المفيد أحيانًا االحتفاظ بعدد المحاور دون تغيير عند استدعاء الدالة لحساب‬
‫المجموع أو المتوسط‪ .‬هذا مهم عندما نريد استخدام آلية البث ‪.broadcast mechanism‬‬
‫‪85‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫)‪sum_A = tf.reduce_sum(A, axis=1, keepdims=True‬‬


‫‪sum_A, sum_A.shape‬‬
‫=‪(<tf.Tensor: shape=(2, 1), dtype=float32, numpy‬‬
‫‪array([[ 3.],‬‬
‫‪[12.]], dtype=float32)>,‬‬
‫))]‪TensorShape([2, 1‬‬
‫على سبيل المثال‪ ،‬بما أن ‪ sum_A‬تحافظ على محوريها بعد جمع كل صف‪ ،‬يمكننا قسمة ‪A‬‬
‫على ‪ sum_A‬مع البث إلنشاء مصفوفة حيث يتم جمع كل صف الى ‪.1‬‬

‫‪A / sum_A‬‬
‫=‪<tf.Tensor: shape=(2, 3), dtype=float32, numpy‬‬
‫‪array([[0.‬‬ ‫‪, 0.33333334, 0.6666667 ],‬‬
‫‪[0.25‬‬ ‫‪, 0.33333334, 0.41666666]],‬‬
‫>)‪dtype=float32‬‬
‫إذا أردنا حساب المجموع التراكمي ‪ cumulative sum‬لعناصر ‪ A‬على طول بعض المحاور‪،‬‬
‫قل ‪( axis=0‬صف بصف)‪ ،‬يمكننا استدعاء دالة ‪ .cumsum‬حسب التصميم‪ ،‬ال تقلل هذه‬
‫الدالة من موتر اإلدخال على طول أي محور‪.‬‬

‫)‪tf.cumsum(A, axis=0‬‬
‫=‪<tf.Tensor: shape=(2, 3), dtype=float32, numpy‬‬
‫‪array([[0., 1., 2.],‬‬
‫>)‪[3., 5., 7.]], dtype=float32‬‬
‫‪Dot Products‬‬ ‫‪2.3.8‬‬
‫حتى اآلن‪ ،‬قمنا فقط بإجراء العمليات األولية‪ ،‬والمجموع‪ ،‬والمتوسطات‪ .‬وإذا كان هذا هو كل ما‬
‫يمكننا فعله‪ ،‬فلن يستحق الجبر الخطي قسمًا خاصًا به‪ .‬لحسن الحظ‪ ،‬هذا هو المكان الذي تصبح‬
‫فيه األشياء أكثر إثارة لالهتمام‪ .‬يعد حاصل الضرب النقطي ‪ Dot Products‬من أهم العمليات‬
‫األساسية‪ .‬بالنظر إلى متجهين 𝑑‪ ، 𝐱, 𝐲 ∈ ℝ‬فإن حاصل الضرب النقطي 𝐲 ⊤ 𝐱 (او⟩𝐲 ‪ )⟨𝐱,‬هو‬
‫مجموع حاصل ضرب العناصريف نفس الموضع‪.𝐱 ⊤ 𝐲 = ∑𝑑𝑖=1 𝑥𝑖 𝑦𝑖 :‬‬

‫)‪y = tf.ones(3, dtype=tf.float32‬‬


‫)‪x, y, tf.tensordot(x, y, axes=1‬‬
‫‪(<tf.Tensor: shape=(3,), dtype=float32, numpy=array([0.,‬‬
‫‪1., 2.], dtype=float32)>,‬‬
‫‪<tf.Tensor: shape=(3,), dtype=float32, numpy=array([1.,‬‬
‫‪1., 1.], dtype=float32)>,‬‬
‫)>‪<tf.Tensor: shape=(), dtype=float32, numpy=3.0‬‬
‫بالتساوي‪ ،‬يمكننا حساب حاصل الضرب النقطي لمتجهين عن طريق إجراء عملية ضرب‬
‫عنصري ‪ elementwise multiplication‬متبوعة بمجموع ‪:sum‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪86‬‬

‫)‪tf.reduce_sum(x * y‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=3.0‬‬
‫يعتبر الضرب النقطي مفيديف مجموعة واسعة من السياقات‪ .‬على سبيل المثال‪ ،‬بالنظر إلى‬
‫مجموعة من القيم‪ ،‬يُشار إليها بالمتجه 𝑛‪ 𝐰 ∈ ℝ‬ومجموعة من األوزان التي يُشار إليهايف 𝐱 ‪،‬‬
‫يمكن التعبير عن امجموع االوزان للقيم وفقًا لألوزان 𝐰 على أنها حاصل الضرب النقطي 𝐰 ⊤ 𝐱‪.‬‬
‫عندما تكون األوزان غير سالبة ومجموعها واحد‪ ،‬مثل )‪ ،(∑𝑛𝑖=1 𝑤𝑖 = 1‬يعبر الضرب النقطي‬
‫عن مجموع االوزان ‪ .weighted average‬بعد تسوية متجهين بحيث يكون لهما طول الوحدة‬
‫‪ ،unit length‬تعبر حاصل الضرب النقطي عن جيب التمام للزاوية بينهما‪ .‬الحقًايف هذا القسم‪،‬‬
‫سنقدم رسميًا فكرة الطول ‪ length‬هذه‪.‬‬

‫‪Matrix-Vector‬‬ ‫‪2.3.9‬‬
‫اآلن بعد أن عرفنا كيفية حساب حاصل الضرب النقطي‪ ،‬يمكننا البدءيف فهم حاصل الضرب بين‬
‫𝑛 × 𝑚 مصفوفة 𝐀 ومتجه األبعاد 𝐱‪ .‬للبدء‪ ،‬نتخيل المصفوفة ‪ matrix‬بداللة متجهات الصف‬
‫‪: row vectors‬‬

‫⊤‪𝐚1‬‬
‫⊤‬
‫‪𝐀 = 𝐚2 ,‬‬
‫⋮‬
‫⊤𝐚[‬
‫]𝑚‬

‫⊤𝐚 هو متجه صف يمثل ‪ 𝑖 th‬صف المصفوفة 𝐀‪.‬‬


‫حيث كل ‪𝑖 ∈ ℝ‬‬
‫𝑛‬

‫حاصل ضرب المصفوفة المتجه 𝐱𝐀 هو ببساطة متجه طول العمود 𝑚 ‪ ،‬الذي يكون عنصره‬
‫⊤𝐚‪:‬‬
‫𝑖 هو حاصل الضرب النقطي 𝐱 𝑖‬
‫‪th‬‬

‫⊤‪𝐚1‬‬ ‫𝐱 ⊤‪𝐚1‬‬
‫⊤‬ ‫⊤‬
‫‪𝐀𝐱 = 𝐚2 𝐱 = 𝐚2 𝐱 .‬‬
‫⋮‬ ‫⋮‬
‫⊤‬ ‫⊤‬
‫] 𝑚𝐚[‬ ‫]𝐱 𝑚𝐚[‬

‫يمكننا أن نفكريف الضرب بمصفوفة 𝑛×𝑚‪ 𝐀 ∈ ℝ‬كتحويل يُسقط المتجهات منه 𝑛‪ ℝ‬إلى 𝑚‪.ℝ‬‬
‫هذه التحوالت مفيدة بشكل ملحوظ‪ .‬على سبيل المثال‪ ،‬يمكننا تمثيل عمليات التدوير على أنها‬
‫عمليات ضرب بواسطة مصفوفات مربعة معينة‪ .‬تصف حاصل ضرب ‪ Matrix-vector‬أيضًا‬
‫الحساب األساسي المتضمنيف حساب مخرجات كل طبقةيف الشبكة العصبية بالنظر إلى‬
‫مخرجات الطبقة السابقة‪.‬‬

‫للتعبير عن حاصل المصفوفة‪-‬المتجهيف الكود‪ ،‬نستخدم دالة ‪ matvec.‬الحظ أن بُعد العمود‬


‫‪( A‬طوله على طول المحور ‪ )1‬يجب أن يكون هو نفسه بُعد ‪( x‬طوله)‪.‬‬
‫‪87‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫)‪A.shape, x.shape, tf.linalg.matvec(A, x‬‬


‫‪(TensorShape([2, 3]),‬‬
‫‪TensorShape([3]),‬‬
‫[(‪<tf.Tensor: shape=(2,), dtype=float32, numpy=array‬‬
‫)>)‪5., 14.], dtype=float32‬‬
‫‪Matrix-Matrix Multiplication‬‬ ‫–‬ ‫‪2.3.10‬‬
‫إذا كنت قد حصلت على تعليق حاصل الضرب النقطي وضرب المصفوفة‪-‬المتجه‪ ،‬فيجب أن‬
‫يكون ضرب المصفوفة‪-‬المصفوفة أمرًا سهالً‪.‬‬

‫قل إن لدينا مصفوفتين 𝑘×𝑛‪ 𝐀 ∈ ℝ‬و 𝑚×𝑘‪:𝐁 ∈ ℝ‬‬

‫‪𝑎11‬‬ ‫‪𝑎12‬‬ ‫𝑘‪⋯ 𝑎1‬‬ ‫‪𝑏11‬‬ ‫‪𝑏12‬‬ ‫𝑚‪⋯ 𝑏1‬‬


‫‪𝑎21‬‬ ‫‪𝑎22‬‬ ‫𝑘‪⋯ 𝑎2‬‬ ‫‪𝑏21‬‬ ‫‪𝑏22‬‬ ‫𝑚‪⋯ 𝑏2‬‬
‫⋮ [=𝐀‬ ‫⋮‬ ‫⋱‬ ‫⋮ [ = 𝐁‪⋮ ],‬‬ ‫‪].‬‬
‫⋮‬ ‫⋱‬ ‫⋮‬
‫‪𝑎𝑛1‬‬ ‫‪𝑎𝑛2‬‬ ‫𝑘𝑛𝑎 ⋯‬ ‫‪𝑏𝑘1‬‬ ‫‪𝑏𝑘2‬‬ ‫𝑚𝑘𝑏 ⋯‬

‫⊤𝐚 تشير إلى متجه الصف ‪ row vector‬الذي يمثل ‪ 𝑖 th‬صف المصفوفة 𝐀‬
‫افترض ‪𝑖 ∈ ℝ‬‬
‫𝑘‬

‫ودعنا 𝑘‪ 𝐛𝑗 ∈ ℝ‬تشير إلى متجه العمود من ‪ 𝑗 th‬عمود المصفوفة 𝐁‪:‬‬

‫⊤‪𝐚1‬‬
‫⊤‬
‫‪𝐀 = 𝐚2 , 𝐁 = [𝐛1‬‬ ‫‪𝐛2‬‬ ‫⋯‬ ‫‪𝐛𝑚 ].‬‬
‫⋮‬
‫⊤𝐚[‬‫]𝑛‬

‫إليجاد حاصل ضرب المصفوفة 𝑚×𝑛‪ ،𝐂 ∈ ℝ‬نقوم ببساطة بحساب كل عنصر 𝑗𝑖𝑐على أنه‬
‫⊤𝐚‪:‬‬
‫حاصل الضرب النقطي بين 𝑖 صف لـ 𝐀 وصف 𝑗 لـ 𝐁‪ ،‬أي 𝑗𝐛 𝑖‬
‫‪th‬‬ ‫‪th‬‬

‫⊤‪𝐚1‬‬ ‫‪𝐚1⊤ 𝐛1‬‬ ‫‪𝐚1⊤ 𝐛2‬‬ ‫𝑚𝐛 ⊤‪⋯ 𝐚1‬‬


‫⊤‬ ‫⊤‬
‫‪𝐂 = 𝐀𝐁 = 𝐚2 [𝐛1‬‬ ‫‪𝐛2‬‬ ‫‪⋯ 𝐛𝑚 ] = 𝐚2 𝐛1‬‬ ‫⊤𝐚‬‫‪2 𝐛2‬‬ ‫⊤𝐚 ⋯‬‫‪2 𝐛𝑚 .‬‬
‫⋮‬ ‫⋮‬ ‫⋮‬ ‫⋱‬ ‫⋮‬
‫⊤𝐚[‬‫]𝑛‬ ‫⊤𝐚 [‬‫‪𝑛 𝐛1‬‬ ‫⊤𝐚‬‫‪𝑛 𝐛2‬‬ ‫⊤𝐚 ⋯‬‫] 𝑚𝐛 𝑛‬

‫يمكننا التفكيريف ضرب المصفوفة‪-‬المصفوفة 𝐁𝐀 على أنه حاصل ضرب مصفوفة متجهية أو‬
‫ضرب نقطي 𝑛 × 𝑚 وربط النتائج معًا لتشكيل مصفوفة 𝑚 × 𝑛‪.‬يف المقتطف التالي‪ ،‬نقوم‬
‫بضرب المصفوفة على ‪ A‬و ‪ .B‬هنا‪ A ،‬عبارة عن مصفوفة تتكون من صفين و‪ 3‬أعمدة‪ ،‬و ‪ B‬عبارة‬
‫عن مصفوفة مكونة من ‪ 3‬صفوف و ‪ 4‬أعمدة‪ .‬بعد الضرب‪ ،‬نحصل على مصفوفة من صفين و‪4‬‬
‫أعمدة‪.‬‬

‫)‪B = tf.ones((3, 4), tf.float32‬‬


‫)‪tf.matmul(A, B‬‬
‫=‪<tf.Tensor: shape=(2, 4), dtype=float32, numpy‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪88‬‬

‫‪array([[ 3., 3., 3., 3.],‬‬


‫>)‪[12., 12., 12., 12.]], dtype=float32‬‬
‫غالبًا ما يتم تبسيط مصطلح ضرب المصفوفة‪-‬المصفوفة إلى ضرب المصفوفة ‪matrix‬‬
‫‪ ،multiplication‬ويجب عدم الخلط بينه وبين ضرب ‪.Hadamard‬‬

‫‪Norms‬‬ ‫‪2.3.11‬‬
‫بعض العوامل األكثر فائدةيف الجبر الخطي هي المعيار ‪ .Norm‬بشكل غير رسمي‪ ،‬يخبرنا‬
‫المعيار المتجه عن حجمه‪ .‬على سبيل المثال‪ ،‬يقيس المعيار ‪ 𝑒𝑙𝑙2‬الطول (اإلقليدي) للمتجه‪.‬‬
‫هنا‪ ،‬نحن نستخدم مفهوم الحجم ‪ size‬الذي يتعلق بحجم مكونات المتجه (وليس أبعاده)‪.‬‬

‫المعيار هو دالة ‖⋅‖ تقوم بتعيين متجه ‪ vector‬إلى رقمى ‪ scalar‬وتفي بالخصائص الثالث‬
‫التالية‪:‬‬

‫‪ .1‬بالنظر إلى أي متجه 𝐱 ‪ ،‬إذا قمنا بقياس (جميع عناصر) المتجه بواسطة قيمية قياسية‬
‫‪ ،scalar‬فسيتم قياس معياره وفقًا لذلك‪:‬‬

‫‪‖𝛼𝐱‖ = |𝛼|‖𝐱‖.‬‬

‫‪ .2‬ألي متجهات 𝐱 و𝐲 ‪ :‬المعايير ‪ norms‬ترضي متباينة المثلث ‪:triangle inequality‬‬


‫‪‖𝐱 + 𝐲‖ ≤ ‖𝐱‖ + ‖𝐲‖.‬‬
‫‪ .3‬معيار المتجه ‪ norm of a vector‬غير سالب ويختفي فقط إذا كان المتجه صفرًا‪:‬‬
‫‪‖𝐱‖ > 0 for all 𝐱 ≠ 0.‬‬

‫العديد من الدوال هي معايير صالحة ومعايير مختلفة تقوم بترميز مفاهيم مختلفة الحجم‪ .‬المعيار‬
‫اإلقليدية ‪ Euclidean norm‬التي تعلمناها جميعًايف هندسة المدرسة االبتدائية عند حساب وتر‬
‫المثلث األيمن هي الجذر التربيعي لمجموع مربعات عناصر المتجه‪ .‬رسميًا‪ ،‬هذا يسمى المعيار‬
‫‪ ℓ2‬ويتم التعبير عنه كـ‪:‬‬

‫𝑛‬

‫∑√ = ‪‖𝐱‖2‬‬ ‫‪𝑥𝑖2 .‬‬


‫‪𝑖=1‬‬

‫طريقة المعيار تحسب المعيار ‪.ℓ2‬‬

‫)]‪u = tf.constant([3.0, -4.0‬‬


‫)‪tf.norm(u‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=5.0‬‬
‫معيار ‪ ℓ1‬شائع أيضًا ويسمى المقياس المرتبط بمسافة مانهاتن ‪.Manhattan distance‬‬
‫بحكم التعريف‪ ،‬يجمع المعيار ‪ ℓ1‬القيم المطلقة لعناصر المتجه‪:‬‬
‫‪89‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫𝑛‬

‫‪‖𝐱‖1 = ∑|𝑥𝑖 |.‬‬


‫‪𝑖=1‬‬

‫بالمقارنة مع المعيار ‪ ، ℓ2‬فهي أقل حساسية للقيم المتطرفة ‪ .outliers‬لحساب المعيار ‪،ℓ1‬‬
‫نقوم بتكوين القيمة المطلقة باستخدام عملية الجمع‪.‬‬

‫))‪tf.reduce_sum(tf.abs(u‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=7.0‬‬
‫كل من المعيار ‪ ℓ2‬والمعيار ‪ ℓ1‬هي حاالت خاصة للمعايير األكثر عمومية 𝑝‪:ℓ‬‬
‫‪1‬‬
‫𝑛‬ ‫𝑝‬
‫∑( = 𝑝‖𝐱‖‬ ‫‪|𝑥𝑖 |𝑝 ) .‬‬
‫‪𝑖=1‬‬

‫في حالة المصفوفات‪ ،‬تكون األمور أكثر تعقيدًا‪ .‬بعد كل شيء‪ ،‬يمكن النظر إلى المصفوفات‬
‫كمجموعات من اإلدخاالت الفردية وككائنات تعمل على المتجهات وتحولها إلى متجهات‬
‫أخرى‪ .‬على سبيل المثال‪ ،‬يمكننا أن نسأل إلى أي مدى يمكن أن يكون حاصل ضرب المصفوفة‪-‬‬
‫المتجه 𝐯𝐗 مرتبط بـ 𝐯‪ .‬هذا الخط الفكري يؤدي إلى معيار يسمى المعيار الطيفي ‪spectral‬‬
‫‪.norm‬يف الوقت الحالي‪ ،‬نقدم معيار ‪ ،Frobenius‬والذي يسهل حسابه ويتم تعريفه على أنه‬
‫الجذر التربيعي لمجموع مربعات عناصر المصفوفة‪:‬‬

‫𝑚‬ ‫𝑛‬
‫‪2‬‬
‫∑√ = 𝐹‖𝐗‖‬ ‫∑‬ ‫𝑗𝑖𝑥‬ ‫‪.‬‬
‫‪𝑖=1‬‬ ‫‪𝑗=1‬‬

‫يتصرف معيار ‪ Frobenius‬كما لو كان معيارًا ‪ ℓ2‬لمتجه على شكل مصفوفة‪ .‬سيؤدي استدعاء‬
‫الدالة التالية إلى حساب قاعدة ‪ Frobenius‬للمصفوفة‪.‬‬

‫)))‪tf.norm(tf.ones((4, 9‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=6.0‬‬
‫بينما ال نريد أن نتقدم كثيرًا على أنفسنا‪ ،‬يمكننا زرع بعض الحدس بالفعل حول سبب فائدة هذه‬
‫المفاهيم‪.‬يف التعلم العميق‪ ،‬نحاول غالبًا حل مشكالت التحسين ‪:optimization problems‬‬
‫تعظيم ‪ maximize‬االحتمال المخصص للبيانات المرصودة ‪observed data‬؛ تعظيم‬
‫اإليرادات المرتبطة بنموذج التوصية؛ تقليل المسافة بين التنبؤات وأرصاد القيم الحقيقية‬
‫‪ ground-truth‬؛ تقليل ‪ minimize‬المسافة بين تمثيالت صور الشخص نفسه مع تعظيم‬
‫المسافة بين تمثيالت الصور ألشخاص مختلفين‪ .‬غالبًا ما يتم التعبير عن هذه المسافات‪ ،‬التي‬
‫تشكل أهداف خوارزميات التعلم العميق‪ ،‬كمعايير ‪.norms‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪90‬‬

‫‪2.3.12‬‬
‫في هذا القسم‪ ،‬راجعنا جميع الجبر الخطي الذي ستحتاجه لفهم جزء كبير من التعلم العميق‬
‫الحديث‪ .‬هناك الكثير من الجبر الخطي والكثير منه مفيد للتعلم اآللي‪ .‬على سبيل المثال‪ ،‬يمكن‬
‫أن تتحلل المصفوفات إلى عوامل ‪ ،factors‬ويمكن أن تكشف هذه التحليالت عن بنية منخفضة‬
‫األبعاديف مجموعات البيانات الواقعية‪ .‬هناك حقول فرعية كاملة للتعلم اآللي تركز على استخدام‬
‫تحليالت المصفوفة وتعميماتها على الموترات عالية الترتيب الكتشاف البنيةيف مجموعات‬
‫البيانات وحل مشاكل التنبؤ‪ .‬لكن هذا الكتاب يركز على التعلم العميق‪ .‬ونعتقد أنك ستكون أكثر‬
‫ميلًا لتعلم المزيد من الرياضيات بمجرد أن تتسخ يديك عند تطبيق التعلم اآللي على مجموعات‬
‫بيانات حقيقية‪ .‬لذلك بينما نحتفظ بالحقيف تقديم المزيد من الرياضيات الحقًا‪ ،‬فإننا نختتم هذا‬
‫القسم هنا‪.‬‬

‫إذا كنت حريصًا على تعلم المزيد من الجبر الخطي‪ ،‬فهناك العديد من الكتب والموارد الممتازة‬
‫عبر اإلنترنت‪ .‬للحصول على دورة مكثفة أكثر تقدمًا ‪ ،‬ضعيف اعتبارك التحقق ‪(Kolter,‬‬
‫)‪2008, Petersen et al., 2008, Strang, 1993‬‬

‫الخالصة‪:‬‬

‫القيم القياسية ‪ scalars‬والمتجهات ‪ vectors‬والمصفوفات ‪ matrices‬والموترات‬ ‫•‬


‫‪ tensors‬هي الكائنات الرياضية األساسية المستخدمةيف الجبر الخطي ولها عدد من‬
‫المحاور صفر وواحد واثنان وعدد عشوائي من المحاور‪ ،‬على التوالي‪.‬‬
‫يمكن تقطيع أو تقليل الموترات على طول محاور محددة من خالل الفهرسة‪ ،‬أو‬ ‫•‬
‫عمليات مثل المجموع والمتوسط‪ ،‬على التوالي‪.‬‬
‫تسمى حاصل الضرب األولي ‪ Elementwise products‬حاصل ضرب‬ ‫•‬
‫‪ .Hadamard‬على النقيض من ذلك‪ ،‬فإن الضرب النقطي وحاصل ضرب‬
‫المصفوفة‪-‬المتجه وضرب المصفوفة‪-‬المصفوفة ليست عمليات عنصرية‬
‫‪ elementwise operations‬وفي العموم تُرجع الكائنات التي لها أشكال مختلفة عن‬
‫المعامالت‪.‬‬
‫مقارنة بحاصل ضرب ‪ ،Hadamard‬يستغرق ضرب المصفوفة‪-‬المصفوفة وقتًا أطول‬ ‫•‬
‫بكثير للحساب (الوقت المكعب بدالً من الوقت التربيعي)‪.‬‬
‫تلتقط المعايير ‪ Norms‬المفاهيم المختلفة لحجم المتجه ‪magnitude of a‬‬ ‫•‬
‫‪ ،vector‬ويتم تطبيقها بشكل شائع على الفرق بين متجهين لقياس المسافة بينهما‪.‬‬
‫تتضمن معايير المتجه الشائعة المعيار ‪ ℓ1‬والمعيار ‪ ، ℓ2‬وتشمل معايير المصفوفة‬ ‫•‬
‫المشتركة المعايير الطيفية ومعايير ‪.Frobenius‬‬
‫‪91‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪2.3.13‬‬
‫‪ .1‬اثبت أن مدور ‪ transpose‬لمدور المصفوفة هو المصفوفة نفسها‪.(𝐀 ) = 𝐀 :‬‬
‫⊤ ⊤‬

‫‪ .2‬بالنظر إلى مصفوفتين 𝐀 و 𝐁‪ ،‬اثبت ان ‪ sum‬و‪𝐀⊤ +:transposition commute‬‬


‫⊤)𝐁 ‪.𝐁⊤ = (𝐀 +‬‬
‫‪ .3‬بالنظر إلى أي مصفوفة مربعة 𝐀‪ ،‬هل ⊤𝐀 ‪ 𝐀 +‬دائمًا متماثل ‪symmetric‬؟ هل‬
‫يمكنك إثبات النتيجة باستخدام نتيجة التمرينين السابقين فقط؟‬
‫‪ .4‬حددنا موتر ‪ X‬للشكل (‪)2, 3, 4‬يف هذا القسم‪ .‬ما هو خرج )‪len(X‬اكتب إجابتك‬
‫دون تنفيذ أي كود‪ ،‬ثم تحقق من إجابتك باستخدام الكود‪.‬‬
‫‪ .5‬بالنسبة للموتر ‪ X‬ذي الشكل التعسفي‪ ،‬هل يتوافق )‪ len(X‬دائمًا مع طول محور‬
‫معين من ‪X‬؟ ما هذا المحور؟‬
‫‪ .6‬قم بتنفيذ )‪ A / A.sum(axis=1‬وشاهد ما سيحدث‪ .‬هل يمكنك تحليل‬
‫السبب؟‬
‫‪ .7‬عند السفر بين نقطتينيف وسط مانهاتن‪ ،‬ما هي المسافة التي يتعين عليك قطعها من‬
‫حيث اإلحداثيات‪ ،‬أي من حيث السبل والشوارع؟ هل يمكنك السفر قطريا؟‬
‫‪ .8‬ضعيف اعتبارك موتر ذو شكل (‪ .)2, 3, 4‬ما هي أشكال مخرجات الجمع على طول‬
‫المحور ‪ 0‬و ‪ 1‬و ‪2‬؟‬
‫‪ .9‬قم بتغذية موتر بثالثة محاور أو أكثر لدالة ‪ linalg.norm‬وراقب ناتجها‪ .‬ماذا‬
‫تحسب هذه الدالة لموترات الشكل التعسفي؟‬
‫‪210 ×216‬‬
‫‪𝐁 ∈ ،𝐀 ∈ ℝ‬‬ ‫‪ .10‬حدد ثالث مصفوفات كبيرة‪ ،‬على سبيل المثال‬
‫‪5 ×214‬‬ ‫‪16 ×25‬‬
‫‪ 𝐂 ∈ ℝ2‬على سبيل المثال تم تهيئتها باستخدام متغيرات عشوائية‬ ‫‪ℝ2‬و‬
‫غاوسية ‪ .Gaussian random variables‬تريد حساب المنتج 𝐂𝐁𝐀‪ .‬هل هناك أي‬
‫اختالفيف مساحة الذاكرة وسرعتها‪ ،‬اعتمادًا على ما إذا كنت تقوم بحساب 𝐂)𝐁𝐀(‬
‫أم )𝐂𝐁(𝐀‪ .‬لماذا؟‬
‫‪210 ×216‬‬
‫‪𝐁 ∈ ،𝐀 ∈ ℝ‬‬ ‫‪ .11‬حدد ثالث مصفوفات كبيرة‪ ،‬على سبيل المثال‬
‫‪5 ×216‬‬ ‫‪16 ×25‬‬
‫‪ .𝐂 ∈ ℝ2‬هل هناك أي اختالفيف السرعة حسب ما إذا كنت تقوم‬ ‫‪ℝ2‬و‬
‫بحساب 𝐁𝐀 أم ⊤ 𝐂𝐀؟ لماذا ا؟ ما الذي يتغير إذا قمت بتهيئة ⊤ 𝐁 = 𝐂 بدون استنساخ‬
‫الذاكرة ‪cloning memory‬؟ لماذا؟‬
‫‪ .𝐀, 𝐁, 𝐂 ∈ ℝ‬تشكيل موتر مع ‪3‬‬ ‫‪100×200‬‬
‫‪ .12‬حدد ثالث مصفوفات‪ ،‬على سبيل المثال‬
‫محاور عن طريق تكديس ]𝐂 ‪ .[𝐀, 𝐁,‬ما هي األبعاد؟ اقطع ‪ Slice‬اإلحداثي الثاني‬
‫للمحور الثالث السترجاع 𝐁‪ .‬تحقق من صحة إجابتك‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪92‬‬

‫‪Calculus‬‬ ‫‪2.4‬‬
‫لفترة طويلة‪ ،‬ظلت كيفية حساب مساحة الدائرة لغزاً‪ .‬بعد ذلك‪ ،‬جاء عالم الرياضيات اليوناني‬
‫القديم أرخميدس بفكرة ذكية لتسجيل سلسلة من المضلعات مع زيادة أعداد الرؤوس داخل‬
‫دائرة (الشكل ‪ .)2.4.1‬بالنسبة إلى المضلع ذي الرؤوس 𝑛‪ ،‬نحصل على مثلثات 𝑛‪ .‬يقترب‬
‫ارتفاع كل مثلث من نصف القطر 𝑟 ألننا نقسم الدائرة بشكل أكثر دقة‪.‬يف نفس الوقت‪ ،‬تقترب‬
‫𝑟𝜋‪2‬‬
‫‪ ،‬ألن النسبة بين القوس والقاطع تقترب من ‪ 1‬لعدد كبير من الرؤوس‪ .‬وبالتالي‪ ،‬فإن‬ ‫𝑛‬
‫قاعدتها‬
‫𝑟𝜋‪1 2‬‬
‫( ⋅ 𝑟 ⋅ 𝑛‪.‬‬ ‫)‬ ‫مساحة المثلث تقترب ‪= 𝜋𝑟 2‬‬
‫𝑛 ‪2‬‬

‫الشكل ‪ 2.4.1‬إيجاد مساحة الدائرة كإجراء نهائي‪.‬‬

‫يؤدي هذا اإلجراء المحدد إلى حساب التفاضل والتكامل التفاضلي (القسم ‪ .)19.5‬يمكن أن‬
‫يخبرنا األول عن كيفية زيادة قيمة دالة أو إنقاصها من خالل معالجة وسيطاتها‪ .‬يكون هذا مفيدًا‬
‫لمشاكل التحسين التي نواجههايف التعلم العميق‪ ،‬حيث نقوم بتحديث معلماتنا بشكل متكرر‬
‫لتقليل دالة الخطأ‪ .‬يعالج التحسين كيفية مالءمة (‪ )fit‬نماذجنا لبيانات التدريب‪ ،‬وحساب‬
‫التفاضل والتكامل ‪ calculus‬هو شرطه األساسي‪ .‬ومع ذلك‪ ،‬ال تنس أن هدفنا النهائي هو األداء‬
‫الجيد على البيانات غير المرئية من قبل ‪ .unseen data‬هذه المشكلة تسمى التعميم‬
‫‪ generalization‬وستكون محور التركيز الرئيسي للفصول األخرى‪.‬‬

‫‪Derivatives and Differentiation‬‬ ‫‪2.4.1‬‬


‫ببساطة‪ ،‬المشتق ‪ derivative‬هو معدل التغييريف دالة فيما يتعلق بالتغيراتيف مدخالتها‬
‫‪ .arguments‬يمكن للمشتقات أن تخبرنا عن مدى سرعة زيادة دالة الخطأ أو نقصانها إذا قمنا‬
‫بزيادة أو تقليل كل معلمة بمقدار ضئيل للغاية‪ .‬بشكل رسمي‪ ،‬بالنسبة للدوال ‪ ،𝑓: ℝ → ℝ‬تلك‬
‫الخريطة من القيم القياسية ‪ scalars‬إلى القيم القياسية ‪ ،scalars‬يتم تعريف مشتق 𝑓 عند نقطة‬
‫𝑥على أنه‬

‫)𝑥(𝑓 ‪𝑓(𝑥 + ℎ) −‬‬


‫𝑚𝑖𝑙 = )𝑥( ‪𝑓 ′‬‬ ‫‪.‬‬
‫‪ℎ→0‬‬ ‫‪ℎ‬‬
‫‪93‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫يسمى هذا المصطلح الموجود على الجانب األيمن بالغاية ‪ limit‬ويخبرنا بما يحدث لقيمة‬
‫التعبير عندما يقترب المتغير المحدد من قيمة معينة‪ .‬يخبرنا هذا الحد بما تتقارب فيه النسبة بين‬
‫االضطراب ‪ ℎ‬والتغيريف قيمة الدالة )𝑥(𝑓 ‪ 𝑓(𝑥 + ℎ) −‬كلما قلصنا حجمها إلى الصفر‪.‬‬

‫عندما يكون )𝑥( ‪ 𝑓 ′‬موجودًا‪ ،‬يُقال إنه قابل للتفاضل ‪ differentiable‬عند 𝑥؛ وعندما )𝑥( ‪𝑓 ′‬‬
‫يكون موجودًا لجميع 𝑥يف مجموعة‪ ،‬على سبيل المثال‪ ،‬الفترة ]𝑏 ‪ ، [𝑎,‬نقول أن 𝑓هذا قابل‬
‫للتفاضليف هذه المجموعة‪ .‬ليست كل الدوال قابلة للتفاضل‪ ،‬بمايف ذلك العديد من الدوال التي‬
‫نرغبيف تحسينها‪ ،‬بمايف ذلك الدقة والمنطقة الواقعة تحت خاصية التشغيل المستقبلة (‪.)AUC‬‬
‫ومع ذلك‪ ،‬نظرًا ألن حساب مشتق الخسارة يعد خطوة حاسمةيف جميع الخوارزميات تقريبًا‬
‫لتدريب الشبكات العصبية العميقة‪ ،‬فإننا غالبًا ما نقوم بتحسين بديل قابل للتفاضل بدالً من ذلك‪.‬‬

‫يمكننا تفسير المشتق )𝑥( ‪ 𝑓 ′‬على أنه معدل اللحظي ‪ instantaneous rate‬للتغير بالنسبة لـ‬
‫)𝑥(𝑓‪ .‬دعونا نطور بعض الحدس بمثال‪ .‬حدد 𝑥‪. 𝑢 = 𝑓(𝑥) = 3𝑥 2 − 4‬‬

‫‪%matplotlib inline‬‬
‫‪import numpy as np‬‬
‫‪from matplotlib_inline import backend_inline‬‬
‫‪from d2l import tensorflow as d2l‬‬

‫‪def f(x):‬‬
‫‪return 3 * x ** 2 - 4 * x‬‬
‫)𝑥(𝑓‪𝑓(𝑥+ℎ)−‬‬
‫‪ ،‬النهج ‪ 2‬كنهج ‪ .0‬بينما تفتقر هذه التجربة إلى صرامة إثبات رياضي‪ ،‬سنرى‬ ‫‪ℎ‬‬
‫ضبط‬
‫ذلك قريبًا بالفعل ‪.𝑓 ′ (1) = 2‬‬

‫‪for h in 10.0**np.arange(-1, -6, -1):‬‬


‫‪print(f'h={h:.5f}, numerical limit={(f(1+h)-‬‬
‫)'}‪f(1))/h:.5f‬‬
‫‪h=0.10000, numerical limit=2.30000‬‬
‫‪h=0.01000, numerical limit=2.03000‬‬
‫‪h=0.00100, numerical limit=2.00300‬‬
‫‪h=0.00010, numerical limit=2.00030‬‬
‫‪h=0.00001, numerical limit=2.00003‬‬
‫هناك العديد من االصطالحات الترميزية المكافئة للمشتقات‪ .‬معطى)𝑥(𝑓 = 𝑦 ‪ ،‬العبارات التالية‬
‫متكافئة‪:‬‬

‫𝑓𝑑 𝑦𝑑‬ ‫𝑑‬


‫= ‪𝑓 ′ (𝑥) = 𝑦 ′‬‬ ‫=‬ ‫=‬ ‫‪𝑓(𝑥) = 𝐷𝑓(𝑥) = 𝐷𝑥 𝑓(𝑥),‬‬
‫𝑥𝑑 𝑥𝑑 𝑥𝑑‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪94‬‬

‫𝑑‬
‫حيث الرموز 𝑥𝑑 و 𝐷 هم عوامل التفاضل ‪ .differentiation operators‬أدناه‪ ،‬نقدم مشتقات‬
‫بعض الدوال الشائعة‪:‬‬

‫𝑑‬
‫𝐶‬ ‫‪=0‬‬ ‫𝐶 ‪for any constant‬‬
‫𝑥𝑑‬
‫𝑛 𝑑‬
‫𝑥‬ ‫‪= 𝑛𝑥 𝑛−1‬‬ ‫‪for 𝑛 ≠ 0‬‬
‫𝑥𝑑‬
‫𝑥 𝑑‬
‫𝑒‬ ‫𝑥𝑒 =‬
‫𝑥𝑑‬
‫𝑑‬
‫𝑥 ‪ln‬‬ ‫‪= 𝑥 −1‬‬
‫𝑥𝑑‬
‫غالبًا ما تكون الدوال المكونة من دوال قابلة للتفاضل قابلة للتفاضل‪ .‬القواعد التالية مفيدة للعمل‬
‫مع تراكيب أي دوال قابلة للتفاضل 𝑓 و 𝑔 وثابت 𝐶‪.‬‬

‫𝑑‬ ‫𝑑‬
‫])𝑥(𝑓𝐶[‬ ‫𝐶=‬ ‫)𝑥(𝑓‬ ‫‪Constant multiple rule‬‬
‫𝑥𝑑‬ ‫𝑥𝑑‬
‫𝑑‬ ‫𝑑‬ ‫𝑑‬
‫])𝑥(𝑔 ‪[𝑓(𝑥) +‬‬ ‫=‬ ‫‪𝑓(𝑥) +‬‬ ‫)𝑥(𝑔‬ ‫‪Sum rule‬‬
‫𝑥𝑑‬ ‫𝑥𝑑‬ ‫𝑥𝑑‬
‫𝑑‬ ‫𝑑‬ ‫𝑑‬
‫])𝑥(𝑔)𝑥(𝑓[‬ ‫)𝑥(𝑓 )𝑥(𝑔 ‪= 𝑓(𝑥) 𝑔(𝑥) +‬‬ ‫‪Product rule‬‬
‫𝑥𝑑‬ ‫𝑥𝑑‬ ‫𝑥𝑑‬
‫𝑑‬ ‫𝑑‬
‫)𝑥(𝑓 𝑑‬ ‫)𝑥(𝑔 )𝑥(𝑓 ‪𝑔(𝑥) 𝑓(𝑥) −‬‬
‫=‬ ‫𝑥𝑑‬ ‫𝑥𝑑‬ ‫‪Quotient rule‬‬
‫)𝑥(𝑔 𝑥𝑑‬ ‫)𝑥( ‪𝑔2‬‬

‫باستخدام هذا‪ ،‬يمكننا تطبيق القواعد إليجاد مشتقة 𝑥‪ 3𝑥 2 − 4‬عبر‪:‬‬

‫𝑑‬ ‫𝑑‬ ‫𝑑‬


‫‪[3𝑥 2 − 4𝑥] = 3 𝑥 2 − 4 𝑥 = 6𝑥 − 4.‬‬
‫𝑥𝑑‬ ‫𝑥𝑑‬ ‫𝑥𝑑‬
‫يُظهر التوصيل ‪ 𝑥 = 1‬أن المشتق ‪ 2‬موجود بالفعليف هذا المكان‪ .‬الحظ أن المشتقات تخبرنا‬
‫عن ميل ‪ slope‬الدالةيف موقع معين‪.‬‬

‫‪Visualization Utilities‬‬ ‫‪2.4.2‬‬


‫يمكننا رسم ميل الدوال باستخدام مكتبة ‪ .matplotlib‬نحن بحاجة إلى تحديد بعض‬
‫الدوال‪ .‬كما يشير اسمه‪ ،‬فإن ‪ use_svg_display‬تخبر ‪ matplotlib‬بإخراج‬
‫الرسومات بتنسيق ‪SVG‬للحصول على صور أكثر وضوحًا‪ .‬التعليق ‪ #@save‬هو مُعدِّل‬
‫‪ modifier‬خاص يسمح لنا بحفظ أي دالة أو فئة أو كتلة رمز أخرىيف حزمة ‪ d2l‬حتى نتمكن‬
‫عبر‬ ‫‪،‬‬ ‫المثال‬ ‫سبيل‬ ‫على‬ ‫‪،‬‬ ‫الكود‬ ‫تكرار‬ ‫دون‬ ‫الحقًا‬ ‫استدعاؤها‬ ‫من‬
‫)(‪.d2l.use_svg_display‬‬
95 ‫ االساسيات‬:‫الفصل الثاني‬

def use_svg_display(): #@save


"""Use the svg format to display a plot in
Jupyter."""
backend_inline.set_matplotlib_formats('svg')
‫ نظرًا ألن بيان االستيراد‬.set_figsize ‫ يمكننا تعيين أحجام الشكل باستخدام‬،‫بشكل مالئم‬
‫عبر‬plt ‫ حيث تم تمييز‬matplotlib import pyplot as plt ‫ من‬import
.d2l.plt ‫ يمكننا استدعاء‬،d2l ‫ في حزمة‬via #@save

def set_figsize(figsize=(3.5, 2.5)): #@save


"""Set the figure size for matplotlib."""
use_svg_display()
d2l.plt.rcParams['figure.figsize'] = figsize
labels ‫ بمايف ذلك التسميات‬،‫ المحاور بالخصائص‬set_axes ‫يمكن أن تربط الدالة‬
.scales ‫ والمقاييس‬ranges ‫والنطاقات‬

#@save
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale,
yscale, legend):
"""Set the axes for matplotlib."""
axes.set_xlabel(xlabel), axes.set_ylabel(ylabel)
axes.set_xscale(xscale), axes.set_yscale(yscale)
axes.set_xlim(xlim), axes.set_ylim(ylim)
if legend:
axes.legend(legend)
axes.grid()
‫ جزء‬.‫ لتراكب منحنيات متعددة‬plot ‫ يمكننا تحديد دالة الرسم‬،‫باستخدام هذه الدوال الثالث‬
.‫كبير من الكود هنا هو مجرد ضمان تطابق أحجام وأشكال المدخالت‬

#@save
def plot(X, Y=None, xlabel=None, ylabel=None, legend=[],
xlim=None,
ylim=None, xscale='linear', yscale='linear',
fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5,
2.5), axes=None):
"""Plot data points."""

def has_one_axis(X): # True if `X` (tensor or list)


has 1 axis
return (hasattr(X, "ndim") and X.ndim == 1 or
isinstance(X, list)
and not hasattr(X[0], "__len__"))
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 96

if has_one_axis(X): X = [X]
if Y is None:
X, Y = [[]] * len(X), X
elif has_one_axis(Y):
Y = [Y]
if len(X) != len(Y):
X = X * len(Y)

set_figsize(figsize)
if axes is None: axes = d2l.plt.gca()
axes.cla()
for x, y, fmt in zip(X, Y, fmts):
axes.plot(x,y,fmt) if len(x) else
axes.plot(y,fmt)
set_axes(axes, xlabel, ylabel, xlim, ylim, xscale,
yscale, legend)
‫ = 𝑦 الخاص بها‬2𝑥 − 3 tangent line ‫اآلن يمكننا رسم الدالة )𝑥(𝑓 = 𝑢 وخط المماس‬
.slope of the tangent line ‫ حيث المعامل هو ميل خط المماس‬،𝑥 = 1 ‫عند‬

x = np.arange(0, 3, 0.1)
plot(x, [f(x), 2 * x - 3], 'x', 'f(x)', legend=['f(x)',
'Tangent line (x=1)'])
‫‪97‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪Partial Derivatives and Gradients‬‬ ‫‪2.4.3.‬‬


‫حتى اآلن‪ ،‬كنا نفرق بين دوال متغير واحد فقط‪.‬يف التعلم العميق‪ ،‬نحتاج أيضًا إلى العمل مع دوال‬
‫العديد من المتغيرات‪ .‬نقدم بإيجاز مفاهيم المشتق التي تنطبق على مثل هذه الدوال متعددة‬
‫المتغيرات ‪.multivariate functions‬‬

‫لتكن ) 𝑛𝑥 ‪ 𝑦 = 𝑓(𝑥1 , 𝑥2 , … ,‬ان تكون دالة مع 𝑛 من المتغيرات‪ .‬المشتق الجزئي ‪partial‬‬


‫‪ derivative‬لـ 𝑦فيما يتعلق بمعاملته ‪ 𝑖 th‬هو‬

‫𝑦𝜕‬ ‫) 𝑛𝑥 ‪𝑓(𝑥1 , … , 𝑥𝑖−1 , 𝑥𝑖 + ℎ, 𝑥𝑖+1 , … , 𝑥𝑛 ) − 𝑓(𝑥1 , … , 𝑥𝑖 , … ,‬‬


‫𝑚𝑖𝑙 =‬ ‫‪.‬‬
‫‪𝜕𝑥𝑖 ℎ→0‬‬ ‫‪ℎ‬‬
‫𝑦𝜕‬
‫لحساب 𝑥𝜕‪ ،‬يمكننا التعامل مع 𝑛𝑥 ‪ 𝑥1 , … , 𝑥𝑖−1 , 𝑥𝑖+1 , … ,‬على أنها ثوابت ونحسب مشتقة‬
‫𝑖‬
‫𝑦 بالنسبة إلى 𝑥‪ .‬تعد اصطالحات الترميز التالية للمشتقات الجزئية شائعة وكلها تعني نفس‬
‫الشيء‪:‬‬

‫𝑦𝜕‬ ‫𝑓𝜕‬
‫=‬ ‫‪= 𝜕𝑥𝑖 𝑓 = 𝜕𝑖 𝑓 = 𝑓𝑥𝑖 = 𝑓𝑖 = 𝐷𝑖 𝑓 = 𝐷𝑥𝑖 𝑓.‬‬
‫𝑖𝑥𝜕 𝑖𝑥𝜕‬

‫يمكننا ربط المشتقات الجزئية ‪ partial derivatives‬لدالة متعددة المتغيرات ‪multivariate‬‬


‫فيما يتعلق بجميع متغيراتها للحصول على متجه يسمى تدرج الدالة ‪gradient of the‬‬
‫‪ .function‬لنفترض أن مدخالت الدالة ‪ 𝑓: ℝ𝑛 → ℝ‬عبارة عن متجه ذي أبعاد = 𝐱‬
‫⊤] 𝑛𝑥 ‪ [𝑥1 , 𝑥2 , … ,‬وأن الناتج عبارة عن قيمة قياسية ‪ .scalar‬انحدار الدالة 𝑓 بالنسبة إلى 𝐱 متجه‬
‫للمشتقات الجزئية‪:‬‬
‫⊤‬
‫‪∇𝐱 𝑓(𝐱) = [𝜕𝑥1 𝑓(𝐱), 𝜕𝑥2 𝑓(𝐱), … 𝜕𝑥𝑛 𝑓(𝐱)] .‬‬

‫عندما ال يكون هناك غموض ‪∇𝐱 𝑓(𝐱) ،no ambiguity‬عادة ما يتم استبداله بـ )𝐱(𝑓∇‪ .‬القواعد‬
‫التالية مفيدة للتمييز بين الدوال متعددة المتغيرات‪:‬‬

‫لكل 𝑛×𝑚‪ 𝐀 ∈ ℝ‬ما لدينا ⊤𝐀 = 𝐱𝐀 𝐱∇ و𝐀 = 𝐀 ⊤ 𝐱 𝐱∇‪.‬‬ ‫•‬


‫⊤‬
‫𝐀 ‪∇𝐱 𝐱 𝐀𝐱 = (𝐀 +‬‬ ‫𝐱) ⊤‬
‫‪ ، 𝐀 ∈ ℝ‬لدينا ذلك‬ ‫𝑛×𝑛‬
‫بالنسبة للمصفوفات المربعة‬ ‫•‬
‫وعلى وجه الخصوص 𝐱‪.∇𝐱 ‖𝐱‖2 = ∇𝐱 𝐱 ⊤ 𝐱 = 2‬‬

‫وبالمثل‪ ،‬لدينا 𝐗‪ ∇𝐗 ‖𝐗‖2𝐹 = 2‬ألي مصفوفة 𝐗‪.‬‬


‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪98‬‬

‫‪Chain Rule‬‬ ‫‪2.4.4‬‬


‫في التعلم العميق‪ ،‬غالبًا ما يصعب حساب التدرجات ‪ gradients‬ذات االهتمام ألننا نعمل مع‬
‫دوال متداخلة بعمق (دوال (دوال ‪ .))...‬لحسن الحظ‪ ،‬تهتم قاعدة السلسلة ‪ Chain Rule‬بهذا‬
‫األمر‪ .‬بالعودة إلى دوال متغير واحد‪ ،‬افترض أن ))𝑥(𝑔(𝑓 = 𝑦 والدوال األساسية )𝑢(𝑓 = 𝑦‬
‫و)𝑥(𝑔 = 𝑢 كالهما قابل للتفاضل‪ .‬تنص قاعدة السلسلة على ذلك‬

‫𝑢𝑑 𝑦𝑑 𝑦𝑑‬
‫=‬ ‫‪.‬‬
‫𝑥𝑑 𝑢𝑑 𝑥𝑑‬
‫بالعودة إلى الدوال متعددة المتغيرات ‪ ،multivariate functions‬افترض أن )𝐮(𝑓 = 𝑦 لها‬
‫متغيرات 𝑚𝑢 ‪ ، 𝑢1 , 𝑢2 , … ,‬حيث لكل )𝐱( 𝑖𝑔 = 𝑖𝑢 منها متغيرات 𝑛𝑥 ‪ ، 𝑥1 , 𝑥2 , … ,‬أي‪ .‬ثم‬
‫تنص قاعدة السلسلة على ذلك‬

‫𝑦𝜕‬ ‫‪𝜕𝑦 𝜕𝑢1 𝜕𝑦 𝜕𝑢2‬‬ ‫𝑚𝑢𝜕 𝑦𝜕‬


‫=‬ ‫‪+‬‬ ‫‪+ ⋯+‬‬ ‫‪and thus ∇𝐱 𝑦 = 𝐀∇𝐮 𝑦,‬‬
‫𝑖𝑥𝜕 ‪𝜕𝑥𝑖 𝜕𝑢1 𝜕𝑥𝑖 𝜕𝑢2‬‬ ‫𝑖𝑥𝜕 𝑚𝑢𝜕‬

‫حيث 𝑚×𝑛‪ 𝐀 ∈ ℝ‬هي مصفوفة تحتوي على مشتق المتجه 𝐮 فيما يتعلق بالمتجه 𝐱‪ .‬وبالتالي‪،‬‬
‫فإن تقييم التدرج يتطلب حساب ضرب المصفوفة‪-‬المتجه‪ .‬هذا هو أحد األسباب الرئيسية التي‬
‫تجعل الجبر الخطي لبنة أساسيةيف بناء أنظمة التعلم العميق‪.‬‬

‫‪2.4.5‬‬
‫على الرغم من أننا قد خدشنا للتو سطح موضوع عميق‪ ،‬فقد تم التركيز بالفعل على عدد من‬
‫المفاهيم‪ :‬أوالً‪ ،‬يمكن تطبيق قواعد تكوين التفاضل ‪ rules for differentiation‬بال تفكير‪،‬‬
‫مما يمكننا من حساب التدرجات ‪ gradients‬تلقائيًا‪ .‬ال تتطلب هذه المهمة إبداعًا‪ ،‬وبالتالي‬
‫يمكننا تركيز قوتنا المعرفيةيف مكان آخر‪ .‬ثانيًا‪ ،‬يتطلب حساب مشتقات الدوال ذات القيمة‬
‫المتجهية ‪ vector-valued functions‬مضاعفة المصفوفات بينما نتتبع الرسم البياني للتبعية‬
‫للمتغيرات من المخرجات إلى المدخالت‪ .‬على وجه الخصوص‪ ،‬يتم اجتياز هذا الرسم البياني‬
‫في اتجاه أمامي عندما نقوم بتقييم دالة وفي اتجاه عكسي عندما نحسب التدرجات‪ .‬ستقدم‬
‫الفصول الالحقة بشكل رسمي االنتشار الخلفي ‪ ،backpropagation‬وهو إجراء حسابي لتطبيق‬
‫قاعدة السلسلة ‪.chain rule‬‬

‫من وجهة نظر التحسين ‪ ،optimization‬تسمح لنا التدرجات ‪ gradients‬بتحديد كيفية‬


‫تحريك معلمات النموذج لتقليل الخطأ‪ ،‬وستتطلب كل خطوة من خوارزميات التحسين‬
‫المستخدمةيف هذا الكتاب حساب التدرج‪.‬‬
‫‪99‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪2.4.6‬‬
‫‪ .1‬حتى اآلن أخذنا قواعد المشتقات كأمر مسلم به‪ .‬باستخدام التعريف والغايات اثبت‬
‫خصائص 𝑐 = )𝑥(𝑓 )‪ (i‬و 𝑛 𝑥 = )𝑥(𝑓 (‪ )ii‬و 𝑥 𝑒 = )𝑥(𝑓 (‪ )iii‬و = )𝑥(𝑓‬
‫𝑥 ‪.)iv( log‬‬
‫‪ .2‬على نفس المنوال‪ ،‬قم بإثبات قاعدة الضرب‪ ،‬المجموع‪ ،‬وحاصل القسمة من المبادئ‬
‫األولى‪.‬‬
‫‪ .3‬إثبت أن قاعدة المضاعفات الثابتة ‪ constant multiple rule‬تتبع كحالة خاصة‬
‫لقاعدة حاصل الضرب‪.‬‬
‫‪ .4‬احسب مشتق 𝑥 𝑥 = )𝑥(𝑓‪.‬‬
‫‪ .5‬ماذا يعني ذلك ‪ 𝑓 ′ (𝑥) = 0‬بالنسبة لبعض 𝑥 ؟ أعط مثاالً عن دالة 𝑓 وموقع 𝑥 قد‬
‫يكون هذا مناسبًا لهما‪.‬‬
‫‪1‬‬
‫‪ .6‬ارسم الدالة 𝑥 ‪ 𝑦 = 𝑓(𝑥) = 𝑥 3 −‬وارسم خط المماس الخاص بها عند ‪.𝑥 = 1‬‬
‫‪ .7‬أوجد انحدار (تدرج) الدالة ‪.𝑓(𝐱) = 3𝑥12 + 5𝑒 𝑥2‬‬
‫‪ .8‬هل يمكنك كتابة قاعدة السلسلة ‪ chain rule‬للحالة حيث )𝑧 ‪ 𝑢 = 𝑓(𝑥, 𝑦,‬و = 𝑥‬
‫)𝑏 ‪ 𝑥(𝑎,‬و )𝑏 ‪ 𝑦 = 𝑦(𝑎,‬و )𝑏 ‪ 𝑧 = 𝑧(𝑎,‬؟‬
‫‪ .9‬بالنظر إلى دالة )𝑥(𝑓 قابلة للعكس ‪ ،invertible‬احسب مشتق معكوسها )𝑥( ‪.𝑓 −1‬‬
‫هنا لدينا ذلك 𝑥 = ))𝑥(𝑓( ‪ 𝑓 −1‬والعكس 𝑦 = ))𝑦( ‪ .𝑓(𝑓 −1‬تلميح‪ :‬استخدم هذه‬
‫الخصائصيف اشتقاقك‪.‬‬

‫‪Automatic Differentiation‬‬ ‫‪2.5‬‬


‫تذكر من القسم ‪ 2.4‬أن حساب المشتقات هو الخطوة الحاسمةيف جميع خوارزميات التحسين‬
‫التي سنستخدمها لتدريب الشبكات العميقة‪.‬يف حين أن الحسابات واضحة ومباشرة‪ ،‬إال أن‬
‫حسابها يدويًا يمكن أن يكون ممالً وعرضة للخطأ‪ ،‬وتزداد هذه المشكلة فقط عندما تصبح‬
‫نماذجنا أكثر تعقيدًا‪.‬‬

‫لحسن الحظ‪ ،‬تعمل جميع أطر التعلم العميق الحديثة على إخراج هذا العمل من لوحاتنا من‬
‫خالل تقديم التفاضل التلقائي ‪( Automatic Differentiation‬غالبًا ما يتم اختصاره إلى‬
‫‪ .) autograd‬بينما نقوم بتمرير البيانات عبر كل دالة متتالية‪ ،‬يقوم إطار العمل ببناء رسم بياني‬
‫حسابي يتتبع كيف تعتمد كل قيمة على اآلخرين‪ .‬لحساب المشتقات‪ ،‬تعمل حزم التفاضل‬
‫التلقائيةيف االتجاه المعاكس من خالل هذا الرسم البياني بتطبيق قاعدة السلسلة‪ .‬الخوارزمية‬
‫الحسابية لتطبيق قاعدة السلسلة بهذه الطريقة تسمى االنتشار الخلفي ‪.backpropagation‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪100‬‬

‫بينما أصبحت مكتبات ‪ autograd‬مصدر قلق ساخن خالل العقد الماضي‪ ،‬إال أنها تتمتع بتاريخ‬
‫طويل‪.‬يف الواقع‪ ،‬تعود أقدم اإلشارات إلى ‪ autograd‬إلى أكثر من نصف قرن (‪،Wengert‬‬
‫‪ .)1964‬تعود األفكار األساسية الكامنة وراء االنتشار الخلفي ‪ backpropagation‬الحديث إلى‬
‫أطروحة دكتوراه من عام ‪ )1980 ،Speelpenning( 1980‬وتم تطويرها بشكل أكبريف أواخر‬
‫الثمانينيات (‪ .)1989 ،Griewank‬بينما أصبح االنتشار الخلفي هو األسلوب االفتراضي‬
‫لحساب التدرجات ‪ ،gradients‬فإنه ليس الخيار الوحيد‪ .‬على سبيل المثال‪ ،‬تستخدم لغة برمجة‬
‫جوليا ‪ Julia‬االنتشار األمامي (‪ .)2016 ،Revels et al.‬قبل استكشاف الطرق‪ ،‬دعنا نتقن أوالً‬
‫استخدام حزمة ‪.autograd‬‬

‫‪A Simple Function‬‬ ‫‪2.5.1‬‬


‫لنفترض أننا مهتمون بالتفاضل بين الدالة 𝐱 ⊤ 𝐱‪ 𝑦 = 2‬فيما يتعلق بمتجه العمود 𝐱‪ .‬للبدء‪ ،‬نحدد‬
‫‪ x‬قيمة أولية‪.‬‬

‫‪import tensorflow as tf‬‬

‫)‪x = tf.range(4, dtype=tf.float32‬‬


‫‪x‬‬
‫‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array([0.,‬‬
‫>)‪1., 2., 3.], dtype=float32‬‬
‫قبل أن نحسب االنحدار بالنسبة لـ 𝑦 ‪ ،‬نحتاج إلى مكان لتخزين 𝐱‪ .‬بشكل عام‪ ،‬نتجنب تخصيص‬
‫ذاكرة جديدةيف كل مرة نأخذ فيها أحد المشتقات ألن التعلم العميق يتطلب مشتقات حوسبية‬
‫متتالية فيما يتعلق بنفس المعلمات آالف أو ماليين المرات‪ ،‬وقد نخاطر بنفاد الذاكرة‪ .‬الحظ أن‬
‫تدرج دالة ذات قيمة رقمية فيما يتعلق بالمتجه 𝐱 لها قيمة متجهة ولها نفس الشكل 𝐱‪.‬‬

‫)‪x = tf.Variable(x‬‬
‫نحسب اآلن دالة ‪ x‬ونحسب النتيجة لـ ‪.y‬‬

‫‪# Record all computations onto a tape‬‬


‫‪with tf.GradientTape() as t:‬‬
‫)‪y = 2 * tf.tensordot(x, x, axes=1‬‬
‫‪y‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=28.0‬‬
‫يمكننا اآلن حساب انحدار ‪ y‬بالنسبة إلى ‪ x‬باستدعاء دالة االنحدار ‪.gradient‬‬

‫)‪x_grad = t.gradient(y, x‬‬


‫‪x_grad‬‬
‫‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array([ 0.,‬‬
‫>)‪4., 8., 12.], dtype=float32‬‬
‫‪101‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫نحن نعلم بالفعل أن تدرج الدالة 𝐱 ⊤ 𝐱‪ 𝑦 = 2‬بالنسبة 𝐱 إلى يجب أن يكون 𝐱‪ .4‬يمكننا اآلن‬
‫التحقق من تطابق حساب التدرج والنتيجة المتوقعة‪.‬‬

‫‪x_grad == 4 * x‬‬
‫‪<tf.Tensor: shape=(4,), dtype=bool, numpy=array([ True,‬‬
‫>)]‪True, True, True‬‬
‫دعونا اآلن نحسب دالة أخرى لـ ‪ x‬ونأخذ انحدارها‪ .‬الحظ أن ‪ TensorFlow‬يعيد تعيين‬
‫المخزن المؤقت للتدرج كلما سجلنا تدرجًا جديدًا‪.‬‬

‫‪with tf.GradientTape() as t:‬‬


‫)‪y = tf.reduce_sum(x‬‬
‫‪t.gradient(y, x) # Overwritten by the newly calculated‬‬
‫‪gradient‬‬
‫‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array([1.,‬‬
‫>)‪1., 1., 1.], dtype=float32‬‬
‫‪Backward for Non-‬‬ ‫‪2.5.2‬‬
‫‪Scalar Variables‬‬
‫عندما تكون ‪ y‬متجهًا‪ ،‬فإن التفسير األكثر طبيعية لمشتق ‪ y‬بالنسبة إلى المتجه ‪ x‬هو مصفوفة‬
‫تسمى ‪ Jacobian‬تحتوي على المشتقات الجزئية لكل مكون من ‪ y‬بالنسبة إلى كل مكون من‬
‫مكونات ‪ .x‬وبالمثل‪ ،‬بالنسبة إلى ‪ y‬و ‪ x‬ذات الترتيب األعلى‪ ،‬يمكن أن تكون نتيجة االشتقاق‬
‫موترًا أعلى رتبة ‪.higher-order tensor‬‬

‫بينما يظهر ‪ Jacobian‬يف بعض تقنيات التعلم اآللي المتقدمة ‪ ،‬فإننا نريد بشكل أكثر شيوعًا‬
‫تلخيص تدرجات كل مكون من مكونات ‪ y‬فيما يتعلق بالمتجه الكامل ‪ ، x‬مما ينتج عنه متجه‬
‫من نفس الشكل مثل ‪ .x‬على سبيل المثال ‪ ،‬غالبًا ما يكون لدينا متجه يمثل قيمة دالة الخطأ لدينا‬
‫محسوبة بشكل منفصل لكل مجموعة من أمثلة التدريب‪ .‬هنا‪ ،‬نريد فقط تلخيص التدرجات‬
‫المحسوبة بشكل فردي لكل مثال‪.‬‬

‫بشكل افتراضي‪ ،‬يُرجع ‪ TensorFlow‬تدرج المجموع‪ .‬بمعنى آخر‪ ،‬بدالً من إرجاع ‪Jacobian‬‬
‫𝐲 𝐱𝜕 ‪ ،‬فإنه يُرجع تدرج المجموع 𝑖𝑦 𝑖∑ 𝐱𝜕‪.‬‬

‫‪with tf.GradientTape() as t:‬‬


‫‪y = x * x‬‬
‫`)‪t.gradient(y, x) # Same as `y = tf.reduce_sum(x * x‬‬
‫‪<tf.Tensor: shape=(4,), dtype=float32, numpy=array([0.,‬‬
‫>)‪2., 4., 6.], dtype=float32‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪102‬‬

‫‪Detaching Computation‬‬ ‫‪2.5.3‬‬


‫في بعض األحيان‪ ،‬نرغبيف نقل بعض الحسابات خارج الرسم البياني الحسابي المسجل‪ .‬على‬
‫سبيل المثال‪ ،‬لنفترض أننا نستخدم المدخالت إلنشاء بعض المصطلحات الوسيطة المساعدة‬
‫التي ال نريد حساب التدرج لها‪.‬يف هذه الحالة‪ ،‬نحتاج إلى فصل ‪ detach‬الرسم البياني للتأثير‬
‫الحسابي عن النتيجة النهائية‪ .‬يوضح مثال اللعبة التالي هذا األمر بشكل أوضح‪ :‬افترض أن لدينا‬
‫‪ z = x * y‬و ‪ y = x * x‬لكننا نريد التركيز على التأثير المباشر لـ ‪ x‬على ‪ z‬بدالً من التأثير المنقول‬
‫عبر ‪.y‬يف هذه الحالة‪ ،‬يمكننا إنشاء متغير جديد ‪ u‬يأخذ نفس قيمة ‪ y‬ولكن مصدره (كيف تم‬
‫إنشاؤه) قد تم محوه‪ .‬وبالتالي‪ ،‬ليس لدى ‪ u‬أسالفيف الرسم البياني والتدرجات ال تتدفق عبر ‪u‬‬
‫إلى ‪ .x‬على سبيل المثال‪ ،‬سيؤدي أخذ التدرج لـ ‪ z = x * u‬إلى الحصول على النتيجة ‪( ،x‬وليس‬
‫‪ x * x * 3‬كما كنت تتوقع منذ ‪.)z = x * x * x‬‬

‫‪# Set `persistent=True` to preserve the compute graph.‬‬


‫‪# This lets us run `t.gradient` more than once‬‬
‫‪with tf.GradientTape(persistent=True) as t:‬‬
‫‪y = x * x‬‬
‫)‪u = tf.stop_gradient(y‬‬
‫‪z = u * x‬‬

‫)‪x_grad = t.gradient(z, x‬‬


‫‪x_grad == u‬‬
‫‪<tf.Tensor: shape=(4,), dtype=bool, numpy=array([ True,‬‬
‫>)]‪True, True, True‬‬

‫‪Gradients and Python‬‬ ‫‪2.5.4‬‬


‫‪Control Flow‬‬
‫لقد راجعنا حتى اآلن الحاالت التي تم فيها تحديد المسار من اإلدخال إلى المخرجات بشكل‬
‫جيد عبر دالة مثل ‪ .z = x * x * x‬تمنحنا البرمجة مزيدًا من الحريةيف كيفية حساب النتائج‪ .‬على‬
‫سبيل المثال‪ ،‬يمكننا جعلها تعتمد على المتغيرات المساعدة أو اختيارات الشرط على النتائج‬
‫الوسيطة‪ .‬تتمثل إحدى فوائد استخدام التفاضل التلقائييف أنه حتى إذا كان إنشاء الرسم البياني‬
‫الحسابي لدالة ما يتطلب المرور عبر متاهة من تدفق التحكم ‪control flow‬يف بايثون (على‬
‫سبيل المثال‪ ،‬الشرطية والحلقات واستدعاءات الدوال التعسفية)‪ ،‬فال يزال بإمكاننا حساب‬
‫التدرج للمتغير الناتج‪ .‬لتوضيح ذلك‪ ،‬ضعيف اعتبارك مقتطف الشفرة التالي حيث يعتمد عدد‬
‫مرات تكرار حلقة ‪ while‬وتقييم جملة ‪ if‬على قيمة اإلدخال ‪.a‬‬

‫‪def f(a):‬‬
‫‪b = a * 2‬‬
‫‪103‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪while tf.norm(b) < 1000:‬‬


‫‪b = b * 2‬‬
‫‪if tf.reduce_sum(b) > 0:‬‬
‫‪c = b‬‬
‫‪else:‬‬
‫‪c = 100 * b‬‬
‫‪return c‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=1024.0‬‬

‫أدناه‪ ،‬نستدعي هذه الدالة‪ ،‬ونمرر قيمة عشوائية كمدخالت‪ .‬نظرًا ألن اإلدخال متغير عشوائي‪،‬‬
‫فإننا ال نعرف الشكل الذي سيتخذه الرسم البياني الحسابي ‪ .computational graph‬ومع‬
‫ذلك‪ ،‬عندما ننفذ )‪ f(a‬على إدخال معين‪ ،‬فإننا ندرك رسمًا بيانيًا حسابيًا محددًا ويمكننا بعد‬
‫ذلك الذهاب للخلف ‪.backward‬‬

‫)))(=‪a = tf.Variable(tf.random.normal(shape‬‬
‫‪with tf.GradientTape() as t:‬‬
‫)‪d = f(a‬‬
‫)‪d_grad = t.gradient(d, a‬‬
‫‪d_grad‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=1024.0‬‬

‫على الرغم من أن دالتنا ‪ f‬مصممة قليالً ألغراض توضيحية‪ ،‬إال أن اعتمادها على المدخالت‬
‫بسيط للغاية‪ :‬إنها دالة خطية ‪ linear function‬بمقياس محدد متعدد التعريف ‪piecewise‬‬
‫‪ .defined scale‬على هذا النحو‪ ،‬فإن ‪ f(a) / a‬عبارة عن متجه للمدخالت الثابتة‪ ،‬عالوة‬
‫على ذلك‪ ،‬تحتاج ‪ f(a) / a‬إلى مطابقة تدرج )‪ f(a‬فيما يتعلق بـ ‪.a‬‬

‫‪d_grad == d / a‬‬
‫>‪<tf.Tensor: shape=(), dtype=bool, numpy=True‬‬

‫تدفق التحكم الديناميكي ‪ Dynamic control flow‬شائع جدًايف التعلم العميق‪ .‬على سبيل‬
‫المثال‪ ،‬عند معالجة النص‪ ،‬يعتمد الرسم البياني الحسابي على طول المدخالت‪.‬يف هذه الحاالت‪،‬‬
‫يصبح التفاضل التلقائي أمرًا حيويًا للنمذجة اإلحصائية ألنه من المستحيل حساب التدرج مسبقًا‪.‬‬

‫‪2.5.5‬‬
‫لقد اكتسبت اآلن طعمًا لقوة التفاضل التلقائي‪ .‬لقد كان تطوير المكتبات لحساب المشتقات‬
‫تلقائيًا وفعالًا بمثابة معزز كبير لإلنتاجية لممارسي التعلم العميق‪ ،‬مما أتاح لهم التركيز على‬
‫اهتمامات أعلى‪ .‬عالوة على ذلك‪ ،‬يسمح لنا برنامج ‪ autograd‬بتصميم نماذج ضخمة تكون‬
‫حسابات التدرج بالقلم والورق لها مضيعة للوقت‪ .‬ومن المثير لالهتمام‪ ،‬أنه بينما نستخدم‬
‫‪ autograd‬لتحسين النماذج (بالمعنى اإلحصائي)‪ ،‬فإن تحسين مكتبات ‪ autograd‬نفسها‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪104‬‬

‫(بالمعنى الحسابي) يعد موضوعًا غنيًا ذا أهمية حيوية لمصممي إطار العمل‪ .‬هنا‪ ،‬يتم االستفادة‬
‫من األدوات من المجمعين ومعالجة الرسم البياني لحساب النتائج بالطريقة األكثر مالءمة وفعالية‬
‫للذاكرة‪.‬‬

‫في الوقت الحالي‪ ،‬حاول أن تتذكر هذه األساسيات‪ )1( :‬إرفاق التدرجات بتلك المتغيرات التي‬
‫نرغبيف المشتقات فيما يتعلق بها؛ (‪ )2‬تسجيل حساب القيمة المستهدفة؛ (‪ )3‬تنفيذ دالة‬
‫االنتشار الخلفي ‪backpropagation‬؛ و (‪ )4‬الوصول إلى التدرج الناتج‪.‬‬

‫‪2.5.6‬‬
‫‪ .1‬لماذا يكون حساب المشتق الثاني أكثر تكلفة بكثير من المشتق األول؟‬
‫‪ .2‬بعد تشغيل دالة ‪ ،backpropagation‬قم بتشغيلها على الفور مرة أخرى وشاهد ما‬
‫سيحدث‪ .‬لماذا؟‬
‫‪ .3‬في مثال تدفق التحكم ‪ control flow‬حيث نحسب مشتق ‪ d‬بالنسبة إلى ‪ ،a‬ماذا‬
‫سيحدث إذا غيرنا المتغير ‪ a‬إلى متجه عشوائي أو مصفوفة؟يف هذه المرحلة‪ ،‬لم تعد‬
‫نتيجة الحساب )‪ f(a‬عددًا قياسيًا‪ .‬ماذا يحدث للنتيجة؟ كيف نحلل هذا؟‬
‫‪ .4‬لتكن )𝑥(‪ .𝑓(𝑥) = sin‬ارسم الرسم البياني لـ 𝑓 ومشتقاته ‪ .𝑓 ′‬ال تستغل حقيقة ذلك‬
‫)𝑥(‪ 𝑓 ′ (𝑥) = cos‬بل استخدم التفاضل التلقائي للحصول على النتيجة‪.‬‬
‫‪ .5‬لتكن ‪ .𝑓(𝑥) = ((log 𝑥 2 ) ⋅ sin 𝑥) + 𝑥 −1‬اكتب نتائج تتبع الرسم البياني للتبعية‬
‫من 𝑥 إلى )𝑥(𝑓‪.‬‬
‫𝑓𝑑‬
‫من الدالة المذكورة أعاله‪،‬‬ ‫𝑥𝑑‬
‫‪ .6‬استخدم قاعدة السلسلة ‪ chain rule‬لحساب المشتق‬
‫مع وضع كل مصطلح على الرسم البياني للتبعية الذي قمت بإنشائه مسبقًا‪.‬‬
‫‪ .7‬بالنظر إلى الرسم البياني ونتائج المشتقات الوسيطة‪ ،‬لديك عدد من الخيارات عند‬
‫حساب التدرج‪ .‬قم بتقييم النتيجة بمجرد البدء من 𝑥 إلى 𝑓 ومرة واحدة من 𝑓 التتبع‬
‫إلى الخلف 𝑥‪ .‬يُعرف المسار من 𝑥 إلى 𝑓 بشكل عام باسم التفاضل األمامي ‪forward‬‬
‫‪ ،differentiation‬بينما يُعرف المسار من 𝑓 إلى 𝑥 باسم التمايز الخلفي ‪backward‬‬
‫‪.differentiation‬‬
‫‪ .8‬متى قد ترغبيف استخدام التفاضل األمامي ومتى التفاضل الخلفي؟ تلميح‪ :‬ضعيف ‬
‫اعتبارك مقدار البيانات الوسيطة المطلوبة‪ ،‬والقدرة على موازاة الخطوات‪ ،‬وحجم‬
‫المصفوفات والمتجهات المعنية‪.‬‬

‫‪Probability and Statistics‬‬ ‫‪2.6‬‬


‫بطريقة أو بأخرى‪ ،‬يدور التعلم اآللي حول عدم اليقين ‪.uncertainty‬يف التعلم الخاضع‬
‫لإلشراف‪ ،‬نريد أن نتنبأ بشيء غير معروف (الهدف ‪ )target‬بالنظر إلى شيء معروف (الميزات‬
‫‪105‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪ .)features‬اعتمادًا على هدفنا‪ ،‬قد نحاول توقع القيمة األكثر احتمالًا للهدف‪ .‬أو قد نتوقع القيمة‬
‫بأقل مسافة متوقعة من الهدف‪ .‬وأحيانًا ال نرغب فقطيف التنبؤ بقيمة معينة ولكن تحديد عدم‬
‫اليقين لدينا ‪ .quantify our uncertainty‬على سبيل المثال‪ ،‬بالنظر إلى بعض الميزات التي‬
‫تصف المريض‪ ،‬قد نرغبيف معرفة مدى احتمالية تعرضه ألزمة قلبيةيف العام المقبل‪.‬يف التعلم‬
‫غير الخاضع لإلشراف‪ ،‬غالبًا ما نهتم بعدم اليقين‪ .‬لتحديد ما إذا كانت مجموعة القياسات شاذة‬
‫‪ ،anomalous‬من المفيد معرفة مدى احتمالية مالحظة القيميف المجتمع محل االهتمام‪ .‬عالوة‬
‫على ذلك‪،‬يف التعلم المعزز ‪ ،reinforcement learning‬نرغبيف تطوير عوامل تعمل بذكاءيف ‬
‫بيئات مختلفة‪ .‬يتطلب هذا التفكيريف كيفية توقع تغير البيئة والمكافآت التي قد يتوقع المرء‬
‫مواجهتها استجابة لكل من اإلجراءات المتاحة‪.‬‬

‫االحتمالية ‪ Probability‬هو المجال الرياضي المعني باالستدالل ‪reasoning‬يف ظل عدم‬


‫اليقين‪ .‬بالنظر إلى نموذج احتمالي لبعض العمليات‪ ،‬يمكننا التفكيريف احتمال وقوع أحداث‬
‫مختلفة‪ .‬إن استخدام االحتماالت لوصف تكرار األحداث القابلة للتكرار (مثل رمي العمالت‬
‫المعدنية ‪ )coin tosses‬غير مثير للجدل إلى حد ما‪.‬يف الواقع‪ ،‬يلتزم العلماء ‪frequentist‬‬
‫‪ scholars‬بتفسير االحتمال الذي ينطبق فقط على مثل هذه األحداث القابلة للتكرار‪ .‬على‬
‫النقيض من ذلك‪ ،‬يستخدم علماء بايز ‪Bayesian scholars‬لغة االحتمال على نطاق أوسع‬
‫إلضفاء الطابع الرسمي على تفكيرنايف ظل عدم اليقين‪ .‬يتميز احتمالية بايز ‪Bayesian‬‬
‫‪ probability‬بميزتين فريدتين‪ )1( :‬تعيين درجات من االعتقاد لألحداث غير القابلة للتكرار‪،‬‬
‫على سبيل المثال‪ ،‬ما هو احتمال أن يكون القمر مصنوعًا من الجبن؟ و (‪ )2‬الذاتية‬
‫‪ -subjectivity‬بينما يوفر احتمالية بايز قواعد ال لبس فيها لكيفية تحديث المرء لمعتقداتهيف ‬
‫ضوء أدلة جديدة‪ ،‬فإنه يسمح لألفراد المختلفين بالبدء بمعتقدات سابقة مختلفة‪ .‬تساعدنا‬
‫اإلحصائيات على التفكير بشكل عكسي‪ ،‬بدءًا من جمع البيانات وتنظيمها والتراجع عن‬
‫االستنتاجات التي قد نستخلصها حول العملية التي أنتجت البيانات‪ .‬عندما نحلل مجموعة‬
‫بيانات‪ ،‬ونبحث عن األنماط التي نأمل أن تميز مجموعة أكبر من السكان‪ ،‬فإننا نستخدم التفكير‬
‫اإلحصائي‪ .‬تم تخصيص معظم الدورات والتخصصات واألطروحات والمهن واإلدارات‬
‫والشركات والمؤسسات لدراسة االحتماالت واإلحصاءات‪.‬يف حين أن هذا القسم يخدش السطح‬
‫فقط‪ ،‬فإننا سنوفر األساس الذي تحتاجه لبدء بناء النماذج‪.‬‬

‫‪Tossing Coins‬‬ ‫‪2.6.1‬‬


‫تخيل أننا نخطط لرمي عملة معدنية ونريد تحديد مدى احتمالية رؤية الرؤوس ‪( heads‬مقابل‬
‫ذيول ‪ .)tails‬إذا كانت العملة عادلة‪ ،‬فإن كال النتيجتين (الرأس والذيل) متساويانيف االحتمال‪.‬‬
‫عالوة على ذلك‪ ،‬إذا كنا نخطط إللقاء 𝑛 مرات العملة‪ ،‬فيجب أن يتطابق الجزء الذي نتوقع رؤيته‬
‫من الرؤوس تمامًا مع الكسر المتوقع من ذيول‪ .‬إحدى الطرق البديهية لرؤية ذلك هي من خالل‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪106‬‬

‫التناسق ‪ :symmetry‬لكل نتيجة محتملة مع ‪ 𝑛ℎ‬رؤوس و) ‪ 𝑛𝑡 = (𝑛 − 𝑛ℎ‬ذيول‪ ،‬هناك نتيجة‬


‫محتملة متساوية مع 𝑡𝑛 رؤوس و ‪ 𝑛ℎ‬ذيول‪ .‬الحظ أن هذا ممكن فقط إذا كنا نتوقعيف المتوسط‬
‫‪1‬‬ ‫‪1‬‬
‫رؤية ‪ 2‬الرميات تظهر على الرؤوس و‪ 2‬تظهر على الذيول‪ .‬بالطبع‪ ،‬إذا أجريت هذه التجربة عدة‬
‫مرات مع كل ‪ 𝑛 = 1000000‬رميات‪ ،‬فقد ال ترى تجربةيف أي 𝑡𝑛 = ‪𝑛ℎ‬بالضبط‪.‬‬
‫‪1‬‬
‫باالحتمالية ‪ probability‬وهي هنا تلتقط اليقين الذي ستظهر به أي‬ ‫‪2‬‬
‫رسميًا‪ ،‬تسمى الكمية‬
‫رمية‪ .‬تقوم االحتماالت بتعيين درجات بين ‪ 0‬و‪ 1‬نتائج االهتمام ‪،outcomes of interest‬‬
‫تسمى األحداث ‪ .events‬هنا حدث االهتمام بالرأس ‪ heads‬ونشير إلى االحتمال المقابل‬
‫)‪ .𝑃(heads‬يشير احتمال ‪ 1‬اليقين المطلق (تخيل عملة خدعة حيث كان كال الجانبين رؤوسًا)‬
‫‪𝑛𝑡 𝑛ℎ‬‬
‫و‬
‫𝑛 𝑛‬
‫واحتمال ‪ 0‬يشير إلى استحالة (على سبيل المثال‪ ،‬إذا كان كال الجانبين ذيول)‪ .‬الترددات‬
‫ليست احتماالت بل إحصائيات ‪ .statistics‬االحتماالت هي الكميات النظرية التي تقوم عليها‬
‫‪1‬‬
‫هو خاصية للعملة نفسها‪ .‬على النقيض من ذلك‪،‬‬ ‫عملية توليد البيانات‪ .‬هنا‪ ،‬االحتمال‬
‫‪2‬‬
‫اإلحصائيات هي كميات تجريبية يتم حسابها كدوال للبيانات المرصودة‪ .‬تتشابك اهتماماتنايف ‬
‫الكميات االحتمالية واإلحصائية بشكل ال ينفصم‪ .‬غالبًا ما نصمم إحصائيات خاصة تسمى‬
‫المقدرات ‪ estimators‬التي‪،‬يف ضوء مجموعة بيانات‪ ،‬تنتج تقديرات لمعلمات النموذج مثل‬
‫االحتماالت‪ .‬عالوة على ذلك‪ ،‬عندما تحقق تلك المقدرات خاصية لطيفة تسمى االتساق‬
‫‪ ،consistency‬فإن تقديراتنا ستتقارب مع االحتمال المقابل‪ .‬بدورها‪ ،‬تخبرنا هذه االحتماالت‬
‫المستنتجة عن الخصائص اإلحصائية المحتملة للبيانات من نفس المجتمع والتي قد نواجههايف ‬
‫المستقبل‪.‬‬

‫لنفترض أننا عثرنا على عملة حقيقية لم نكن نعرف حقيقة وجودها )‪ .𝑃(heads‬للتحقق من‬
‫هذه الكمية بالطرق اإلحصائية‪ ،‬نحتاج إلى (‪ )1‬جمع بعض البيانات؛ و (‪ )2‬تصميم مقدر‬
‫‪ .estimator‬الحصول على البيانات هنا سهل؛ يمكننا رمي العملة عدة مرات وتسجيل جميع‬
‫النتائج‪ .‬رسميًا‪ ،‬يُطلق على استخالص اإلنجازات من بعض العمليات العشوائية األساسية أخذ‬
‫العينات ‪ .sampling‬كما قد تكون خمنت‪ ،‬أحد المقدر الطبيعي ‪ natural estimator‬هو الكسر‬
‫‪ fraction‬بين عدد الرؤوس المرصودة ‪ observed heads‬بالعدد اإلجمالي للرمي ‪number‬‬
‫‪.of tosses‬‬

‫‪%matplotlib inline‬‬
‫‪import random‬‬
‫‪import tensorflow as tf‬‬
‫‪from tensorflow_probability import distributions as tfd‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪107‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫اآلن‪ ،‬افترض أن العملة كانتيف الواقع عادلة‪ ،‬أي ‪ .𝑃(heads) = 0.5‬لمحاكاة رميات عملة‬
‫عادلة‪ ،‬يمكننا استدعاء أي مولد أرقام عشوائي‪ .‬بعض الطرق السهلة لرسم عينات من حدث ذي‬
‫احتمالية‪ .‬على سبيل المثال‪ ،‬ينتج ‪random.random‬في بايثون أرقامًايف الفترة ]‪ [0,1‬حيث‬
‫يكون احتمال الكذبيف أي فترة فرعية ]‪ [𝑎, 𝑏] ⊂ [0,1‬مساويًا 𝑎 ‪ .𝑏 −‬وبالتالي يمكننا الخروج‬
‫من ‪ 0‬و ‪ 1‬باحتمال ‪ 0.5‬لكل منهما باختبار ما إذا كان الطفو المرتجع أكبر من ‪0.5‬‬

‫‪num_tosses = 100‬‬
‫)])‪heads = sum([random.random() > 0.5 for _ in range(100‬‬
‫‪tails = num_tosses - heads‬‬
‫)]‪print("heads, tails: ", [heads, tails‬‬
‫‪<tf.Tensor: shape=(2,), dtype=float32, numpy=array([45.,‬‬
‫>)‪55.], dtype=float32‬‬

‫هنا‪ ،‬على الرغم من أن عملتنا المحاكاة عادلة (قمنا بتعيين االحتماالت ]‪[0.5, 0.5‬‬
‫بأنفسنا)‪ ،‬قد ال تكون تعدادات الرأس والذيول متطابقة‪ .‬ذلك ألننا رسمنا عددًا محدودًا فقط من‬
‫العينات‪ .‬إذا لم ننفذ المحاكاة بأنفسنا‪ ،‬ورأينا النتيجة فقط‪ ،‬فكيف لنا أن نعرف ما إذا كانت العملة‬
‫‪1‬‬
‫مجرد قطعة أثرية من حجم العينة‬ ‫‪2‬‬
‫غير عادلة إلى حد ما أو إذا كان االنحراف المحتمل عنها‬
‫الصغير؟ دعونا نرى ما يحدث عندما نقوم بمحاكاة ‪10000‬رمية‪.‬‬

‫)(‪counts = tfd.Multinomial(10000, fair_probs).sample‬‬


‫‪counts / 10000‬‬
‫‪<tf.Tensor: shape=(2,), dtype=float32,‬‬
‫>)‪numpy=array([0.5056, 0.4944], dtype=float32‬‬

‫بشكل عام‪ ،‬بالنسبة لمتوسطات األحداث المتكررة (مثل رمي العمالت المعدنية)‪ ،‬مع تزايد عدد‬
‫التكرارات‪ ،‬نضمن أن تتقارب تقديراتنا مع االحتماالت األساسية الحقيقية‪ .‬يُطلق على الدليل‬
‫الرياضي لهذه الظاهرة اسم قانون األعداد الكبيرة ‪ law of large numbers‬وتخبرنا نظرية الحد‬
‫المركزي ‪ central limit theorem‬أنهيف العديد من المواقف‪ ،‬مع نمو حجم العينة 𝑛‪ ،‬يجب أن‬
‫‪1‬‬
‫تنخفض هذه األخطاء بمعدل )𝑛 (‪ .‬دعنا نحصل على مزيد من الحدس من خالل دراسة كيفية‬
‫√‬
‫تطور تقديراتنا مع زيادة عدد الرميات من ‪ 1‬إلى ‪.10000‬‬

‫)‪counts = tfd.Multinomial(1, fair_probs).sample(10000‬‬


‫)‪cum_counts = tf.cumsum(counts, axis=0‬‬
‫‪estimates = cum_counts / tf.reduce_sum(cum_counts,‬‬
‫)‪axis=1, keepdims=True‬‬
‫)(‪estimates = estimates.numpy‬‬

‫))‪d2l.set_figsize((4.5, 3.5‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪108‬‬

‫))")‪d2l.plt.plot(estimates[:, 0], label=("P(coin=heads‬‬


‫))")‪d2l.plt.plot(estimates[:, 1], label=("P(coin=tails‬‬
‫‪d2l.plt.axhline(y=0.5, color='black',‬‬
‫)'‪linestyle='dashed‬‬
‫)'‪d2l.plt.gca().set_xlabel('Samples‬‬
‫)'‪d2l.plt.gca().set_ylabel('Estimated probability‬‬
‫;)(‪d2l.plt.legend‬‬

‫يتوافق كل منحنى صلب مع إحدى قيمتي العملة المعدنية ويعطي االحتمالية المقدرة لعملة العملة‬
‫هذه بعد كل مجموعة من التجارب‪ .‬يعطي الخط األسود المتقطع االحتمال األساسي الحقيقي‪.‬‬
‫مع حصولنا على المزيد من البيانات من خالل إجراء المزيد من التجارب‪ ،‬تتقارب المنحنيات‬
‫نحو االحتمال الحقيقي‪ .‬قد تبدأ بالفعليف رؤية شكل بعض األسئلة األكثر تقدمًا التي تشغل بال‬
‫اإلحصائيين‪ :‬ما مدى سرعة حدوث هذا التقارب ‪convergence‬؟ إذا كنا قد اختبرنا بالفعل‬
‫العديد من العمالت المعدنية المصنعةيف نفس المصنع‪ ،‬فكيف يمكننا دمج هذه المعلومات؟‬

‫‪A More Formal Treatment‬‬ ‫‪2.6.2‬‬


‫لقد وصلنا بالفعل إلى حد بعيد‪ :‬طرح نموذج احتمالي‪ ،‬وإنشاء بيانات تركيبية‪ ،‬وتشغيل مقدر‬
‫إحصائي‪ ،‬وتقييم التقارب بشكل تجريبي‪ ،‬واإلبالغ عن مقاييس الخطأ (التحقق من االنحراف‬
‫‪ .)deviation‬ومع ذلك‪ ،‬للمضي قدمًا‪ ،‬سنحتاج إلى أن نكون أكثر دقة‪.‬‬

‫عند التعامل مع العشوائية ‪ ،randomness‬فإننا نشير إلى مجموعة النتائج المحتملة 𝒮 ونطلق‬
‫عليها مساحة العينة ‪ sample space‬أو مساحة النتيجة ‪ .outcome space‬هنا‪ ،‬كل عنصر هو‬
‫‪109‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫نتيجة ممكنة مميزة‪.‬يف حالة دحرجة عملة واحدة‪ .𝒮 = {heads,tails}،‬لنرد واحد = 𝒮‬


‫}‪ .{1,2,3,4,5,6‬عند قلب عملتين‪ ،‬يكون لدينا أربع نتائج محتملة‪:‬‬

‫})‪{(heads,heads), (heads,tails), (tails,heads), (tails,tails‬‬

‫األحداث هي مجموعات فرعية من مساحة العينة‪ .‬على سبيل المثال‪ ،‬حدث "ظهور أول رمية‬
‫عملة على الرأس" يتوافق مع المجموعة })‪ .{(heads,heads), (heads,tails‬كلما كانت نتيجة‬
‫𝑧التجربة العشوائية تحقق 𝒜 ∈ 𝑧‪ 𝒜 ،‬حدث ذلك‪ .‬بالنسبة إلى لفة واحدة من النرد‪ ،‬يمكننا‬
‫تحديد األحداث "رؤية ‪ )𝒜 = {5}( "5‬و "رؤية رقم فردي" (}‪.)ℬ = {1,3,5‬يف هذه الحالة‪ ،‬إذا‬
‫جاء النرد ‪ ،5‬فسنقول أن كالهما 𝐴 و 𝐵 حدث‪ .‬من ناحية أخرى‪ ،‬إذا ‪ ,𝑧 = 3‬اذن 𝒜 لم يحدث‬
‫بل ‪ ℬ‬حدث‪.‬‬

‫تقوم دالة االحتمال بتعيين األحداث على قيم حقيقية ]‪ .𝑃: 𝒜 ⊆ 𝒮 → [0,1‬يفي احتمال وقوع‬
‫حدث 𝒜يف مساحة العينة المحددة 𝒮‪𝑃(𝒜) ،‬بالخصائص التالية‪:‬‬

‫احتمال حدوث أي حدث 𝒜 هو رقم حقيقي غير سالب‪ ،‬أي ‪ 𝑃(𝒜) ≥ 0‬؛‬ ‫•‬
‫احتمال مساحة العينة بأكملها هو ‪ ، 1‬أي ‪𝑃(𝒮) = 1‬؛‬ ‫•‬
‫بالنسبة ألي تسلسل قابل للعد من األحداث … ‪ 𝒜1 , 𝒜2 ,‬التي تكون متنافية‬ ‫•‬
‫‪ 𝒜𝑖 ∩ 𝒜𝑗 = ∅( mutually exclusive‬لكل 𝑗 ≠ 𝑖)‪ ،‬فإن احتمال حدوث أي منها‬
‫∞‬
‫‪.𝑃(⋃𝑖=1‬‬ ‫∞∑ = ) 𝑖𝒜‬
‫‪𝑖=1‬‬ ‫يساوي مجموع احتماالتها الفردية‪ ،‬أي ) 𝑖𝒜(𝑃‬

‫يمكن تطبيق بديهيات نظرية االحتماالت‪ ،‬التي اقترحها كولموغوروف )‪ ،(1933‬الشتقاق عدد‬
‫من النتائج المهمة بسرعة‪ .‬على سبيل المثال‪ ،‬يترتب على ذلك على الفور أن احتمال حدوث أي‬
‫حدث 𝒜 أو مكمل حدوثه ‪ 𝒜 ′‬يحدثانيف وقت واحد هو ‪ .𝑃(𝒜 ∩ 𝒜 ′ ) = 0‬بشكل غير رسمي‪،‬‬
‫يخبرنا هذا أن األحداث المستحيلة ليس لها أي احتمال لحدوثها‪.‬‬

‫‪Random Variables‬‬ ‫‪2.6.3‬‬


‫عندما تحدثنا عن أحداث مثل ظهور احتماالت ظهور النرد أو ظهور أول عملة معدنية‪ ،‬كنا‬
‫نستدعي فكرة المتغير العشوائي ‪ .random variable‬بشكل رسمي‪ ،‬المتغيرات العشوائية عبارة‬
‫عن تعيينات من مساحة عينة أساسية إلى مجموعة من (ربما العديد) من القيم‪ .‬قد تتساءل كيف‬
‫يختلف المتغير العشوائي عن مساحة العينة‪ ،‬ألن كالهما عبارة عن مجموعة من النتائج‪ .‬األهم‬
‫من ذلك‪ ،‬يمكن أن تكون المتغيرات العشوائية أكثر خشونة ‪ much coarser‬من مساحة العينة‬
‫األولية‪ .‬يمكننا تحديد متغير عشوائي ثنائي مثل "أكبر من ‪ "0.5‬حتى عندما تكون مساحة العينة‬
‫األساسية النهائية‪ ،‬على سبيل المثال‪ ،‬المقطع الخطي بين ‪0‬و ‪ .1‬باإلضافة إلى ذلك‪ ،‬يمكن‬
‫للمتغيرات العشوائية المتعددة أن تشتركيف نفس مساحة العينة األساسية‪ .‬على سبيل المثال‪" ،‬ما‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪110‬‬

‫إذا كان إنذار منزلي ينطلق" و "ما إذا كان منزلي قد تعرض للسطو" كالهما متغيرين عشوائيين‬
‫يشتركانيف مساحة عينة أساسية‪ .‬وبالتالي‪ ،‬فإن معرفة القيمة المأخوذة بواسطة متغير عشوائي واحد‬
‫يمكن أن يخبرنا شيئًا عن القيمة المحتملة لمتغير عشوائي آخر‪ .‬مع العلم أن جهاز اإلنذار قد‬
‫انطلق‪ ،‬قد نشكيف احتمال تعرض المنزل للسطو‪.‬‬

‫تتوافق كل قيمة مأخوذة بواسطة متغير عشوائي مع مجموعة فرعية من مساحة العينة األساسية‪.‬‬
‫وبالتالي فإن الحدوث الذي يأخذ فيه المتغير العشوائي 𝑋 قيمة 𝑣‪ ،‬يُرمز إليه بـ )𝑣 = 𝑋(𝑃‪ ،‬هو‬
‫حدث ويشير إلى احتماله‪.‬يف بعض األحيان‪ ،‬يمكن أن يصبح هذا الترميز غير مؤكد‪ ،‬ويمكننا إساءة‬
‫استخدام التدوين عندما يكون السياق واضحًا‪ .‬على سبيل المثال‪ ،‬قد نستخدم )𝑋(𝑃 لإلشارة‬
‫على نطاق واسع إلى توزيع 𝑋 ‪ ،‬أي الدالة التي تخبرنا باالحتمال الذي 𝑋 يأخذ أي قيمة معينة‪.‬يف ‬
‫أحيان أخرى نكتب تعبيرات مثل )𝑌(𝑃)𝑋(𝑃 = )𝑌 ‪ ،𝑃(𝑋,‬كاختصار للتعبير عن عبارة‬
‫صحيحة لجميع القيم التي يمكن أن تأخذها المتغيرات العشوائية 𝑋 و 𝑌‪ ،‬أي لكل 𝑗 ‪ 𝑖,‬ما تحمله‬
‫)𝑗 = 𝑌(𝑃)𝑖 = 𝑋(𝑃 = )𝑗 = 𝑌 ‪.𝑃(𝑋 = 𝑖 and‬يف أوقات أخرى‪ ،‬نسيء استخدام التدوين‬
‫عن طريق الكتابة عندما يكون المتغير العشوائي واضحًا من السياق‪ .‬نظرًا ألن الحدثيف نظرية‬
‫االحتماالت هو مجموعة من النتائج من مساحة العينة‪ ،‬يمكننا تحديد نطاق من القيم لمتغير‬
‫عشوائي ليأخذها‪ .‬على سبيل المثال‪ ،‬يدل )‪ 𝑃(1 ≤ 𝑋 ≤ 3‬على احتمال وقوع الحدث‬
‫}‪.{1 ≤ 𝑋 ≤ 3‬‬

‫الحظ أن هناك فرقًا طفيفًا بين المتغيرات العشوائية المتقطعة ‪،discrete random variables‬‬
‫مثل تقليب عملة معدنية أو رمي نرد‪ ،‬والمتغيرات المستمرة ‪ ،continuous‬مثل وزن وطول‬
‫الشخص المأخوذ عشوائيًا من السكان‪.‬يف هذه الحالة نادرًا ما نهتم حقًا بالطول الدقيق لشخص‬
‫ما‪ .‬عالوة على ذلك‪ ،‬إذا أخذنا قياسات دقيقة كافية‪ ،‬فسنجد أنه ال يوجد شخصان على الكوكب‬
‫لهما نفس االرتفاع بالضبط‪.‬يف الواقع‪ ،‬مع قياسات دقيقة كافية‪ ،‬لن يكون لديك نفس االرتفاع‬
‫عند االستيقاظ وعندما تنام‪ .‬ليس هناك فائدة تذكريف السؤال عن االحتمال الدقيق أن يبلغ طول‬
‫شخص ما ‪ 1.801392782910287192‬مترًا‪ .‬بدالً من ذلك‪ ،‬نهتم عادةً أكثر بالقدرة على‬
‫تحديد ما إذا كان ارتفاع شخص ما يقعيف فترة زمنية معينة‪ ،‬لنقل بين ‪ 1.79‬و‪ 1.81‬مترًا‪.‬يف هذه‬
‫الحاالت‪ ،‬نتعامل مع كثافات االحتماالت‪ .‬ال يوجد احتمال الرتفاع ‪ 1.80‬متر بالضبط‪ ،‬لكن‬
‫كثافة غير صفرية ‪ .nonzero density‬إلخراج االحتمال المخصص لفترة ما‪ ،‬يجب أن نأخذ‬
‫جزءًا ال يتجزأ من الكثافة على تلك الفترة‪.‬‬

‫‪Multiple Random Variables‬‬ ‫‪2.6.4‬‬


‫ربما الحظت أنه ال يمكننا حتى تجاوز القسم األخير دون اإلدالء بعبارات تتضمن تفاعالت بين‬
‫متغيرات عشوائية متعددة (استدعاء )𝑌(𝑃)𝑋(𝑃 = )𝑌 ‪ .)𝑃(𝑋,‬يهتم معظم التعلم اآللي بمثل‬
‫‪111‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫هذه العالقات‪ .‬هنا‪ ،‬ستكون مساحة العينة هي الفئة المستهدفة‪ ،‬كما يقول العمالء الذين يتعاملون‬
‫مع شركة‪ ،‬أو صور فوتوغرافية على اإلنترنت‪ ،‬أو بروتينات معروفة لعلماء األحياء‪ .‬يمثل كل متغير‬
‫عشوائي القيمة (غير المعروفة) لسمة مختلفة‪ .‬عندما نقوم بأخذ عينة من فرد من السكان‪ ،‬نالحظ‬
‫تحقيق كل من المتغيرات العشوائية‪ .‬نظرًا ألن القيم المأخوذة بواسطة المتغيرات العشوائية تتوافق‬
‫مع مجموعات فرعية من مساحة العينة التي يمكن أن تكون متداخلة أو متداخلة جزئيًا أو منفصلة‬
‫تمامًا‪ ،‬فإن معرفة القيمة المأخوذة بواسطة متغير عشوائي واحد يمكن أن تجعلنا نقوم بتحديث‬
‫معتقداتنا حول القيم المحتملة لمتغير عشوائي آخر‪ .‬إذا دخل المريض إلى المستشفى والحظنا‬
‫أنه يعاني من صعوبةيف التنفس وفقد حاسة الشم‪ ،‬فإننا نعتقد أنه من المرجح أن يكون مصابًا بـ‬
‫‪ COVID-19‬أكثر مما قد يكون عليه الحال إذا لم يكن لديه مشكلةيف التنفس وكان عاديًا‬
‫تمامًا‪ .‬حاسة الشم‪.‬‬

‫عند العمل مع متغيرات عشوائية متعددة‪ ،‬يمكننا إنشاء أحداث تتوافق مع كل مجموعة من القيم‬
‫التي يمكن أن تأخذها المتغيرات بشكل مشترك‪ .‬تسمى دالة االحتمال التي تعين االحتماالت لكل‬
‫من هذه المجموعات (على سبيل المثال 𝑎 = 𝐴 و 𝑏 = 𝐵) دالة االحتمال المشترك ‪joint‬‬
‫‪ probability function‬وترجع ببساطة االحتمال المعين لتقاطع المجموعات الفرعية المقابلة‬
‫من مساحة العينة‪ .‬االحتمال المشترك المخصص للحدث حيث يتم اإلشارة إلى المتغيرات‬
‫العشوائية 𝐴 و 𝐵 القيم 𝑎 و𝑏 ‪ ،‬على التوالي‪ ،‬حيث تشير )𝑏 = 𝐵 ‪ 𝑃(𝐴 = 𝑎,‬والفاصلة إلى‬
‫"‪ ."and‬الحظ أنه بالنسبة ألية قيم 𝑎 و𝑏 ‪ ،‬فهي تحمل ذلك ≤ )𝑏 = 𝐵 ‪𝑃(𝐴 = 𝑎,‬‬
‫)𝑎 = 𝐴(𝑃‪ ،‬ومنذ حدوث 𝑎 = 𝐴 و 𝑏 = 𝐵 ‪ 𝐴 = 𝑎 ،‬يجب أن يحدث و𝑏 = 𝐵 يجب أن‬
‫يحدث أيضًا‪ .‬ومن المثير لالهتمام أن االحتمال المشترك يخبرنا بكل ما يمكننا معرفته عن هذه‬
‫المتغيرات العشوائية بالمعنى االحتمالي‪ ،‬ويمكن استخدامه الشتقاق العديد من الكميات المفيدة‬
‫األخرى‪ ،‬بمايف ذلك استعادة التوزيعات الفردية )𝐴(𝑃 و )𝐵(𝑃‪ .‬السترداد )𝑎 = 𝐴(𝑃 ‪ ،‬نجمع‬
‫ببساطة )𝑣 = 𝐵 ‪ 𝑃(𝐴 = 𝑎,‬جميع القيم 𝑣 التي يمكن أن يأخذها المتغير العشوائي 𝐵‪:‬‬
‫𝑣∑ = )𝑎 = 𝐴(𝑃‪.‬‬ ‫)𝑣 = 𝐵 ‪𝑃(𝐴 = 𝑎,‬‬

‫)𝑏=𝐵‪𝑃(𝐴=𝑎,‬‬
‫تبين أنها مهمة للغاية‪ .‬يطلق عليه االحتمال الشرطي ‪conditional‬‬ ‫)𝑎=𝐴(𝑃‬
‫النسبة ‪≤ 1‬‬
‫‪,probability‬ويُشار إليه بالرمز ”∣“‪ .‬يخبرنا االحتمال الجديد المرتبط بالحدث 𝑏 = 𝐵 ‪ ،‬بمجرد‬
‫أن نشتركيف حقيقة حدوثه 𝑎 = 𝐴‪ .‬يمكننا أن نفكريف هذا االحتمال الشرطي على أنه يقيد االنتباه‬
‫فقط إلى المجموعة الفرعية من مساحة العينة المرتبطة بـ 𝑎 = 𝐴 ثم إعادة التسوية‬
‫‪ renormalizing‬بحيث تصل جميع االحتماالت إلى ‪ .1‬االحتماالت الشرطية هييف الواقع‬
‫احتماالت‪ ،‬وبالتالي نحترم جميع البديهيات ‪ ،axioms‬طالما أننا شرط جميع المصطلحاتيف ‬
‫نفس الحدث وبالتالي قصر االنتباه على نفس مساحة العينة‪ .‬على سبيل المثال‪ ،‬بالنسبة لألحداث‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪112‬‬

‫‪𝑃( ℬ ∪ ℬ′ ∣ 𝐴 = 𝑎 ) = 𝑃( ℬ ∣ 𝐴 = 𝑎 ) +‬‬ ‫ذلك‬ ‫لدينا‬ ‫و ‪ℬ′‬‬ ‫‪ℬ‬‬ ‫المنفصلة‬


‫) 𝑎 = 𝐴 ∣ ‪.𝑃( ℬ‬‬
‫‪′‬‬

‫باستخدام تعريف االحتماالت الشرطية ‪ ،conditional probabilities‬يمكننا اشتقاق النتيجة‬


‫الشهيرة المسماة نظرية بايز ‪ .Bayes’ theorem‬من خالل البناء‪ ،‬لدينا ذلك = )𝐵 ‪𝑃(𝐴,‬‬
‫)𝐴(𝑃) 𝐴 ∣ 𝐵 (𝑃 و )𝐵(𝑃) 𝐵 ∣ 𝐴 (𝑃 = )𝐵 ‪ .𝑃(𝐴,‬الجمع بين كال المعادلتين ينتج‬
‫)𝐵(𝑃) 𝐵 ∣ 𝐴 (𝑃 = )𝐴(𝑃) 𝐴 ∣ 𝐵 (𝑃 وبالتالي‬

‫)𝐴(𝑃) 𝐴 ∣ 𝐵 (𝑃‬
‫= ) 𝐵 ∣ 𝐴 (𝑃‬ ‫‪.‬‬
‫)𝐵(𝑃‬

‫هذه المعادلة البسيطة لها آثار عميقة ألنها تسمح لنا بعكس ترتيب الشرط‪ .‬إذا عرفنا كيف نقدر‬
‫) 𝐴 ∣ 𝐵 (𝑃 ‪ ،‬ثم يمكننا أن نقدر ) 𝐵 ∣ 𝐴 (𝑃‪ .‬غالبًا ما نجد أنه من األسهل تقدير مصطلح واحد‬
‫بشكل مباشر ولكن ليس اآلخر ويمكن أن تنقذ نظرية بايز ‪ Bayes’ theorem‬هنا‪ .‬على سبيل‬
‫المثال‪ ،‬إذا عرفنا مدى انتشار أعراض مرض معين‪ ،‬واالنتشار العام للمرض واألعراض‪ ،‬على‬
‫التوالي‪ ،‬يمكننا تحديد مدى احتمالية إصابة شخص ما بالمرض بناءً على أعراضه‪.‬يف بعض‬
‫الحاالت‪ ،‬قد ال يكون لدينا وصول مباشر لـ )𝐵(𝑃 ‪ ،‬مثل انتشار األعراض‪.‬يف هذه الحالة‪ ،‬تكون‬
‫النسخة المبسطة من نظرية بايز مفيدة‪:‬‬

‫‪𝑃( 𝐴 ∣ 𝐵 ) ∝ 𝑃( 𝐵 ∣ 𝐴 )𝑃(𝐴).‬‬

‫𝑎∑ يمكننا‬ ‫بما أننا نعلم أن ) 𝐵 ∣ 𝐴 (𝑃 يجب تسويته الى ‪ ، 1‬أي ‪𝑃( 𝐴 = 𝑎 ∣ 𝐵 ) = 1‬‬
‫استخدامه لحساب‪:‬‬

‫)𝐴(𝑃) 𝐴 ∣ 𝐵 (𝑃‬
‫= ) 𝐵 ∣ 𝐴 (𝑃‬ ‫‪.‬‬
‫𝑏∑‬ ‫)𝐴(𝑃) 𝐴 ∣ 𝑏 = 𝐵 (𝑃‬

‫في إحصائيات بايز ‪ ،Bayesian statistics‬نعتقد أن المراقب ‪ observer‬يمتلك بعض‬


‫المعتقدات السابقة (الذاتية ‪ )subjective‬حول معقولية الفرضيات المتاحة المشفرةيف السابق‬
‫)𝐻(𝑃 ‪ ،‬ودالة احتمالية توضح مدى احتمالية مالحظة أي قيمة لألدلة التي تم جمعها لكل من‬
‫الفرضياتيف الفئة ) 𝐻 ∣ 𝐸 (𝑃‪ .‬ثم يتم تفسير نظرية بايز على أنها تخبرنا بكيفية تحديث السابقة‬
‫األولية ‪ initial prior‬يف ضوء األدلة المتاحة 𝐸 إلنتاج معتقدات الحقة = ) 𝐸 ∣ 𝐻 (𝑃‬
‫)𝐻(𝑃) 𝐻∣∣ 𝐸 (𝑃‬
‫‪ .‬بشكل غير رسمي‪ ،‬يمكن ذكر ذلك على أنه "الحقًا يساوي احتمالية األوقات‬
‫)𝐸(𝑃‬
‫السابقة ‪ ،prior times likelihood‬مقسومًا على الدليل ‪ ."evidence‬اآلن‪ ،‬نظرًا ألن الدليل‬
‫)𝐸(𝑃 هو نفسه بالنسبة لجميع الفرضيات‪ ،‬يمكننا التخلص ببساطة من تسوية الفرضيات‪.‬‬
‫‪113‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫𝑎∑ يسمح لنا أيضًا بالتهميش ‪ marginalize‬على‬ ‫الحظ أن ‪𝑃( 𝐴 = 𝑎 ∣ 𝐵 ) = 1‬‬


‫المتغيرات العشوائية‪ .‬وهذا يعني أنه يمكننا إسقاط المتغيرات من التوزيع المشترك مثل‬
‫)𝐵 ‪ .𝑃(𝐴,‬بعد كل شيء‪ ،‬لدينا ذلك‬

‫∑‬ ‫∑ )𝐵(𝑃 = )𝐵 ‪𝑃(𝐴 = 𝑎,‬‬ ‫‪𝑃( 𝐴 = 𝑎 ∣ 𝐵 ) = 𝑃(𝐵).‬‬


‫𝑎‬ ‫𝑎‬

‫االستقالل ‪ Independence‬هو مفهوم آخر مهم بشكل أساسي يشكل العمود الفقري للعديد‬
‫من األفكار المهمةيف اإلحصاء‪ .‬باختصار‪ ،‬يكون متغيرين مستقلين إذا كان التكييف‬
‫‪ conditioning‬على قيمة 𝐴 ال يسبب أي تغييريف توزيع االحتماالت المرتبط بـ 𝐵 والعكس‬
‫صحيح‪ .‬بشكل رسمي أكثر‪ ،‬االستقالل‪ ،‬والمشار إليه 𝐵 ⊥ 𝐴 ‪ ،‬يتطلب ذلك = ) 𝐵 ∣ 𝐴 (𝑃‬
‫)𝐴(𝑃 ‪ ،‬وبالتالي‪ ،‬ذلك )𝐵(𝑃)𝐴(𝑃 = )𝐵(𝑃) 𝐵 ∣ 𝐴 (𝑃 = )𝐵 ‪ .𝑃(𝐴,‬غالبًا ما يكون‬
‫االستقالل افتراضًا مناسبًا‪ .‬على سبيل المثال‪ ،‬إذا كان المتغير العشوائي 𝐴 يمثل النتيجة من رمي‬
‫عملة عادلة ويمثل المتغير العشوائي 𝐵 النتيجة من رمي عملة أخرى‪ ،‬فإن معرفة ما إذا كان المتغير‬
‫العشوائي 𝐴 ال يجب أن يؤثر على احتمالية 𝐵 ظهور الرأس‪.‬‬

‫يكون االستقالل مفيدًا بشكل خاص عندما يكون بين السحوبات ‪ draws‬المتتالية لبياناتنا من‬
‫بعض التوزيعات األساسية (مما يسمح لنا بعمل استنتاجات إحصائية قوية) أو عندما يكون بين‬
‫المتغيرات المختلفةيف بياناتنا‪ ،‬مما يسمح لنا بالعمل مع نماذج أبسط ترميز بنية االستقالل هذه‪.‬‬
‫من ناحية أخرى‪ ،‬غالبًا ما يكون تقدير التبعيات بين المتغيرات العشوائية هو الهدف األساسي‬
‫للتعلم‪ .‬نحن نهتم بتقدير احتمالية المرض نظرًا لألعراض على وجه التحديد ألننا نعتقد أن‬
‫األمراض واألعراض ليست مستقلة‪.‬‬

‫الحظ أنه نظرًا ألن االحتماالت الشرطية هي احتماالت مناسبة‪ ،‬فإن مفاهيم االستقالل‬
‫‪ independence‬واالعتماد ‪ dependence‬تنطبق عليها أيضًا‪ .‬متغيرين عشوائيين 𝐴 و𝐵‬
‫مستقالن بشكل مشروط مع األخذيف االعتبار متغير ثالث 𝐶 إذا وفقط إذا = ) 𝐶 ∣ 𝐵 ‪𝑃( 𝐴,‬‬
‫) 𝐶 ∣ 𝐵 (𝑃) 𝐶 ∣ 𝐴 (𝑃‪ .‬ومن المثير لالهتمام‪ ،‬أن متغيرين يمكن أن يكونا مستقلين بشكل عام‬
‫ولكنهما يعتمدان عند التكييف على متغير ثالث‪ .‬يحدث هذا غالبًا عندما يتوافق المتغيران‬
‫العشوائيان 𝐴 و𝐵 مع أسباب متغير ثالث 𝐶‪ .‬على سبيل المثال‪ ،‬قد تكون العظام المكسورة‬
‫وسرطان الرئة مستقلينيف عموم السكان‪ ،‬ولكن إذا شرطنا وجودنايف المستشفى‪ ،‬فقد نجد أن‬
‫العظام المكسورة مرتبطة سلبًا بسرطان الرئة‪ .‬وذلك ألن العظم المكسور يفسر سبب وجود شخص‬
‫مايف المستشفى وبالتالي يقلل من احتمالية إصابته بسرطان الرئة‪.‬‬

‫وعلى العكس من ذلك‪ ،‬يمكن أن يصبح متغيرين عشوائيين مستقلين عند التكييف على متغير‬
‫ثالث‪ .‬يحدث هذا غالبًا عندما يكون لحدثين غير مرتبطين سببًا مشتركًا‪ .‬يرتبط حجم الحذاء‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪114‬‬

‫ومستوى القراءة ارتباطًا وثيقًا بين طالب المدارس االبتدائية‪ ،‬لكن هذا االرتباط يختفي إذا شرطنا‬
‫في العمر‪.‬‬

‫‪2.6.5‬‬
‫دعونا نختبر مهاراتنا‪ .‬افترض أن الطبيب يقوم بإجراء اختبار فيروس نقص المناعة البشرية ‪HIV‬‬
‫على المريض‪ .‬هذا االختبار دقيق إلى حد ما وال يفشل إال مع احتمال ‪ ٪1‬إذا كان المريض يتمتع‬
‫بصحة جيدة ولكنه يبلغ عن إصابته بالمرض‪ .‬عالوة على ذلك‪ ،‬فإنه ال يفشل أبدًايف اكتشاف‬
‫فيروس نقص المناعة البشرية إذا كان المريض مصابًا به بالفعل‪ .‬نستخدم }‪ 𝐷1 ∈ {0,1‬لإلشارة‬
‫إلى التشخيص (‪ 0‬إذا كان سلبياً و‪ 1‬إذا كان إيجابياً) و}‪ 𝐻 ∈ {0,1‬لإلشارة إلى حالة فيروس‬
‫نقص المناعة البشرية‪.‬‬

‫الحظ أن مجاميع األعمدة كلها ‪( 1‬لكن مجاميع الصفوف ليست كذلك)‪ ،‬ألنها احتماالت‬
‫مشروطة‪ .‬دعونا نحسب احتمال إصابة المريض بفيروس نقص المناعة البشرية إذا كانت نتيجة‬
‫االختبار إيجابية‪ ،‬أي ) ‪ .𝑃( 𝐻 = 1 ∣ 𝐷1 = 1‬حدسيًا‪ ،‬سيعتمد هذا على مدى انتشار المرض‪،‬‬
‫ألنه يؤثر على عدد اإلنذارات الكاذبة‪ .‬افترض أن السكان يتمتعون بصحة جيدة إلى حد ما‪ ،‬على‬
‫سبيل المثال‪ . 𝑃(𝐻 = 1) = 0.0015،‬لتطبيق نظرية بايز‪ ،‬نحتاج إلى تطبيق التهميش‬
‫‪ marginalization‬لتحديد‬

‫= )‪𝑃(𝐷1 = 1‬‬ ‫)‪𝑃(𝐷1 = 1, 𝐻 = 0) + 𝑃(𝐷1 = 1, 𝐻 = 1‬‬


‫=‬ ‫)‪𝑃( 𝐷1 = 1 ∣ 𝐻 = 0 )𝑃(𝐻 = 0) + 𝑃( 𝐷1 = 1 ∣ 𝐻 = 1 )𝑃(𝐻 = 1‬‬
‫=‬ ‫‪0.011485.‬‬
‫هذا يقودنا إلى‬

‫)‪𝑃( 𝐷1 = 1 ∣ 𝐻 = 1 )𝑃(𝐻 = 1‬‬


‫= ) ‪𝑃( 𝐻 = 1 ∣ 𝐷1 = 1‬‬ ‫‪= 0.1306.‬‬
‫)‪𝑃(𝐷1 = 1‬‬

‫بمعنى آخر‪ ،‬هناك احتمال بنسبة ‪ ٪13.06‬فقط أن يكون المريض مصابًا بالفعل بفيروس نقص‬
‫المناعة البشرية‪ ،‬على الرغم من استخدام اختبار دقيق للغاية‪ .‬كما نرى‪ ،‬يمكن أن يكون االحتمال‬
‫مخالفًا للحدس‪ .‬ماذا يفعل المريض عند تلقي مثل هذه األخبار المرعبة؟ من المحتمل أن يطلب‬
‫‪115‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫المريض من الطبيب إجراء اختبار آخر لتوضيح األمر‪ .‬االختبار الثاني له خصائص مختلفة وهو‬
‫ليس بنفس جودة االختبار األول‪.‬‬

‫لسوء الحظ‪ ،‬االختبار الثاني يأتي إيجابيًا أيضًا‪ .‬دعونا نحسب االحتماالت المطلوبة الستدعاء‬
‫نظرية بايز بافتراض االستقالل الشرطي ‪:conditional independence‬‬

‫) ‪𝑃( 𝐷1 = 1, 𝐷2 = 1 ∣ 𝐻 = 0‬‬ ‫‪= 𝑃( 𝐷1 = 1 ∣ 𝐻 = 0 )𝑃( 𝐷2 = 1 ∣ 𝐻 = 0 ) = 0.0003,‬‬


‫) ‪𝑃( 𝐷1 = 1, 𝐷2 = 1 ∣ 𝐻 = 1‬‬ ‫= ) ‪= 𝑃( 𝐷1 = 1 ∣ 𝐻 = 1 )𝑃( 𝐷2 = 1 ∣ 𝐻 = 1‬‬ ‫‪0.98.‬‬

‫يمكننا اآلن تطبيق التهميش ‪ marginalization‬للحصول على احتمالية أن كال االختبارين يأتي‬
‫بنتائج إيجابية‪:‬‬

‫= )‪𝑃(𝐷1 = 1, 𝐷2 = 1‬‬ ‫)‪𝑃(𝐷1 = 1, 𝐷2 = 1, 𝐻 = 0) + 𝑃(𝐷1 = 1, 𝐷2 = 1, 𝐻 = 1‬‬


‫=‬ ‫)‪𝑃( 𝐷1 = 1, 𝐷2 = 1 ∣ 𝐻 = 0 )𝑃(𝐻 = 0) + 𝑃( 𝐷1 = 1, 𝐷2 = 1 ∣ 𝐻 = 1 )𝑃(𝐻 = 1‬‬
‫=‬ ‫‪0.00176955.‬‬

‫أخيرًا‪ ،‬فإن احتمال إصابة المريض بفيروس نقص المناعة البشرية مع إعطاء كال االختبارين‬
‫إيجابيًا‬

‫)‪𝑃( 𝐷1 = 1, 𝐷2 = 1 ∣ 𝐻 = 1 )𝑃(𝐻 = 1‬‬


‫= ) ‪𝑃( 𝐻 = 1 ∣ 𝐷1 = 1, 𝐷2 = 1‬‬
‫)‪𝑃(𝐷1 = 1, 𝐷2 = 1‬‬
‫‪= 0.8307.‬‬

‫أي أن االختبار الثاني سمح لنا باكتساب ثقة أعلى بكثير من أن ليس كل شيء على ما يرام‪ .‬على‬
‫الرغم من أن االختبار الثاني أقل دقة بكثير من االختبار األول‪ ،‬إال أنه ال يزال يحسن تقديرنا بشكل‬
‫كبير‪ .‬كان افتراض أن كال االختبارين مستقلين عن بعضهما البعض مشروطًا أمرًا حاسمًا لقدرتنا‬
‫على إنشاء تقدير أكثر دقة‪ .‬خذ الحالة القصوى حيث نجري نفس االختبار مرتين‪.‬يف هذه الحالة‪،‬‬
‫نتوقع نفس النتيجةيف كلتا المرتين‪ ،‬وبالتالي ال يتم اكتساب رؤية إضافية من إجراء نفس االختبار‬
‫مرة أخرى‪ .‬ربما الحظ القارئ الذكي أن التشخيص تصرف كمصنف يختبئ على مرأى من الجميع‬
‫حيث تزيد قدرتنا على تقرير ما إذا كان المريض يتمتع بصحة جيدة مع حصولنا على المزيد من‬
‫الميزات (نتائج االختبار)‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪116‬‬

‫‪Expectations‬‬ ‫‪2.6.6‬‬
‫في كثير من األحيان‪ ،‬ال يتطلب اتخاذ القرارات مجرد النظر إلى االحتماالت المخصصة لألحداث‬
‫الفردية‪ ،‬بل تجميعها معًايف مجاميع مفيدة يمكن أن تزودنا باإلرشادات‪ .‬على سبيل المثال‪ ،‬عندما‬
‫تأخذ المتغيرات العشوائية قيمًا عددية مستمرة‪ ،‬فإننا غالبًا ما نهتم بمعرفة القيمة التي نتوقعهايف ‬
‫المتوسط‪ .‬تسمى هذه الكمية رسميًا بالتوقع ‪ .expectation‬إذا كنا نقوم باستثمارات‪ ،‬فقد تكون‬
‫الكمية األولى من الفائدة هي العائد الذي يمكن أن نتوقعه‪ ،‬بمتوسط جميع النتائج المحتملة‬
‫(والترجيح حسب االحتماالت المناسبة)‪ .‬على سبيل المثال‪ ،‬لنفترض أنه مع وجود احتمال بنسبة‬
‫‪ ،٪50‬قد يفشل االستثمار تمامًا‪ ،‬مع احتمال ‪ ٪40‬أنه قد يوفر عائدًا × ‪ ،2‬ومع احتمال ‪ ٪10‬قد‬
‫يوفر عائد × ‪ .10‬لحساب العائد المتوقع‪ ،‬نقوم بتجميع الكل العوائد‪ ،‬وضرب كل منهايف احتمال‬
‫حدوثها‪ .‬هذا ينتج التوقع ‪ .0.5 ⋅ 0 + 0.4 ⋅ 2 + 0.1 ⋅ 10 = 1.8‬ومن ثم فإن العائد المتوقع‬
‫هو ‪.1.8‬‬

‫بشكل عام‪ ،‬يتم تعريف توقع (أو متوسط) المتغير العشوائي 𝑋 على أنه‬

‫∑ = ]𝑥[ 𝑃∼𝑥𝐸 = ]𝑋[𝐸‬ ‫‪𝑥𝑃(𝑋 = 𝑥).‬‬


‫𝑥‬

‫وبالمثل‪ ،‬بالنسبة للكثافات التي نحصل عليها )𝑥(𝑝𝑑𝑥 ∫ = ]𝑋[𝐸‪.‬يف بعض األحيان نحن‬
‫مهتمون بالقيمة المتوقعة لبعض دوال 𝑥‪ .‬يمكننا حساب هذه التوقعات على أنها‬

‫∑ = ])𝑥(𝑓[ 𝑃∼𝑥𝐸‬ ‫𝑥𝑑)𝑥(𝑝)𝑥(𝑓 ∫ = ])𝑥(𝑓[ 𝑃∼𝑥𝐸 ‪𝑓(𝑥)𝑃(𝑥) and‬‬


‫𝑥‬

‫لالحتماالت والكثافات المتقطعة‪ ،‬على التوالي‪ .‬بالعودة إلى مثال االستثمار أعاله‪ ،‬قد تكون‬
‫المنفعة (السعادة) المرتبطة بالعائد‪ .‬الحظ االقتصاديون السلوكيون منذ فترة طويلة أن الناس‬
‫يربطون بين عدم الكفاءة وخسارة األموال أكثر من المنفعة المكتسبة من كسب دوالر واحد مقارنة‬
‫بخط األساس‪ .‬عالوة على ذلك‪ ،‬تميل قيمة النقود إلى أن تكون دون خطية ‪ .sublinear‬يمكن‬
‫المتالك ‪ 100‬ألف دوالر مقابل صفر دوالر أن يحدث فرقًا بين دفع اإليجار وتناول الطعام الجيد‬
‫والتمتع بالرعاية الصحية الجيدة مقابل المعاناة من التشرد‪ .‬من ناحية أخرى‪ ،‬فإن المكاسب‬
‫الناتجة عن امتالك ‪ 200‬ألف مقابل ‪ 100‬ألف أقل دراماتيكية‪ .‬مثل هذا االستدالل يحفز‬
‫الكليشيهات القائلة بأن "منفعة المال لوغاريتمية ‪." the utility of money is logarithmic‬‬

‫إذا كانت المنفعة المرتبطة بخسارة إجمالية هي ‪ ،-1‬وكانت المرافق المرتبطة بعائدات ‪ 1‬و‪ 2‬و‪10‬‬
‫هي ‪ 1‬و‪ 2‬و‪ 4‬على التوالي‪ ،‬فإن السعادة المتوقعة لالستثمار ستكون ‪0.5 ⋅ (−1) + 0.4 ⋅ 2 +‬‬
‫‪117‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫‪( 0.1 ⋅ 4 = 0.7‬خسارة فائدة متوقعة قدرها ‪ .)٪ 30‬إذا كانت هذه هي بالفعل دالة المنفعة‬
‫‪ utility function‬الخاصة بك‪ ،‬فقد يكون من األفضل لك االحتفاظ بالماليف البنك‪.‬‬

‫بالنسبة للقرارات المالية‪ ،‬قد نرغب أيضًايف قياس مدى خطورة ‪ risky‬االستثمار‪ .‬هنا‪ ،‬ال نهتم‬
‫فقط بالقيمة المتوقعة ولكن إلى أي مدى تميل القيم الفعلية إلى االختالف بالنسبة إلى هذه القيمة‪.‬‬
‫الحظ أنه ال يمكننا أن نأخذ فقط توقع الفرق بين القيم الفعلية والمتوقعة‪ .‬وذلك ألن توقع‬
‫االختالف هو اختالف التوقعات‪ ،‬وبالتالي ‪ .𝐸[𝑋 − 𝐸[𝑋]] = 𝐸[𝑋] − 𝐸[𝐸[𝑋]] = 0‬ومع‬
‫ذلك‪ ،‬يمكننا أن ننظر إلى توقع أي دالة غير سلبية لهذا االختالف‪ .‬يتم حساب التباينيف المتغير‬
‫العشوائي من خالل النظر إلى القيمة المتوقعة لالنحرافات التربيعية ‪:squared deviations‬‬

‫‪Var[𝑋] = 𝐸[(𝑋 − 𝐸[𝑋])2 ] = 𝐸[𝑋 2 ] − 𝐸[𝑋]2 .‬‬

‫هنا تأتي المساواة من خالل توسيع ‪ (𝑋 − 𝐸[𝑋])2 = 𝑋 2 − 2𝑋𝐸[𝑋] + 𝐸[𝑋]2‬وأخذ‬


‫التوقعات لكل مصطلح‪ .‬الجذر التربيعي للتباين ‪ variance‬هو كمية مفيدة أخرى تسمى‬
‫االنحراف المعياري ‪ .standard deviation‬بينما ينقل التباين واالنحراف المعياري نفس‬
‫المعلومات (يمكن حساب أي منهما من اآلخر)‪ ،‬فإن االنحراف المعياري له خاصية لطيفة التي‬
‫يتم التعبير عنهايف نفس الوحدات مثل الكمية األصلية التي يمثلها المتغير العشوائي‪.‬‬

‫أخيرًا‪ ،‬يتم تعريف تباين دالة المتغير العشوائي بشكل مشابه‬

‫‪Var𝑥∼𝑃 [𝑓(𝑥)] = 𝐸𝑥∼𝑃 [𝑓 2 (𝑥)] − 𝐸𝑥∼𝑃 [𝑓(𝑥)]2 .‬‬

‫بالعودة إلى مثالنا االستثماري‪ ،‬يمكننا اآلن حساب تباين االستثمار‪ .‬أعطيت ⋅ ‪0.5 ⋅ 0 + 0.4‬‬
‫‪ .22 + 0.1 ⋅ 102 − 1.82 = 8.36‬لجميع المقاصد واألغراض‪ ،‬هذا استثمار محفوف‬
‫بالمخاطر‪ .‬الحظ أنه من خالل االصطالح الرياضي‪ ،‬غالبًا ما يشار إلى المتوسط والتباين كـ 𝜇 و‬
‫‪ .𝜎 2‬هذا شائع بشكل خاص عندما نستخدمه لتحديد توزيع غاوسي‪.‬‬

‫بنفس الطريقة التي قدمنا بها التوقعات والتباين للمتغيرات العشوائية العددية‪ ،‬يمكننا القيام بذلك‬
‫للمتغيرات ذات القيمة المتجهية ‪ .vector-valued ones‬التوقعات سهلة‪ ،‬حيث يمكننا‬
‫‪def‬‬
‫تطبيقها بطريقة أساسية‪ .‬على سبيل المثال‪ 𝝁 = 𝐸𝐱∼𝑃 [𝐱]،‬لديه إحداثيات ] 𝑖𝑥[ 𝑃∼𝐱𝐸 = 𝑖𝜇‪.‬‬
‫التغايرات ‪ Covariances‬أكثر تعقيدًا‪ .‬نقوم بحل المشكلة بأخذ توقعات الناتج الخارجي للفرق‬
‫بين المتغيرات العشوائية ومتوسطها‪.‬‬

‫‪def‬‬
‫‪𝚺 = Cov𝐱∼𝑃 [𝐱] = 𝐸𝐱∼𝑃 [(𝐱 − 𝝁)(𝐱 − 𝝁)⊤ ].‬‬

‫يشار إلى هذه المصفوفة بمصفوفة التغاير ‪ .covariance matrix‬طريقة سهلة لمعرفة تأثيرها‬
‫هي النظريف بعض المتجهات 𝐯 بنفس حجم 𝐱‪ .‬إنه يتبع هذا‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪118‬‬

‫‪𝐯 ⊤ 𝚺𝐯 = 𝐸𝐱∼𝑃 [𝐯 ⊤ (𝐱 − 𝝁)(𝐱 − 𝝁)⊤ 𝐯] = Var𝑥∼𝑃 [𝐯 ⊤ 𝐱].‬‬

‫على هذا النحو‪ 𝚺،‬يسمح لنا بحساب التباين ألي دالة خطية لـ 𝐱 من خالل ضرب مصفوفة بسيط‪.‬‬
‫تخبرنا العناصر خارج القطر عن مدى ارتباط اإلحداثيات‪ :‬القيمة ‪ 0‬تعني عدم وجود ارتباط ‪no‬‬
‫‪ ،correlation‬حيث تعني القيمة اإليجابية األكبر أنها أكثر ارتباطًا ‪.strongly correlated‬‬

‫‪2.6.7‬‬
‫في التعلم اآللي‪ ،‬هناك العديد من األشياء التي يجب عدم التأكد بشأنها! يمكن أن نكون غير‬
‫متأكدين من قيمة التسميةيف ضوء المدخالت‪ .‬يمكن أن نكون غير متأكدين من القيمة المقدرة‬
‫للمعلمة‪ .‬يمكننا حتى أن نكون غير متأكدين مما إذا كانت البيانات التي تصل إلى النشر هي حتى‬
‫من نفس التوزيع مثل بيانات التدريب‪.‬‬

‫من خالل عدم اليقين المتكرر ‪ ،aleatoric uncertainty‬نشير إلى أن عدم اليقين المتأصليف ‬
‫المشكلة‪ ،‬وبسبب العشوائية الحقيقية التي ال تحسبها المتغيرات المرصودة‪ .‬من خالل عدم اليقين‬
‫المعرفي ‪ ،epistemic uncertainty‬نشير إلى عدم اليقين بشأن معلمات النموذج‪ ،‬وهو نوع‬
‫عدم اليقين الذي نأمليف تقليله من خالل جمع المزيد من البيانات‪ .‬قد يكون لدينا حالة من عدم‬
‫اليقين المعرفي فيما يتعلق باحتمالية ظهور عملة ما‪ ،‬ولكن حتى بمجرد أن نعرف هذا االحتمال‪،‬‬
‫فإننا نشكيف عدم يقين دائم بشأن نتيجة أي رمية مستقبلية‪ .‬بغض النظر عن المدة التي نشاهد‬
‫فيها شخصًا ما يرمي عملة عادلة‪ ،‬فلن نكون أبدًا أكثر أو أقل من ‪ ٪50‬على يقين من أن القرعة‬
‫التالية ستظهر رأساً‪ .‬تدين هذه المصطلحات إلى األدبياتيف النمذجة الميكانيكية ‪mechanical‬‬
‫‪( modeling‬انظر على سبيل المثال‪ Der Kiureghian ،‬و‪ )2009( Ditlevsen‬لمراجعة هذا‬
‫الجانب من عدم اليقين الكمي ‪ .)uncertainty quantification‬من الجدير بالذكر أن هذه‬
‫المصطلحات تشكل إساءة طفيفة للغة‪ .‬يشير المصطلح المعرفي إلى أي شيء يتعلق بالمعرفة‬
‫‪ ،knowledge‬وبالتالي بالمعنى الفلسفي‪ ،‬فإن كل عدم اليقين هو معرفي ‪.epistemic‬‬

‫لقد رأينا أن أخذ العينات للبيانات من توزيع احتمالي غير معروف يمكن أن يزودنا بمعلومات‬
‫يمكن استخدامها لتقدير معلمات توزيع توليد البيانات‪ .‬ومع ذلك‪ ،‬فإن المعدل الذي يمكن به‬
‫هذا يمكن أن يكون بطيئًا للغاية‪.‬يف مثالنا لرمي العمالت (والعديد من األمثلة األخرى) ال يمكننا‬
‫أن نفعل أفضل من تصميم المقدّرات التي تتقارب بمعدل 𝑛√‪ 1/‬حيث 𝑛 حجم العينة (على‬
‫سبيل المثال‪ ،‬عدد الرميات)‪ .‬هذا يعني أنه باالنتقال من ‪ 10‬إلى ‪ 1000‬مالحظة (عادة ما تكون‬
‫مهمة قابلة للتحقيق للغاية)‪ ،‬نرى انخفاضًا بمقدار عشرة أضعافيف عدم اليقين ‪،uncertainty‬‬
‫في حين أن المالحظات األلف التالية تساعد قليالً نسبيًا‪ ،‬حيث تقدم فقط تقليلًا بمقدار ‪1.41‬‬
‫مرة‪ .‬هذه ميزة دائمة للتعلم اآللي‪:‬يف حين أن هناك غالبًا مكاسب سهلة‪ ،‬فإنها تتطلب قدرًا كبيرًا‬
‫جدًا من البيانات‪ ،‬وغالبًا ما تكون معها قدرًا هائالً من الحسابات لتحقيق المزيد من المكاسب‪.‬‬
‫‪119‬‬ ‫الفصل الثاني‪ :‬االساسيات‬

‫للحصول على مراجعة تجريبية لهذه الحقيقة لنماذج اللغة واسعة النطاق‪ ،‬انظر ‪.Revels et al‬‬
‫(‪.)2016‬‬

‫كما شحذنا لغتنا وأدواتنا للنمذجة اإلحصائية‪.‬يف هذه العملية‪ ،‬تعلمنا عن االحتماالت الشرطية‬
‫وحول واحدة من أهم المعادالتيف اإلحصاء ‪ -‬نظرية بايز‪ .‬إنها أداة فعالة لفصل المعلومات التي‬
‫تنقلها البيانات من خالل مصطلح االحتمالية )𝐴 ∣ 𝐵(𝑃 الذي يتناول مدى مطابقة المالحظات‬
‫𝐵 مع اختيار المعلمات 𝐴 ‪ ،‬واالحتمال السابق )𝐴(𝑃 الذي يحكم مدى معقولية اختيار معين 𝐴‬
‫كانيف المقام األول‪ .‬على وجه الخصوص‪ ،‬رأينا كيف يمكن تطبيق هذه القاعدة لتعيين‬
‫االحتماالت للتشخيص‪ ،‬بناءً على فعالية االختبار وانتشار المرض نفسه (أي سابقنا)‪.‬‬

‫أخيرًا‪ ،‬قدمنا مجموعة أولى من األسئلة غير التافهة حول تأثير توزيع احتمالي محدد‪ ،‬وهي‬
‫التوقعات ‪ expectations‬والتباينات ‪.variances‬يف حين أن هناك أكثر من مجرد توقعات خطية‬
‫وتربيعية لتوزيع االحتماالت‪ ،‬فإن هذين األمرين يوفران بالفعل قدرًا جيدًا من المعرفة حول‬
‫السلوك المحتمل للتوزيع‪ .‬على سبيل المثال‪ ،‬تنص عدم المساواة ‪Chebyshev’s inequality‬‬
‫على ‪ 𝑃(|𝑋 − 𝜇| ≥ 𝑘𝜎) ≤ 1/𝑘 2‬حيث 𝜇 هو التوقع‪ 𝜎 2 ،‬هو تباين التوزيع‪ 𝑘 > 1،‬وهو‬
‫معيار ثقة من اختيارنا‪ .‬يخبرنا أن السحب من التوزيع يكمنيف احتمال ‪ ٪50‬على األقل خالل‬
‫]𝜎‪ [−√2𝜎, √2‬فترة تتمحور حول التوقع‪.‬‬

‫‪2.6.8‬‬
‫‪ .1‬أعط مثاالً حيث يمكن أن تؤدي مراقبة المزيد من البيانات إلى تقليل مقدار عدم اليقين‬
‫بشأن النتيجة إلى مستوى منخفض بشكل تعسفي‪.‬‬
‫‪ .2‬أعط مثاالً حيث ستؤدي مراقبة المزيد من البيانات إلى تقليل مقدار عدم اليقين فقط‬
‫إلى حد ما ثم ال أكثر‪ .‬اشرح سبب حدوث ذلك وأين تتوقع حدوث هذه النقطة‪.‬‬
‫‪ .3‬لقد أثبتنا تجريبياً التقارب مع متوسط رمي عملة معدنية‪ .‬احسب التباينيف تقدير‬
‫االحتمال الذي نراه بعد سحب 𝑛 من العينات‪.‬‬
‫‪ .1‬كيف يتناسب التباين مع عدد المالحظات ‪number of observations‬؟‬
‫‪ .2‬استخدم عدم المساواةيف ‪ Chebyshev‬للحد من االنحراف عن التوقع‪.‬‬
‫‪ .3‬كيف تتصل بنظرية الحد المركزي ‪central limit theorem‬؟‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪120‬‬

‫‪Documentation‬‬ ‫‪2.7‬‬
‫بينما ال يمكننا تقديم كل دالة وفئة ‪ TensorFlow‬فردية (وقد تصبح المعلومات قديمة بسرعة)‪،‬‬
‫توفر وثائق ‪ API‬والبرامج التعليمية واألمثلة اإلضافية مثل هذا التوثيق ‪ .documentation‬يقدم‬
‫هذا القسم بعض اإلرشادات حول كيفية استكشاف ‪.TensorFlow API‬‬

‫‪Functions and Classes in a‬‬ ‫‪2.7.1‬‬


‫‪Module‬‬
‫من أجل معرفة الدوال والفئات التي يمكن استدعاؤهايف وحدة نمطية‪ ،‬نستدعي الدالة ‪ .dir‬على‬
‫سبيل المثال‪ ،‬يمكننا االستعالم عن جميع الخصائصيف الوحدة لتوليد أرقام عشوائية‪:‬‬

‫‪['Algorithm', 'Generator', '__builtins__', '__cached__',‬‬


‫‪'__doc__', '__file__', '__loader__', '__name__',‬‬
‫‪'__package__', '__path__', '__spec__', '_sys',‬‬
‫‪'all_candidate_sampler', 'categorical',‬‬
‫‪'create_rng_state', 'experimental',‬‬
‫‪'fixed_unigram_candidate_sampler', 'gamma',‬‬
‫‪'get_global_generator',‬‬
‫‪'learned_unigram_candidate_sampler',‬‬
‫‪'log_uniform_candidate_sampler', 'normal', 'poisson',‬‬
‫‪'set_global_generator', 'set_seed', 'shuffle',‬‬
‫‪'stateless_binomial', 'stateless_categorical',‬‬
‫‪'stateless_gamma', 'stateless_normal',‬‬
‫‪'stateless_parameterized_truncated_normal',‬‬
‫‪'stateless_poisson', 'stateless_truncated_normal',‬‬
‫‪'stateless_uniform', 'truncated_normal', 'uniform',‬‬
‫]'‪'uniform_candidate_sampler‬‬
‫بشكل عام‪ ،‬يمكننا تجاهل الدوال التي تبدأ وتنتهي بـ __ (كائنات خاصةيف بايثون) أو الدوال‬
‫التي تبدأ بـ _ (عادةً دوال داخلية)‪ .‬استنادًا إلى أسماء الدوال أو السمات المتبقية‪ ،‬قد نخاطر‬
‫بتخمين أن هذه الوحدة تقدم طرقًا مختلفة لتوليد أرقام عشوائية‪ ،‬بمايف ذلك أخذ العينات من‬
‫التوزيع المنتظم (‪ )uniform‬والتوزيع الطبيعي (‪ )normal‬والتوزيع متعدد الحدود‬
‫(‪.)multinomial‬‬

‫‪Specific Functions and Classes‬‬ ‫‪2.7.2‬‬


‫لمزيد من اإلرشادات المحددة حول كيفية استخدام دالة أو فئة معينة‪ ،‬يمكننا استدعاء دالة‬
‫‪ .help‬كمثال‪ ،‬دعنا نستكشف تعليمات االستخدام لدالة موترات ‪ones.‬‬

‫‪ones‬‬
121 ‫ االساسيات‬:‫الفصل الثاني‬

Help on function ones in module


tensorflow.python.ops.array_ops:

ones(shape, dtype=tf.float32, name=None)


Creates a tensor with all elements set to one
(1).

See also tf.ones_like, tf.zeros, tf.fill,


tf.eye.

This operation returns a tensor of type dtype


with shape shape and
all elements set to one.

>>> tf.ones([3, 4], tf.int32)


<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], dtype=int32)>

Args:
shape: A list of integers, a tuple of
integers, or
a 1-D Tensor of type int32.
dtype: Optional DType of an element in the
resulting Tensor. Default is
tf.float32.
name: Optional string. A name for the
operation.

Returns:
A Tensor with all elements set to one (1).
‫ تنشئ موترًا جديدًا بالشكل المحدد‬one ‫ يمكننا أن نرى أن الدالة‬،documentation ‫من الوثائق‬
‫ يجب عليك إجراء اختبار سريع لتأكيد التفسير‬،‫ كلما أمكن‬.1 ‫وتضبط جميع العناصر على القيمة‬
:‫الخاص بك‬

tf.ones(4)
<tf.Tensor: shape=(4,), dtype=float32, numpy=array([1.,
1., 1., 1.], dtype=float32)>
،‫ على سبيل المثال‬.‫ يمكننا استخدام ? لعرض المستنديف نافذة أخرى‬،Jupyter ‫في نوتبوك‬
.‫ ويعرضهيف نافذة متصفح جديدة‬،help(list) ‫ سيُنشئ محتوى مطابقًا تقريبًا لـ‬list?
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪122‬‬

‫باإلضافة إلى ذلك‪ ،‬إذا استخدمنا عالمتي استفهام‪ ،‬مثل ??‪ ،list‬فسيتم أيضًا عرض كود بايثون‬
‫الذي ينفذ الدالة‪.‬‬

‫يوفر التوثيق الرسمي الكثير من األوصاف واألمثلة التي تتجاوز هذا الكتاب‪ .‬ينصب تركيزنا على‬
‫تغطية حاالت االستخدام المهمة التي ستتيح لك البدء بسرعةيف المشكالت العملية‪ ،‬بدالً من‬
‫اكتمال التغطية‪ .‬نشجعك أيضًا على دراسة الكود المصدري للمكتبات لمشاهدة أمثلة على‬
‫تطبي قات عالية الجودة لكود اإلنتاج‪ .‬من خالل القيام بذلك‪ ،‬ستصبح مهندسًا أفضل باإلضافة‬
‫إلى أن تصبح عالماً أفضل‪.‬‬
‫الشبكات العصبية الخطية‬
‫لالنحدار‬
‫‪3‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪124‬‬

‫‪Linear Neural‬‬ ‫‪3‬‬


‫‪Networks for Regression‬‬
‫قبل أن نقلق بشأن جعل شبكاتنا العصبية عميقة ‪ ،deep‬سيكون من المفيد تنفيذ بعض الشبكات‬
‫العصبية الضحلة ‪ ،shallow neural networks‬والتي تتصل مدخالتها مباشرة بالمخرجات‪.‬‬
‫سيثبت هذا أهميته لعدة أسباب‪ .‬أوالً‪ ،‬بدالً من تشتيت االنتباه بسبب البنى المعقدة‪ ،‬يمكننا التركيز‬
‫على أساسيات تدريب الشبكة العصبية‪ ،‬بمايف ذلك تحديد معلمات طبقة اإلخراج‪ ،‬ومعالجة‬
‫البيانات‪ ،‬وتحديد دالة الخطأ‪ ،‬وتدريب النموذج‪ .‬ثانيًا‪ ،‬تتكون هذه الفئة من الشبكات الضحلة‬
‫لتشمل مجموعة من النماذج الخطية‪ ،‬والتي تشمل العديد من الطرق الكالسيكية للتنبؤ‬
‫اإلحصائي‪ ،‬بمايف ذلك االنحدار الخطي ‪ linear regression‬وانحدار ‪ .Softmax‬يعد فهم هذه‬
‫األدوات الكالسيكية أمرًا محوريًا ألنه ا تُستخدم على نطاق واسعيف العديد من السياقات‬
‫وسنحتاج غالبًا إلى استخدامها كخطوط أساسية عند تبرير استخدام معماريات مختلفة‪ .‬سيركز‬
‫هذا الفصل بشكل ضيق على االنحدار الخطي وسيعمل الفصل التالي على توسيع مجموعة‬
‫النمذجة لدينا من خالل تطوير شبكات عصبية خطية من أجل التصنيف ‪.classification‬‬

‫‪Linear Regression‬‬ ‫‪3.1‬‬


‫تظهر مشاكل االنحدار ‪ Regression problems‬كلما أردنا توقع قيمة عددية‪ .‬تشمل األمثلة‬
‫الشائعة التنبؤ باألسعار (للمنازل‪ ،‬والمخزون‪ ،‬وما إلى ذلك)‪ ،‬والتنبؤ بطول اإلقامة (للمرضىيف ‬
‫المستشفى)‪ ،‬والتنبؤ بالطلب (لمبيعات التجزئة)‪ ،‬من بين أمور أخرى ال حصر لها‪ .‬ليست كل‬
‫مشكلة تنبؤ مشكلة انحدار كالسيكية‪.‬يف وقت الحق‪ ،‬سوف نقدم مشاكل التصنيف‬
‫‪ ،classification problems‬حيث الهدف هو التنبؤ بالعضوية بين مجموعة من الفئات‪.‬‬

‫كمثال جار‪ ،‬لنفترض أننا نرغبيف تقدير أسعار المنازل (بالدوالر) بناءً على مساحتها (باألقدام‬
‫المربعة) والعمر (بالسنوات)‪ .‬لتطوير نموذج للتنبؤ بأسعار المنازل‪ ،‬نحتاج إلى الحصول على‬
‫بيانات تتكون من المبيعات‪ ،‬بمايف ذلك سعر البيع والمساحة والعمر لكل منزل‪.‬يف مصطلحات‬
‫التعلم اآللي‪ ،‬تسمى مجموعة البيانات ‪ dataset‬مجموعة بيانات التدريب ‪ training dataset‬أو‬
‫مجموعة التدريب ‪ ،training set‬ويسمى كل صف (يحتوي على البيانات المقابلة لعملية بيع‬
‫واحدة) بمثال (أو نقطة بيانات ‪ ، data point‬مثال ‪ ، instance‬عينة ‪ .)sample‬الشيء الذي‬
‫نحاول توقعه (السعر) يسمى التسمية ‪( label‬أو الهدف ‪ .)target‬تسمى المتغيرات (العمر‬
‫والمنطقة) التي تستند إليها التنبؤات الميزات (أو المتغيرات المشتركة ‪.)covariates‬‬
‫‪125‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪Basics‬‬ ‫‪3.1.1‬‬
‫قد يكون االنحدار الخطي ‪ Linear regression‬هو األبسط واألكثر شيوعًا بين األدوات القياسية‬
‫لمعالجة مشاكل االنحدار‪ .‬يعود تاريخ االنحدار الخطي إلى فجر القرن التاسع عشر (‪،Gauss‬‬
‫‪ ،)1805 ،Legendre ،1809‬ويتدفق االنحدار الخطي من بعض االفتراضات البسيطة‪ .‬أوالً‪،‬‬
‫نفترض أن العالقة بين الميزات 𝐱 والهدف 𝑦 خطية تقريبًا‪ ،‬أي أنه يمكن التعبير عن المتوسط‬
‫الشرطي ]𝐱 = 𝑋 ∣ 𝑌[𝐸 كمجموع وزني للسمات 𝐱‪ .‬يسمح هذا اإلعداد بأن القيمة المستهدفة‬
‫قد ال تزال تنحرف عن قيمتها المتوقعة بسبب ضوضاء المراقبة ‪ .observation noise‬بعد ذلك‪،‬‬
‫يمكننا فرض افتراض أن أي ضوضاء من هذا القبيل حسن التصرف‪ ،‬بعد توزيع غاوسي‪ .‬عادة‪،‬‬
‫سنستخدم 𝑛 لإلشارة إلى عدد األمثلةيف مجموعة البيانات الخاصة بنا‪ .‬نحن نستخدم النصوص‬
‫الفوقية ‪ superscripts‬لتعداد العينات واألهداف‪ ،‬والنصوص التحتية ‪ subscripts‬لفهرسة‬
‫)𝑖(‬
‫اإلحداثيات‪ .‬بشكل ملموس‪ 𝐱 (𝑖) ،‬يشير إلى العينة ‪ 𝑖𝑡ℎ‬و 𝑗𝑥 يدل على إحداثياتها ‪.𝑗𝑡ℎ‬‬

‫‪Model‬‬ ‫‪3.1.1.1‬‬

‫يوجديف قلب كل حل نموذج يصف كيف يمكن تحويل الميزات إلى تقدير للهدف‪ .‬يعني افتراض‬
‫الخطية أنه يمكن التعبير عن القيمة المتوقعة للهدف ‪( target‬السعر) كمجموع اوزان للسمات‬
‫‪( features‬المنطقة والعمر)‪:‬‬

‫‪price = 𝑤area ⋅ area + 𝑤age ⋅ age + 𝑏.‬‬ ‫‪3.1.1‬‬


‫هنا ‪ 𝑤area‬و ‪ 𝑤age‬تسمى األوزان ‪ ،weights‬وتسمى 𝑏 التحيز ‪( bias‬أو اإلزاحة ‪ offset‬أو‬
‫التقاطع ‪ .) intercept‬تحدد األوزان تأثير كل ميزة على تنبؤاتنا‪ .‬يحدد التحيز قيمة التقدير عندما‬
‫تكون جميع الميزات صفرية‪ .‬على الرغم من أننا لن نرى أبدًا أي منازل مبنية حديثًا بمساحة صفر‬
‫بالضبط‪ ،‬إال أننا ما زلنا بحاجة إلى التحيز ألنه يسمح لنا بالتعبير عن جميع الدوال الخطية لميزاتنا‬
‫(مقابل تقييدنا بالخطوط التي تمر عبر األصل)‪ .‬بالمعنى الدقيق للكلمة‪ ،‬عبارة عن تحويل أفيني‬
‫لميزات اإلدخال‪ ،‬والتي تتميز بتحويل خطي للميزات عبر مجموع االوزان‪ ،‬جنبًا إلى جنب مع‬
‫الترجمة عبر التحيز اإلضافي‪ .‬بالنظر إلى مجموعة البيانات‪ ،‬فإن هدفنا هو اختيار األوزان 𝐰‬
‫واالنحياز 𝑏 ‪،‬يف المتوسط‪ ،‬يجعل توقعات نموذجنا تتناسب مع األسعار الحقيقية التي لوحظت‬
‫في البيانات بأكبر قدر ممكن‪.‬‬

‫في التخصصات التي يكون من الشائع فيها التركيز على مجموعات البيانات مع بعض الميزات‬
‫فقط‪ ،‬والتعبير الواضح عن النماذج طويلة الشكل‪ ،‬كمايف (‪ ،)3.1.1‬أمر شائع‪.‬يف التعلم اآللي‪،‬‬
‫نعمل عادةً مع مجموعات البيانات عالية األبعاد ‪ ،high-dimensional datasets‬حيث يكون‬
‫من المالئم استخدام تدوين الجبر الخطي المدمج‪ .‬عندما تتكون مدخالتنا من 𝑑 ميزات‪ ،‬يمكننا‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪126‬‬

‫^‬
‫تعيين فهرس لكل منها (بين ‪ 1‬و 𝑑) والتعبير عن توقعاتنا 𝑦 (بشكل عام‪ ،‬يشير رمز "القبعة ‪"hat‬‬
‫إلى تقدير ‪)estimate‬‬

‫^‬
‫‪𝑦 = 𝑤1 𝑥1 + ⋯ + 𝑤𝑑 𝑥𝑑 + 𝑏.‬‬ ‫‪3.1.2‬‬
‫بتجميع كل الميزاتيف متجه 𝑑‪ 𝐱 ∈ ℝ‬وجميع األوزانيف متجه 𝑑‪ ،𝐰 ∈ ℝ‬يمكننا التعبير عن‬
‫نموذجنا بشكل مضغوط عبر الضرب النقطي بين 𝐰 و 𝐱‪:‬‬
‫^‬
‫‪𝑦 = 𝐰 ⊤ 𝐱 + 𝑏.‬‬ ‫‪3.1.3‬‬

‫في (‪ ،)3.1.3‬يتوافق المتجه 𝐱 مع ميزات مثال واحد‪ .‬غالبًا ما نجد أنه من المالئم الرجوع إلى‬
‫ميزات مجموعة البيانات الكاملة لألمثلة 𝑛 عبر مصفوفة التصميم 𝑑×𝑛‪ .𝐗 ∈ ℝ‬هنا‪ 𝐗،‬يحتوي‬
‫^‬
‫على صف واحد لكل مثال وعمود واحد لكل ميزة‪ .‬لمجموعة من الميزات 𝐗 والتنبؤات ∈ 𝐲‬
‫𝑛‪ ℝ‬يمكن التعبير عنها عبر حاصل ضرب المصفوفة‪-‬المتجه ‪:matrix-vector product‬‬
‫^‬
‫‪𝑦 = 𝐗𝐰 + 𝑏,‬‬ ‫‪3.1.4‬‬

‫حيث يتم تطبيق البث ‪( broadcasting‬القسم ‪ )2.1.4‬أثناء عملية الجمع‪ .‬بالنظر إلى ميزات‬
‫مجموعة بيانات التدريب 𝐗 والتسميات المقابلة (المعروفة) 𝐲‪ ،‬فإن الهدف من االنحدار الخطي‬
‫هو العثور على متجه الوزن 𝐰 ومصطلح التحيز 𝑏 الذي يعطى ميزات لمثال بيانات جديد مأخوذ‬
‫من نفس التوزيع مثل 𝐗‪ ،‬فإن تسمية المثال الجديد سوف (في التوقع) يتوقع بأقل خطأ‪.‬‬

‫حتى إذا كنا نعتقد أن أفضل نموذج للتنبؤ بـ 𝑦 معطى 𝐱 هو خطي‪ ،‬فإننا ال نتوقع العثور على‬
‫مجموعة بيانات حقيقية من األمثلة 𝑛 حيث )𝑖( 𝑦 تساوي تمامًا 𝑏 ‪ 𝐰 ⊤ 𝐱 (𝑖) +‬لكل ≤ 𝑖 ≤ ‪1‬‬
‫𝑛‪ .‬على سبيل المثال‪ ،‬أيا كانت األدوات التي نستخدمها لمراقبة الميزات 𝐗 والتسميات 𝐲 قد‬
‫تعاني من قدر ضئيل من أخطاء القياس ‪ .measurement error‬وبالتالي‪ ،‬حتى عندما نكون‬
‫واثقين من أن العالقة األساسية خطية‪ ،‬فسنقوم بتضمين مصطلح ضوضاء ‪ noise‬لتفسير مثل‬
‫هذه األخطاء‪.‬‬

‫قبل أن نتمكن من البحث عن أفضل المعلمات ‪( parameters‬أو معلمات النموذج ‪model‬‬


‫‪ 𝐰 )parameters‬و 𝑏‪ ،‬سنحتاج إلى شيئين آخرين‪ )1( :‬مقياس جودة لبعض النماذج المحددة؛‬
‫و (‪ )2‬إجراء لتحديث النموذج لتحسين جودته‪.‬‬

‫‪Loss Function‬‬ ‫‪3.1.1.2‬‬


‫بطبيعة الحال‪ ،‬يتطلب مالءمة ‪ fitting‬نموذجنا للبيانات أن نتفق على بعض مقاييس المالءمة‬
‫‪( fitness‬أو‪ ،‬على نحو مكافئ‪ ،‬عدم اللياقة ‪ .)unfitness‬تحدد دوال الخطأ ‪Loss functions‬‬
‫‪127‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫المسافة بين القيم الحقيقية ‪ real‬والمتوقعة ‪ predicted‬للهدف‪ .‬ستكون الخسارة (الخطأ) عادةً‬
‫رقمًا غير سالب حيث تكون القيم األصغر أفضل وتتحمل التنبؤات الكاملة خسارة قدرها ‪.0‬‬
‫بالنسبة لمشاكل االنحدار‪ ،‬فإن دالة الخسارة األكثر شيوعًا هي الخطأ التربيعي ‪.squared error‬‬
‫^‬
‫عندما يكون توقعنا للحصول على مثال 𝑖 هو )𝑖( 𝑦 والتسمية الحقيقية المقابلة هي )𝑖( 𝑦‪ ،‬الخطأ‬
‫التربيعي مُعطى بواسطة‪:‬‬

‫^ ‪1‬‬
‫‪𝑙 (𝑖) (𝐰, 𝑏) = (𝑦 (𝑖) − 𝑦 (𝑖) )2 .‬‬
‫‪2‬‬ ‫‪3.1.5‬‬
‫‪1‬‬
‫ال يُحدث الثابت فرقًا حقيقيًا ولكنه يثبت أنه مالئم من الناحية المعيارية‪ ،‬ألنه يُلغى عندما نأخذ‬
‫‪2‬‬
‫مشتق الخطأ‪ .‬نظرًا ألن مجموعة بيانات التدريب تُمنح لنا‪ ،‬وبالتالي فهي خارجة عن سيطرتنا‪،‬‬
‫فإن الخطأ التجريبي ليس سوى دالة لمعلمات النموذج‪ .‬أدناه‪ ،‬نتخيل مالءمة نموذج االنحدار‬
‫الخطييف مشكلة ذات مدخالت أحادية البعد (الشكل ‪.)3.1.1‬‬

‫الشكل ‪ 3.1.1‬مالئمة نموذج االنحدار الخطي لبيانات أحادية البعد‪.‬‬


‫^‬
‫الحظ أن الفروق الكبيرة بين التقديرات )𝑖( 𝑦 واألهداف )𝑖( 𝑦 تؤدي إلى مساهمات أكبريف ‬
‫الخسارة‪ ،‬بسبب الشكل التربيعي ‪ quadratic form‬للخسارة (يمكن أن يكون هذا سيفًا مزدوج‬
‫الحافة‪ .‬بينما يشجع النموذج على تجنب األخطاء الكبيرة‪ ،‬فإنه يمكن أن يؤدي أيضًا إلى حساسية‬
‫مفرطة للبيانات الشاذة ‪ .)anomalous data‬لقياس جودة نموذجيف مجموعة البيانات الكاملة ل‬
‫𝑛 من األمثلة‪ ،‬نقوم ببساطة بمتوسط (أو بشكل مكافئ‪ ،‬جمع) الخسائريف مجموعة التدريب‪:‬‬
‫𝑛‬ ‫𝑛‬
‫‪1‬‬ ‫)𝑖(‬
‫‪1‬‬ ‫)𝑖( ⊤ ‪1‬‬
‫∑ = )𝑏 ‪𝐿(𝐰,‬‬ ‫∑ = )𝑏 ‪𝑙 (𝐰,‬‬ ‫‪(𝐰 𝐱 + 𝑏 − 𝑦 (𝑖) )2 .‬‬
‫𝑛‬ ‫𝑛‬ ‫‪2‬‬
‫‪𝑖=1‬‬ ‫‪𝑖=1‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪128‬‬

‫عند تدريب النموذج‪ ،‬نريد العثور على المعلمات (∗ 𝑏 ‪ )𝐰 ∗ ,‬التي تقلل الخسارة اإلجمالية عبر‬
‫جميع أمثلة التدريب‪:‬‬

‫‪𝐰 ∗ , 𝑏 ∗ = argmin 𝐿(𝐰, 𝑏).‬‬


‫𝑏‪𝐰,‬‬

‫‪Analytic Solution‬‬ ‫‪3.1.1.3‬‬


‫على عكس معظم النماذج التي سنغطيها‪ ،‬يقدم لنا االنحدار الخطي مشكلة تحسين سهلة بشكل‬
‫مدهش‪ .‬على وجه الخصوص‪ ،‬يمكننا العثور على المعلمات المثلى (كما تم تقييمهايف بيانات‬
‫التدريب) بشكل تحليلي من خالل تطبيق صيغة بسيطة على النحو التالي‪ .‬أوالً‪ ،‬يمكننا تضمين‬
‫التحيز 𝑏 يف المعلمة 𝐰 من خالل إلحاق عمود بمصفوفة التصميم المكونة من جميع العناصر‪.‬‬
‫إذن مشكلة التنبؤ لدينا هي تقليل ‪ .‖𝐲 − 𝐗𝐰‖2‬طالما أن مصفوفة التصميم 𝐗 لها رتبة كاملة (ال‬
‫توجد ميزة تعتمد خطيًا على العناصر األخرى)‪ ،‬عندئذٍ ستكون هناك نقطة حرجة واحدة فقط على‬
‫سطح الخسارة وتتوافق مع الحد األدنى من الخسارة على المجال بأكمله‪ .‬أخذ مشتق الخسارة‬
‫فيما يتعلق بـ 𝐰 وجعله يساوي صفر عوائد‪:‬‬

‫‪𝜕𝐰 ‖𝐲 − 𝐗𝐰‖2 = 2𝐗 ⊤ (𝐗𝐰 − 𝐲) = 0 and hence 𝐗 ⊤ 𝐲 = 𝐗 ⊤ 𝐗𝐰.‬‬

‫يوفر لنا حل 𝐰 الحل األمثل لمشكلة التحسين ‪ .optimization problem‬الحظ أن هذا الحل‬

‫𝐲 ⊤ 𝐗 ‪𝐰 ∗ = (𝐗 ⊤ 𝐗)−1‬‬

‫ستكون فريدة فقط عندما تكون المصفوفة 𝐗 ⊤ 𝐗 قابلة للعكس ‪ ،invertible‬أي عندما تكون‬
‫أعمدة مصفوفة التصميم مستقلة خطيًا (‪.)1996 ،Golub and Van Loan‬‬

‫في حين أن المشكالت البسيطة مثل االنحدار الخطي قد تقبل حلولًا تحليلية‪ ،‬يجب أال تعتاد‬
‫على مثل هذا الحظ الجيد‪ .‬على الرغم من أن الحلول التحليلية تسمح بتحليل رياضي لطيف‪ ،‬إال‬
‫أن متطلبات الحل التحليلي مقيدة للغاية بحيث تستبعد تقريبًا جميع الجوانب المثيرة للتعلم‬
‫العميق‪.‬‬

‫‪Minibatch Stochastic‬‬ ‫‪3.1.1.4‬‬


‫‪Gradient Descent‬‬
‫لحسن الحظ‪ ،‬حتىيف الحاالت التي ال يمكننا فيها حل النماذج بشكل تحليلي‪ ،‬ال يزال بإمكاننا‬
‫تدريب النماذج بفعاليةيف الممارسة العملية‪ .‬عالوة على ذلك‪ ،‬بالنسبة للعديد من المهام‪ ،‬يتبين‬
‫أن تلك النماذج التي يصعب تحسينها أفضل بكثير لدرجة أن اكتشاف كيفية تدريبها ينتهي به‬
‫األمر يستحق العناء‪.‬‬
‫‪129‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫تتمثل التقنية الرئيسية لتحسين أي نموذج تعلم عميق تقريبًا‪ ،‬والتي سوف ندعو إليها خالل هذا‬
‫الكتاب‪،‬يف تقليل الخطأ بشكل متكرر عن طريق تحديث المعلماتيف االتجاه الذي يقلل بشكل‬
‫تدريجي من دالة الخسارة‪ .‬هذه الخوارزمية تسمى التدرج االشتقاقي (االنحدار االشتقاقي)‬
‫‪.gradient descent‬‬

‫يتمثل التطبيق األكثر سذاجة للتدرج االشتقاقييف أخذ مشتق دالة الخسارة‪ ،‬وهو متوسط الخسائر‬
‫المحسوبةيف كل مثال فردييف مجموعة البيانات‪ .‬من الناحية العملية‪ ،‬يمكن أن يكون هذا بطيئًا‬
‫للغاية‪ :‬يجب أن نمرر مجموعة البيانات بأكملها قبل إجراء تحديث واحد‪ ،‬حتى لو كانت خطوات‬
‫التحديث قوية جدًا (‪ .)1989 ،Liu and Nocedal‬واألسوأ من ذلك‪ ،‬إذا كان هناك الكثير من‬
‫التكراريف بيانات التدريب‪ ،‬فإن فائدة التحديث الكامل تكون أقل‪.‬‬

‫الطرف اآلخر هو النظريف مثال واحد فقطيف كل مرة واتخاذ خطوات التحديث بناءً على مالحظة‬
‫واحدةيف كل مرة‪ .‬يمكن أن تكون الخوارزمية الناتجة‪ ،‬التدرج االشتقاقي العشوائي ‪stochastic‬‬
‫)‪ gradient descent (SGD‬استراتيجية فعالة (‪ ،)2010 ،Bottou‬حتى بالنسبة لمجموعات‬
‫البيانات الكبيرة‪ .‬لسوء الحظ‪ ،‬فإن ‪ SGD‬لها عيوب‪ ،‬حسابية وإحصائية‪ .‬تنشأ مشكلة واحدة من‬
‫حقيقة أن المعالجات تضرب وتضيف األرقام أسرع بكثير مما هي عليهيف نقل البيانات من‬
‫الذاكرة الرئيسية إلى ذاكرة التخزين المؤقت للمعالج‪ .‬األمر الذي يصل إلى مرتبة المقدار ‪order‬‬
‫‪ of magnitude‬هو أكثر كفاءة إلجراء عملية ضرب المصفوفة‪-‬المتجه مقارنة بعدد مماثل من‬
‫عمليات ضرب المتجه‪-‬المتجه ‪ .‬هذا يعني أن معالجة عينة واحدةيف كل مرة قد تستغرق وقتًا‬
‫أطول بكثير مقارنة بالدفعة الكاملة‪ .‬المشكلة الثانية هي أن بعض الطبقات‪ ،‬مثل تسوية الدُفعات‬
‫‪( batch normalization‬سيتم وصفهايف القسم ‪ ،)8.5‬تعمل بشكل جيد فقط عندما يكون‬
‫لدينا وصول إلى أكثر من مالحظة واحدةيف كل مرة‪.‬‬

‫الحل لكلتا المشكلتين هو اختيار استراتيجية وسيطة‪ :‬بدالً من أخذ دفعة كاملة أو عينة واحدة فقط‬
‫في كل مرة‪ ،‬نأخذ دفعة صغيرة ‪ minibatch‬من المالحظات (‪ .)2014 ،Li et al.‬يعتمد االختيار‬
‫المحدد لحجم الدفعة الصغيرة المذكور على العديد من العوامل‪ ،‬مثل مقدار الذاكرة وعدد‬
‫المعجالت واختيار الطبقات وإجمالي حجم مجموعة البيانات‪ .‬على الرغم من كل ذلك‪ ،‬فإن‬
‫الرقم بين ‪ 32‬و‪ ،256‬ويفضل أن يكون مضاعفًا لقوة كبيرة‪ ،‬يعد بداية جيدة‪ .‬هذا يقودنا إلى‬
‫االنحدار التدريجي العشوائي ذو الدفعات الصغيرة ‪minibatch stochastic gradient‬‬
‫‪.descent‬‬

‫في أبسط أشكالها‪،‬يف كل تكرار 𝑡 ‪ ،‬نقوم أوالً بأخذ عينة عشوائية من الدفعات الصغيرة 𝑡‪ ℬ‬يتكون‬
‫من عدد ثابت |‪ |ℬ‬من أمثلة التدريب‪ .‬نقوم بعد ذلك بحساب مشتق (التدرج او االنحدار‬
‫‪ )gradient‬لمتوسط الخسارة على ‪ minibatch‬فيما يتعلق بمعلمات النموذج‪ .‬أخيرًا‪ ،‬نضرب‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪130‬‬

‫التدرجيف قيمة موجبة صغيرة محددة مسبقًا 𝜂 ‪ ،‬تسمى معدل التعلم ‪ ،learning rate‬ونطرح‬
‫المصطلح الناتج من قيم المعلمة الحالية‪ .‬يمكننا التعبير عن التحديث على النحو التالي‪:‬‬
‫𝜂‬
‫𝑡‪(𝐰, 𝑏) ← (𝐰, 𝑏) − |ℬ| ∑𝑖∈ℬ‬‬ ‫‪𝜕(𝐰,𝑏) 𝑙 (𝑖) (𝐰, 𝑏).‬‬

‫باختصار‪ ،‬يتم تنفيذ ‪ minibatch SGD‬على النحو التالي‪ )1( :‬تهيئة قيم معلمات النموذج‪،‬‬
‫عادةً بشكل عشوائي؛ (‪ )2‬أخذ عينات متكررة من الدفعات الصغيرة العشوائية من البيانات‪،‬‬
‫وتحديث المعلماتيف اتجاه التدرج السالب‪ .‬بالنسبة للخسائر التربيعية والتحوالت المرتبطة‪ ،‬فإن‬
‫هذا له توسع مغلق الشكل‪:‬‬
‫𝜂‬ ‫𝜂‬
‫𝐰‬ ‫‪←𝐰−‬‬ ‫𝑡‪∑𝑖∈ℬ‬‬ ‫)𝑏 ‪𝜕𝐰 𝑙 (𝑖) (𝐰,‬‬ ‫‪=𝐰−‬‬ ‫𝑡‪∑𝑖∈ℬ‬‬ ‫) )𝑖( 𝑦 ‪𝐱 (𝑖) (𝐰 ⊤ 𝐱 (𝑖) + 𝑏 −‬‬
‫|‪|ℬ‬‬ ‫|‪|ℬ‬‬
‫𝜂‬ ‫𝜂‬
‫𝑏‬ ‫‪←𝑏−‬‬ ‫𝑡‪∑𝑖∈ℬ‬‬ ‫)𝑏 ‪𝜕𝑏 𝑙 (𝑖) (𝐰,‬‬ ‫‪=𝑏−‬‬ ‫‪∑𝑖∈ℬ (𝐰 ⊤ 𝐱 (𝑖) + 𝑏 − 𝑦 (𝑖) ) .‬‬
‫|‪|ℬ‬‬ ‫|‪|ℬ‬‬ ‫𝑡‬

‫نظرًا ألننا نختار دفعات صغيرة ‪ ،ℬ‬فنحن بحاجة إلى التسوية ‪ normalize‬من خالل حجمه |‪.|ℬ‬‬
‫في كثير من األحيان يتم تحديد حجم الدفعات الصغيرة ومعدل التعلم من قبل المستخدم‪ .‬تسمى‬
‫هذه المعلمات القابلة للضبط التي لم يتم تحديثهايف حلقة التدريب بالمعلمات الفائقة‬
‫‪ .hyperparameters‬يمكن ضبطها تلقائيًا من خالل عدد من التقنيات‪ ،‬مثل تحسين بايزي‬
‫‪)2018 ،Frazier( Bayesian optimization‬يف النهاية‪ ،‬يتم تقييم جودة الحل عادةً على‬
‫مجموعة بيانات تحقق منفصلة ‪( separate validation dataset‬أو مجموعة التحقق من‬
‫الصحة ‪.)validation set‬‬

‫بعد التدريب على عدد محدد مسبقًا من التكرارات ‪( iterations‬أو حتى يتم استيفاء معيار إيقاف‬
‫^ ^‬
‫آخر)‪ ،‬نسجل معلمات النموذج المقدرة‪ ،‬المشار إليها 𝑏 ‪ .𝐰,‬الحظ أنه حتى لو كانت دالتنا خطية‬
‫حقًا وبدون ضوضاء‪ ،‬فلن تكون هذه المعلمات هي الحد األدنى الدقيق للخسارة‪ ،‬أو حتى حتمية‪.‬‬
‫على الرغم من أن الخوارزمية تتقارب ببطء نحو المصغرات ‪ ،minimizers‬إال أنها ال تستطيع‬
‫تحقيقها بالضبطيف عدد محدود من الخطوات‪ .‬عالوة على ذلك‪ ،‬يتم اختيار الدفعات الصغيرة‬
‫‪ ℬ‬المستخدمة لتحديث المعلمات عشوائيًا‪ .‬هذا يكسر الحتمية ‪.determinism‬‬

‫يحدث االنحدار الخطي ليكون مشكلة تعليمية بحد أدنى عالمي (كلما كانت 𝐗 ذات رتبة كاملة‪،‬‬
‫أو ما يعادلها‪ ،‬كلما كان 𝐗 ⊤ 𝐗 قابالً للعكس)‪ .‬ومع ذلك‪ ،‬فإن األسطح الخاسرة للشبكات العميقة‬
‫تحتوي على العديد من نقاط السرج ‪ saddle points‬والحد األدنى ‪ .minima‬لحسن الحظ‪ ،‬ال‬
‫نهتم عادةً بإيجاد مجموعة محددة من المعلمات ولكن فقط أي مجموعة من المعلمات تؤدي‬
‫إلى تنبؤات دقيقة (وبالتالي خطأ منخفض)‪ .‬من الناحية العملية‪ ،‬نادرًا ما يكافح ممارسو التعلم‬
‫العميق للعثور على معايير تقلل من الخطأيف مجموعات التدريب (‪،Frankle and Carbin‬‬
‫‪131‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪ .)2018 ،Izmailov et al. ،2018‬المهمة األكثر صعوبة هي العثور على المعلمات التي تؤدي‬
‫إلى تنبؤات دقيقة حول البيانات غير المرئية من قبل ‪ ،unseen data‬وهو تحد يسمى التعميم‬
‫‪ .generalization‬نعود إلى هذه المواضيعيف جميع أنحاء الكتاب‪.‬‬

‫‪Predictions‬‬ ‫‪3.1.1.5‬‬
‫^‬ ‫^‬
‫بالنظر إلى النموذج 𝑏 ‪ ،𝐰 ⊤ 𝐱 +‬يمكننا اآلن عمل تنبؤات لمثال جديد‪ ،‬على سبيل المثال‪ ،‬للتنبؤ‬
‫بسعر بيع منزل لم يسبق رؤيتهيف ضوء مساحته وعمره‪ .‬اعتاد ممارسو التعلم العميق على استدعاء‬
‫استدالل ‪ inference‬مرحلة التنبؤ ولكن هذا نوع من التسمية الخاطئة ‪ - misnomer‬يشير‬
‫االستدالل على نطاق واسع إلى أي استنتاج تم التوصل إليه على أساس األدلة‪ ،‬بمايف ذلك قيم‬
‫المعلمات والتسمية المحتملة لمثيل غير مرئي‪ .‬إذا كان هناك أي شيء‪،‬يف كثير من األحيان يشير‬
‫االستدالليف األدبيات اإلحصائية إلى استدالل المعلمات وهذا التحميل الزائد للمصطلحات‬
‫يخلق ارتباكًا غير ضروري عندما يتحدث ممارسو التعلم العميق إلى اإلحصائيين‪ .‬فيما يلي سوف‬
‫نتمسك بالتنبؤ كلما أمكن ذلك‪.‬‬

‫‪Vectorization for Speed‬‬ ‫‪3.1.2‬‬


‫عند تدريب نماذجنا‪ ،‬نريد عادةً معالجة مجموعات صغيرة كاملة من األمثلةيف وقت واحد‪ .‬يتطلب‬
‫القيام بذلك بكفاءة أن نقوم بتوجيه ‪ vectorize‬الحسابات واالستفادة من مكتبات الجبر الخطية‬
‫السريعة بدالً من كتابة الحلقات المكلفةيف بايثون‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import math‬‬
‫‪import time‬‬
‫‪import numpy as np‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫لتوضيح سبب أهمية هذا كثيرًا‪ ،‬يمكننا التفكيريف طريقتين إلضافة المتجهات‪ .‬للبدء‪ ،‬نقوم بإنشاء‬
‫مثيل لمتجهين كل منهما ‪ 10,000‬بعد يحتويان على جميع المتجهات‪.‬يف إحدى الطرق‪ ،‬نقوم‬
‫بعمل حلقة فوق المتجهات باستخدام ‪.Python for-loop‬يف الطريقة األخرى‪ ،‬نعتمد على‬
‫استدعاء واحد لـ ‪.+‬‬

‫‪n = 10000‬‬
‫)‪a = tf.ones(n‬‬
‫)‪b = tf.ones(n‬‬
‫اآلن يمكننا قياس أعباء العمل‪ .‬أوالً‪ ،‬نضيفهم‪ ،‬إحداثي واحديف كل مرة‪ ،‬باستخدام حلقة ‪for-‬‬
‫‪.loop‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪132‬‬

‫))‪c = tf.Variable(tf.zeros(n‬‬
‫)(‪t = time.time‬‬
‫‪for i in range(n):‬‬
‫)]‪c[i].assign(a[i] + b[i‬‬
‫'‪f'{time.time() - t:.5f} sec‬‬
‫'‪'9.45401 sec‬‬
‫بدالً من ذلك‪ ،‬نعتمد على العامل ‪ +‬المعاد تحميله لحساب مجموع العناصر‪.‬‬

‫)(‪t = time.time‬‬
‫‪d = a + b‬‬
‫'‪f'{time.time() - t:.5f} sec‬‬
‫'‪'0.00031 sec‬‬
‫الطريقة الثانية أسرع بشكل كبير من الطريقة األولى‪ .‬غالبًا ما ينتج عن التعليمات البرمجية‬
‫الموجهية ‪ Vectorizing code‬تسريع من حيث الحجم‪ .‬عالوة على ذلك‪ ،‬نقوم بدفع المزيد‬
‫من الرياضيات إلى المكتبة دون الحاجة إلى كتابة أكبر عدد من العمليات الحسابية بأنفسنا‪ ،‬مما‬
‫يقلل من احتمالية حدوث أخطاء ويزيد من إمكانية نقل الشفرة‪.‬‬

‫‪The Normal Distribution and‬‬ ‫‪3.1.3‬‬


‫‪Squared Loss‬‬
‫لقد قدمنا حتى اآلن حافزًا وظيفيًا إلى حد ما لهدف الخطأ التربيعية‪ :‬تعيد المعلمات المثلى التوقع‬
‫الشرطي ]𝑋 ∣ 𝑌[𝐸 عندما يكون النمط األساسي خطيًا حقًا‪ ،‬وتعين الخطأ عقوبات كبيرة للقيم‬
‫المتطرفة ‪ .outliers‬يمكننا أيضًا توفير دافع رسمي أكثر لهدف الخطأ التربيعية من خالل وضع‬
‫افتراضات احتمالية حول توزيع الضوضاء‪.‬‬

‫تم اختراع االنحدار الخطييف مطلع القرن التاسع عشر‪ .‬على الرغم من أنه قد نوقش منذ فترة‬
‫طويلة ما إذا كان ‪ Gauss‬أو ‪ Legendre‬قد فكريف الفكرة ألول مرة‪ ،‬إال أن ‪ Gauss‬هو الذي‬
‫اكتشف أيضًا التوزيع الطبيعي ‪( normal distribution‬يسمى أيضًا ‪ .)Gaussian‬اتضح أن‬
‫التوزيع الطبيعي واالنحدار الخطي مع الخطأ التربيعي يشتركانيف اتصال أعمق من النسب الشائعة‪.‬‬

‫للبدء‪ ،‬تذكر أنه يتم إعطاء التوزيع الطبيعي بمتوسط 𝜇 وتباين ‪( 𝜎 2‬االنحراف المعياري 𝜎)‬

‫‪1‬‬ ‫‪1‬‬
‫= )𝑥(𝑝‬ ‫‪exp (−‬‬ ‫‪(𝑥 − 𝜇)2 ).‬‬
‫‪√2𝜋𝜎 2‬‬ ‫‪2𝜎 2‬‬

‫نحدد أدناه دالة لحساب التوزيع الطبيعي‪.‬‬

‫‪def normal(x, mu, sigma):‬‬


‫)‪p = 1 / math.sqrt(2 * math.pi * sigma**2‬‬
‫)‪return p * np.exp(-0.5 * (x - mu)**2 / sigma**2‬‬
‫‪133‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫يمكننا اآلن رسم التوزيعات الطبيعية‪.‬‬

‫‪# Use numpy again for visualization‬‬


‫)‪x = np.arange(-7, 7, 0.01‬‬

‫‪# Mean and standard deviation pairs‬‬


‫])‪params = [(0, 1), (0, 2), (3, 1‬‬
‫‪d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in‬‬
‫‪params], xlabel='x',‬‬
‫‪ylabel='p(x)', figsize=(4.5, 2.5),‬‬
‫‪legend=[f'mean {mu}, std {sigma}' for mu, sigma‬‬
‫)]‪in params‬‬

‫الحظ أن تغيير المتوسط يتوافق مع التحول على طول المحور 𝑥 ‪ ،‬وزيادة التباين يؤدي إلى انتشار‬
‫التوزيع‪ ،‬مما يقلل من ذروته‪.‬‬

‫تتمثل إحدى طرق تحفيز االنحدار الخطي بخطأ مربعيف افتراض أن المالحظات تنشأ من‬
‫القياسات الصاخبة‪ ،‬حيث يتم توزيع الضوضاء عادةً على النحو التالي‪:‬‬

‫‪𝑦 = 𝐰 ⊤ 𝐱 + 𝑏 + 𝜖 where 𝜖 ∼ 𝒩(0, 𝜎 2 ).‬‬

‫وبالتالي‪ ،‬يمكننا اآلن كتابة احتمالية ‪ likelihood‬رؤية 𝑦 معين لـ 𝐱 عبر‬


‫‪1‬‬ ‫‪1‬‬
‫= )𝐱 ∣ 𝑦(𝑃‬ ‫‪exp (− 2𝜎2 (𝑦 − 𝐰 ⊤ 𝐱 − 𝑏)2 ).‬‬
‫‪√2𝜋𝜎 2‬‬

‫على هذا النحو‪ ،‬فإن االحتمالية عوامل ‪ .likelihood factorizes‬وفقًا لمبدأ الحد األقصى من‬
‫االحتمالية ‪ ،principle of maximum likelihood‬فإن أفضل قيم المعلمات 𝐰 و 𝑏 هي‬
‫تلك التي تزيد من احتمالية مجموعة البيانات بأكملها‪:‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪134‬‬

‫‪𝑃(𝐲 ∣ 𝐗) = ∏𝑛𝑖=1‬‬ ‫‪𝑝(𝑦 (𝑖) ∣ 𝐱 (𝑖) ).‬‬

‫تتبع المساواة ‪ equality‬منذ أن تم رسم جميع األزواج ) )𝑖( 𝑦 ‪ (𝐱 (𝑖) ,‬بشكل مستقل عن بعضها‬
‫البعض‪ .‬تسمى التقديرات المختارة وفقًا لمبدأ االحتمالية القصوى بمقدرات االحتمالية القصوى‬
‫‪.maximum likelihood estimators‬يف حين أن تكبير ناتج العديد من الدوال األسية قد يبدو‬
‫صعبًا‪ ،‬يمكننا تبسيط األشياء بشكل كبير‪ ،‬دون تغيير الهدف‪ ،‬من خالل تعظيم لوغاريتم االحتمال‬
‫بدالً من ذلك‪ .‬ألسباب تاريخية‪ ،‬غالبًا ما يتم التعبير عن التحسينات على أنها تصغير‬
‫‪ minimization‬بدالً من تكبير ‪ .maximization‬لذلك‪ ،‬بدون تغيير أي شيء‪ ،‬يمكننا تقليل‬
‫احتمالية السجل السلبية ‪ ،negative log-likelihood‬والتي يمكننا التعبير عنها على النحو‬
‫التالي‪:‬‬
‫‪1‬‬ ‫‪1‬‬
‫‪−log 𝑃(𝐲 ∣ 𝐗) = ∑𝑛𝑖=1‬‬ ‫)𝑖( 𝑦( ‪log (2𝜋𝜎 2 ) + 2‬‬ ‫‪− 𝐰 ⊤ 𝐱 (𝑖) − 𝑏)2 .‬‬
‫‪2‬‬ ‫𝜎‪2‬‬

‫إذا افترضنا أن 𝜎 تم إصالحه‪ ،‬فيمكننا تجاهل المصطلح األول‪ ،‬ألنه ال يعتمد على 𝐰 أو 𝑏‪.‬‬
‫‪1‬‬
‫المصطلح الثاني مطابق لخطأ الخطأ التربيعي التي تم تقديمها سابقًا‪ ،‬باستثناء ثابت الضرب ‪.𝜎2‬‬
‫لحسن الحظ‪ ،‬الحل ال يعتمد على أي منهما‪ .‬ويترتب على ذلك أن التقليل من متوسط الخطأ‬
‫التربيعي يعادل الحد األقصى لتقدير االحتمالية لنموذج خطييف ظل افتراض الضوضاء الغاوسية‬
‫المضافة‪.‬‬

‫‪Linear Regression as a Neural‬‬ ‫‪3.1.4‬‬


‫‪Network‬‬
‫في حين أن النماذج الخطية ليست غنية بما يكفي للتعبير عن العديد من الشبكات العصبية‬
‫المعقدة التي سنقدمهايف هذا الكتاب‪ ،‬فإن الشبكات العصبية ‪ neural networks‬غنية بما يكفي‬
‫لتضمين النماذج الخطية كشبكات عصبية يتم فيها تمثيل كل ميزة بواسطة خلية عصبية‪ ،‬وكلها‬
‫متصلة مباشرة إلى اإلخراج‪.‬‬

‫الشكل ‪ 3.1.2‬يصور االنحدار الخطي كشبكة عصبية‪ .‬يبرز الرسم التخطيطي نمط االتصال مثل‬
‫كيفية توصيل كل مدخل بالمخرجات‪ ،‬ولكن ليس القيم المحددة المأخوذة بواسطة األوزان أو‬
‫التحيزات‪.‬‬
‫‪135‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫الشكل ‪ 3.1.2‬االنحدار الخطي هو شبكة عصبية أحادية الطبقة‪.‬‬

‫المدخالت 𝑑𝑥 ‪ .𝑥1 , … ,‬نشير إلى عدد المدخالت ‪ number of inputs‬أو أبعاد الميزة‬
‫‪feature dimensionality‬يف طبقة اإلدخال‪ .‬ناتج الشبكة هو ‪ .𝑜1‬نظرًا ألننا نحاول فقط التنبؤ‬
‫بقيمة عددية واحدة‪ ،‬فلدينا فقط خلية عصبية ناتجة واحدة‪ .‬الحظ أن جميع قيم اإلدخال معطاة‪.‬‬
‫هناك فقط خلية عصبية واحدة محسوبة‪ .‬باختصار‪ ،‬يمكننا التفكيريف االنحدار الخطي كشبكة‬
‫عصبية أحادية الطبقة متصلة بالكامل ‪.single-layer fully connected neural network‬‬
‫سنواجه شبكات ذات طبقات أكثر بكثيريف الفصول المستقبلية‪.‬‬

‫‪Biology‬‬ ‫‪3.1.4.1‬‬
‫نظرًا ألن االنحدار الخطي يسبق علم األعصاب الحسابي ‪،computational neuroscience‬‬
‫فقد يبدو وصف االنحدار الخطي من حيث الشبكات العصبية مفارقة تاريخية‪ .‬ومع ذلك‪ ،‬فقد‬
‫كانت مكانًا طبيعيًا للبدء عندما بدأ علماء علم اإلنترنت وعلماء الفسيولوجيا العصبية وارين‬
‫ماكولوتش ووالتر بيتسيف تطوير نماذج من الخاليا العصبية االصطناعية‪ .‬ضعيف اعتبارك الصورة‬
‫الكرتونية للخاليا العصبية البيولوجيةيف الشكل ‪ ،3.1.3‬والتي تتكون من التشعبات ‪dendrites‬‬
‫(أطراف اإلدخال)‪ ،‬والنواة ‪( nucleus‬وحدة المعالجة المركزية ‪ ،)CPU‬والمحور العصبي‬
‫‪( axon‬سلك اإلخراج)‪ ،‬والمحطات الطرفية ‪( axon terminals‬أطراف اإلخراج)‪ ،‬مما يتيح‬
‫التوصيالت بالخاليا العصبية األخرى عبر المشابك ‪.synapses‬‬

‫الشكل ‪ 3.1.3‬الخلية العبية (العصبون) الحقيقي‪.‬‬


‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪136‬‬

‫يتم تلقي المعلومات 𝑖𝑥 الواردة من الخاليا العصبية األخرى (أو أجهزة االستشعار البيئية‬
‫‪)environmental sensors‬يف التشعبات ‪ .dendrites‬على وجه الخصوص‪ ،‬يتم اخذ اوزان‬
‫‪ weighted‬هذه المعلومات من خالل األوزان المشبكية 𝑖𝑤 (‪ ،)synaptic weights‬وتحديد‬
‫تأثير المدخالت‪ ،‬على سبيل المثال‪ ،‬التنشيط أو التثبيط عبر المنتج 𝑖𝑤 𝑖𝑥‪ .‬يتم تجميع المدخالت‬
‫𝑖∑ = 𝑦 ‪ ،‬وربما‬ ‫الموزونة الواردة من مصادر متعددةيف النواة كمجموع اوزان 𝑏 ‪𝑥𝑖 𝑤𝑖 +‬‬
‫تخضع لبعض عمليات المعالجة الالحقة غير الخطية عبر )𝑦(𝜎‪ .‬ثم يتم إرسال هذه المعلومات‬
‫عبر المحور العصبي ‪ axon‬إلى المحاور الطرفية ‪ ،axon terminals‬حيث تصل إلى وجهتها‬
‫(على سبيل المثال‪ ،‬المشغل ‪ actuator‬مثل العضالت ‪ )muscle‬أو يتم تغذيتهايف خلية عصبية‬
‫أخرى عبر التشعبات ‪.dendrites‬‬

‫من المؤكد أن الفكرة رفيعة المستوى القائلة بإمكانية دمج العديد من هذه الوحدات مع االتصال‬
‫الصحيح وخوارزمية التعلم الصحيحة‪ ،‬إلنتاج سلوك أكثر تعقيدًا وإثارة لالهتمام من أي خلية‬
‫عصبية واحدة وحدها يمكن أن تدين بدراستنا لألنظمة العصبية البيولوجية الحقيقية‪.‬يف الوقت‬
‫نفسه‪ ،‬تستمد معظم األبحاثيف التعلم العميق اليوم اإللهام من مصدر أوسع بكثير‪ .‬نستدعي‬
‫ستيوارت راسل وبيتر نورفيج (راسل ونورفيج‪ )2016 ،‬اللذين أشاروا إلى أنه على الرغم من أن‬
‫الطائرات ربما كانت مستوحاة من الطيور‪ ،‬إال أن علم الطيور لم يكن المحرك األساسي البتكار‬
‫الطيران لعدة قرون‪ .‬وبالمثل‪ ،‬يأتي اإللهاميف التعلم العميق هذه األيام على قدم المساواة أو أكبر‬
‫من الرياضيات واللغويات وعلم النفس واإلحصاء وعلوم الكمبيوتر والعديد من المجاالت‬
‫األخرى‪.‬‬

‫‪3.1.5‬‬
‫في هذا القسم‪ ،‬قدمنا االنحدار الخطي التقليدي‪ ،‬حيث يتم اختيار معلمات الدالة الخطية لتقليل‬
‫الخسارة التربيعيةيف مجموعة التدريب‪ .‬لقد حفزنا أيضًا اختيار الهدف هذا من خالل بعض‬
‫االعتبارات العملية ومن خالل تفسير االنحدار الخطي باعتباره تقديرًا أقصى الحتماليةيف ظل‬
‫افتراض الخطية والضوضاء الغاوسية‪ .‬بعد مناقشة كل من االعتبارات الحسابية واالرتباطات‬
‫باإلحصاءات‪ ،‬أظهرنا كيف يمكن التعبير عن هذه النماذج الخطية كشبكات عصبية بسيطة حيث‬
‫يتم توصيل المدخالت مباشرة بالمخرجات (المخرجات)‪ .‬على الرغم من أننا سننتقل قريبًا إلى‬
‫النماذج الخطية السابقة تمامًا‪ ،‬إال أنها كافية لتقديم معظم المكونات التي تتطلبها جميع نماذجنا‪:‬‬
‫النماذج البارامترية ‪ ،parametric forms‬واألهداف القابلة للتفاضل ‪differentiable‬‬
‫‪ ، objectives‬والتحسين عبر التدرج االشتقاقي العشوائي المصغر ‪ ،‬وفي النهاية ‪ ،‬التقييم على‬
‫البيانات غير المرئية سابقًا‪.‬‬
‫‪137‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪3.1.6‬‬
‫‪ .1‬افترض أن لدينا بعض البيانات ‪ .𝑥1 , … , 𝑥𝑛 ∈ ℝ‬هدفنا هو إيجاد ثابت 𝑏 يتم تصغير‬
‫‪ ∑𝑖(𝑥𝑖 − 𝑏)2‬إلى أدنى حد‪.‬‬
‫‪ .1‬ابحث عن حل تحليلي للقيمة المثلى لـ 𝑏‪.‬‬
‫‪ .2‬كيف ترتبط هذه المشكلة وحلها بالتوزيع الطبيعي؟‬
‫𝑖∑ إلى |𝑏 ‪∑𝑖 | 𝑥𝑖 −‬؟ هل يمكنك‬ ‫‪ .3‬ماذا لو غيرنا الخسارة من ‪(𝑥𝑖 − 𝑏)2‬‬
‫العثور على الحل األمثل لـ 𝑏؟‬
‫‪ .2‬إثبت أن الدوال األفينية التي يمكن التعبير عنها بواسطة 𝑏 ‪ 𝐱 𝐰 +‬تعادل الدوال‬
‫⊤‬

‫الخطيةيف )‪.(𝐱, 1‬‬


‫𝑖∑ ‪𝑓(𝐱) = 𝑏 +‬‬ ‫‪ .3‬افترض أنك تريد إيجاد دوال تربيعية لـ 𝐱‪ ،‬أي ‪𝑤𝑖 𝑥𝑖 +‬‬
‫𝑖≤𝑗∑‪ .،‬كيف يمكنك صياغة هذايف شبكة عميقة؟‬ ‫𝑗𝑥 𝑖𝑥 𝑗𝑖𝑤‬
‫‪ .4‬تذكر أن أحد شروط حل مشكلة االنحدار الخطي هو أن مصفوفة التصميم 𝐗 𝐗 لها‬
‫⊤‬

‫رتبة كاملة ‪.full rank‬‬


‫‪ .1‬ماذا يحدث إذا لم يكن األمر كذلك؟‬
‫‪ .2‬كيف يمكنك اصالحها؟ ماذا يحدث إذا أضفت قدرًا صغيرًا من الضوضاء‬
‫الغاوسية المستقلة ذات التنسيق اإلحداثي إلى جميع إدخاالت 𝐗؟‬
‫‪ .3‬ما هي القيمة المتوقعة لمصفوفة التصميم 𝐗 ⊤ 𝐗يف هذه الحالة؟‬
‫‪ .4‬ماذا يحدث مع التدرج االشتقاقي العشوائي ‪ SGD‬عندما ال يكون له رتبة كاملة؟‬
‫‪ .5‬افترض أن نموذج الضوضاء الذي يحكم الضوضاء المضافة 𝜖 هو التوزيع األسي‪ .‬هذا‬
‫‪1‬‬
‫هو‪𝑝(𝜖) = 2 exp (−|𝜖|) ،‬‬
‫‪ .1‬اكتب االحتمالية السلبية لسجل البيانات تحت النموذج (‪negative log-‬‬
‫‪.−log 𝑃(𝐲 ∣ 𝐗) )likelihood‬‬
‫‪ .2‬هل يمكنك إيجاد حل الشكل المغلق؟‬
‫‪ .3‬اقترح خوارزمية التدرج االشتقاقي العشوائي مع الدفعات الصغيرة لحل هذه‬
‫المشكلة‪ .‬ما الذي يمكن أن يحدث بشكل خاطئ (تلميح‪ :‬ماذا يحدث بالقرب‬
‫من النقطة الثابتة بينما نستمريف تحديث المعلمات)؟ أيمكنك إصالح هذا؟‬
‫‪ .6‬افترض أننا نريد تصميم شبكة عصبية ذات طبقتين من خالل تكوين طبقتين خطيتين‪.‬‬
‫أي أن إخراج الطبقة األولى يصبح مدخالت الطبقة الثانية‪ .‬لماذا مثل هذا التكوين‬
‫الساذج ال يعمل؟‬
‫‪ .7‬ماذا يحدث إذا كنت تريد استخدام االنحدار لتقدير واقعي ألسعار المنازل أو أسعار‬
‫األسهم؟‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪138‬‬

‫‪ .1‬أظهر أن افتراض الضوضاء الغاوسية المضافة غير مناسب‪ .‬تلميح‪ :‬هل يمكننا‬
‫الحصول على أسعار سلبية؟ ماذا عن التقلبات ‪fluctuations‬؟‬
‫‪ .2‬لماذا يكون االنحدار إلى لوغاريتم السعر أفضل بكثير‪ ،‬أي ‪𝑦 = log price‬؟‬
‫‪ .3‬ما الذي يجب أن تقلق بشأنه عند التعامل مع ‪ ،pennystock‬أي األسهم ذات‬
‫األسعار المنخفضة جدًا؟ تلميح‪ :‬هل يمكنك التداول بجميع األسعار الممكنة؟‬
‫لماذا هذه مشكلة أكبر لألسهم الرخيصة؟‬
‫‪ .4‬لمزيد من المعلومات‪ ،‬راجع نموذج ‪ Black-Scholes‬الشهير لتسعير‬
‫الخيارات)‪. (Black and Scholes, 1973‬‬
‫‪ .8‬لنفترض أننا نريد استخدام االنحدار لتقدير عدد التفاح المباعيف محل بقالة‪.‬‬
‫‪ .1‬ما هي المشاكل مع نموذج الضوضاء الغاوسية المضافة؟ تلميح‪ :‬أنت تبيع‬
‫التفاح وليس الزيت‪.‬‬
‫‪ .2‬يلتقط توزيع بواسون ‪ Poisson distribution‬التوزيعات على العد‪ .‬أعطيت‬
‫من قبل !𝑘‪ 𝜆 .𝑝(𝑘 ∣ 𝜆) = 𝜆𝑘 𝑒 −𝜆 /‬هي دالة المعدل و𝑘 هي عدد األحداث‬
‫التي تراها‪ .‬إثبات أن 𝜆 هي القيمة المتوقعة للعد 𝑘‪.‬‬
‫‪ .3‬صمم دالة خطأ مرتبطة بتوزيع بواسون‪.‬‬
‫‪ .4‬صمم دالة خطأ لتقدير 𝜆 ‪ log‬بدالً من ذلك‪.‬‬

‫‪Object-Oriented Design for‬‬ ‫‪3.2‬‬


‫‪Implementation‬‬
‫في مقدمتنا لالنحدار الخطي‪ ،‬مررنا عبر مكونات مختلفة بمايف ذلك البيانات والنموذج ودالة‬
‫الخطأ وخوارزمية التحسين‪.‬يف الواقع‪ ،‬يعد االنحدار الخطي أحد أبسط نماذج التعلم اآللي‪ .‬ومع‬
‫ذلك‪ ،‬فإن التدريب عليه يستخدم العديد من نفس المكونات التي تتطلبها النماذج األخرىيف هذا‬
‫الكتاب‪ .‬لذلك‪ ،‬قبل الغوصيف تفاصيل التنفيذ‪ ،‬من المفيد تصميم بعض واجهات برمجة‬
‫التطبيقات المستخدمةيف هذا الكتاب‪ .‬عند التعامل مع المكوناتيف التعلم العميق على أنها‬
‫كائنات‪ ،‬يمكننا البدء بتحديد فئات لهذه الكائنات وتفاعالتها‪ .‬سيؤدي هذا التصميم الموجه‬
‫للكائنات للتنفيذ إلى تبسيط العرض التقديمي بشكل كبير وقد ترغبيف استخدامهيف مشاريعك‪.‬‬

‫مستوحاة من مكتبات مفتوحة المصدر مثل ‪ ،PyTorch Lightning‬على مستوى عالٍ‪ ،‬نرغب‬
‫في الحصول على ثالث فئات‪ )1( :‬تحتوي الوحدة النمطية على نماذج وخسائر وطرق تحسين؛‬
‫(‪ )2‬توفر ‪ DataModule‬أدوات تحميل بيانات للتدريب والتحقق من الصحة؛ (‪ )3‬يتم الجمع‬
‫بين كال الفئتين باستخدام فئة ‪ ، Trainer‬مما يسمح لنا بتدريب النماذج على مجموعة متنوعة‬
‫من منصات األجهزة‪ .‬تتكيف معظم التعليمات البرمجيةيف هذا الكتاب مع الوحدة النمطية‬
‫‪139‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪Module‬ووحدة البيانات ‪ .DataModule‬سنتطرق إلى فئة المدرب ‪ Trainer‬فقط عندما‬


‫نناقش وحدات معالجة الرسومات ‪ GPU‬ووحدات المعالجة المركزية ‪ CPU‬والتدريب الموازي‬
‫وخوارزميات التحسين‪.‬‬

‫‪import time‬‬
‫‪import numpy as np‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import torch as d2l‬‬
‫‪Utilities‬‬ ‫‪3.2.1‬‬
‫نحتاج إلى بعض األدوات المساعدة ‪ Utilities‬لتبسيط البرمجة الموجهة للكائنات ‪object-‬‬
‫‪oriented programming‬يف نوتبوكس ‪ .Jupyter‬يتمثل أحد التحدياتيف أن تعريفات الفئات‬
‫تميل إلى أن تكون كتل طويلة إلى حد ما من التعليمات البرمجية‪ .‬تتطلب قابلية قراءة النوتبوك‬
‫‪ Notebook‬أجزاء قصيرة من التعليمات البرمجية‪ ،‬تتخللها تفسيرات‪ ،‬وهو مطلب ال يتوافق مع‬
‫أسلوب البرمجة الشائعيف مكتبات بايثون‪ .‬تتيح لنا دالة األداة المساعدة األولى تسجيل الدوال‬
‫كطرقيف الكالس بعد إنشاء الكالس‪.‬يف الواقع‪ ،‬يمكننا القيام بذلك حتى بعد إنشاء نسخ من‬
‫الكالس! يسمح لنا بتقسيم تنفيذ كالس إلى كتل تعليمات برمجية متعددة‪.‬‬

‫‪def add_to_class(Class): #@save‬‬


‫‪def wrapper(obj):‬‬
‫)‪setattr(Class, obj.__name__, obj‬‬
‫‪return wrapper‬‬
‫دعونا نلقي نظرة سريعة على كيفية استخدامه‪ .‬نحن نخطط لتنفيذ كالس ‪ A‬مع طريقة ‪ .do‬بدالً‬
‫من وجود رمز لكل من ‪ A‬والقيام بهيف نفس كتلة التعليمات البرمجية‪ ،‬يمكننا أوالً إعالن الكالس‬
‫‪ A‬وإنشاء مثيل (‪.a )instance‬‬

‫‪class A:‬‬
‫‪def __init__(self):‬‬
‫‪self.b = 1‬‬

‫)(‪a = A‬‬
‫بعد ذلك نحدد الطريقة ‪ do‬كما نفعل عادة ‪ ،‬ولكن ليسيف نطاق الكالس ‪ .A‬بدالً من ذلك ‪،‬‬
‫نقوم بتزيين هذه الطريقة عن طريق ‪ add_to_class‬بالفئة ‪ A‬كوسيطة لها‪ .‬عند القيام بذلك‪،‬‬
‫تكون الطريقة قادرة على الوصول إلى متغيرات األعضاءيف ‪ A‬كما نتوقع إذا تم تعريفها كجزء من‬
‫تعريف ‪ .A‬دعونا نرى ما يحدث عندما نستدعيها للمثيل ‪.a‬‬

‫)‪@add_to_class(A‬‬
‫‪def do(self):‬‬
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 140

print('Class attribute "b" is', self.b)

a.do()
Class attribute "b" is 1
‫__ كسمات‬init__ ‫ التي تحفظ جميع الوسائطيف طريقةكالس‬utility ‫الثاني هو كالس‬
‫ ضمنيًا دون الحاجة إلى‬constructor ‫ هذا يسمح لنا بتوسيع تواقيع استدعاء المُنشئ‬.‫للكالس‬
.‫تعليمات برمجية إضافية‬

class HyperParameters: #@save


def save_hyperparameters(self, ignore=[]):
raise NotImplemented
‫ نحدد صنفنا الذي يرث من‬،‫ الستخدامها‬.20.7 ‫نؤجل تنفيذه إلى القسم‬
.__init__ ‫يف طريقة‬save_hyperparameters ‫ ويستدعي‬HyperParameters

# Call the fully implemented HyperParameters class saved


in d2l
class B(d2l.HyperParameters):
def __init__(self, a, b, c):
self.save_hyperparameters(ignore=['c'])
print('self.a =', self.a, 'self.b =', self.b)
print('There is no self.c =', not hasattr(self,
'c'))

b = B(a=1, b=2, c=3)


self.a = 1 self.b = 2
There is no self.c = True
‫ احترامًا للوحة‬.‫األداة األخيرة تسمح لنا برسم تقدم التجربة بشكل تفاعلي أثناء استمرارها‬
‫ تم تأجيل‬.ProgressBoard ‫ نطلق عليها اسم‬،)‫ األكثر قوة (والمعقدة‬TensorBoard
.‫ دعنا نراهيف العمل‬،‫يف الوقت الحالي‬.20.7 ‫التنفيذ إلى القسم‬

.legend ‫يف وسيلة اإليضاح‬label ‫ مع تحديد‬، ‫( يف الشكل‬x, y) ‫ نقطة‬draw ‫ترسم دالة‬


‫ يتم‬.‫يف الشكل فقط‬1/𝑛 ‫ على تمهيد الخط من خالل إظهار النقاط‬every_n ‫يعمل الخيار‬
.‫حساب متوسط قيمها من نقاط الجوار 𝑛يف الشكل األصلي‬

class ProgressBoard(d2l.HyperParameters): #@save


"""Plot data points in animation."""
def __init__(self, xlabel=None, ylabel=None,
xlim=None,
ylim=None, xscale='linear',
yscale='linear',
‫‪141‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪ls=['-', '--', '-.', ':'],‬‬


‫‪colors=['C0', 'C1', 'C2', 'C3'],‬‬
‫‪fig=None, axes=None, figsize=(3.5,‬‬
‫‪2.5), display=True):‬‬
‫)(‪self.save_hyperparameters‬‬

‫‪def draw(self, x, y, label, every_n=1):‬‬


‫‪raise NotImplemented‬‬
‫في المثال التالي‪ ،‬نرسم الجيب ‪ sin‬وجيب التمام ‪ cos‬بنعومة مختلفة‪ .‬إذا قمت بتشغيل كتلة‬
‫التعليمات البرمجية هذه‪ ،‬فسترى الخطوط تنمويف الرسوم المتحركة‪.‬‬

‫)'‪board = d2l.ProgressBoard('x‬‬
‫‪for x in np.arange(0, 10, 0.1):‬‬
‫)‪board.draw(x, np.sin(x), 'sin', every_n=2‬‬
‫)‪board.draw(x, np.cos(x), 'cos', every_n=10‬‬

‫‪Models‬‬ ‫‪3.2.2‬‬
‫كالس الوحدة النمطية ‪ Module‬هي الكالس األساسي لجميع النماذج التي سننفذها‪ .‬كحد‬
‫أدنى نحتاج إلى تحديد ثالث طرق‪ .‬تقوم طريقة __‪ __init‬بتخزين المعلمات القابلة للتعلم‪،‬‬
‫وتقبل طريقة ‪ training_step‬مجموعة بيانات إلرجاع قيمة الخطأ‪ ،‬وتعيد طريقة‬
‫‪ configure_optimizers‬طريقة التحسين‪ ،‬أو قائمة بها‪ ،‬تُستخدم لتحديث المعلمات‬
‫القابلة للتعلم‪ .‬اختياريا يمكننا تحديد ‪ validation_step‬لإلبالغ عن تدابير التقييم‪.‬يف ‬
‫بعض األحيان نضع الكود لحساب اإلخراجيف طريقة ‪ forward‬منفصلة لجعله أكثر قابلية‬
‫إلعادة االستخدام‪.‬‬

‫‪class Module(tf.keras.Model, d2l.HyperParameters):‬‬


‫‪#@save‬‬
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 142

def __init__(self, plot_train_per_epoch=2,


plot_valid_per_epoch=1):
super().__init__()
self.save_hyperparameters()
self.board = ProgressBoard()
self.training = None

def loss(self, y_hat, y):


raise NotImplementedError

def forward(self, X):


assert hasattr(self, 'net'), 'Neural network is
defined'
return self.net(X)

def call(self, X, *args, **kwargs):


if kwargs and "training" in kwargs:
self.training = kwargs['training']
return self.forward(X, *args)

def plot(self, key, value, train):


"""Plot a point in animation."""
assert hasattr(self, 'trainer'), 'Trainer is not
inited'
self.board.xlabel = 'epoch'
if train:
x = self.trainer.train_batch_idx / \
self.trainer.num_train_batches
n = self.trainer.num_train_batches / \
self.plot_train_per_epoch
else:
x = self.trainer.epoch + 1
n = self.trainer.num_val_batches / \
self.plot_valid_per_epoch
self.board.draw(x, value.numpy(), (
'train_' if train else 'val_') + key,
every_n=int(n))
def training_step(self, batch):
l = self.loss(self(*batch[:-1]), batch[-1])
self.plot('loss', l, train=True)
return l
‫‪143‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪def validation_step(self, batch):‬‬


‫)]‪l = self.loss(self(*batch[:-1]), batch[-1‬‬
‫)‪self.plot('loss', l, train=False‬‬

‫‪def configure_optimizers(self):‬‬
‫‪raise NotImplementedError‬‬
‫قد تالحظ أن ‪Module‬هي فئة فرعية من ‪ ، tf.keras.Model‬وهي الفئة األساسية‬
‫للشبكات العصبيةيف ‪ .TensorFlow‬يوفر ميزات مالئمة للتعامل مع الشبكات العصبية‪ .‬على‬
‫سبيل المثال‪ ،‬تستدعي طريقة ‪call‬يف طريقة __‪ __call‬المضمنة‪ .‬هنا نعيد توجيه ‪call‬‬
‫إلى دالة ‪ ، forward‬وحفظ وسائطها كسمة فئة‪ .‬نقوم بذلك لجعل الكود الخاص بنا أكثر‬
‫تشابهًا مع تطبيقات إطار العمل األخرى‪.‬‬

‫‪Data‬‬ ‫‪3.2.3‬‬
‫فئة ‪ DataModule‬هي الفئة األساسية للبيانات‪.‬يف كثير من األحيان يتم استخدام طريقة‬
‫__‪ __init‬إلعداد البيانات‪ .‬يتضمن ذلك التنزيل والمعالجة المسبقة إذا لزم األمر‪ .‬يُرجع‬
‫‪ train_dataloader‬أداة تحميل البيانات لمجموعة بيانات التدريب‪ .‬أداة تحميل البيانات‬
‫هي منشئ ‪( generator‬بايثون) ينتج دفعة بياناتيف كل مرة يتم استخدامها‪ .‬يتم بعد ذلك إدخال‬
‫هذه الدُفعةيف طريقة ‪ training_step‬للوحدة النمطية ‪Module‬لحساب الخطأ‪ .‬يوجد‬
‫‪ val_dataloader‬اختياري إلرجاع أداة تحميل مجموعة بيانات التحقق‪ .‬يتصرف بنفس‬
‫الطريقة‪ ،‬باستثناء أنه ينتج دفعات بيانات ألسلوب ‪validation_step‬يف ‪.Module‬‬

‫‪class DataModule(d2l.HyperParameters): #@save‬‬


‫‪def __init__(self, root='../data'):‬‬
‫)(‪self.save_hyperparameters‬‬

‫‪def get_dataloader(self, train):‬‬


‫‪raise NotImplementedError‬‬

‫‪def train_dataloader(self):‬‬
‫)‪return self.get_dataloader(train=True‬‬

‫‪def val_dataloader(self):‬‬
‫)‪return self.get_dataloader(train=False‬‬
‫‪Training‬‬ ‫‪3.2.4‬‬
‫يقوم فئة ‪ Trainer‬بتدريب المعلمات القابلة للتعلميف فئة ‪ Module‬مع البيانات المحددةيف ‬
‫‪ .DataModule‬الطريقة الرئيسية ‪ ، fit‬والتي تقبل وسيطتين‪ ، model :‬مثيل للوحدة النمطية‬
‫‪ ، Module‬والبيانات ‪ ، data‬مثيل ‪ .DataModule‬ثم يتكرر على مدار مجموعة البيانات‬
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 144

‫ سوف نؤجل تنفيذ هذه الدالة إلى‬،‫ كمايف السابق‬.‫ عدد مرات لتدريب النموذج‬max_epochs
.‫فصول الحقة‬

class Trainer(d2l.HyperParameters): #@save


def __init__(self, max_epochs, num_gpus=0,
gradient_clip_val=0):
self.save_hyperparameters()
assert num_gpus == 0, 'No GPU support yet'

def prepare_data(self, data):


self.train_dataloader = data.train_dataloader()
self.val_dataloader = data.val_dataloader()
self.num_train_batches =
len(self.train_dataloader)
self.num_val_batches = (len(self.val_dataloader)
if self.val_dataloader
is not None else 0)

def prepare_model(self, model):


model.trainer = self
model.board.xlim = [0, self.max_epochs]
self.model = model

def fit(self, model, data):


self.prepare_data(data)
self.prepare_model(model)
self.optim = model.configure_optimizers()
self.epoch = 0
self.train_batch_idx = 0
self.val_batch_idx = 0
for self.epoch in range(self.max_epochs):
self.fit_epoch()

def fit_epoch(self):
raise NotImplementedError
3.2.5
‫ توضح الفئات‬،‫لتسليط الضوء على التصميم الموجه للكائنات لتنفيذ التعلم العميقيف المستقبل‬
‫ سنستمريف إثراء‬.‫المذكورة أعاله فقط كيف تخزن كائناتها البيانات وتتفاعل مع بعضها البعض‬
‫ يتم حفظ‬،‫ عالوة على ذلك‬.‫يف بقية الكتاب‬،@add_to_class ‫ مثل‬،‫تطبيقات هذه الفئات‬
‫ وهي مجموعة أدوات خفيفة الوزن‬،)d2l library(d2l ‫هذه الفئات المنفذة بالكامليف مكتبة‬
‫‪145‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫تجعل النمذجة المنظمة للتعلم العميق أمرًا سهالً‪ .‬على وجه الخصوص‪ ،‬فإنه يسهل إعادة استخدام‬
‫العديد من المكونات بين المشاريع دون تغيير الكثير على اإلطالق‪ .‬على سبيل المثال‪ ،‬يمكننا‬
‫استبدال المُحسِّن ‪ optimizer‬فقط‪ ،‬والنموذج ‪ model‬فقط‪ ،‬ومجموعة البيانات ‪ dataset‬فقط‪،‬‬
‫وما إلى ذلك؛ هذه الدرجة من النمطية ‪ modularity‬تؤتي ثمارهايف جميع أنحاء الكتاب من‬
‫حيث اإليجاز والبساطة (وهذا هو سبب إضافتها) ويمكنها أن تفعل الشيء نفسه لمشاريعك‬
‫الخاصة‪.‬‬

‫‪3.2.6‬‬

‫‪ .1‬حدد موقع عمليات التنفيذ الكاملة للفئات المذكورة أعاله المحفوظةيف مكتبة ‪.d2l‬‬
‫نوصي بشدة أن تنظر إلى التنفيذ بالتفصيل بمجرد أن تكتسب مزيدًا من اإللمام بنمذجة‬
‫التعلم العميق‪.‬‬
‫‪ .2‬قم بإزالة عبارة ‪save_hyperparameters‬يف الفئة ‪ .B‬هل ال يزال بإمكانك‬
‫طباعة ‪ self.a‬و ‪ self.b‬؟ اختياري‪ :‬إذا كنت قد تعمقتيف التنفيذ الكامل لفئة‬
‫‪ ، HyperParameters‬فهل يمكنك توضيح السبب؟‬

‫‪Synthetic Regression Data‬‬ ‫‪3.3‬‬


‫يدور التعلم اآللي حول استخراج المعلومات من البيانات‪ .‬لذلك قد تتساءل‪ ،‬ما الذي يمكن أن‬
‫نتعلمه من البيانات التركيبية ‪synthetic data‬؟ على الرغم من أننا قد ال نهتم بشكل جوهري‬
‫باألنماط التي قمنا بتخزينهايف نموذج إنشاء البيانات االصطناعية‪ ،‬إال أن مجموعات البيانات هذه‬
‫مفيدة لألغراض التعليمية‪ ،‬مما يساعدنا على تقييم خصائص خوارزميات التعلم الخاصة بنا‬
‫والتأكد من أن تطبيقاتنا تعمل كما هو متوقع‪ .‬على سبيل المثال‪ ،‬إذا أنشأنا بيانات تُعرف المعلمات‬
‫الصحيحة لها مسبقًا ‪ ،priori‬فيمكننا التحقق من أن نموذجنا يمكنهيف الواقع استعادتها‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import random‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪Generating the Dataset‬‬ ‫‪3.3.1‬‬
‫في هذا المثال‪ ،‬سنعمل األبعاد المنخفضة ‪ low-dimensional‬لإليجاز‪ .‬يُنشئ مقتطف الشفرة‬
‫التالي ‪ 1000‬مثال بميزات ثنائية األبعاد مستمدة من التوزيع العادي القياسي‪ .‬تنتمي مصفوفة‬
‫التصميم 𝐗 الناتجة إلى ‪ .ℝ1000×2‬نقوم بإنشاء كل تسمية من خالل تطبيق دالة خطية للقيم‬
‫الحقيقية ‪ ، ground truth‬وأفسدتها عن طريق الضوضاء المضافة 𝜖 ‪ ،‬مرسومة بشكل مستقل‬
‫ومتطابق لكل مثال‪:‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪146‬‬

‫‪𝐲 = 𝐗𝐰 + 𝑏 + 𝜖.‬‬

‫للسهولة‪ ،‬نفترض أن ذلك 𝜖 مستمد من التوزيع الطبيعي بمتوسط ‪ 𝜇 = 0‬وانحراف معياري = 𝜎‬


‫‪ .0.01‬الحظ أنه بالنسبة للتصميم الموجه للكائنات‪ ،‬نضيف الكود إلى طريقة __‪ __init‬لفئة‬
‫فرعية من ‪( d2l.DataModule‬تم تقديمهيف القسم ‪ .)3.2.3‬من الممارسات الجيدة السماح‬
‫بتعيين أي معلمات فائقة إضافية‪ .‬نحقق ذلك باستخدام )(‪.save_hyperparameters‬‬
‫سيتم تحديد حجم الدفعة ‪ batch_size‬الحقًا‪.‬‬

‫‪class SyntheticRegressionData(d2l.DataModule): #@save‬‬


‫‪def __init__(self, w, b, noise=0.01, num_train=1000,‬‬
‫‪num_val=1000,‬‬
‫‪batch_size=32):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫‪n = num_train + num_val‬‬
‫))]‪self.X = tf.random.normal((n, w.shape[0‬‬
‫‪noise = tf.random.normal((n, 1)) * noise‬‬
‫‪self.y = tf.matmul(self.X, tf.reshape(w, (-1,‬‬
‫‪1))) + b + noise‬‬
‫أدناه‪ ،‬قمنا بتعيين المعلمات الحقيقية على ⊤]‪ 𝐰 = [2, −3.4‬و ‪ .𝑏 = 4.2‬الحقًا‪ ،‬يمكننا‬
‫التحقق من معلماتنا المقدرة مقابل قيم الحقيقة األساسية هذه‪.‬‬

‫‪data = SyntheticRegressionData(w=tf.constant([2, -3.4]),‬‬


‫)‪b=4.2‬‬
‫يتكون كل صفيف ‪features‬من متجه ‪ℝ2‬يف وكل صفيف ‪ labels‬عبارة عن قيمة قياسية‬
‫‪ .scalar‬دعونا نلقي نظرة على اإلدخال األول‪.‬‬

‫)]‪print('features:', data.X[0],'\nlabel:', data.y[0‬‬


‫‪features: tf.Tensor([-0.44379362 0.23580837],‬‬
‫)‪shape=(2,), dtype=float32‬‬
‫)‪label: tf.Tensor([2.506998], shape=(1,), dtype=float32‬‬
‫‪Reading the Dataset‬‬ ‫‪3.3.2‬‬
‫غالبًا ما تتطلب نماذج التعلم اآللي للتدريب تمريرات متعددة على مجموعة بيانات ‪،Dataset‬‬
‫مع الحصول على دفعة صغيرة ‪ minibatch‬واحدة من األمثلةيف كل مرة‪ .‬ثم يتم استخدام هذه‬
‫البيانات لتحديث النموذج‪ .‬لتوضيح كيفية عمل ذلك‪ ،‬نقوم بتنفيذ دالة ‪،get_dataloader‬‬
‫‪SyntheticRegressionData‬عبر ‪add_to_class‬‬ ‫وتسجيلها كطريقةيف فئة‬
‫(المقدمةيف القسم ‪ .)3.2.1‬يأخذ حجم الدُفعة‪ ،‬مصفوفة الميزات ‪ ،matrix of features‬ومتجه‬
‫التسميات ‪ ،a vector of labels‬وينشئ الدُفعات المصغرة من ‪ .batch_size‬على هذا‬
‫‪147‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫النحو‪ ،‬يتكون كل ‪ minibatch‬من مجموعة من الميزات والتسميات‪ .‬الحظ أننا بحاجة إلى أن‬
‫نضعيف اعتبارنا ما إذا كنايف وضع التدريب ‪ training‬أو التحقق من الصحة ‪:validation‬يف ‬
‫السابق‪ ،‬سنرغبيف قراءة البيانات بترتيب عشوائي‪،‬يف حين أن القدرة على قراءة البيانات بترتيب‬
‫محدد مسبقًا قد تكون مهمة ألغراض التصحيح‪.‬‬

‫)‪@d2l.add_to_class(SyntheticRegressionData‬‬
‫‪def get_dataloader(self, train):‬‬
‫‪if train:‬‬
‫))‪indices = list(range(0, self.num_train‬‬
‫‪# The examples are read in random order‬‬
‫)‪random.shuffle(indices‬‬
‫‪else:‬‬
‫‪indices = list(range(self.num_train,‬‬
‫))‪self.num_train+self.num_val‬‬
‫‪for i in range(0, len(indices), self.batch_size):‬‬
‫)]‪j = tf.constant(indices[i : i+self.batch_size‬‬
‫)‪yield tf.gather(self.X, j), tf.gather(self.y, j‬‬
‫لبناء بعض الحدس‪ ،‬دعنا نفحص الدفعة األولى من البيانات‪ .‬توفر لنا كل دفعة صغيرة من الميزات‬
‫حجمها وأبعاد ميزات اإلدخال‪ .‬وبالمثل‪ ،‬سيكون لمجموعة التسميات الصغيرة الخاصة بنا شكل‬
‫مطابق تم تحديده بواسطة ‪.batch_size‬‬

‫)))(‪X, y = next(iter(data.train_dataloader‬‬
‫)‪print('X shape:', X.shape, '\ny shape:', y.shape‬‬
‫)‪X shape: (32, 2‬‬
‫)‪y shape: (32, 1‬‬
‫استدعاء‬ ‫فإن‬ ‫‪،innocuous‬‬ ‫ضار‬ ‫غير‬ ‫يبدو‬ ‫بينما‬
‫))(‪ iter(data.train_dataloader‬يوضح قوة تصميم بايثون الموجه للكائنات‪.‬‬
‫الحظ أننا أضفنا طريقة إلى فئة ‪SyntheticRegressionData‬بعد إنشاء كائن البيانات‪.‬‬
‫ومع ذلك‪ ،‬فإن الكائن يستفيد من إضافة الدالة بأثر رجعي إلى الفئة‪.‬‬

‫خالل التكرار نحصل على دفعات صغيرة مميزة حتى يتم استنفاد مجموعة البيانات بالكامل‬
‫(جرب هذا)‪.‬يف حين أن التكرار الذي تم تنفيذه أعاله مفيد لألغراض التعليمية‪ ،‬إال أنه غير فعال‬
‫في الطرق التي قد تسبب لنا المشاكليف مشاكل حقيقية‪ .‬على سبيل المثال‪ ،‬يتطلب األمر أن نقوم‬
‫بتحميل جميع البيانات الموجودةيف الذاكرة وأن نقوم بالكثير من الوصول العشوائي إلى الذاكرة‪.‬‬
‫تعد أجهزة التكرار المضمنة ‪ built-in iterators‬التي يتم تنفيذهايف إطار عمل التعلم العميق‬
‫أكثر كفاءة إلى حد كبير ويمكنها التعامل مع مصادر مثل البيانات المخزنةيف الملفات‪ ،‬والبيانات‬
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 148

‫ دعونا نحاول‬،‫ بعد ذلك‬.‫ والبيانات التي يتم إنشاؤها أو معالجتها أثناء التنقل‬،‫المستلمة عبر التدفق‬
.‫تنفيذ نفس الدالة باستخدام التكرارات المضمنة‬

Concise Implementation of 3.3.3


the Data Loader
‫ الموجودةيف‬API ‫ يمكننا استدعاء واجهة برمجة التطبيقات‬،‫بدالً من كتابة المكرر الخاص بنا‬
X ‫ نحتاج إلى مجموعة بيانات بالميزات‬،‫ كما كان من قبل‬.‫إطار عمل لتحميل البيانات‬
‫يف أداة تحميل البيانات المضمنة‬batch_size ‫ قمنا بتعيين‬، ‫ عالوة على ذلك‬.y ‫والتسميات‬
.‫ بكفاءة‬shuffling examples ‫ وندعها تهتم بأمثلة الخلط‬built-in data loader

@d2l.add_to_class(d2l.DataModule) #@save
def get_tensorloader(self, tensors, train,
indices=slice(0, None)):
tensors = tuple(a[indices] for a in tensors)
shuffle_buffer = tensors[0].shape[0] if train else 1
return
tf.data.Dataset.from_tensor_slices(tensors).shuffle(

buffer_size=shuffle_buffer).batch(self.batch_size)

@d2l.add_to_class(SyntheticRegressionData) #@save
def get_dataloader(self, train):
i = slice(0, self.num_train) if train else
slice(self.num_train, None)
return self.get_tensorloader((self.X, self.y),
train, i)
‫ باستثناء أنها أكثر كفاءة ولديها بعض‬،‫تعمل أداة تحميل البيانات الجديدة تمامًا مثل السابقة‬
.‫الدوال اإلضافية‬

X, y = next(iter(data.train_dataloader()))
print('X shape:', X.shape, '\ny shape:', y.shape)
X shape: (32, 2)
y shape: (32, 1)
‫ الخاصة بإطار‬API ‫ أداة تحميل البيانات التي توفرها واجهة برمجة التطبيقات‬،‫على سبيل المثال‬
‫ أي عدد‬، ‫ حتى نتمكن من االستعالم عن طولها‬، ‫__ المضمنة‬len__ ‫العمل تدعم طريقة‬
.number of batches ‫الدُفعات‬

len(data.train_dataloader())
32
‫‪149‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪ .3.3.4‬الملخص‬

‫تُعد برامج تحميل البيانات ‪ Data loaders‬طريقة مالئمة الستخراج عملية تحميل البيانات‬
‫ومعالجتها‪ .‬وبهذه الطريقة‪ ،‬فإن خوارزمية التعلم اآللي نفسها قادرة على معالجة العديد من أنواع‬
‫ومصادر البيانات المختلفة دون الحاجة إلى تعديل‪ .‬أحد األشياء الرائعة حول برامج تحميل‬
‫البيانات هو أنه يمكن تكوينها‪ .‬على سبيل المثال‪ ،‬قد نقوم بتحميل الصور ومن ثم يكون لدينا‬
‫مرشح ما بعد المعالجة يقوم بقصها أو تعديلها بطريقة أخرى‪ .‬على هذا النحو‪ ،‬يمكن استخدام‬
‫برامج تحميل البيانات لوصف خط أنابيب معالجة البيانات بالكامل‪.‬‬

‫بالنسبة للنموذج نفسه‪ ،‬فإن النموذج الخطي ثنائي األبعاد هو نموذج بسيط كما قد نواجهه‪ .‬يتيح‬
‫لنا اختبار دقة نماذج االنحدار دون القلق بشأن عدم وجود كميات كافية من البيانات أو نظام‬
‫معادالت غير محدد بشكل كافٍ‪ .‬سنستخدم هذا بشكل جيديف القسم التالي‪.‬‬

‫‪3.3.5‬‬
‫‪ .1‬ماذا سيحدث إذا كان عدد األمثلة ال يمكن تقسيمه على حجم الدُفعة‪ .‬كيف يمكن تغيير‬
‫هذا السلوك من خالل تحديد وسيطة مختلفة باستخدام واجهة برمجة التطبيقات‬
‫الخاصة ‪ API‬بإطار العمل ‪Framework‬؟‬
‫‪ .2‬ماذا لو أردنا إنشاء مجموعة بيانات ضخمة‪ ،‬حيث يكون حجم متجه المعلمة ‪ w‬وعدد‬
‫األمثلة ‪ num_examples‬عددًا كبيرًا؟‬
‫‪ .1‬ماذا يحدث إذا لم نتمكن من االحتفاظ بجميع البياناتيف الذاكرة؟‬
‫‪ .2‬كيف يمكنك تبديل البيانات إذا تم االحتفاظ بالبيانات على القرص؟ مهمتك‬
‫هي تصميم خوارزمية فعالة ال تتطلب الكثير من القراءة أو الكتابة العشوائية‪.‬‬
‫تلميح‪ :‬مولدات التقليب العشوائية الزائفة ‪pseudorandom permutation‬‬
‫‪ generators‬تسمح لك بتصميم التعديل دون الحاجة إلى تخزين جدول‬
‫التقليب ‪ permutation table‬بشكل صريح ( ‪،Naor and Reingold‬‬
‫‪.)1999‬‬
‫‪ .3‬قم بتنفيذ منشئ البيانات ‪ data generator‬الذي ينتج بيانات جديدة بسرعة‪،‬يف كل‬
‫مرة يتم استدعاء المكرر‪.‬‬
‫‪ .4‬كيف يمكنك تصميم منشئ بيانات عشوائي ‪ random data generator‬يقوم بإنشاء‬
‫نفس البياناتيف كل مرة يتم استدعاؤها؟‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪150‬‬

‫‪Linear Regression‬‬ ‫‪3.4‬‬


‫‪Implementation from Scratch‬‬
‫نحن اآلن جاهزون للعمل من خالل التنفيذ الكامل لالنحدار الخطي‪.‬يف هذا القسم‪ ،‬سنقوم بتنفيذ‬
‫الطريقة بأكملها من البداية‪ ،‬بمايف ذلك (‪ )1‬النموذج ‪ model‬؛ (‪ )2‬دالة الخطأ ‪loss function‬؛‬
‫(‪ )3‬مُحسِّن التدرج االشتقاقي العشوائي المصغر ‪minibatch stochastic gradient‬‬
‫‪ descent optimizer‬؛ و (‪ )4‬دالة التدريب ‪ training function‬التي تجمع كل هذه القطع‬
‫معًا‪ .‬أخيرًا‪ ،‬سنقوم بتشغيل منشئ البيانات التركيبية الخاص بنا من القسم ‪ 3.3‬ونطبق نموذجنا‬
‫على مجموعة البيانات الناتجة‪ .‬بينما يمكن ألطر التعلم العميق الحديثة أتمتة كل هذا العمل‬
‫تقري ًبا‪ ،‬فإن تنفيذ األشياء من البداية هو الطريقة الوحيدة للتأكد من أنك تعرف حقًا ما تفعله‪.‬‬
‫عالوة على ذلك‪ ،‬عندما يحين وقت تخصيص النماذج‪ ،‬وتحديد طبقاتنا الخاصة أو دوال الخطأ‪،‬‬
‫فإن فهم كيفية عمل األشياء تحت الغطاء سيكون مفيدًا‪.‬يف هذا القسم‪ ،‬سوف نعتمد فقط على‬
‫الموترات والتفاضل التلقائي‪.‬يف وقت الحق‪ ،‬سنقدم تطبيقًا أكثر إيجازًا‪ ،‬مستفيدًا من أجراس‬
‫وصفارات أطر التعلم العميق مع االحتفاظ بهيكل ما يلي أدناه‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪Defining the Model‬‬ ‫‪3.4.1‬‬
‫قبل أن نبدأيف تحسين معلمات نموذجنا عن طريق ‪ ،minibatch SGD‬نحتاج إلى بعض‬
‫المعلمات ‪parameters‬يف المقام األول‪ .‬فيما يلي نقوم بتهيئة األوزان عن طريق سحب أرقام‬
‫عشوائية من التوزيع الطبيعي بمتوسط ‪ 0‬وانحراف معياري ‪ 0.01‬غالبًا ما يعمل الرقم السحري‬
‫‪ 0.01‬جيدًايف الممارسة‪ ،‬ولكن يمكنك تحديد قيمة مختلفة من خالل وسيطة ‪ .sigma‬عالوة‬
‫على ذلك‪ ،‬قمنا بتعيين االنحياز إلى ‪ .0‬الحظ أنه بالنسبة للتصميم الموجه للكائنات‪ ،‬نضيف‬
‫الكود إلى طريقة __‪ __init‬لفئة فرعية من وحدة ‪( d2l.Module‬المقدمةيف القسم‬
‫‪.)3.2.2‬‬

‫‪class LinearRegressionScratch(d2l.Module): #@save‬‬


‫‪def __init__(self, num_inputs, lr, sigma=0.01):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫‪w = tf.random.normal((num_inputs, 1), mean=0,‬‬
‫)‪stddev=0.01‬‬
‫)‪b = tf.zeros(1‬‬
‫)‪self.w = tf.Variable(w, trainable=True‬‬
‫)‪self.b = tf.Variable(b, trainable=True‬‬
‫‪151‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫بعد ذلك‪ ،‬يجب علينا تحديد نموذجنا‪ ،‬وربط مدخالته ومعلماته بمخرجاته‪ .‬بالنسبة لنموذجنا‬
‫الخطي‪ ،‬نأخذ ببساطة منتج متجه المصفوفة لميزات اإلدخال 𝐗 وأوزان النموذج 𝐰 ‪ ،‬ونضيف‬
‫اإلزاحة(‪ 𝑏 )offset‬إلى كل مثال‪ 𝐗𝐰.‬هو متجه و𝑏 هو قيمة قياسية ‪ .scalar‬نظرًا آللية البث‬
‫(انظر القسم ‪ ،)2.1.4‬عندما نضيف متجهًا وقيمة قياسية‪ ،‬تُضاف القيمة القياسية إلى كل مكون‬
‫فئة‬ ‫الناتجة كطريقةيف ‬ ‫‪forward‬‬ ‫دالة‬ ‫تسجيل‬ ‫يتم‬ ‫المتجه‪.‬‬ ‫مكونات‬ ‫من‬
‫‪ LinearRegressionScratch‬عبر ‪( add_to_class‬تم تقديمهيف القسم ‪.)3.2.1‬‬

‫)‪@d2l.add_to_class(LinearRegressionScratch‬‬ ‫‪#@save‬‬
‫‪def forward(self, X):‬‬
‫"""‪"""The linear regression model.‬‬
‫‪return tf.matmul(X, self.w) + self.b‬‬
‫‪Defining the Loss Function‬‬ ‫‪3.4.2‬‬
‫نظرًا ألن تحديث نموذجنا يتطلب أخذ التدرج ‪ gradient‬لدالة الخطأ ‪ ، loss function‬فيجب‬
‫علينا تحديد دالة الخطأ أوالً‪ .‬هنا نستخدم دالة الخطأ التربيعية ‪squared loss function‬يف ‬
‫(‪.)3.1.5‬يف التنفيذ‪ ،‬نحتاج إلى تحويل القيمة الحقيقية ‪ y‬إلى شكل القيمة المتوقعة ‪.y_hat‬‬
‫النتيجة التي تم إرجاعها بواسطة الدالة التالية سيكون لها أيضًا نفس شكل ‪ .y_hat‬نعيد أيضًا‬
‫قيمة الخطأ المتوسطة بين جميع األمثلةيف ‪.minibatch‬‬

‫‪@d2l.add_to_class(LinearRegressionScratch) #@save‬‬
‫‪def loss(self, y_hat, y):‬‬
‫‪l = (y_hat - tf.reshape(y, y_hat.shape)) ** 2 / 2‬‬
‫)‪return tf.reduce_mean(l‬‬
‫‪Defining the Optimization‬‬ ‫‪3.4.3‬‬
‫‪Algorithm‬‬
‫كما نوقشيف القسم ‪ ،3.1‬فإن االنحدار الخطي له حل مغلق الشكل ‪.closed-form solution‬‬
‫ومع ذلك‪ ،‬فإن هدفنا هنا هو توضيح كيفية تدريب شبكات عصبية أكثر عمومية‪ ،‬وهذا يتطلب أن‬
‫نعلمك كيفية استخدام ‪ .minibatch SGD‬ومن ثم سننتهز هذه الفرصة لتقديم مثالك العملي‬
‫األول لـ ‪.SGD‬يف كل خطوة‪ ،‬باستخدام ‪ minibatch‬مأخوذ عشوائيًا من مجموعة البيانات‬
‫الخاصة بنا‪ ،‬نقدر تدرج الخطأ فيما يتعلق بالمعلمات‪ .‬بعد ذلك‪ ،‬نقوم بتحديث المعلماتيف ‬
‫االتجاه الذي قد يقلل من الخطأ‪.‬‬

‫الكود التالي يطبق التحديث‪ ،‬بالنظر إلى مجموعة من المعلمات‪ ،‬معدل التعلم ‪ .lr‬نظرًا ألن‬
‫خسارتنا يتم حسابها كمتوسط على ‪ ،minibatch‬ال نحتاج إلى ضبط معدل التعلم مقابل حجم‬
‫الدُفعة‪.‬يف فصول الحقة سنبحثيف كيفية تعديل معدالت التعلم للدفعات الصغيرة ‪minibatch‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪152‬‬

‫الكبيرة جدًا عند ظهورهايف التعلم الموزع على نطاق واسع‪.‬يف الوقت الحالي‪ ،‬يمكننا تجاهل هذه‬
‫التبعية‪.‬‬

‫نحدد فئة ‪ SGD‬الخاصة بنا‪ ،‬وهي فئة فرعية من ‪( d2l.HyperParameters‬تم تقديمها‬


‫في القسم ‪ ، )3.2.1‬للحصول على واجهة برمجة تطبيقات ‪ API‬مماثلة لمُحسِّن ‪ SGD‬المدمج‪.‬‬
‫نقوم بتحديث المعلماتيف طريقة ‪ .apply_gradients‬يقبل قائمة من المعلمات وأزواج‬
‫التدرج‪.‬‬

‫‪class SGD(d2l.HyperParameters): #@save‬‬


‫‪def __init__(self, lr):‬‬
‫"""‪"""Minibatch stochastic gradient descent.‬‬
‫)(‪self.save_hyperparameters‬‬

‫‪def apply_gradients(self, grads_and_vars):‬‬


‫‪for grad, param in grads_and_vars:‬‬
‫)‪param.assign_sub(self.lr * grad‬‬
‫نحدد بعد ذلك طريقة ‪ ، configure_optimizers‬والتي تُرجع مثيالً لفئة ‪.SGD‬‬

‫)‪@d2l.add_to_class(LinearRegressionScratch‬‬ ‫‪#@save‬‬
‫‪def configure_optimizers(self):‬‬
‫)‪return SGD(self.lr‬‬
‫‪Training‬‬ ‫‪3.4.4‬‬
‫اآلن بعد أن أصبح لدينا جميع األجزاءيف مكانها (المعلمات‪ ،‬دالة الخسارة (الخطأ)‪ ،‬النموذج‪،‬‬
‫والمحسن)‪ ،‬نحن جاهزون لتنفيذ حلقة التدريب الرئيسية‪ .‬من األهمية بمكان أن تفهم هذا الرمز‬
‫جيدًا ألنك ستستخدم حلقات تدريب مماثلة لكل نموذج تعليم عميق آخر مغطىيف هذا الكتاب‪.‬‬
‫في كل فترة ‪ ،epoch‬نكرر مجموعة بيانات التدريب بأكملها‪ ،‬ونمرر مرة واحدةيف كل مثال‬
‫(بافتراض أن عدد األمثلة قابل للقسمة على حجم الدُفعة)‪.‬يف كل تكرار‪ ،‬نحصل على دفعة مصغرة‬
‫من أمثلة التدريب‪ ،‬ونحسب خسارتها من خالل طريقة ‪ training_step‬للنموذج‪ .‬بعد‬
‫ذلك‪ ،‬نحسب التدرجات فيما يتعلق بكل معلمة‪ .‬أخيرًا‪ ،‬سنقوم باستدعاء خوارزمية التحسين‬
‫لتحديث معلمات النموذج‪ .‬باختصار‪ ،‬سنقوم بتنفيذ الحلقة التالية‪:‬‬

‫تهيئة المعلمات )𝑏 ‪(𝐰,‬‬ ‫•‬


‫كرر حتى االنتهاء‬ ‫•‬
‫‪1‬‬
‫←𝐠‬ ‫‪𝜕(𝐰,𝑏) |ℬ| ∑𝑖∈ℬ‬‬ ‫حساب التدرج )𝑏 ‪𝑙(𝐱 (𝑖) , 𝑦 (𝑖) , 𝐰,‬‬ ‫‪o‬‬
‫تحديث المعلمات 𝐠𝜂 ‪(𝐰, 𝑏) ← (𝐰, 𝑏) −‬‬ ‫‪o‬‬
153 ‫ الشبكات العصبية الخطية لالنحدار‬:‫الفصل الثالث‬

‫ التي أنشأناهايف‬synthetic regression dataset ‫تذكر أن مجموعة بيانات االنحدار التركيبية‬


‫يف معظم‬،‫ ومع ذلك‬.validation dataset ‫ ال توفر مجموعة بيانات للتحقق‬3.3 ‫القسم‬
‫ هنا نمرر أداة تحميل بيانات‬.‫ سنستخدم مجموعة بيانات تحقق لقياس جودة نموذجنا‬،‫الحاالت‬
‫ يتم تسجيل‬،‫ بعد تصميمنا الموجه للكائنات‬.‫التحقق مرة واحدةيف كل فترة لقياس أداء النموذج‬
‫ (مقدمةيف‬d2l.Trainer ‫ كطريقتين من فئة‬fit_epoch ‫ و‬prepare_batch ‫دالتي‬
.)3.2.4 ‫القسم‬

@d2l.add_to_class(d2l.Trainer) #@save
def prepare_batch(self, batch):
return batch

@d2l.add_to_class(d2l.Trainer) #@save
def fit_epoch(self):
self.model.training = True
for batch in self.train_dataloader:
with tf.GradientTape() as tape:
loss =
self.model.training_step(self.prepare_batch(batch))
grads = tape.gradient(loss,
self.model.trainable_variables)
if self.gradient_clip_val > 0:
grads =
self.clip_gradients(self.gradient_clip_val, grads)
self.optim.apply_gradients(zip(grads,
self.model.trainable_variables))
self.train_batch_idx += 1
if self.val_dataloader is None:
return
self.model.training = False
for batch in self.val_dataloader:

self.model.validation_step(self.prepare_batch(batch))
self.val_batch_idx += 1
‫ هنا‬.‫ لكننا نحتاج أوالً إلى بعض البيانات للتدرب عليها‬،‫نحن جاهزون تقريبًا لتدريب النموذج‬
ground- ‫ونمرر بعض المعلمات الحقيقة‬SyntheticRegressionData ‫نستخدم فئة‬
‫ وتعيين‬lr=0.03 ‫ نقوم بتدريب نموذجنا بمعدل التعلم‬،‫ بعد ذلك‬.‫ األساسية‬truth
‫ كل من عدد الفترات ومعدل التعلم عبارة عن معلمات‬،‫ الحظ أنه بشكل عام‬.max_epochs=3
ً‫ يعد إعداد المعلمات الفائقة أمرًا صعبًا وسنرغب عادة‬،‫ بشكل عام‬.hyperparameters ‫فائقة‬
‫ وثانية لقسم‬، ‫ ومجموعة واحدة للتدريب‬، way split-3 ‫في استخدام تقسيم ثالثي االتجاهات‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪154‬‬

‫المعلمات الفائقة‪ ،‬والثالثة مخصصة للتقييم النهائي‪ .‬نحن نتجاهل هذه التفاصيليف الوقت الحالي‬
‫ولكننا سنراجعها الحقًا‪.‬‬

‫)‪model = LinearRegressionScratch(2, lr=0.03‬‬


‫‪data = d2l.SyntheticRegressionData(w=tf.constant([2, -‬‬
‫)‪3.4]), b=4.2‬‬
‫)‪trainer = d2l.Trainer(max_epochs=3‬‬
‫)‪trainer.fit(model, data‬‬

‫نظرًا ألننا قمنا بتجميع مجموعة البيانات بأنفسنا‪ ،‬فإننا نعرف بالضبط ما هي المعلمات الحقيقية‪.‬‬
‫وبالتالي‪ ،‬يمكننا تقييم نجاحنايف التدريب من خالل مقارنة المعلمات الحقيقية بتلك التي تعلمناها‬
‫من خالل حلقة التدريب الخاصة بنا‪.‬يف الواقع‪ ،‬تبين أنهم قريبون جدًا من بعضهم البعض‪.‬‬

‫‪print(f'error in estimating w: {data.w -‬‬


‫)'})‪tf.reshape(model.w, data.w.shape‬‬
‫)'}‪print(f'error in estimating b: {data.b - model.b‬‬
‫]‪error in estimating w: [ 0.06905794 -0.15879321‬‬
‫]‪error in estimating b: [0.22819376‬‬
‫ال ينبغي لنا أن نأخذ القدرة على استعادة المعلمات الحقيقية كأمر مسلم به‪ .‬بشكل عام‪ ،‬بالنسبة‬
‫للنماذج العميقة‪ ،‬ال توجد حلول فريدة للمعلمات‪ ،‬وحتى بالنسبة للنماذج الخطية‪ ،‬يكون استرداد‬
‫المعلمات بالضبط ممكنًا فقط عندما ال تعتمد أي ميزة خطيًا على الميزات األخرى‪ .‬ومع ذلك‪،‬‬
‫في التعلم اآللي‪ ،‬غالبًا ما نكون أقل اهتمامًا باستعادة المعلمات األساسية الحقيقية‪ ،‬وأكثر اهتمامًا‬
‫بالمعلمات التي تؤدي إلى تنبؤ عالي الدقة (‪ .)1992 ،Vapnik‬لحسن الحظ‪ ،‬حتىيف مشكالت‬
‫التحسين الصعبة‪ ،‬غالبًا ما يجد التدرج االشتقاقي العشوائي حلولًا جيدة بشكل ملحوظ‪ ،‬ويرجع‬
‫‪155‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫ذلك جزئيًا إلى حقيقة أنه‪ ،‬بالنسبة للشبكات العميقة‪ ،‬توجد العديد من تكوينات المعلمات التي‬
‫تؤدي إلى تنبؤ عالي الدقة‪.‬‬

‫‪3.4.5‬‬
‫في هذا القسم‪ ،‬اتخذنا خطوة مهمة نحو تصميم أنظمة التعلم العميق من خالل تنفيذ نموذج‬
‫شبكة عصبية يعمل بكامل طاقته وحلقة تدريب‪.‬يف هذه العملية‪ ،‬قمنا ببناء أداة تحميل البيانات‪،‬‬
‫ونموذج‪ ،‬ودالة الخطأ‪ ،‬وإجراء التحسين‪ ،‬وأداة الرسم والمراقبة‪ .‬لقد فعلنا ذلك من خالل تكوين‬
‫كائن بايثون يحتوي على جميع المكونات ذات الصلة لتدريب النموذج‪ .‬على الرغم من أن هذا‬
‫ليس تطبيقًا احترافيًا بعد‪ ،‬إال أنه يعمل بشكل مثالي ويمكن أن يساعدك رمز مثل هذا بالفعليف ‬
‫حل المشكالت الصغيرة بسرعة‪.‬يف األقسام التالية‪ ،‬سنرى كيفية القيام بذلك بشكل أكثر إيجازًا‬
‫(تجنب الكود المعياري ‪ )avoiding boilerplate code‬وبكفاءة أكبر (استخدم وحدات‬
‫معالجة الرسومات ‪ GPUs‬الخاصة بنا إلى أقصى إمكاناتها)‪.‬‬

‫‪3.4.6‬‬
‫‪ .1‬ماذا سيحدث إذا قمنا بتهيئة األوزان إلى الصفر‪ .‬هل ستظل الخوارزمية تعمل؟ ماذا لو‬
‫قمنا بتهيئة المعلمات مع التباين ‪ 1,000‬بدالً من ‪ 0.01‬؟‬
‫‪ .2‬افترض أنك جورج سيمون أوم تحاول ابتكار نموذج للمقاومات التي تربط الجهد‬
‫والتيار‪ .‬هل يمكنك استخدام التفاضل التلقائي ‪automatic differentiation‬‬
‫لمعرفة معلمات نموذجك؟‬
‫‪ .3‬هل يمكنك استخدام قانون بالنك ‪ Planck’s Law‬لتحديد درجة حرارة جسم ما‬
‫باستخدام كثافة الطاقة الطيفية؟ كمرجع‪ ،‬فإن الكثافة الطيفية 𝐵 لإلشعاع المنبعث من‬
‫‪2ℎ𝑐 2‬‬ ‫𝑐‪ℎ‬‬
‫= )𝑇 ‪ 𝜆 .𝐵(𝜆,‬هو الطول الموجي‪ ،‬و𝑇‬ ‫‪𝜆5‬‬
‫‪⋅ (exp‬‬ ‫𝑇𝑘𝜆‬
‫جسم أسود هي ‪− 1)−1‬‬
‫درجة الحرارة‪ ،‬و𝑐 سرعة الضوء‪ ،‬و‪ ℎ‬كمية بالنك‪ ،‬و𝑘 ثابت بولتزمان‪ .‬تقيس الطاقة‬
‫ألطوال موجية مختلفة وتحتاج اآلن لمواءمة منحنى الكثافة الطيفية مع قانون بالنك‪.‬‬
‫‪ .4‬ما هي المشاكل التي قد تواجهها إذا أردت حساب المشتقات الثانية للخطأ؟ كيف‬
‫تصلحهم؟‬
‫‪ .5‬لماذا طريقة إعادة التشكيل ‪ reshape‬مطلوبةيف دالة الخطأ ‪ loss function‬؟‬
‫‪ .6‬جرب استخدام معدالت تعلم مختلفة لمعرفة مدى سرعة انخفاض قيمة دالة الخطأ‪.‬‬
‫هل يمكنك تقليل الخطأ عن طريق زيادة عدد فترات التدريب ‪number of epochs‬‬
‫‪of training‬؟‬
‫‪ .7‬إذا كان عدد األمثلة ال يمكن تقسيمه على حجم الدُفعة‪ ،‬فماذا يحدث لـ ‪data_iter‬‬
‫في نهاية الفترة ‪epoch‬؟‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪156‬‬

‫‪ .8‬حاول تنفيذ دالة خطأ مختلفة‪ ،‬مثل خطأ القيمة المطلقة ‪absolute value loss‬‬
‫)(‪. (y_hat - d2l.reshape(y, y_hat.shape)).abs().sum‬‬
‫‪ .1‬تحقق مما يحدث للبيانات العادية‪.‬‬
‫‪ .2‬تحقق مما إذا كان هناك اختالفيف السلوك إذا قمت بتشويش بعض إدخاالت‬
‫𝐲 مثل ‪.𝑦5 = 10,000‬‬
‫‪ .3‬هل يمكنك التفكيريف حل رخيص للجمع بين أفضل جوانب الخسارة التربيعية‬
‫وخسارة القيمة المطلقة؟ تلميح‪ :‬كيف يمكنك تجنب قيم التدرج الكبيرة حقًا؟‬
‫‪ .9‬لماذا نحتاج إلى تعديل مجموعة البيانات؟ هل يمكنك تصميم حالة تؤدي فيها‬
‫مجموعة بيانات ضارة إلى كسر خوارزمية التحسين بطريقة أخرى؟‬

‫‪Concise Implementation of‬‬ ‫‪3.5‬‬


‫‪Linear Regression‬‬
‫شهد التعلم العميق انفجارًا كامبريًا ‪ Cambrian explosion‬من نوع ما خالل العقد الماضي‪.‬‬
‫إن العدد الهائل من التقنيات والتطبيقات والخوارزميات يفوق إلى حد بعيد التقدم المحرزيف ‬
‫العقود السابقة‪ .‬ويرجع ذلك إلى مجموعة مصادفة من عدة عوامل‪ ،‬أحدها هو األدوات المجانية‬
‫القوية التي يقدمها عدد من أطر التعلم العميق مفتوحة المصدر‪ .‬يمكن القول إن ‪Theano‬‬
‫(‪ )2010 ،.Bergstra et al‬و ‪ ،)2012 ،.Dean et al( DistBelief‬و ‪،.Jia et al( Caffe‬‬
‫‪ )2014‬يمثل الجيل األول من هذه النماذج التي وجدت اعتمادًا واسع النطاق‪ .‬على عكس‬
‫األعمال السابقة (األساسية) مثل ‪Bottou (،SN2 (Simulateur Neuristique) Cun‬‬
‫‪ ، )1988 ،and Le Cun‬والتي قدمت تجربة برمجة تشبه ‪ ، Lisp‬توفر األطر الحديثة تمايزًا‬
‫تلقائيًا ومالءمة بايثون‪ .‬تسمح لنا هذه األطر بأتمتة العمل المتكرر لتنفيذ خوارزميات التعلم القائم‬
‫على التدرج وتصميمه‪.‬‬

‫في القسم ‪ ،3.4‬اعتمدنا فقط على (‪ )1‬الموترات لتخزين البيانات والجبر الخطي؛ و (‪)2‬‬
‫التفاضل التلقائي لحساب التدرجات‪.‬يف الممارسة العملية‪ ،‬نظرًا ألن مكررات البيانات ودوال‬
‫الخطأ والمحسّنات وطبقات الشبكة العصبية شائعة جدًا‪ ،‬فإن المكتبات الحديثة تنفذ هذه‬
‫المكونات لنا أيضًا‪.‬يف هذا القسم‪ ،‬سنوضح لك كيفية تنفيذ نموذج االنحدار الخطي من القسم‬
‫‪ 3.4‬بإيجاز باستخدام واجهات برمجة التطبيقات ‪ API‬عالية المستوى ألطر التعلم العميق‪.‬‬

‫‪import numpy as np‬‬


‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪157‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫‪Defining the Model‬‬ ‫‪3.5.1‬‬


‫عندما قمنا بتنفيذ االنحدار الخطي من البدايةيف القسم ‪ ،3.4‬قمنا بتعريف معلمات نموذجنا‬
‫بوضوح وقمنا بترميز الحسابات إلنتاج مخرجات باستخدام عمليات الجبر الخطي األساسية‪.‬‬
‫يجب أن تعرف كيف تفعل هذا‪ .‬ولكن بمجرد أن تصبح نماذجك أكثر تعقيدًا‪ ،‬وبمجرد أن تضطر‬
‫إلى القيام بذلك كل يوم تقريبًا‪ ،‬ستكون سعيدًا بالمساعدة‪ .‬الوضع مشابه لترميز مدونتك الخاصة‬
‫من البداية‪ .‬يعد القيام بذلك مرة أو مرتين أمرًا مفيدًا ومفيدًا‪ ،‬لكنك ستكون مطور ويب رديئًا إذا‬
‫قضيت شهرًايف إعادة اختراع العجلة‪.‬‬

‫بالنسبة للعمليات القياسية‪ ،‬يمكننا استخدام الطبقات المحددة مسبقًا إلطار العمل‪ ،‬والتي تسمح‬
‫لنا بالتركيز على الطبقات المستخدمة لبناء النموذج بدالً من القلق بشأن تنفيذها‪ .‬أذكر معمارية‬
‫شبكة أحادية الطبقة على النحو الموصوفيف الشكل ‪ .2.1.3‬تسمى الطبقة متصلة بالكامل ‪fully‬‬
‫‪ ،,connected‬نظرًا ألن كل مدخل من مدخالتها متصل بكل من مخرجاتها عن طريق ضرب‬
‫المصفوفة‪-‬المتجه ‪.matrix-vector multiplication‬‬

‫في ‪ ،Keras‬يتم تحديد الطبقة المتصلة بالكامليف فئة ‪ .Dense‬نظرًا ألننا نريد فقط إنشاء ناتج‬
‫قيمة قياسية واحده ‪ ،Scalar‬فقد قمنا بتعيين هذا الرقم على ‪ .1‬وتجدر اإلشارة إلى أنه‪ ،‬للسهولة‪،‬‬
‫ال يتطلب منا ‪ Keras‬تحديد شكل اإلدخال لكل طبقة‪ .‬ال نحتاج إلى إخبار ‪ Keras‬بعدد‬
‫المدخالت التي تدخليف هذه الطبقة الخطية‪ .‬عندما نحاول ألول مرة تمرير البيانات من خالل‬
‫نموذجنا‪ ،‬على سبيل المثال‪ ،‬عندما ننفذ )‪ net(X‬الحقًا‪ ،‬ستستنتج ‪ Keras‬تلقائيًا عدد‬
‫المدخالت لكل طبقة‪ .‬سنصف كيف يعمل هذا بمزيد من التفصيل الحقًا‪.‬‬

‫‪class LinearRegression(d2l.Module): #@save‬‬


‫‪def __init__(self, lr):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫= ‪initializer‬‬
‫)‪tf.initializers.RandomNormal(stddev=0.01‬‬
‫‪self.net = tf.keras.layers.Dense(1,‬‬
‫)‪kernel_initializer=initializer‬‬
‫في طريقة ‪ ، forward‬نستدعي دالة __‪ __call‬المضمنة للطبقات المحددة مسبقًا لحساب‬
‫المخرجات‪.‬‬

‫‪@d2l.add_to_class(LinearRegression) #@save‬‬
‫‪def forward(self, X):‬‬
‫"""‪"""The linear regression model.‬‬
‫)‪return self.net(X‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪158‬‬

‫‪Defining the Loss Function‬‬ ‫‪3.5.2‬‬


‫متوسط الخطأ التربيعي (بدون ‪ 1/2‬العامليف ‬ ‫تحسب فئة ‪MeanSquaredError‬‬
‫)‪ .)(3.1.5‬بشكل افتراضي‪ ،‬تقوم بإرجاع متوسط الخطأ على األمثلة ‪.‬‬

‫‪@d2l.add_to_class(LinearRegression) #@save‬‬
‫‪def loss(self, y_hat, y):‬‬
‫)(‪fn = tf.keras.losses.MeanSquaredError‬‬
‫)‪return fn(y, y_hat‬‬
‫‪Defining the Optimization‬‬ ‫‪3.5.3‬‬
‫‪Algorithm‬‬
‫‪ Minibatch SGD‬هي أداة قياسية لتحسين الشبكات العصبية ‪ ،‬وبالتالي تدعمها ‪ Keras‬جنبًا‬
‫إلى جنب مع عدد من االختالفاتيف هذه الخوارزميةيف وحدة ‪.optimizers‬‬

‫‪@d2l.add_to_class(LinearRegression) #@save‬‬
‫‪def configure_optimizers(self):‬‬
‫)‪return tf.keras.optimizers.SGD(self.lr‬‬
‫‪Training‬‬ ‫‪3.5.4‬‬
‫ربما الحظت أن التعبير عن نموذجنا من خالل واجهات برمجة التطبيقات ‪ API‬عالية المستوى‬
‫إلطار عمل التعلم العميق يتطلب عددًا أقل من أسطر التعليمات البرمجية‪ .‬لم يكن علينا تخصيص‬
‫المعلمات بشكل فردي أو تحديد دالة الخطأ أو تنفيذ ‪ .minibatch SGD‬بمجرد أن نبدأ العمل‬
‫مع نماذج أكثر تعقيدًا‪ ،‬فإن مزايا واجهة برمجة التطبيقات عالية المستوى ستنمو بشكل كبير‪ .‬اآلن‬
‫بعد أن أصبح لدينا جميع األجزاء األساسيةيف مكانها الصحيح‪ ،‬فإن حلقة التدريب نفسها هي‬
‫نفسها التي طبقناها من البداية‪ .‬لذلك نحن فقط نستدعي طريقة ‪( fit‬المقدمةيف القسم‬
‫‪ ،)3.2.4‬والتي تعتمد على تنفيذ طريقة ‪ fit_epoch‬يف القسم ‪ ، 3.4‬لتدريب نموذجنا‪.‬‬

‫)‪model = LinearRegression(lr=0.03‬‬
‫‪data = d2l.SyntheticRegressionData(w=tf.constant([2, -‬‬
‫)‪3.4]), b=4.2‬‬
‫)‪trainer = d2l.Trainer(max_epochs=3‬‬
‫)‪trainer.fit(model, data‬‬
‫‪159‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫أدناه‪ ،‬نقارن معلمات النموذج التي تم تعلمها من خالل التدريب على البيانات المحدودة‬
‫والمعلمات الفعلية التي أنشأت مجموعة البيانات الخاصة بنا‪ .‬للوصول إلى المعلمات‪ ،‬نصل إلى‬
‫أوزان وانحياز الطبقة التي نحتاجها‪ .‬كما هو الحاليف تنفيذنا من البداية‪ ،‬الحظ أن معلماتنا المقدرة‬
‫قريبة من نظيراتها الحقيقية‪.‬‬

‫)‪@d2l.add_to_class(LinearRegression‬‬ ‫‪#@save‬‬
‫‪def get_w_b(self):‬‬
‫‪return (self.get_weights()[0],‬‬
‫)]‪self.get_weights()[1‬‬

‫)(‪w, b = model.get_w_b‬‬
‫‪print(f'error in estimating w: {data.w - tf.reshape(w,‬‬
‫)'})‪data.w.shape‬‬
‫)'}‪print(f'error in estimating b: {data.b - b‬‬
‫] ‪error in estimating w: [ 0.00565076 -0.0058403‬‬
‫]‪error in estimating b: [0.01354933‬‬
‫‪3.5.5‬‬
‫يحتوي هذا القسم على أول تطبيق لشبكة عميقة (في هذا الكتاب) لالستفادة من وسائل الراحة‬
‫التي توفرها أطر التعلم العميق الحديثة‪ ،‬مثل ‪.Tensorflow ، PyTorch ،JAX ، Gluon‬‬
‫استخدمنا اإلعدادات االفتراضية إلطار العمل لتحميل البيانات‪ ،‬وتحديد الطبقة‪ ،‬ودالة الخطأ‪،‬‬
‫والمحسن‪ ،‬وحلقة التدريب‪ .‬عندما يوفر إطار العمل جميع الميزات الضرورية‪ ،‬فمن الجيد عمومًا‬
‫استخدامها‪ ،‬نظرًا ألن تطبيقات المكتبة لهذه المكونات تميل إلى تحسين األداء بشكل كبير‬
‫واختبارها بشكل صحيح من أجل الموثوقية‪.‬يف نفس الوقت‪ ،‬حاول أال تنسى أنه يمكن تنفيذ هذه‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪160‬‬

‫الوحدات مباشرة‪ .‬هذا مهم بشكل خاص للباحثين الطموحين الذين يرغبونيف العيش على حافة‬
‫النزف لتطوير النموذج‪ ،‬حيث ستبتكر مكونات جديدة ال يمكن أن توجديف أي مكتبة حالية‪.‬‬

‫في ‪ ،TensorFlow‬توفر وحدة ‪ data‬أدوات لمعالجة البيانات‪ ،‬وتحدد وحدة ‪ keras‬عددًا‬


‫كبيرًا من طبقات الشبكة العصبية ودوال الخطأ الشائعة‪ .‬عالوة على ذلك‪ ،‬توفر وحدة‬
‫‪ initializers‬طرقًا مختلفة لتهيئة معلمة النموذج‪ .‬يتم استنتاج األبعاد والتخزين للشبكات‬
‫تلقائيًا (ولكن احرص على عدم محاولة الوصول إلى المعلمات قبل تهيئتها)‪.‬‬

‫‪3.5.6‬‬
‫‪ .1‬كيف ستحتاج إلى تغيير معدل التعلم إذا قمت باستبدال الخطأ اإلجمالي على‬
‫‪ minibatch‬بمتوسط فوق الخطأيف ‪minibatch‬؟‬
‫‪ .2‬راجع وثائق إطار العمل لمعرفة دوال الخطأ المتوفرة‪ .‬على وجه الخصوص‪ ،‬استبدل‬
‫الخطأ التربيعية بدالة الخطأ القوية لهوبر ‪ .Huber’s robust loss function‬أي‪،‬‬
‫استخدم دالة الخطأ‪:‬‬
‫𝜎‬
‫‪|𝑦 − 𝑦 ′ | −‬‬ ‫𝜎 > | ‪if |𝑦 − 𝑦 ′‬‬
‫‪2‬‬
‫‪𝑙(𝑦, 𝑦 ′ ) = { 1‬‬
‫‪(𝑦 − 𝑦 ′ )2‬‬ ‫‪otherwise‬‬
‫𝜎‪2‬‬
‫‪ .3‬كيف يمكنك الوصول إلى التدرج ألوزان النموذج؟‬
‫‪ .4‬كيف يتغير الحل إذا قمت بتغيير معدل التعلم وعدد الفترات؟ هل تستمريف التحسن؟‬
‫‪ .5‬كيف يتغير الحل عندما تقوم بتغيير كمية البيانات التي يتم إنشاؤها؟‬
‫^‬ ‫^‬
‫‪ .1‬ارسم خطأ التقدير لـ 𝐰 ‪𝐰 −‬و 𝑏 ‪𝑏 −‬كدالة لمقدار البيانات‪ .‬تلميح‪ :‬قم بزيادة‬
‫كمية البيانات لوغاريتميًا وليس خطيًا‪ ،‬أي ‪ 10000 ، ... ، 50 ، 20 ، 10 ، 5‬بدالً‬
‫من ‪.10000 ، ... ، 2000 ، 1000‬‬
‫‪ .2‬لماذا االقتراحيف التلميح مناسب؟‬

‫‪Generalization‬‬ ‫‪3.6‬‬
‫ضعيف اعتبارك أن اثنين من طالب الكلية يستعدان بجد لالمتحان النهائي‪ .‬بشكل عام‪ ،‬سيتألف‬
‫هذا اإلعداد من ممارسة واختبار قدراتهم من خالل إجراء االختبارات التي أجريتيف السنوات‬
‫السابقة‪ .‬ومع ذلك‪ ،‬فإن األداء الجيديف االختبارات السابقة ال يضمن تفوقهم عندما يكون األمر‬
‫مهمًا‪ .‬على سبيل المثال‪ ،‬تخيل طالبًا‪ ،‬تدعى إليفنتين إيلي ‪ ،Elephantine Ellie‬تألف إعدادها‬
‫بالكامل من حفظ إجابات أسئلة امتحان السنوات السابقة‪ .‬حتى لو كانت إيلي تتمتع بذاكرة فيل‪،‬‬
‫وبالتالي تمكنت تمامًا من تذكر إجابة أي سؤال سبق رؤيته‪ ،‬فقد تتجمد مع ذلك عندما تواجه‬
‫‪161‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫سؤالًا جديدًا (لم يسبق رؤيته)‪ .‬بالمقارنة‪ ،‬تخيل أن تلميذة أخرى‪ ،‬إيرين االستقرائية ‪Inductive‬‬
‫‪ ،Irene‬لديها مهارات حفظ ضعيفة نسبيًا‪ ،‬ولكنها موهوبةيف التقاط األنماط‪ .‬الحظ أنه إذا كان‬
‫االختبار يتألف حقًا من أسئلة معاد تدويرها من عام سابق‪ ،‬فستتفوق إيلي بسهولة على إيرين‪.‬‬
‫حتى لو أسفرت أنماط إيرين المستنبطة عن تنبؤات دقيقة بنسبة ‪ ،٪90‬فال يمكنها أبدًا منافسة‬
‫استدعاء إيلي بنسبة ‪ .٪100‬ومع ذلك‪ ،‬حتى لو كان االختبار يتكون بالكامل من أسئلة جديدة‪،‬‬
‫فقد تحافظ إيرين على متوسطها البالغ ‪.٪90‬‬

‫كعلماءيف التعلم اآللي‪ ،‬هدفنا هو اكتشاف األنماط ‪ .discover patterns‬ولكن كيف يمكننا‬
‫التأكد من أننا اكتشفنا حقًا نمطًا عامًا ولم نحفظ بياناتنا ببساطة؟يف معظم األحيان‪ ،‬تكون تنبؤاتنا‬
‫مفيدة فقط إذا اكتشف نموذجنا مثل هذا النمط‪ .‬ال نريد توقع أسعار األسهميف األمس‪ ،‬ولكن‬
‫أسعار الغد‪ .‬ال نحتاج إلى التعرف على األمراض التي تم تشخيصها بالفعل للمرضى الذين تمت‬
‫رؤيتهم سابقًا‪ ،‬ولكن باألحرى األمراض التي لم يتم تشخيصها من قبليف المرضى الذين لم يتم‬
‫رؤيتهم من قبل‪ .‬هذه المشكلة ‪ -‬كيفية اكتشاف األنماط التي تعمم ‪how to discover‬‬
‫‪ -patterns that generalize‬هي المشكلة األساسية للتعلم اآللي‪ ،‬ويمكن القول إنها مشكلة‬
‫جميع اإلحصائيات‪ .‬قد نعتبر هذه المشكلة مجرد شريحة واحدة من سؤال أعظم بكثير يبتلع العلم‬
‫كله‪ :‬متى يكون لدينا ما يبرر قيامنا بالقفزة من مالحظات معينة إلى عبارات أكثر عمومية‬
‫(‪)Popper, 2005‬؟‬

‫في الحياة الواقعية‪ ،‬يجب علينا مالئمة ‪ fit‬النماذج باستخدام مجموعة محدودة من البيانات‪.‬‬
‫تختلف المقاييس النموذجية لتلك البيانات بشكل كبير عبر المجاالت‪ .‬بالنسبة للعديد من‬
‫المشكالت الطبية المهمة‪ ،‬ال يمكننا الوصول إال إلى بضعة آالف من نقاط البيانات‪ .‬عند دراسة‬
‫األمراض النادرة‪ ،‬قد نكون محظوظين للوصول إلى المئات‪ .‬على النقيض من ذلك‪ ،‬تحتوي أكبر‬
‫مجموعات البيانات العامة التي تتكون من صور فوتوغرافية مصنفة (على سبيل المثال‪،‬‬
‫‪ ،)2009,Deng et al.( )ImageNet‬على ماليين الصور‪ .‬وبعض مجموعات الصور غير‬
‫المسماة ‪ unlabeled image‬مثل مجموعة بيانات ‪ Flickr YFC100M‬يمكن أن تكون أكبر‪،‬‬
‫حيث تحتوي على أكثر من ‪ 100‬مليون صورة (‪ .)2016 ،Thomee et al.‬ومع ذلك‪ ،‬حتىيف ‬
‫هذا النطاق األقصى‪ ،‬يظل عدد نقاط البيانات المتاحة صغيرًا بشكل ال نهائي مقارنة بمساحة‬
‫جميع الصور الممكنة بدقة ‪ 1‬ميجابكسل‪ .‬عندما نعمل مع عينات محدودة‪ ،‬يجب أن نضعيف ‬
‫اعتبارنا المخاطر التي قد نالئمها مع بيانات التدريب الخاصة بنا‪ ،‬فقط لنكتشف أننا فشلنايف ‬
‫اكتشاف نمط قابل للتعميم‪.‬‬

‫تسمى ظاهرة االقتراب من بيانات التدريب الخاصة بنا أكثر من التوزيع األساسي بفرط التجهيز‬
‫او التعلم ‪ ،overfitting‬وغالبًا ما تسمى تقنيات مكافحة فرط التعلم بأساليب التنظيم‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪162‬‬

‫‪ .regularization‬بينما ال يوجد بديل لمقدمة مناسبة لنظرية التعلم اإلحصائي (انظر‬


‫)‪ ،))Vapnik (1998) ،Boucheron et al. (2005‬سنمنحك الحدس الكافي فقط للبدء‪.‬‬
‫سوف نعيد النظريف التعميميف العديد من الفصوليف جميع أنحاء الكتاب‪ ،‬ونستكشف كل مما هو‬
‫معروف عن المبادئ الكامنة وراء التعميميف النماذج المختلفة‪ ،‬وكذلك التقنيات االستداللية التي‬
‫تم العثور عليها (تجريبيًا) لتحقيق تعميم أفضل للمهام ذات األهمية العملية‪.‬‬

‫‪Training Error and‬‬ ‫‪3.6.1‬‬


‫‪Generalization Error‬‬
‫في إعداد التعلم القياسي الخاضع لإلشراف‪ ،‬نفترض أن بيانات التدريب وبيانات االختبار مستمدة‬
‫بشكل مستقل عن التوزيعات المتطابقة ‪.Independently from Identical Distributions‬‬
‫وهذا ما يسمى عادة افتراض ‪.IID‬يف حين أن هذا االفتراض قوي‪ ،‬فمن الجدير بالذكر أنهيف غياب‬
‫أي افتراض من هذا القبيل سنكون ميتينيف الماء‪ .‬لماذا يجب أن نعتقد أن بيانات التدريب‬
‫المأخوذة من التوزيع )𝑌 ‪ 𝑃(𝑋,‬يجب أن تخبرنا بكيفية عمل تنبؤات بشأن بيانات االختبار الناتجة‬
‫عن توزيع مختلف )𝑌 ‪𝑄(𝑋,‬؟ إن تحقيق مثل هذه القفزات يتطلب افتراضات قوية حول كيفية‬
‫ارتباط 𝑃 و 𝑄‪ .‬سنناقش الحقًا بعض االفتراضات التي تسمح بالتغيراتيف التوزيع ولكننا نحتاج‬
‫أوالً إلى فهم حالة ‪ IID‬حيث )⋅(𝑄 = )⋅(𝑃‪.‬‬

‫بادئ ذي بدء‪ ،‬نحتاج إلى التفريق بين خطأ التدريب ‪ ،𝑅emp‬وهو إحصاء محسوب على مجموعة‬
‫بيانات التدريب‪ ،‬وخطأ التعميم 𝑅‪ ،‬وهو توقع يتم إجراؤه فيما يتعلق بالتوزيع األساسي‪ .‬يمكنك‬
‫التفكيريف خطأ التعميم كما تراه إذا قمت بتطبيق النموذج الخاص بك على دفق ال نهائي ‪infinite‬‬
‫‪ stream‬من أمثلة البيانات اإلضافية المستمدة من نفس توزيع البيانات األساسي‪ .‬رسميًا‪ ،‬يتم‬
‫التعبير عن خطأ التدريب كمجموع (بنفس الترميزيف القسم ‪:)3.1‬‬
‫𝑛‬
‫‪1‬‬
‫∑ = ]𝑓 ‪𝑅emp [𝐗, 𝐲,‬‬ ‫‪𝑙(𝐱 (𝑖) , 𝑦 (𝑖) , 𝑓(𝐱 (𝑖) )),‬‬
‫𝑛‬
‫‪𝑖=1‬‬

‫بينما يتم التعبير عن خطأ التعميم كجزء ال يتجزأ‪:‬‬

‫‪𝑅[𝑝, 𝑓] = 𝐸(𝐱,𝑦)∼𝑃 [𝑙(𝐱, 𝑦, 𝑓(𝐱))] = ∫ ∫ 𝑙(𝐱, 𝑦, 𝑓(𝐱))𝑝(𝐱, 𝑦)𝑑𝐱𝑑𝑦.‬‬

‫من الناحية اإلشكالية‪ ،‬ال يمكننا أبدًا حساب خطأ التعميم تمامًا‪ .‬ال أحد يخبرنا أبدًا عن الشكل‬
‫الدقيق لدالة الكثافة )𝑦 ‪ .𝑝(𝐱,‬عالوة على ذلك‪ ،‬ال يمكننا أخذ عينة من دفق ال نهائي من نقاط‬
‫البيانات‪ .‬وبالتالي‪ ،‬من الناحية العملية‪ ،‬يجب علينا تقدير خطأ التعميم من خالل تطبيق نموذجنا‬
‫على مجموعة اختبار مستقلة تتكون من اختيار عشوائي ‪ 𝐗 ′‬لألمثلة والتسميات ‪ 𝐲 ′‬التي تم حجبها‬
‫‪163‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫من مجموعة التدريب الخاصة بنا‪ .‬يتكون هذا من تطبيق نفس الصيغة المستخدمة لحساب خطأ‬
‫التدريب التجريبي ولكن على مجموعة اختبار ‪.𝐗 ′ , 𝐲 ′‬‬

‫بشكل حاسم‪ ،‬عندما نقوم بتقييم المصنف الخاص بنا على مجموعة االختبار‪ ،‬فإننا نعمل مع‬
‫مصنف ثابت ‪( fixed classifier‬ال يعتمد على عينة مجموعة االختبار)‪ ،‬وبالتالي فإن تقدير‬
‫الخطأ هو ببساطة مشكلة تقدير المتوسط ‪ .problem of mean estimation‬ومع ذلك ال‬
‫يمكن قول الشيء نفسه بالنسبة لمجموعة التدريب‪ .‬الحظ أن النموذج الذي انتهينا إليه يعتمد‬
‫بشكل صريح على اختيار مجموعة التدريب‪ ،‬وبالتالي فإن خطأ التدريب سيكون بشكل عام تقديرًا‬
‫متحيزًا للخطأ الحقيقي على السكان األساسيين‪ .‬السؤال المركزي للتعميم هو متى يجب أن نتوقع‬
‫أن يكون خطأ التدريب لدينا قريبًا من الخطأ السكاني ‪( population error‬وبالتالي خطأ‬
‫التعميم)‪.‬‬

‫‪Model Complexity‬‬ ‫‪3.6.1.1‬‬


‫في النظرية الكالسيكية‪ ،‬عندما يكون لدينا نماذج بسيطة وبيانات وفيرة‪ ،‬تميل أخطاء التدريب‬
‫والتعميم إلى التقارب‪ .‬ومع ذلك‪ ،‬عندما نعمل مع نماذج أكثر تعقيدًا و ‪ /‬أو أمثلة أقل‪ ،‬نتوقع أن‬
‫ينخفض خطأ التدريب بينما تنمو فجوة التعميم‪ .‬هذا يجب ان ال يكون مفاجئا‪ .‬تخيل أن فئة‬
‫النموذج معبرة جدًا لدرجة أنه بالنسبة ألي مجموعة بيانات 𝑛 من األمثلة‪ ،‬يمكننا العثور على‬
‫مجموعة من المعلمات التي يمكن أن تتالءم تمامًا مع التسميات التعسفية‪ ،‬حتى لو تم تعيينها‬
‫عشوائيًا‪.‬يف هذه الحالة‪ ،‬حتى لو تناسبنا بيانات التدريب الخاصة بنا تمامًا‪ ،‬كيف يمكننا استنتاج‬
‫أي شيء عن خطأ التعميم؟ لكل ما نعرفه‪ ،‬قد ال يكون خطأ التعميم أفضل من التخمين العشوائي‪.‬‬

‫بشكل عام‪،‬يف حالة عدم وجود أي قيود على فئة النموذج لدينا‪ ،‬ال يمكننا االستنتاج بناءً على‬
‫مالءمة بيانات التدريب وحدها أن نموذجنا قد اكتشف أي نمط قابل للتعميم (‪،Vapnik et al.‬‬
‫‪ .)1994‬من ناحية أخرى‪ ،‬إذا كانت فئة النموذج الخاصة بنا غير قادرة على مالءمة تسميات‬
‫عشوائية‪ ،‬فال بد أنها اكتشفت نمطًا‪ .‬استمدت األفكار النظرية التعليمية حول تعقيد النموذج‬
‫بعض اإللهام من أفكار كارل بوبر‪ ،‬فيلسوف العلم المؤثر‪ ،‬الذي صاغ معيار القابلية للتزييف‬
‫‪ .criterion of falsifiability‬وفقًا لبوبر‪ ،‬النظرية التي يمكن أن تشرح أي وجميع المالحظات‬
‫ليست نظرية علمية على اإلطالق! بعد كل شيء‪ ،‬ماذا قال لنا عن العالم إذا لم يستبعد أي احتمال؟‬
‫باختصار‪ ،‬ما نريده هو فرضية ال يمكن أن تفسر أي مالحظات قد نتصورها ومع ذلك تصادف‬
‫أنها متوافقة مع تلك المالحظات التي نقوم بهايف الواقع‪.‬‬

‫اآلن ما يشكل بدقة فكرة مناسبة لتعقيد النموذج هو مسألة معقدة‪.‬يف كثير من األحيان‪ ،‬تكون‬
‫النماذج التي تحتوي على المزيد من المعلمات قادرة على مالءمة عدد أكبر من التسميات المعينة‬
‫بشكل تعسفي‪ .‬ومع ذلك‪ ،‬هذا ليس صحيحا بالضرورة‪ .‬على سبيل المثال‪ ،‬تعمل طرق النواة‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪164‬‬

‫‪kernel methods‬يف مساحات ذات أعداد ال حصر لها من المعلمات‪ ،‬ومع ذلك يتم التحكميف ‬
‫تعقيدها بوسائل أخرى (‪ .)2002 ،Scholkopf and Smola‬أحد المفاهيم التي غالبًا ما تكون‬
‫مفيدة عن التعقيد هو نطاق القيم التي يمكن أن تتخذها المعلمات‪ .‬هنا‪ ،‬سيكون النموذج الذي‬
‫يُسمح لمعلماته بأخذ قيم عشوائية أكثر تعقيدًا‪ .‬سنعيد النظريف هذه الفكرةيف القسم التالي‪ ،‬عندما‬
‫نقدم تناقص او اضمحالل الوزن ‪ ،weight decay‬وهو أول أسلوب عملي لتنظيم األمور‪.‬‬
‫والجدير بالذكر أنه قد يكون من الصعب مقارنة التعقيد بين أعضاء فئات النماذج المختلفة إلى‬
‫حد كبير (على سبيل المثال‪ ،‬أشجار القرار ‪ decision trees‬مقابل الشبكات العصبية ‪neural‬‬
‫‪.)networks‬‬

‫في هذه المرحلة‪ ،‬يجب أن نؤكد على نقطة مهمة أخرى سنعيد النظر فيها عند إدخال الشبكات‬
‫العصبية العميقة‪ .‬عندما يكون النموذج قادرًا على تركيب تسميات عشوائية‪ ،‬فإن خطأ التدريب‬
‫المنخفض ال يعني بالضرورة خطأ تعميم منخفض‪ .‬ومع ذلك‪ ،‬فإنه ال يعني بالضرورة خطأ التعميم‬
‫العالي أيضًا! كل ما يمكننا قوله بثقة هو أن خطأ التدريب المنخفض وحده ال يكفي للتصديق‬
‫على خطأ التعميم المنخفض‪ .‬تبين أن الشبكات العصبية العميقة هي مجرد نماذج من هذا القبيل‪:‬‬
‫فبينما يتم تعميمها جيدًايف الممارسة العملية‪ ،‬فهي قوية جدًا بحيث ال تسمح لنا باستنتاج الكثير‬
‫على أساس خطأ التدريب وحده‪.‬يف هذه الحاالت‪ ،‬يجب أن نعتمد بشكل أكبر على بياناتنا‬
‫المؤجلة للمصادقة على التعميم بعد وقوع الحقيقة‪ .‬يسمى الخطأيف بيانات االنتظار‪ ،‬أي مجموعة‬
‫التحقق من الصحة ‪ ،validation set‬خطأ التحقق من الصحة ‪.validation error‬‬

‫‪Overfitting‬‬ ‫‪Underfitting‬‬ ‫‪3.6.2‬‬


‫عندما نقارن أخطاء التدريب والتحقق من الصحة‪ ،‬نريد أن نضعيف اعتبارنا حالتين شائعتين‪ .‬أوالً‪،‬‬
‫نريد أن ننتبه للحاالت التي يكون فيها خطأ التدريب وخطأ التحقق من الصحة كبيرًا ولكن هناك‬
‫فجوة صغيرة بينهما‪ .‬إذا كان النموذج غير قادر على تقليل خطأ التدريب‪ ،‬فقد يعني ذلك أن‬
‫نموذجنا بسيط للغاية (أي غير معبر بشكل كافٍ ‪ )insufficiently expressive‬اللتقاط النمط‬
‫الذي نحاول نمذجته‪ .‬عالوة على ذلك‪ ،‬نظرًا ألن فجوة التعميم ( 𝑅 ‪ )𝑅emp −‬بين أخطاء‬
‫التدريب والتعميم لدينا صغيرة‪ ،‬فلدينا سبب لالعتقاد بأنه يمكننا التخلص من نموذج أكثر تعقيدًا‪.‬‬
‫تُعرف هذه الظاهرة باسم الضبط الناقص ‪.underfitting‬‬

‫من ناحية أخرى‪ ،‬كما ناقشنا أعاله‪ ،‬نريد أن ننتبه للحاالت التي يكون فيها خطأ التدريب لدينا أقل‬
‫بكثير من خطأ التحقق من الصحة‪ ،‬مما يشير إلى الضبط الزائد (فرط التجهيز) ‪overfitting‬‬
‫الشديد‪ .‬الحظ أن فرط التجهيز ليس دائمًا أمرًا سيئًا‪.‬يف التعلم العميق على وجه الخصوص‪ ،‬غالبًا‬
‫ما يكون أداء أفضل النماذج التنبؤية أفضل بكثير على بيانات التدريب مقارنةً بالبيانات الرافضة‬
‫‪.holdout data‬يف النهاية‪ ،‬نحن نهتم عادةً بتوجيه خطأ التعميم إلى األسفل‪ ،‬وال نهتم إال بالفجوة‬
‫‪165‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫بقدر ما تصبح عقبةيف طريق تحقيق هذه الغاية‪ .‬الحظ أنه إذا كان خطأ التدريب صفرًا‪ ،‬فإن فجوة‬
‫التعميم تساوي تمامًا خطأ التعميم وال يمكننا إحراز تقدم إال من خالل تقليل الفجوة‪.‬‬

‫‪Polynomial Curve Fitting‬‬ ‫‪3.6.2.1‬‬


‫لتوضيح بعض الحدس الكالسيكي حول الضبط الزائد وتعقيد النموذج‪ ،‬ضعيف اعتبارك ما يلي‪:‬‬
‫بالنظر إلى بيانات التدريب التي تتكون من ميزة واحدة 𝑥 وعالمة ذات قيمة حقيقية مقابلة 𝑦‪،‬‬
‫نحاول العثور على متعدد الحدود للدرجة 𝑑‬
‫𝑑‬
‫^‬
‫∑=𝑦‬ ‫𝑖𝑤 𝑖 𝑥‬
‫‪𝑖=0‬‬

‫لتقدير التسمية 𝑦 ‪ .‬هذه مجرد مشكلة انحدار خطي حيث يتم إعطاء ميزاتنا من خالل قوى 𝑥‪،‬‬
‫وتعطي أوزان النموذج من قبل 𝑖𝑤‪ ،‬ويتم إعطاء التحيز ‪ 𝑤0‬منذ ‪ 𝑥 0 = 1‬الحين لكل𝑥‪ .‬نظرًا ألن‬
‫هذه مجرد مشكلة انحدار خطي‪ ،‬فيمكننا استخدام الخطأ التربيعي كدالة للخطأ‪.‬‬

‫تعتبر دالة كثيرة الحدود ذات الترتيب األعلى ‪ higher-order polynomial function‬أكثر‬
‫تعقيدًا من دالة كثيرة الحدود ذات الترتيب األدنى ‪،lower-order polynomial function‬‬
‫نظرًا ألن كثير الحدود ذو الترتيب األعلى يحتوي على معلمات أكثر ونطاق اختيار دالة النموذج‬
‫أوسع‪ .‬عند إصالح مجموعة بيانات التدريب‪ ،‬يجب أن تحقق الدوال متعددة الحدود ذات‬
‫الترتيب األعلى دائمًا خطأ تدريب أقل (في أسوأ األحوال‪ ،‬متساوٍ) بالنسبة إلى كثيرات الحدود من‬
‫الدرجة األدنى‪.‬يف الواقع‪ ،‬كلما كان لكل مثال بيانات قيمة مميزة لـ 𝑥 ‪ ،‬فإن دالة متعددة الحدود‬
‫بدرجة مساوية لعدد أمثلة البيانات يمكن أن تالئم ‪ fit‬مجموعة التدريب تمامًا‪ .‬نحن نتخيل العالقة‬
‫بين درجة متعددة الحدود (تعقيد النموذج) والضبط الناقص مقابل الضبط الزائديف الشكل‬
‫‪.3.6.1‬‬

‫الشكل ‪ 3.6.1‬تأثير تعقيد النموذج على الضبط الناقص والزائد‬


‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪166‬‬

‫‪Dataset Size‬‬ ‫‪3.6.2.2‬‬


‫كما يشير الحد أعاله بالفعل‪ ،‬هناك اعتبار كبير آخر يجب أخذهيف االعتبار وهو حجم مجموعة‬
‫البيانات ‪ .dataset size‬عند إصالح نموذجنا‪ ،‬كلما قل عدد العينات التي لدينايف مجموعة بيانات‬
‫التدريب‪ ،‬زادت احتمالية (واألكثر خطورة) أن نواجه فرط التجهيز‪ .‬مع زيادة كمية بيانات‬
‫التدريب‪ ،‬ينخفض خطأ التعميم عادةً‪ .‬عالوة على ذلك‪ ،‬بشكل عام‪ ،‬المزيد من البيانات ال يضر‬
‫أبدًا‪ .‬بالنسبة للمهمة الثابتة وتوزيع البيانات‪ ،‬يجب أال يزيد تعقيد النموذج بسرعة أكبر من كمية‬
‫البيانات‪ .‬بالنظر إلى المزيد من البيانات‪ ،‬قد نحاول مالءمة نموذج أكثر تعقيدًا‪.‬يف غياب البيانات‬
‫الكافية‪ ،‬ق د يكون من الصعب التغلب على النماذج األبسط‪ .‬بالنسبة للعديد من المهام‪ ،‬يتفوق‬
‫التعلم العميق فقط على النماذج الخطية عندما تتوفر عدة آالف من أمثلة التدريب‪ .‬يرجع النجاح‬
‫الحالي للتعلم العميق جزئيًا إلى وفرة مجموعات البيانات الضخمة الناشئة عن شركات اإلنترنت‬
‫والتخزين الرخيص واألجهزة المتصلة والرقمنة الواسعة لالقتصاد‪.‬‬

‫‪Model Selection‬‬ ‫‪3.6.3‬‬


‫عادة‪ ،‬نختار نموذجنا النهائي‪ ،‬فقط بعد تقييم نماذج متعددة تختلف بطرق مختلفة (بنى مختلفة‪،‬‬
‫أهداف تدريب‪ ،‬ميزات مختارة‪ ،‬معالجة البيانات المسبقة‪ ،‬معدالت التعلم‪ ،‬إلخ)‪ .‬االختيار من‬
‫بين العديد من النماذج يسمى على نحو مناسب اختيار النموذج ‪.model selection‬‬

‫من حيث المبدأ‪ ،‬ال ينبغي أن نلمس مجموعة االختبار الخاصة بنا إال بعد أن نختار جميع معلماتنا‬
‫الفائقة‪ .‬إذا استخدمنا بيانات االختباريف عملية اختيار النموذج‪ ،‬فهناك خطر أننا قد نفرط ‪overfit‬‬
‫في بيانات االختبار‪ .‬عندها سنكونيف مشكلة خطيرة‪ .‬إذا قمنا بزيادة بيانات التدريب الخاصة بنا‪،‬‬
‫فهناك دائمًا تقييم لبيانات االختبار إلبقائنا صادقين‪ .‬ولكن إذا تجاوزنا بيانات االختبار‪ ،‬فكيف‬
‫لنا أن نعرف ذلك؟ انظر ‪ )2005( .Ong et al‬على سبيل المثال كيف يمكن أن يؤدي ذلك إلى‬
‫نتائج سخيفة حتى بالنسبة للنماذج التي يمكن التحكم فيها بإحكاميف التعقيد‪.‬‬

‫وبالتالي‪ ،‬ال ينبغي لنا أبدًا االعتماد على بيانات االختبار الختيار النموذج‪ .‬ومع ذلك ال يمكننا‬
‫االعتماد فقط على بيانات التدريب الختيار النموذج إما ألننا ال نستطيع تقدير خطأ التعميم على‬
‫نفس البيانات التي نستخدمها لتدريب النموذج‪.‬‬

‫في التطبيقات العملية‪ ،‬تصبح الصورة أكثر تعكيرًا‪.‬يف حين أننا من الناحية المثالية لن نلمس بيانات‬
‫االختبار إال مرة واحدة‪ ،‬لتقييم أفضل نموذج أو لمقارنة عدد صغير من النماذج مع بعضها البعض‪،‬‬
‫نادرًا ما يتم تجاهل بيانات االختبار الواقعية بعد استخدام واحد فقط‪ .‬نادرًا ما يمكننا تحمل‬
‫مجموعة اختبار جديدة لكل جولة من التجارب‪.‬يف الواقع‪ ،‬يمكن أن يكون إلعادة تدوير البيانات‬
‫المعيارية لعقود تأثير كبير على تطوير الخوارزميات‪ ،‬على سبيل المثال‪ ،‬لتصنيف الصور ‪image‬‬
‫‪ classification‬والتعرف البصري على األحرف ‪.optical character recognition‬‬
‫‪167‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫تتمثل الممارسة الشائعة لمعالجة مشكلة التدريب على مجموعة االختباريف تقسيم بياناتنا بثالث‬
‫طرق‪ ،‬بمايف ذلك مجموعة التحقق من الصحة باإلضافة إلى مجموعات بيانات التدريب‬
‫واالختبار‪ .‬والنتيجة هي ممارسة غامضة حيث تكون الحدود بين التحقق من الصحة وبيانات‬
‫االختبار غامضة بشكل مثير للقلق‪ .‬ما لم ينص صراحة على خالف ذلك‪،‬يف التجاربيف هذا‬
‫الكتاب‪ ،‬نحن نعمل حقًا مع ما ينبغي أن يُطلق عليه حقًا بيانات التدريب وبيانات التحقق من‬
‫الصحة‪ ،‬بدون مجموعات اختبار حقيقية‪ .‬لذلك‪ ،‬فإن الدقة المبلغ عنهايف كل تجربة للكتاب هي‬
‫في الحقيقة دقة التحقق وليست دقة مجموعة اختبار حقيقية‪.‬‬

‫‪Cross-Validation‬‬ ‫‪3.6.3.1‬‬
‫عندما تكون بيانات التدريب نادرة‪ ،‬فقد ال نتمكن حتى من تحمل بيانات كافية لتشكيل مجموعة‬
‫تحقق مناسبة‪ .‬أحد الحلول الشائعة لهذه المشكلة هو استخدام التحقق المتبادل ‪k-fold‬‬
‫‪ .Cross-Validation‬هنا‪ ،‬يتم تقسيم بيانات التدريب األصلية إلى 𝐾 مجموعات فرعية غير‬
‫متداخلة‪ .‬ثم يتم تنفيذ تدريب النموذج والتحقق من الصحة 𝐾 مرات‪،‬يف كل مرة يتم فيها التدريب‬
‫على مجموعات فرعية والتحقق من صحة ‪ 𝐾 − 1‬مجموعة فرعية مختلفة (المجموعة التي لم‬
‫يتم استخدامها للتدريبيف تلك الجولة)‪ .‬أخيرًا‪ ،‬يتم تقدير أخطاء التدريب والتحقق من الصحة‬
‫من خالل حساب متوسط النتائج من 𝐾 التجارب‪.‬‬

‫‪3.6.4‬‬
‫استكشف هذا القسم بعض أسس التعميميف التعلم اآللي‪ .‬تصبح بعض هذه األفكار معقدة وغير‬
‫بديهية عندما نصل إلى نماذج أعمق‪ ،‬فهناك‪ ،‬تكون النماذج قادرة على الضبط الزائد ‪overfitting‬‬
‫للبيانات بشكل سيئ‪ ،‬ويمكن أن تكون مفاهيم التعقيد ذات الصلة ضمنية وغير بديهية (على‬
‫سبيل المثال‪ ،‬البنى األكبر مع المزيد من المعلمات المعممة بشكل أفضل)‪ .‬نترك لك بعض‬
‫القواعد األساسية‪:‬‬

‫‪ .1‬استخدام مجموعات التحقق من الصحة (أو التحقق المتبادل ‪k-fold Cross-‬‬


‫‪ )Validation‬الختيار النموذج؛‬
‫‪ .2‬غالبًا ما تتطلب النماذج األكثر تعقيدًا المزيد من البيانات؛‬
‫‪ .3‬تتضمن مفاهيم التعقيد ذات الصلة كالً من عدد المعلمات ونطاق القيم التي يُسمح‬
‫لها بأخذها؛‬
‫‪ .4‬مع الحفاظ على جميع األمور األخرى متساوية‪ ،‬تؤدي البيانات المتزايدة دائمًا تقريبًا‬
‫إلى تعميم أفضل؛‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪168‬‬

‫‪ .5‬كل هذا الحديث عن التعميم مبني على افتراض ‪ .IID‬إذا قمنا بتخفيف هذا االفتراض‪،‬‬
‫والسماح للتوزيعات باالنتقال بين فترات التدريب واالختبار‪ ،‬فال يمكننا قول أي شيء‬
‫عن التعميميف غياب افتراض آخر (ربما أكثر اعتدالًا)‪.‬‬

‫‪3.6.5‬‬
‫‪ .1‬متى يمكنك حل مشكلة االنحدار متعدد الحدود ‪polynomial regression‬‬
‫بالضبط؟‬
‫‪ .2‬أعط ما ال يقل عن خمسة أمثلة حيث المتغيرات العشوائية التابعة تجعل معالجة‬
‫المشكلة على أنها بيانات ‪ IID‬غير مستحسنة‪.‬‬
‫‪ .3‬هل يمكن أن تتوقع أال ترى أي خطأيف التدريب؟ ما هي الظروف التي سترى فيها خطأ‬
‫التعميم الصفري؟‬
‫‪ .4‬لماذا يعد التحقق من الصحة المتبادل ذو الطيات ‪k-fold Cross-Validation‬‬
‫مكلفًا جدًا للحساب؟‬
‫‪ .5‬لماذا يكون تقدير خطأ التحقق المتبادل ذو أضعاف منحازة؟‬
‫‪ .6‬يتم تعريف بُعد ‪ VC‬على أنه الحد األقصى لعدد النقاط التي يمكن تصنيفها باستخدام‬
‫تسميات عشوائية }‪ {±1‬بواسطة دالة لفئة من الدوال‪ .‬لماذا قد ال تكون هذه فكرة جيدة‬
‫لقياس مدى تعقيد فئة الدوال؟ تلميح‪ :‬ماذا عن حجم الدوال؟‬
‫‪ .7‬يمنحك مديرك مجموعة بيانات صعبة ال تعمل فيها الخوارزمية الحالية بشكل جيد‪.‬‬
‫كيف تبرر له أنك بحاجة إلى مزيد من البيانات؟ تلميح‪ :‬ال يمكنك زيادة البيانات ولكن‬
‫يمكنك تقليلها‪.‬‬

‫‪Weight Decay‬‬ ‫‪3.7‬‬


‫اآلن بعد أن وصفنا مشكلة الضبط الزائد ‪ ،overfitting‬يمكننا تقديم تقنية التنظيم‬
‫‪ regularization‬األولى لدينا‪ .‬تذكر أنه يمكننا دائمًا التخفيف من فرط التجهيز (الضبط الزائد)‬
‫من خالل جمع المزيد من بيانات التدريب‪ .‬ومع ذلك‪ ،‬قد يكون ذلك مكلفًا أو يستغرق وقتًا‬
‫طويالً أو خارج عن سيطرتنا تمامًا‪ ،‬مما يجعله مستحيلًا على المدى القصير‪.‬يف الوقت الحالي‪،‬‬
‫يمكننا أن نفترض أن لدينا بالفعل قدرًا كبيرًا من البيانات عالية الجودة بقدر ما تسمح به مواردنا‬
‫ونركز على األدوات الموجودة تحت تصرفنا حتى عندما يتم أخذ مجموعة البيانات على أنها أمر‬
‫مفروغ منه‪.‬‬

‫تذكر أنهيف مثال االنحدار متعدد الحدود ‪ polynomial regression‬الخاص بنا (القسم‬
‫‪ ،)3.6.2.1‬يمكننا تحديد سعة نموذجنا عن طريق تعديل درجة كثير الحدود المتوافقة‪.‬يف الواقع‪،‬‬
‫يعد الحد من عدد الميزات أسلوبًا شائ‪1‬عًا للتخفيف من الضبط الزائد‪ .‬ومع ذلك‪ ،‬فإن مجرد‬
‫‪169‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫إهمال الميزات جانباً يمكن أن يكون أداة حادة للغاية‪ .‬بالتمسك بمثال االنحدار متعدد الحدود‪،‬‬
‫ضعيف اعتبارك ما يمكن أن يحدث مع المدخالت عالية األبعاد ‪.high-dimensional input‬‬
‫تسمى االمتدادات الطبيعية لكثيرات الحدود للبيانات متعددة المتغيرات باحادية الحد‬
‫‪ ،monomials‬والتي هي ببساطة نتاج قوى المتغيرات‪ .‬درجة المتغيرات أحادية الحد هي‬
‫مجموع القوى‪ .‬فمثال‪ 𝑥12 𝑥2 ،‬و ‪ 𝑥3 𝑥52‬كالهما أحادي الحد من الدرجة الثالثة‪.‬‬

‫الحظ أن عدد الحدود مع الدرجة 𝑑 يتضخم بسرعة كلما زاد حجم 𝑑‪ .‬بالنظر إلى المتغيرات 𝑘 ‪،‬‬
‫𝑑‪ .(𝑘−1+‬حتى التغييرات‬
‫‪𝑘−1‬‬
‫يكون عدد احاديات الحد من الدرجة 𝑑 (أي 𝑘 متعدد الخيوط 𝑑) هو )‬
‫الصغيرةيف الدرجة‪ ،‬لنقل من ‪ 2‬إلى ‪ ، 3‬تزيد بشكل كبير من تعقيد نموذجنا‪ .‬وبالتالي نحتاج غالبًا‬
‫إلى أداة أكثر دقة لتعديل تعقيد الدالة‪.‬‬

‫‪Norms and Weight Decay‬‬ ‫‪3.7.1‬‬


‫بدالً من التالعب المباشر بعدد المعلمات‪ ،‬يعمل تناقص الوزن عن طريق تقييد القيم التي يمكن‬
‫أن تأخذها المعلمات‪ .‬أكثر شيوعًا يسمى التنظيم ‪ )ℓ2 𝑟𝑒𝑔𝑢𝑙𝑎𝑟𝑖𝑧𝑎𝑡𝑖𝑜𝑛 ( ℓ2‬خارج دوائر‬
‫التعلم العميق عند تحسينه عن طريق التدرج االشتقاقي العشوائي المصغر ‪،minibatch SGD‬‬
‫قد يكون تناقص الوزن هو األسلوب األكثر استخدامًا على نطاق واسع لتنظيم نماذج التعلم اآللي‬
‫البارامترية‪ .‬يتم تحفيز هذه التقنية من خالل الحدس األساسي الذي مفاده أن الدالة ‪𝑓 = 0‬‬
‫(تعيين القيمة ‪ 0‬لجميع المدخالت) من بين جميع الدوال 𝑓 هي أبسطها بمعنى ما‪ ،‬وأنه يمكننا‬
‫قياس مدى تعقيد الدالة من خالل مسافة معلماتها من الصفر‪ .‬ولكن ما مدى دقة قياس المسافة‬
‫بين الدالة والصفر؟ ال توجد إجابة واحدة صحيحة‪.‬يف الواقع‪ ،‬تم تخصيص فروع كاملة‬
‫للرياضيات‪ ،‬بمايف ذلك أجزاء من التحليل الدالي ونظرية فضاءات باناخ ‪،Banach spaces‬‬
‫لمعالجة مثل هذه القضايا‪.‬‬

‫قد يكون أحد التفسيرات البسيطة هو قياس مدى تعقيد دالة خطية 𝐱 ⊤ 𝐰 = )𝐱(𝑓 من خالل‬
‫معيار ‪ norm‬معين لمتجه وزنها‪ ،‬على سبيل المثال ‪ .‖𝐰‖2‬تذكر أننا قدمنا المعيار ‪ ℓ2‬والمعيار‬
‫‪ ، ℓ1‬وهما حاالت خاصة للمعيار األكثر عمومية 𝑝‪ℓ‬يف القسم ‪ .2.3.11‬الطريقة األكثر شيوعًا‬
‫لضمان متجه وزن صغير هي إضافة معياره كمصطلح جزائي لمشكلة تقليل الخطأ‪ .‬وهكذا نستبدل‬
‫هدفنا األصلي‪ ،‬وهو تقليل خطأ التنبؤ ‪ prediction loss‬على تسميات التدريب ‪training‬‬
‫‪ ،labels‬بهدف جديد‪ ،‬وتقليل مجموع خطأ التنبؤ ‪ sum of the prediction loss‬ومدة العقوبة‬
‫‪ .penalty term‬اآلن‪ ،‬إذا نما متجه الوزن بشكل كبير جدًا‪ ،‬فقد تركز خوارزمية التعلم الخاصة‬
‫بنا على تقليل معيار الوزن ‪ ‖𝐰‖2‬إلى الحد األدنى مقابل تقليل خطأ التدريب‪ .‬هذا هو بالضبط‬
‫ما نريده‪ .‬لتوضيح األشياءيف الكود‪ ،‬نعيد إحياء مثالنا السابق من القسم ‪ 3.1‬لالنحدار الخطي‪.‬‬
‫هناك‪ ،‬خطأنا‪:‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪170‬‬

‫𝑛‬
‫‪1‬‬ ‫)𝑖( ⊤ ‪1‬‬
‫∑ = )𝑏 ‪𝐿(𝐰,‬‬ ‫‪(𝐰 𝐱 + 𝑏 − 𝑦 (𝑖) )2 .‬‬
‫𝑛‬ ‫‪2‬‬
‫‪𝑖=1‬‬

‫تذكر أن )𝑖( 𝐱 هي الميزات‪ 𝑦 (𝑖) ،‬هي التسمية ألي مثال بيانات 𝑖 ‪ (𝐰, 𝑏)،‬وهي معلمات الوزن‬
‫والتحيز‪ ،‬على التوالي‪ .‬لمعاقبة حجم متجه الوزن ‪ ،weight vector‬يجب أن نضيف ‪‖𝐰‖2‬‬
‫بطريقة ما إلى دالة الخطأ‪ ،‬ولكن كيف يجب أن يقايض النموذج الخطأ القياسي لهذه العقوبة‬
‫المضافة الجديدة؟يف الممارسة العملية‪ ،‬نميز هذه المقايضة من خالل ثابت التنظيم 𝜆 ‪ ،‬وهو‬
‫معلمة فائقة غير سلبية نالئمها باستخدام بيانات التحقق من الصحة ‪:validation data‬‬

‫𝜆‬
‫‪𝐿(𝐰, 𝑏) + ‖𝐰‖2 .‬‬
‫‪2‬‬
‫بالنسبة لـ ‪ ، 𝜆 = 0‬نستعيد دالة الخسارة األصلية الخاصة بنا‪ .‬لـ ‪ ، 𝜆 > 0‬نحن نقيد حجم ‖𝐰‖‪.‬‬
‫نقسم على ‪ 2‬حسب االصطالح‪ :‬عندما نأخذ مشتق دالة تربيعية‪ ،‬نلغي ‪ 2‬ونلغي ‪ ، 1/2‬مما يضمن‬
‫أن تعبير التحديث يبدو لطيفًا وبسيطًا‪ .‬قد يتساءل القارئ الذكي عن سبب تعاملنا مع المعيار‬
‫التربيعي ‪ squared norm‬وليس المعيار القياسي ‪( standard norm‬أي المسافة اإلقليدية)‪.‬‬
‫نحن نفعل هذا للراحة الحسابية‪ .‬بتربيع المعيار ‪ ، ℓ2‬نزيل الجذر التربيعي‪ ،‬ونترك مجموع مربعات‬
‫كل مكون من متجه الوزن‪ .‬هذا يجعل من السهل حساب مشتق العقوبة‪ :‬مجموع المشتقات‬
‫يساوي مشتق المجموع‪.‬‬

‫عالوة على ذلك‪ ،‬قد تسأل لماذا نتعامل مع المعيار ‪ ℓ2‬يف المقام األول وليس‪ ،‬على سبيل المثال‪،‬‬
‫المعيار ‪.ℓ1‬يف الواقع‪ ،‬الخيارات األخرى صالحة وشائعةيف جميع اإلحصاءات‪.‬يف حين أن النماذج‬
‫الخطية المنتظمة ‪ ℓ2‬تشكل خوارزمية انحدار ريدج ‪ ،ridge regression algorithm‬فإن‬
‫االنحدار الخطي المنتظم ‪ ℓ1‬هو طريقة أساسية مماثلةيف اإلحصاء‪ ،‬والمعروفة باسم انحدار السو‬
‫(‪ .)lasso regression‬أحد أسباب العمل مع المعيار ‪ ℓ2‬هو أنه يفرض عقوبة كبيرة على‬
‫المكونات الكبيرة لمتجه الوزن‪ .‬يؤدي هذا إلى تحيز خوارزمية التعلم الخاصة بنا نحو النماذج‬
‫التي توزع الوزن بالتساوي عبر عدد أكبر من الميزات‪.‬يف الممارسة العملية‪ ،‬قد يجعلهم ذلك أكثر‬
‫قوةيف مواجهة خطأ القياسيف متغير واحد‪ .‬على النقيض من ذلك‪ ،‬تؤدي العقوبات ‪ ℓ1‬إلى نماذج‬
‫تركز األوزان على مجموعة صغيرة من الميزات عن طريق إزالة األوزان األخرى إلى الصفر‪ .‬يمنحنا‬
‫هذا طريقة فعالة الختيار الميزة‪ ،‬والتي قد تكون مرغوبة ألسباب أخرى‪ .‬على سبيل المثال‪ ،‬إذا‬
‫كان نموذجنا يعتمد فقط على بعض الميزات‪ ،‬فقد ال نحتاج إلى جمع البيانات أو تخزينها أو‬
‫نقلها للميزات األخرى (التي تم إسقاطها ‪.)dropped‬‬

‫باستخدام نفس الترميزيف (‪ ،)3.1.11‬تتبع تحديثات التدرج االشتقاقي العشوائي المصغر‬


‫لالنحدار المنتظم ‪:ℓ2‬‬
‫‪171‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫𝜂‬
‫‪𝐰 ← (1 − 𝜂𝜆)𝐰 −‬‬ ‫∑‬ ‫‪𝐱 (𝑖) (𝐰 ⊤ 𝐱 (𝑖) + 𝑏 − 𝑦 (𝑖) ).‬‬
‫|‪|ℬ‬‬
‫‪𝑖∈ℬ‬‬

‫كمايف السابق‪ ،‬نقوم بتحديث 𝐰 بناءً على المقدار الذي يختلف به تقديرنا عن المالحظة‪ .‬ومع‬
‫ذلك‪ ،‬فإننا نقوم أيضًا بتقليص حجم 𝐰 باتجاه الصفر‪ .‬هذا هو السببيف أن الطريقة تسمى أحيانًا‬
‫"تضاؤل او تناقص الوزن ‪ :" weight decay‬نظرًا لمصطلح العقوبة وحده‪ ،‬فإن خوارزمية‬
‫التحسين الخاصة بنا تنقص الوزنيف كل خطوة من خطوات التدريب‪ .‬على عكس اختيار الميزة‬
‫‪ ،feature selection‬يوفر لنا تناقص الوزن آلية مستمرة لضبط تعقيد الدالة‪ .‬تتوافق القيم األصغر‬
‫لـ 𝜆 ألقل تقييدًا لـ 𝐰 ‪،‬يف حين أن القيم األكبر 𝜆 تقيد 𝐰 أكثر وضوحًا‪ .‬ما إذا كنا نقوم بتضمين‬
‫عقوبة التحيز ‪ 𝑏 2‬المقابلة يمكن أن تختلف عبر التطبيقات‪ ،‬وقد تختلف عبر طبقات الشبكة‬
‫العصبية‪.‬يف كثير من األحيان‪ ،‬ال نقوم بتنظيم مصطلح التحيز‪ .‬إلى جانب ذلك‪ ،‬على الرغم من أن‬
‫التنظيم قد ال يكون مكافئًا لتناقص الوزن بالنسبة لخوارزميات التحسين األخرى‪ ،‬إال أن فكرة‬
‫التنظيم من خالل تقليص حجم األوزان ال تزال صحيحة‪.‬‬

‫‪High-Dimensional‬‬ ‫‪Linear‬‬ ‫‪3.7.2‬‬


‫‪Regression‬‬
‫يمكننا توضيح فوائد تناقص الوزن من خالل مثال تركيبي بسيط‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫أوالً‪ ،‬نقوم بإنشاء بعض البيانات كمايف السابق‪:‬‬
‫𝑑‬

‫∑ ‪𝑦 = 0.05 +‬‬ ‫‪0.01𝑥𝑖 + 𝜖 where 𝜖 ∼ 𝒩(0, 0.012 ).‬‬


‫‪𝑖=1‬‬

‫في مجموعة البيانات التركيبية ‪ synthetic dataset‬هذه‪ ،‬يتم إعطاء التسمية الخاصة بنا من‬
‫خالل دالة خطية أساسية لمدخالتنا‪ ،‬تالفة بسبب الضوضاء الغاوسية مع متوسط الصفر‬
‫واالنحراف المعياري ‪ .0.01‬ألغراض توضيحية‪ ،‬يمكننا أن نجعل تأثيرات الضبط الزائد واضحة‪،‬‬
‫من خالل زيادة أبعاد مشكلتنا لـ ‪ 𝑑 = 200‬والعمل مع مجموعة تدريب صغيرة مع ‪ 20‬مثالًا‬
‫فقط‪.‬‬

‫‪class Data(d2l.DataModule):‬‬
‫‪def __init__(self, num_train, num_val, num_inputs,‬‬
‫‪batch_size):‬‬
‫)(‪self.save_hyperparameters‬‬
‫‪n = num_train + num_val‬‬
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 172

self.X = tf.random.normal((n, num_inputs))


noise = tf.random.normal((n, 1)) * 0.01
w, b = tf.ones((num_inputs, 1)) * 0.01, 0.05
self.y = tf.matmul(self.X, w) + b + noise

def get_dataloader(self, train):


i = slice(0, self.num_train) if train else
slice(self.num_train, None)
return self.get_tensorloader([self.X, self.y],
train, i)
Implementation from Scratch 3.7.3
‫ نظرًا ألن التدرج االشتقاقي العشوائي المصغر‬.‫ دعونا نحاول تطبيق تناقص الوزن من الصفر‬،‫اآلن‬
ℓ2 ‫ فنحن نحتاج فقط إلى إضافة عقوبة تربيعية‬، ‫ هو المحسّن الخاص بنا‬SGD minibatch
.‫إلى دالة الخطأ األصلية‬

Defining ℓ2 Norm Penalty ℓ2 3.7.3.1


.‫ربما تكون الطريقة األكثر مالءمة لتنفيذ هذه العقوبة هي تسوية كل الشروط الموجودة وتلخيصها‬

def l2_penalty(w):
return tf.reduce_sum(w**2) / 2
Defining the Model 3.7.3.2
‫ لذلك سنقوم‬،3.4 ‫ لم يتغير االنحدار الخطي والخطأ التربيعي منذ القسم‬،‫في النموذج النهائي‬
‫ التغيير الوحيد هنا هو أن‬.d2l.LinearRegressionScratch ‫فقط بتعريف فئة فرعية من‬
.‫خطأنا تشمل اآلن مصطلح العقوبة‬

class WeightDecayScratch(d2l.LinearRegressionScratch):
def __init__(self, num_inputs, lambd, lr,
sigma=0.01):
super().__init__(num_inputs, lr, sigma)
self.save_hyperparameters()

def loss(self, y_hat, y):


return super().loss(y_hat, y) + self.lambd *
l2_penalty(self.w)
‫ مثالًا ويقيمه على مجموعة التحقق من‬20 ‫يناسب الكود التالي نموذجنايف مجموعة التدريب مع‬
.‫ مثال‬100 ‫الصحة مع‬

data = Data(num_train=20, num_val=100, num_inputs=200,


batch_size=5)
‫‪173‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫)‪trainer = d2l.Trainer(max_epochs=10‬‬

‫‪def train_scratch(lambd):‬‬
‫‪model = WeightDecayScratch(num_inputs=200,‬‬
‫)‪lambd=lambd, lr=0.01‬‬
‫'‪model.board.yscale='log‬‬
‫)‪trainer.fit(model, data‬‬
‫)))‪print('L2 norm of w:', float(l2_penalty(model.w‬‬
‫‪Training without Regularization‬‬ ‫‪3.7.3.3‬‬
‫نقوم اآلن بتشغيل هذا الكود مع ‪ ،lambd = 0‬مما يؤدي إلى تعطيل تناقص الوزن ‪weight‬‬
‫‪ .decay‬الحظ أننا نفرطيف التجهيز بشكل سيئ‪ ،‬مما يقلل من خطأ التدريب ولكن ليس خطأ‬
‫التحقق من الصحة ‪ -‬وهي حالة كتابية من الضبط الزائد ‪.overfitting‬‬

‫)‪train_scratch(0‬‬
‫‪L2 norm of w: 0.010603310540318489‬‬

‫‪Using Weight Decay‬‬ ‫‪3.7.3.4‬‬


‫أدناه‪ ،‬نجري مع تناقص كبيريف الوزن‪ .‬الحظ أن خطأ التدريب يزداد ولكن خطأ التحقق من الصحة‬
‫يتناقص‪ .‬هذا هو بالضبط التأثير الذي نتوقعه من التنظيم‪.‬‬

‫)‪train_scratch(3‬‬
‫‪L2 norm of w: 0.0014634879771620035‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪174‬‬

‫‪Concise Implementation‬‬ ‫‪3.7.4‬‬


‫نظرًا ألن تناقص الوزن موجوديف كل مكانيف تحسين الشبكة العصبية‪ ،‬فإن إطار التعلم العميق‬
‫يجعله مناسبًا بشكل خاص‪ ،‬حيث يدمج تناقص الوزنيف خوارزمية التحسين نفسها لسهولة‬
‫االستخدام مع أي دالة خطأ‪ .‬عالوة على ذلك‪ ،‬يخدم هذا التكامل فائدة حسابية‪ ،‬مما يسمح لحيل‬
‫التنفيذ بإضافة تناقص الوزن إلى الخوارزمية‪ ،‬دون أي نفقات حسابية إضافية‪ .‬نظرًا ألن جزء‬
‫تناقص الوزنيف التحديث يعتمد فقط على القيمة الحالية لكل معلمة‪ ،‬يجب أن يلمس المحسن‬
‫كل معلمة مرة واحدة على أي حال‪.‬‬

‫في الكود التالي‪ ،‬أنشأنا منظم ‪ ℓ2‬باستخدام المعامل التشعبي لتناقص الوزن ونطبقه على أوزان‬
‫الطبقة من خالل وسيطة ‪.kernel_regularizer‬‬

‫‪class WeightDecay(d2l.LinearRegression):‬‬
‫‪def __init__(self, wd, lr):‬‬
‫)‪super().__init__(lr‬‬
‫)(‪self.save_hyperparameters‬‬
‫(‪self.net = tf.keras.layers.Dense‬‬
‫‪1,‬‬
‫‪kernel_regularizer=tf.keras.regularizers.l2(wd),‬‬

‫‪kernel_initializer=tf.keras.initializers.RandomNormal(0,‬‬
‫)‪0.01‬‬
‫)‬

‫‪def loss(self, y_hat, y):‬‬


‫‪return super().loss(y_hat, y) + self.net.losses‬‬
‫‪175‬‬ ‫الفصل الثالث‪ :‬الشبكات العصبية الخطية لالنحدار‬

‫تبدو الحبكة مشابهة لتلك التي حدثت عندما نفذنا عملية تناقص الوزن من نقطة الصفر‪ .‬ومع‬
‫ذلك‪ ،‬يعمل هذا اإلصدار بشكل أسرع وأسهليف التنفيذ‪ ،‬وستصبح الفوائد أكثر وضوحًا عندما‬
‫تعالج مشاكل أكبر ويصبح هذا العمل روتينيًا بشكل أكبر‪.‬‬

‫)‪model = WeightDecay(wd=3, lr=0.01‬‬


‫'‪model.board.yscale='log‬‬
‫)‪trainer.fit(model, data‬‬
‫‪print('L2 norm of w:',‬‬
‫)))]‪float(l2_penalty(model.get_w_b()[0‬‬

‫حتى اآلن‪ ،‬تطرقنا فقط إلى فكرة واحدة عما يشكل دالة خطية بسيطة‪ .‬عالوة على ذلك‪ ،‬ما الذي‬
‫يشكل دالة غير خطية بسيطة يمكن أن يكون سؤالًا أكثر تعقيدًا‪ .‬على سبيل المثال‪ ،‬يسمح‬
‫)‪ reproducing kernel Hilbert space (RKHS‬للمرء بتطبيق األدوات المقدمة للدوال‬
‫الخطيةيف سياق غير خطي‪ .‬لسوء الحظ‪ ،‬تميل الخوارزميات المستندة إلى ‪ RKHS‬إلى التوسع‬
‫بشكل سيئيف البيانات الكبيرة عالية األبعاد‪.‬يف هذا الكتاب‪ ،‬غالبًا ما نعتمد االستدالل المشترك‬
‫حيث يتم تطبيق انحالل (تناقص) الوزن على جميع طبقات الشبكة العميقة‪.‬‬

‫‪3.7.5‬‬
‫التنظيم ‪ Regularization‬هو طريقة شائعة للتعامل مع فرط التجهيز ‪.overfitting‬‬ ‫•‬
‫تضيف تقنيات التنظيم الكالسيكية مصطلحًا جزائيًا ‪ penalty term‬لدالة الخطأ (عند‬
‫التدريب) لتقليل تعقيد النموذج الذي تم تعلمه‪.‬‬
‫أحد الخيارات المحددة للحفاظ على النموذج بسيطًا هو استخدام عقوبة ‪ .ℓ2‬هذا‬ ‫•‬
‫يؤدي إلى تناقص الوزنيف خطوات التحديث لخوارزمية التدرج االشتقاقي العشوائي‬
‫المصغر‪.‬‬
‫يتم توفير دالة تناقص الوزنيف المُحسِّنون من أطر التعلم العميق‪.‬‬ ‫•‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪176‬‬

‫يمكن أن يكون للمجموعات المختلفة من المعلمات سلوكيات تحديث مختلفةيف ‬ ‫•‬


‫نفس حلقة التدريب‪.‬‬

‫‪3.7.6‬‬
‫‪ .1‬جرب قيمة 𝜆يف مسألة التقديريف هذا القسم‪ .‬ارسم دقة التدريب ودقة التحقق من الصحة‬
‫كدالة‪ .‬ماذا تالحظ؟‬
‫‪ .2‬استخدم مجموعة التحقق ‪ validation set‬للعثور على القيمة المثلى لـ 𝜆‪ .‬هل هي‬
‫حقا القيمة المثلى؟ هل هذا مهم؟‬
‫‪ .3‬كيف ستبدو معادالت التحديث إذا استخدمنا | 𝑖𝑤 | 𝑖∑ بدالً من ‖𝐰‖ كعقوبة اختيار‬
‫‪2‬‬

‫(تنظيم ‪)ℓ1‬؟‬
‫‪ .4‬نحن نعلم 𝐰 𝐰 = ‖𝐰‖‪ .‬هل يمكنك العثور على معادلة مماثلة للمصفوفات‬
‫‪2‬‬ ‫⊤‬

‫(راجع معيار ‪Frobenius‬يف القسم ‪)2.3.11‬؟‬


‫‪ .5‬راجع العالقة بين خطأ التدريب ‪ training error‬وخطأ التعميم ‪generalization‬‬
‫‪ .error‬باإلضافة إلى تناقص الوزن ‪ ،weight decay‬وزيادة التدريب ‪increased‬‬
‫‪ ،training‬واستخدام نموذج التعقيد المناسب‪ ،‬ما هي الطرق األخرى التي يمكنك‬
‫التفكير بها للتعامل مع فرط التجهيز؟‬
‫‪ .6‬في إحصائيات بايز ‪ ،Bayesian statistics‬نستخدم ناتج سابق واحتمالية الوصول إلى‬
‫الحقة عبر )𝑤(𝑃)𝑤 ∣ 𝑥(𝑃 ∝ )𝑥 ∣ 𝑤(𝑃‪ .‬كيف يمكنك تحديد )𝑤(𝑃 مع التنظيم‬
‫‪regularization‬؟‬
‫‪4‬‬
‫الشبكات العصبية الخطية‬
‫للتصنيف‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪178‬‬

‫‪Linear Neural‬‬ ‫‪4‬‬


‫‪Networks for Classification‬‬
‫اآلن بعد أن عملت من خالل جميع اآلليات‪ ،‬فأنت جاهز لتطبيق هذه المهارات على أنواع أوسع‬
‫من المهام‪ .‬حتى عندما نتجه نحو التصنيف ‪ ،Classification‬تظل معظم أعمال السباكة كما‬
‫هي‪ :‬تحميل البيانات‪ ،‬وتمريرها عبر النموذج‪ ،‬وتوليد المخرجات‪ ،‬وحساب الخطأ‪ ،‬وأخذ‬
‫التدرجات فيما يتعلق باألوزان‪ ،‬وتحديث النموذج‪ .‬ومع ذلك‪ ،‬فإن الشكل الدقيق لألهداف‪،‬‬
‫ومعلمات طبقة المخرجات‪ ،‬واختيار دالة الخطأ سوف تتكيف لتالئم إعداد التصنيف‪.‬‬

‫‪Softmax‬‬ ‫‪4.1‬‬
‫في القسم ‪ ،3.1‬قدمنا االنحدار الخطي‪ ،‬والعمل من خالل عمليات التنفيذ من البدايةيف القسم‬
‫‪ 3.4‬ومرة أخرى باستخدام واجهات برمجة التطبيقات ‪ API‬عالية المستوى إلطار عمل التعلم‬
‫العميقيف القسم ‪ 3.5‬للقيام بالرفع الثقيل‪.‬‬

‫االنحدار ‪ Regression‬هو المطرقة التي نصل إليها عندما نريد أن نجيب إلى أي مدى؟ أو كم‬
‫عددها؟ أسئلة‪ .‬إذا كنت ترغبيف التنبؤ بعدد الدوالرات (السعر) التي سيتم بيع منزل بها‪ ،‬أو عدد‬
‫مرات الفوز التي قد يحققها فريق البيسبول‪ ،‬أو عدد األيام التي سيبقى فيها المريضيف المستشفى‬
‫قبل الخروج من المستشفى‪ ،‬فمن المحتمل أنك تبحث عن نموذج االنحدار‪ .‬ومع ذلك‪ ،‬حتىيف ‬
‫نماذج االنحدار‪ ،‬هناك فروق مهمة‪ .‬على سبيل المثال‪ ،‬لن يكون سعر المنزل سالبًا أبدًا وقد تكون‬
‫التغييراتيف الغالب مرتبطة بسعره األساسي‪ .‬على هذا النحو‪ ،‬قد يكون التراجع عن لوغاريتم‬
‫السعر أكثر فاعلية‪ .‬وبالمثل‪ ،‬فإن عدد األيام التي يقضيها المريضيف المستشفى هو متغير عشوائي‬
‫منفصل غير سلبي‪ .‬على هذا النحو‪ ،‬قد ال تكون المربعات األقل داللة نهجًا مثاليًا أيضًا‪ .‬يأتي هذا‬
‫النوع من النمذجة من وقت إلى حدث ‪ time-to-event modeling‬مع مجموعة من‬
‫المضاعفات األخرى التي يتم التعامل معهايف حقل فرعي متخصص يسمى نمذجة البقاء‬
‫‪.survival modeling‬‬

‫وجهة النظر هنا ليست إرباكك ولكن فقط إلعالمك بأن هناك الكثير من التقدير أكثر من مجرد‬
‫تقليل األخطاء التربيعية‪ .‬وعلى نطاق أوسع‪ ،‬هناك الكثير للتعلم الخاضع لإلشراف أكثر من‬
‫االنحدار‪.‬يف هذا القسم نركز على مشاكل التصنيف ‪ classification problems‬حيث نضع‬
‫جانبا كم؟ األسئلة وبدالً من ذلك التركيز على أي فئة؟ أسئلة‪.‬‬

‫هل ينتمي هذا البريد اإللكتروني إلى مجلد البريد العشوائي أو صندوق البريد الوارد؟‬ ‫•‬
‫هل من المرجح أن يقوم هذا العميل بالتسجيل أو عدم االشتراكيف خدمة االشتراك؟‬ ‫•‬
‫هل تصور هذه الصورة حمارًا أو كلبًا أو قطة أو ديكًا؟‬ ‫•‬
‫‪179‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫ما هو الفيلم الذي من المرجح أن يشاهده أستون بعد ذلك؟‬ ‫•‬


‫أي قسم من الكتاب سوف تقرأه بعد ذلك؟‬ ‫•‬

‫بالعامية‪ ،‬يثقل ممارسو التعلم اآللي كلمة التصنيف ‪ classification‬لوصف مشكلتين مختلفتين‬
‫تمامًا‪ )1( :‬تلك التي نهتم فيها فقط بالتخصيصات الصعبة لألمثلة للفئات ‪( categories‬الفئات‬
‫‪)classes‬؛ و(‪ )2‬تلك التي نرغبيف إجراء تخصيصات بسيطة‪ ،‬أي لتقييم احتمالية تطبيق كل فئة‪.‬‬
‫يميل التمييز إلى التعتيم جزئيًا‪ ،‬ألنهيف كثير من األحيان‪ ،‬حتى عندما نهتم فقط بالمهام الصعبة‪،‬‬
‫ما زلنا نستخدم النماذج التي تقوم بمهام بسيطة‪.‬‬

‫أكثر من ذلك‪ ،‬هناك حاالت يكون فيها أكثر من تسمية ‪ label‬واحدة صحيحة‪ .‬على سبيل المثال‪،‬‬
‫قد تغطي مقالة إخباريةيف نفس الوقت موضوعات الترفيه واألعمال ورحالت الفضاء‪ ،‬ولكن ال‬
‫تغطي موضوعات الطب أو الرياضة‪ .‬وبالتالي‪ ،‬فإن تصنيفها إلى إحدى الفئات المذكورة أعاله‬
‫بمفردها لن يكون مفيدًا للغاية‪ .‬تُعرف هذه المشكلة عمومًا باسم التصنيف متعدد التسميات‬
‫‪ .multi-label classification‬انظر ‪ )2007( Tsoumakas and Katakis‬للحصول على‬
‫نظرة عامة و ‪ )2015( .Huang et al‬لخوارزمية فعالة عند وضع عالمات ‪ tagging‬على الصور‪.‬‬

‫‪Classification‬‬ ‫‪4.1.1‬‬
‫لتبليل أقدامنا‪ ،‬لنبدأ بمشكلة بسيطةيف تصنيف الصور ‪ .image classification‬هنا‪ ،‬يتكون كل‬
‫إدخال من ‪ 2 × 2‬صورة ذات تدرج رمادي‪ .‬يمكننا تمثيل كل قيمة بكسل باستخدام عدد قياسي‬
‫واحد‪ ،‬مما يعطينا أربع ميزات ‪ .𝑥1 , 𝑥2 , 𝑥3 , 𝑥4‬عالوة على ذلك‪ ،‬لنفترض أن كل صورة تنتمي‬
‫إلى واحدة من بين الفئات "قطة" و "دجاج" و "كلب"‪.‬‬

‫بعد ذلك‪ ،‬علينا أن نختار كيفية تمثيل التسميات ‪ .labels‬لدينا خياران واضحان‪ .‬ربما يكون‬
‫الدافع األكثر طبيعية هو اختيار }‪ ، 𝑦 ∈ {1,2,3‬حيث تمثل األعداد الصحيحة‬
‫}‪ {dog,cat,chicken‬على التوالي‪ .‬هذه طريقة رائعة لتخزين مثل هذه المعلومات على جهاز‬
‫الكمبيوتر‪ .‬إذا كان للفئات بعض الترتيب الطبيعي فيما بينها‪ ،‬على سبيل المثال إذا كنا نحاول‬
‫التنبؤ بـ }‪ ،{baby,toddler,adolescent,young adult,adult,geriatric‬فقد يكون من‬
‫المنطقي اعتبار ذلك مشكلة انحدار ترتيبية واالحتفاظ بالتسميات بهذا التنسيق‪ .‬انظر ‪Moon‬‬
‫‪ )2010( .et al‬للحصول على نظرة عامة على أنواع مختلفة من دوال فقدان الترتيب و ‪Beutel‬‬
‫‪ )2014( .et al‬لنهج بايزي ‪ Bayesian approach‬الذي يعالج االستجابات بأكثر من وضع‪.‬‬

‫بشكل عام‪ ،‬ال تأتي مشاكل التصنيف مع الترتيب الطبيعي بين الفئات ‪ .classes‬لحسن الحظ‪،‬‬
‫ابتكر اإلحصائيون منذ فترة طويلة طريقة بسيطة لتمثيل البيانات الفئوية ‪:categorical data‬‬
‫التشفير الواحد الساخن ‪ .one-hot encoding‬الترميز الواحد الساخن هو متجه يحتوي على‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪180‬‬

‫العديد من المكونات مثل الفئات الموجودة لدينا‪ .‬يتم تعيين المكون المقابل لفئة مثيل معين‬
‫على ‪ 1‬ويتم تعيين جميع المكونات األخرى على ‪.0‬يف حالتنا‪ ،‬سيكون التسمية 𝑦 متجهًا ثالثي‬
‫األبعاد‪ ،‬مع )‪ (1,0,0‬المقابل لـ "قطة" و)‪" (0,1,0‬دجاجة" و)‪ " (0,0,1‬كلب"‪:‬‬

‫‪𝑦 ∈ {(1,0,0), (0,1,0), (0,0,1)}.‬‬

‫‪Linear Model‬‬ ‫‪4.1.1.1‬‬


‫لتقدير االحتماالت الشرطية المرتبطة بجميع الفئات الممكنة‪ ،‬نحتاج إلى نموذج بمخرجات‬
‫متعددة‪ ،‬واحدة لكل فئة‪ .‬لمعالجة التصنيف بالنماذج الخطية‪ ،‬سنحتاج إلى العديد من الدوال‬
‫األفينية ‪ affine functions‬مثل عدد المخرجات‪ .‬بالمعنى الدقيق للكلمة‪ ،‬نحتاج فقط إلى واحد‬
‫أقل‪ ،‬ألن الفئة األخيرة يجب أن تكون الفرق بين ‪ 1‬ومجموع الفئات األخرى ولكن ألسباب‬
‫التناظر ‪ symmetry‬نستخدم معلمات زائدة عن الحاجة‪ .‬كل ناتج يتوافق مع الدالة األفينية‬
‫الخاصة به‪.‬يف حالتنا‪ ،‬نظرًا ألن لدينا ‪ 4‬ميزات و‪ 3‬فئات إخراج محتملة‪ ،‬نحتاج إلى ‪ 12‬قيمة‬
‫قياسية ‪ Scalar‬لتمثيل األوزان (𝑤 مع الرموز المنخفضة ‪ ،)subscripts‬و‪ 3‬مقاييس لتمثيل‬
‫التحيزات (𝑏 مع الرموز المنخفضة ‪ .)subscripts‬هذه العوائد‪:‬‬

‫‪𝑜1‬‬ ‫‪= 𝑥1 𝑤11 + 𝑥2 𝑤12 + 𝑥3 𝑤13 + 𝑥4 𝑤14 + 𝑏1 ,‬‬


‫‪𝑜2‬‬ ‫‪= 𝑥1 𝑤21 + 𝑥2 𝑤22 + 𝑥3 𝑤23 + 𝑥4 𝑤24 + 𝑏2 ,‬‬
‫‪𝑜3‬‬ ‫‪= 𝑥1 𝑤31 + 𝑥2 𝑤32 + 𝑥3 𝑤33 + 𝑥4 𝑤34 + 𝑏3 .‬‬

‫يظهر مخطط الشبكة العصبية المقابليف الشكل ‪ .4.1.1‬كما هو الحاليف االنحدار الخطي‪،‬‬
‫نستخدم شبكة عصبية أحادية الطبقة ‪ .single-layer neural network‬ونظرًا ألن حساب كل‬
‫ناتج ‪ ،𝑜1 , 𝑜2‬ويعتمد على جميع المدخالت‪ 𝑥1 ،‬و ‪ 𝑥3 ، 𝑥2‬و ‪ ، 𝑥4‬يمكن أيضًا وصف طبقة‬
‫المخرجات بأنها طبقة متصلة بالكامل ‪.fully connected layer‬‬

‫الشكل ‪ 4.1.1‬انحدار ‪ Softmax‬عبارة عن شبكة عصبية أحادية الطبقة‪.‬‬


‫‪181‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫للحصول على تدوين أكثر إيجازًا‪ ،‬نستخدم المتجهات والمصفوفات‪ 𝐨 = 𝐖𝐱 + 𝐛:‬وهي أكثر‬
‫مالءمة للرياضيات والرموز‪ .‬الحظ أننا جمعنا كل أوزاننايف مصفوفة ‪ 3 × 4‬وجميع التحيزاتيف ‬
‫متجه ‪.𝐛 ∈ ℝ3‬‬

‫‪Softmax‬‬ ‫‪4.1.1.2‬‬
‫بافتراض دالة خطأ مناسبة‪ ،‬يمكننا أن نحاول‪ ،‬مباشرة‪ ،‬تقليل االختالف بين 𝐨 والتسميات 𝐲‪.‬‬
‫بينما اتضح أن معالجة التصنيف على أنه مشكلة انحدار ذات قيمة متجهية ‪vector-valued‬‬
‫‪ regression‬تعمل بشكل جيد بشكل مدهش‪ ،‬إال أنها مع ذلك تفتقر إلى الطرق التالية‪:‬‬

‫ليس هناك ما يضمن أن مجموع المخرجات 𝑖𝑜يصل إلى ‪ 1‬بالطريقة التي نتوقع أن‬ ‫•‬
‫تتصرف بها االحتماالت‪.‬‬
‫ليس هناك ما يضمن أن النواتج 𝑖𝑜 هي حتى غير سالبة‪ ،‬حتى لو كانت مخرجاتها تصل‬ ‫•‬
‫إلى ‪ ،1‬أو أنها ال تتجاوز ‪.1‬‬

‫كال الجانبين يجعل مشكلة التقدير صعبة الحل والحل هش للغاية للقيم المتطرفة ‪.outliers‬‬
‫على سبيل المثال‪ ،‬إذا افترضنا أن هناك تبعية خطية ‪ linear dependency‬موجبة بين عدد غرف‬
‫النوم واحتمال قيام شخص ما بشراء منزل‪ ،‬فقد يتجاوز االحتمال ‪ 1‬عندما يتعلق األمر بشراء‬
‫قصر! على هذا النحو‪ ،‬نحن بحاجة إلى آلية "لسحق ‪ "squish‬المخرجات‪.‬‬

‫هناك العديد من الطرق التي يمكننا من خاللها تحقيق هذا الهدف‪ .‬على سبيل المثال‪ ،‬يمكننا أن‬
‫نفترض أن المخرجات 𝐨 هي إصدارات تالفة من 𝐲 ‪ ،‬حيث يحدث التلف عن طريق إضافة‬
‫ضوضاء مستمدة من التوزيع الطبيعي‪ .‬بمعنى آخر‪ 𝐲 = 𝐨 + 𝜖 ،‬حيث ) ‪ .𝜖𝑖 ∼ 𝒩(0, 𝜎 2‬هذا‬
‫هو ما يسمى بنموذج االختبار ‪ ،probit model‬الذي قدمه ‪ Fechner‬ألول مرة (‪.)1860‬يف ‬
‫حين أنها جذابة‪ ،‬فإنها ال تعمل بشكل جيد أو تؤدي إلى مشكلة تحسين لطيفة بشكل خاص‪ ،‬عند‬
‫مقارنتها بـ ‪.softmax‬‬

‫هناك طريقة أخرى لتحقيق هذا الهدف (ولضمان الالسلبية ‪ )nonnegativity‬وهي استخدام‬
‫دالة أسية 𝑖𝑜 ‪ .𝑃(𝑦 = 𝑖) ∝ exp‬هذا بالفعل يفي بمتطلبات زيادة احتمال الطبقة الشرطية مع‬
‫زيادة 𝑖𝑜‪ ،‬وهو رتيب ‪ ،monotonic‬وجميع االحتماالت غير سالبة‪ .‬يمكننا بعد ذلك تحويل‬
‫هذه القيم بحيث يتم جمعها الى ‪ 1‬بقسمة كل منها على مجموعها‪ .‬هذه العملية تسمى التسوية‬
‫‪ .normalization‬يمنحنا وضع هاتين القطعتين معًا دالة ‪:softmax‬‬

‫^‬ ‫^‬ ‫) 𝑖𝑜( ‪exp‬‬


‫= 𝑖𝑦‪𝐲 = softmax(𝐨)where‬‬ ‫‪.‬‬
‫) 𝑗𝑜( ‪∑ exp‬‬
‫𝑗‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪182‬‬

‫^‬
‫الحظ أن أكبر إحداثي لـ 𝐨 يتوافق مع الفئة األكثر احتمالًا وفقًا لـ 𝐲‪ .‬عالوة على ذلك‪ ،‬نظرًا ألن‬
‫عملية ‪ softmax‬تحافظ على الترتيب بين وسيطاتها‪ ،‬فإننا ال نحتاج إلى حساب ‪softmax‬‬
‫لتحديد الفئة التي تم تخصيص أعلى احتمالية لها‪.‬‬
‫^‬
‫‪argmax𝑦𝑗 = argmax𝑜𝑗 .‬‬
‫𝑗‬ ‫𝑗‬

‫تعود فكرة ‪ softmax‬إلى جيبس ‪ ،Gibbs‬الذي قام بتكييف األفكار من الفيزياء (‪،Gibbs‬‬
‫‪ .)1902‬منذ زمن بعيد‪ ،‬استخدم بولتزمان‪ ،‬والد الديناميكا الحرارية الحديثة‪ ،‬هذه الحيلة لنمذجة‬
‫التوزيع على حاالت الطاقةيف جزيئات الغاز‪ .‬على وجه الخصوص‪ ،‬اكتشف أن انتشار حالة من‬
‫الطاقةيف مجموعة ديناميكية حرارية‪ ،‬مثل الجزيئاتيف الغاز‪ ،‬يتناسب مع )𝑇𝑘‪ .exp (−𝐸/‬هنا‪،‬‬
‫𝐸طاقة الحالة‪ 𝑇،‬هي درجة الحرارة‪ ،‬و𝑘 ثابت بولتزمان‪ .‬عندما يتحدث اإلحصائيون عن زيادة‬
‫أو خفض "درجة حرارة" نظام إحصائي‪ ،‬فإنهم يشيرون إلى التغيير لصالح حاالت الطاقة‬
‫المنخفضة أو األعلى‪ .‬باتباع فكرة جيبس‪ ،‬الطاقة تساوي الخطأ‪ .‬تستخدم النماذج القائمة على‬
‫الطاقة (‪ )2007 ،Ranzato et al.‬وجهة النظر هذه عند وصف المشكالتيف التعلم العميق‪.‬‬

‫‪Vectorization‬‬ ‫‪4.1.1.3‬‬
‫لتحسين الكفاءة الحسابية‪ ،‬نقوم بتوجيه الحساباتيف الدفعات الصغيرة من البيانات‪ .‬افترض أننا‬
‫حصلنا على دفعات صغيرة 𝑑×𝑛‪ 𝐗 ∈ ℝ‬من 𝑛 من الميزات ذات األبعاد (عدد المدخالت) 𝑑‪.‬‬
‫عالوة على ذلك‪ ،‬افترض أن لدينا 𝑞 فئاتيف المخرجات‪ .‬ثم األوزان تحقق 𝑞×𝑑‪ 𝐖 ∈ ℝ‬والتحيز‬
‫يحقق 𝑞×‪.𝐛 ∈ ℝ1‬‬

‫𝐎‬ ‫‪= 𝐗𝐖 + 𝐛,‬‬


‫^‬
‫𝐘‬ ‫‪= softmax(𝐎).‬‬

‫يؤدي هذا إلى تسريع العملية السائدةيف ضرب المصفوفة‪-‬المصفوفة 𝐖𝐗‪ .‬عالوة على ذلك‪،‬‬
‫نظرًا ألن كل صفيف 𝐗 يمثل مثالًا للبيانات‪ ،‬يمكن حساب عملية ‪ softmax‬نفسهايف اتجاه‬
‫الصف ‪ :rowwise‬لكل صف من 𝐎 ‪ ،‬ثم قم بتسويتها بالمجموع‪ .‬الحظ‪ ،‬مع ذلك‪ ،‬أنه يجب‬
‫توخي الحذر لتجنب األس وأخذ اللوغاريتمات ذات األعداد الكبيرة‪ ،‬ألن هذا يمكن أن يسبب‬
‫تجاوزًا رقميًا أو تدنيًا‪ .‬تعتني أطر التعلم العميق بهذا األمر تلقائيًا‪.‬‬

‫‪Loss Function‬‬ ‫‪4.1.2‬‬


‫^‬
‫اآلن بعد أن أصبح لدينا تعيين من الميزات 𝐱 إلى االحتماالت 𝐲‪ ،‬نحن بحاجة إلى طريقة لتحسين‬
‫دقة هذا التعيين‪ .‬سوف نعتمد على تقدير االحتمال األقصى ‪maximum likelihood‬‬
‫‪183‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪ ،estimation‬وهو نفس المفهوم الذي واجهناه عند تقديم تبرير احتمالي لمتوسط خسارة الخطأ‬
‫التربيعييف القسم ‪.3.1.3‬‬

‫‪Log-Likelihood 4.1.2.1‬‬
‫^‬
‫تعطينا دالة ‪ softmax‬متجهًا 𝐲‪ ،‬والتي يمكننا تفسيرها على أنها احتماالت مشروطة (مقدرة)‬
‫^‬
‫لكل فئة‪ ،‬مع األخذيف االعتبار أي مدخالت 𝐱 ‪ ،‬مثل )𝐱 ∣ ‪ .𝑦1 = 𝑃(𝑦 = cat‬فيما يلي نفترض‬
‫أنه بالنسبة لمجموعة البيانات ذات الميزات 𝐗‪ ،‬يتم تمثيل التسميات 𝐘 باستخدام متجه تسمية‬
‫ترميز واحد ساخن ‪ .one-hot encoding‬يمكننا مقارنة التقديرات بالواقع من خالل التحقق‬
‫من مدى احتمالية أن تكون الفئات الفعلية وفقًا لنموذجنا‪ ،‬مع مراعاة الميزات‪:‬‬
‫𝑛‬

‫∏ = )𝐗 ∣ 𝐘(𝑃‬ ‫‪𝑃(𝐲 (𝑖) ∣ 𝐱 (𝑖) ).‬‬


‫‪𝑖=1‬‬

‫يُسمح لنا باستخدام التحليل إلى عوامل ‪ factorization‬ألننا نفترض أن كل تسمية مرسومة‬
‫بشكل مستقل عن التوزيع ) )𝑖( 𝐱 ∣ 𝐲(𝑃 الخاص به‪ .‬نظرًا ألن تعظيم منتج المصطلحات أمر غير‬
‫مالئم‪ ،‬فإننا نأخذ اللوغاريتم السالب للحصول على المشكلة المكافئة لتقليل ‪:log-likelihood‬‬
‫𝑛‬ ‫𝑛‬
‫)𝑖(‬ ‫)𝑖(‬ ‫^‬
‫∑ = )𝐗 ∣ 𝐘(𝑃 ‪−log‬‬ ‫𝐲(𝑃 ‪− log‬‬ ‫∑=) 𝐱∣‬ ‫‪𝑙(𝐲 (𝑖) , 𝐲 (𝑖) ),‬‬
‫‪𝑖=1‬‬ ‫‪𝑖=1‬‬
‫^‬
‫أين ألي زوج من التسمية 𝐲 والتنبؤ 𝐲 بالنموذج على الفئات 𝑞‪ ،‬فإن دالة الخطأ 𝑙 هي‬
‫𝑞‬
‫^‬ ‫^‬
‫∑ ‪𝑙(𝐲, 𝐲) = −‬‬ ‫‪𝑦𝑗 log 𝑦𝑗 .‬‬
‫‪𝑗=1‬‬

‫ألسباب تم توضيحها الحقًا‪ ،‬فإن دالة الخطأيف (‪ )4.1.8‬تسمى عادةً خطأ االنتروبيا المتقاطعة‬
‫‪ .cross-entropy loss‬نظرًا ألن 𝐲 متجه واحد ساخن للطول 𝑞‪ ،‬فإن المجموع على جميع‬
‫^‬
‫اإلحداثيات 𝑗 يختفي لجميع المصطلحات باستثناء مصطلح واحد‪ .‬الحظ أن الخطأ )𝐲 ‪𝑙(𝐲,‬‬
‫^‬
‫يحدها من األسفل بواسطة ‪ 0‬حيث 𝑦 هو متجه احتمالي‪ :‬ال يوجد إدخال واحد أكبر من ‪،1‬‬
‫^‬
‫وبالتالي ال يمكن أن يكون اللوغاريتم السالب أقل من ‪0‬؛ فقط إذا ‪ 𝑙(𝐲, 𝐲) = 0‬توقعنا التسمية‬
‫الفعلي على وجه اليقين ‪ .certainty‬ال يمكن أن يحدث هذا أبدًا ألي إعداد محدود لألوزان ألن‬
‫أخذ إخراج ‪ softmax‬نحو ‪ 1‬يتطلب أخذ المدخالت المقابلة 𝑖𝑜 إلى ما ال نهاية (أو جميع‬
‫المخرجات 𝑗𝑜 األخرى لكل 𝑖 ≠ 𝑗 إلى الالنهاية السالبة)‪ .‬حتى إذا كان بإمكان نموذجنا تعيين‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪184‬‬

‫احتمال إخراج ‪ ،0‬فإن أي خطأ يرتكب عند تعيين مثل هذه الثقة العالية سيؤدي إلى خطأ ال نهائي‬
‫(∞ = ‪.)−log 0‬‬

‫‪Softmax and Cross-Entropy Loss‬‬ ‫‪Softmax 4.1.2.2‬‬


‫نظرًا ألن دالة ‪ softmax‬وخطأ االنتروبيا المقابلة شائعة جدًا‪ ،‬فمن الجدير فهم كيفية حسابها‬
‫بشكل أفضل قليالً‪ .‬إدخال (‪)4.1.3‬يف تعريف الخطأيف (‪ )4.1.8‬وباستخدام تعريف ‪softmax‬‬
‫نحصل عليه‪:‬‬
‫𝑞‬
‫^‬ ‫) 𝑗𝑜( ‪exp‬‬
‫)𝐲 ‪𝑙(𝐲,‬‬ ‫∑‪= −‬‬ ‫‪𝑦𝑗 log‬‬
‫‪∑𝑞𝑘=1‬‬ ‫) 𝑘𝑜( ‪exp‬‬
‫‪𝑗=1‬‬
‫𝑞‬ ‫𝑞‬ ‫𝑞‬

‫∑=‬ ‫∑ ‪𝑦𝑗 log‬‬ ‫∑ ‪exp (𝑜𝑘 ) −‬‬ ‫𝑗𝑜 𝑗𝑦‬


‫‪𝑗=1‬‬ ‫‪𝑘=1‬‬ ‫‪𝑗=1‬‬
‫𝑞‬ ‫𝑞‬

‫∑ ‪= log‬‬ ‫∑ ‪exp (𝑜𝑘 ) −‬‬ ‫‪𝑦𝑗 𝑜𝑗 .‬‬


‫‪𝑘=1‬‬ ‫‪𝑗=1‬‬

‫لفهم ما يجري بشكل أفضل قليالً‪ ،‬ضعيف االعتبار المشتق فيما يتعلق بأي لوغاريتم 𝑗𝑜‪ .‬نحن‬
‫نحصل‬

‫^‬ ‫) 𝑗𝑜( ‪exp‬‬


‫= )𝐲 ‪𝜕𝑜𝑗 𝑙(𝐲,‬‬ ‫‪− 𝑦𝑗 = softmax(𝐨)𝑗 − 𝑦𝑗 .‬‬
‫‪∑𝑞𝑘=1‬‬ ‫) 𝑘𝑜( ‪exp‬‬

‫بمعنى آخر‪ ،‬المشتق ‪ derivative‬هو الفرق بين االحتمال المحدد بواسطة نموذجنا‪ ،‬كما يعبر عنه‬
‫عملية ‪ ،SoftMax‬وما حدث بالفعل‪ ،‬على النحو المعبر عنه بالعناصر الموجودةيف متجه التسمية‬
‫الساخنة الواحدة‪ .‬بهذا المعنى‪ ،‬فهو مشابه جدًا لما رأيناهيف االنحدار‪ ،‬حيث كان التدرج هو الفرق‬
‫^‬
‫بين المالحظة 𝑦 والتقدير 𝑦‪ .‬هذه ليست صدفة‪.‬يف أي نموذج عائلي أسي‪ ،‬يتم إعطاء تدرجات‬
‫احتمالية السجل من خالل هذا المصطلح على وجه التحديد‪ .‬هذه الحقيقة تجعل حوسبة‬
‫التدرجات سهلةيف الممارسة‪.‬‬

‫اآلن ضعيف اعتبارك الحالة التي نالحظ فيها ليس فقط نتيجة واحدة ولكن توزيعًا كامالً على‬
‫النتائج‪ .‬يمكننا استخدام نفس التمثيل السابق للتسمية 𝐲‪ .‬االختالف الوحيد هو أنه بدالً من المتجه‬
‫الذي يحتوي على مدخالت ثنائية فقط‪ ،‬على سبيل المثال )‪ ،(0,0,1‬لدينا اآلن متجه احتمالي‬
‫عام‪ ،‬على سبيل المثال )‪ .(0.1,0.2,0.7‬الرياضيات التي استخدمناها سابقًا لتحديد الخطأيف ‬
‫(‪ )4.1.8‬ال تزال تعمل بشكل جيد‪ ،‬فقط أن التفسير أكثر عمومية‪ .‬إنها القيمة المتوقعة للخطأ‬
‫توزيع على التسميات‪ .‬يسمى هذه الخطأ بخطأ االنتروبيا المتقاطعة ‪ cross-entropy loss‬وهو‬
‫‪185‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫واحد من أكثر االخطاء استخدامًا لمشاكل التصنيف‪ .‬يمكننا إزالة الغموض عن االسم من خالل‬
‫تقديم أساسيات نظرية المعلومات فقط‪ .‬باختصار‪ ،‬إنه يقيس عدد البتات لترميز ما نراه 𝐲 بالنسبة‬
‫^‬
‫لما نتوقع حدوثه 𝐲‪ .‬نقدم شرحًا أساسيًا جدًا فيما يلي‪ .‬لمزيد من التفاصيل حول نظرية المعلومات‬
‫انظر (‪ )1999 ،Cover and Thomas‬أو (‪.)2003 ،MacKay and Mac Kay‬‬

‫‪Information Theory Basics‬‬ ‫‪4.1.3‬‬


‫تستخدم العديد من أوراق التعلم العميق الحدس والمصطلحات من نظرية المعلومات‬
‫‪ .information theory‬لفهمها‪ ،‬نحتاج إلى لغة مشتركة‪ .‬هذا هو دليل البقاء على قيد الحياة‪.‬‬
‫تتعامل نظرية المعلومات مع مشكلة ترميز المعلومات وفك تشفيرها ونقلها ومعالجتها (المعروفة‬
‫أيضًا باسم البيانات ‪.)data‬‬

‫‪Entropy‬‬ ‫‪4.1.3.1‬‬
‫الفكرة المركزيةيف نظرية المعلومات هي تحديد كمية المعلومات الواردةيف البيانات‪ .‬هذا يضع‬
‫حدًا لقدرتنا على ضغط البيانات‪ .‬بالنسبة للتوزيع 𝑃‪ ،‬يتم تعريف االنتروبيا على النحو التالي‪:‬‬

‫∑ = ]𝑃[𝐻‬ ‫‪− 𝑃(𝑗)log 𝑃(𝑗).‬‬


‫𝑗‬

‫تنص إحدى النظريات األساسية لنظرية المعلومات على أنه من أجل ترميز البيانات المستمدة‬
‫عشوائيًا من التوزيع 𝑃‪ ،‬نحتاج على األقل ]𝑃[𝐻 إلى "‪ "nats‬لتشفيرها (‪.)1948 ،Shannon‬‬
‫إذا كنت تتساءل ما هو "‪ ،”nat‬فهو مكافئ للبت ولكن عند استخدام رمز مع األساس 𝑒 بدالً من‬
‫‪1‬‬
‫واحد مع األساس ‪ .2‬وبالتالي‪ ،‬فإن ‪ nat‬واحد هو ‪ log (2) ≈ 1.44‬بت‬

‫‪Surprisal 4.1.3.2‬‬
‫قد تتساءل ما عالقة الضغط بالتنبؤ‪ .‬تخيل أن لدينا دفقًا من البيانات التي نريد ضغطها‪ .‬إذا كان‬
‫من السهل علينا دائمًا توقع الرمز المميز التالي‪ ،‬فمن السهل ضغط هذه البيانات‪ .‬خذ المثال حيث‬
‫يأخذ كل رمز مميزيف الدفق نفس القيمة دائمًا‪ .‬هذا دفق بيانات ممل للغاية! وهو ليس مملًا‬
‫فحسب‪ ،‬بل يسهل توقعه أيضًا‪ .‬نظرًا ألنهما دائمًا متماثالن‪ ،‬فال يتعين علينا نقل أي معلومات‬
‫لتوصيل محتويات الدفق‪ .‬سهل التنبؤ‪ ،‬سهل الضغط‪.‬‬

‫ومع ذلك‪ ،‬إذا لم نتمكن من التنبؤ بكل حدث تمامًا‪ ،‬فقد نتفاجأ أحيانًا‪ .‬تكون دهشتنا أكبر عندما‬
‫‪1‬‬
‫‪ log‬لتقدير مفاجأة‬ ‫خصصنا حدثًا احتمالية أقل‪ .‬استقر كلود شانون على )𝑗(𝑃 ‪= −log‬‬
‫)𝑗(𝑃‬
‫المرءيف مراقبة حدث ما 𝑗 بعد أن منحه احتمالًا )𝑗(𝑃‪ .‬إن االنتروبيا المحددةيف (‪ )4.1.11‬هي‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪186‬‬

‫إذن المفاجأة المتوقعة عندما يقوم أحدهم بتعيين االحتماالت الصحيحة التي تتطابق بالفعل مع‬
‫عملية توليد البيانات‪.‬‬

‫‪Cross-Entropy Revisited‬‬ ‫‪4.1.3.3‬‬


‫لذا‪ ،‬إذا كان االنتروبيا هو مستوى المفاجأة الذي يختبره شخص يعرف االحتمال الحقيقي ‪ ،‬فقد‬
‫تتساءل ‪ ،‬ما هو االنتروبيا المتقاطعة ‪cross-entropy‬؟ إن االنتروبيا المتقاطعة من 𝑃 إلى 𝑄‪،‬‬
‫المشار إليها )𝑄 ‪ ، 𝐻(𝑃,‬هي المفاجأة المتوقعة لمراقب ذي احتماالت ذاتية عند رؤية البيانات‬
‫‪def‬‬
‫𝑗∑ = )𝑄 ‪𝐻(𝑃,‬‬ ‫التي تم إنشاؤها بالفعل وفقًا لالحتماالت 𝑃‪ .‬هذا معطى من قبل ‪−‬‬
‫)𝑗(𝑄 ‪ .𝑃(𝑗)log‬يتم تحقيق أدنى قدر ممكن من االنتروبيا عندما 𝑄 = 𝑃‪.‬يف هذه الحالة‪ ،‬فإن‬
‫االنتروبيا المتقاطعة 𝑃 إلى 𝑄هي )𝑃(𝐻 = )𝑃 ‪.𝐻(𝑃,‬‬

‫باختصار‪ ،‬يمكننا التفكيريف هدف التصنيف عبر االنتروبيا بطريقتين‪ )1( :‬تعظيم احتمالية البيانات‬
‫المرصودة؛ و (‪ )2‬لتقليل مفاجأتنا (وبالتالي عدد البتات) المطلوبة لتوصيل التسميات ‪.labels‬‬

‫‪4.1.4‬‬
‫في هذا القسم‪ ،‬واجهنا أول دالة خطأ غير بديهية‪ ،‬مما يسمح لنا بتحسين مساحات اإلخراج‬
‫المنفصلة‪ .‬كان المفتاحيف تصميمه هو أننا اتخذنا نهجًا احتماليًا‪ ،‬حيث تعاملنا مع الفئات‬
‫المنفصلة على أنها حاالت سحب من توزيع احتمالي‪ .‬كأثر جانبي‪ ،‬واجهنا ‪ ،softmax‬وهي دالة‬
‫تنشيط مريحة تحول مخرجات طبقة الشبكة العصبية العادية إلى توزيعات احتمالية منفصلة‬
‫صالحة‪ .‬لقد رأينا أن مشتق خطأ االنتروبيا المتقاطعة عندما يقترن بـ ‪ softmax‬يتصرف بشكل‬
‫مشابه جدًا لمشتق الخطأ التربيعي‪ ،‬أي عن طريق أخذ الفرق بين السلوك المتوقع والتنبؤ به‪ .‬وبينما‬
‫كنا قادرين فقط على خدش السطح ذاته‪ ،‬واجهنا روابط مثيرة للفيزياء اإلحصائية ونظرية‬
‫المعلومات‪.‬‬

‫في حين أن هذا كافٍ ليأخذكيف طريقك‪ ،‬ونأمل أن يكون كافيًا إلثارة شهيتك‪ ،‬إال أننا بالكاد نغوص‬
‫بعمق هنا‪ .‬من بين أمور أخرى‪ ،‬تخطينا االعتبارات الحسابية‪ .‬على وجه التحديد‪ ،‬بالنسبة ألي‬
‫طبقة متصلة بالكامل بها 𝑑 مدخالت و 𝑞 مخرجات‪ ،‬المعلمات والتكلفة الحسابية هي )𝑞𝑑(𝒪‪،‬‬
‫والتي يمكن أن تكون باهظةيف الممارسة العملية‪ .‬لحسن الحظ‪ ،‬يمكن تقليل تكلفة تحويل‬
‫المدخالت 𝑑 إلى مخرجات 𝑞 من خالل التقريب ‪ approximation‬والضغط ‪.compression‬‬
‫على سبيل المثال‪ ،‬يستخدم ‪ )2015 ،.Yang et al(،Deep Fried Convnets‬مجموعة من‬
‫التباديل وتحويالت فورييه والقياس لتقليل التكلفة من التربيعية إلى اللوغاريتمية الخطية‪ .‬تعمل‬
‫تقنيات مماثلة من أجل تقريب مصفوفة هيكلية أكثر تقدمًا ( ‪.)2015 ،Sindhwani et al.‬‬
‫𝑞𝑑‬
‫أخيرًا‪ ،‬يمكننا استخدام تحليالت تشبه ‪ Quaternion‬لتقليل التكلفة الى ) 𝑛 (𝒪‪ ،‬مرة أخرى‪،‬‬
‫‪187‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫إذا كنا على استعداد لمقايضة قدر ضئيل من الدقة بتكلفة الحساب والتخزين (‪،Zhang et al.‬‬
‫‪ )2021‬بناءً على عامل الضغط 𝑛‪ .‬هذا مجال نشط للبحث‪ .‬ما يجعل األمر صعبًا هو أننا ال نسعى‬
‫بالضرورة إلى التمثيل األكثر إحكاما أو أصغر عدد من عمليات الفاصلة العائمة ‪floating point‬‬
‫ولكن باألحرى للحل الذي يمكن تنفيذه بكفاءة أكبر على وحدات معالجة الرسومات الحديثة‬
‫‪.GPUs‬‬

‫‪4.1.5‬‬
‫‪ .1‬يمكننا استكشاف العالقة بين العائالت األسية و‪ softmax‬بعمق أكبر‪.‬‬
‫^‬
‫‪ .1‬احسب المشتق الثاني لخطأ االنتروبيا )𝐲 ‪𝑙(𝐲,‬من أجل ‪.softmax‬‬
‫‪ .2‬احسب تباين التوزيع الذي قدمه )𝐨(‪ softmax‬وأظهر أنه يطابق المشتق الثاني‬
‫المحسوب أعاله‪.‬‬
‫‪ .2‬افترض أن لدينا ثالث فئات تحدث باحتمالية متساوية‪ ،‬أي متجه االحتمال هو‬
‫‪1 1 1‬‬
‫)‪(3 , 3 , 3‬‬
‫‪ .1‬ما هي المشكلة إذا حاولنا تصميم كود ثنائي لها؟‬
‫‪ .2‬هل يمكنك تصميم كود أفضل؟ تلميح‪ :‬ماذا يحدث إذا حاولنا ترميز مالحظتين‬
‫مستقلتين؟ ماذا لو قمنا بترميز 𝑛 مالحظات بشكل مشترك؟‬
‫‪ .3‬عند إرسال إشارات ترميز عبر سلك مادي‪ ،‬ال يستخدم المهندسون دائمًا رموزًا ثنائية‪.‬‬
‫على سبيل المثال‪ ،‬يستخدم ‪ PAM-3‬ثالثة مستويات لإلشارة }‪ {−1,0,1‬بدالً من‬
‫مستويين }‪ .{0,1‬كم عدد الوحدات الثالثية ‪ ternary units‬التي تحتاجها إلرسال عدد‬
‫صحيحيف النطاق }‪{0, … ,7‬؟ لماذا قد تكون هذه فكرة أفضل من حيث اإللكترونيات؟‬
‫‪ .4‬يستخدم نموذج برادلي تيري ‪ Bradley-Terry model‬نموذجًا لوجستيًا ‪logistic‬‬
‫‪ model‬اللتقاط التفضيالت‪ .‬لكي يختار المستخدم بين التفاح والبرتقال‪ ،‬يفترض‬
‫المرء أن الدرجات ‪ 𝑜apple‬و ‪ .𝑜orange‬متطلباتنا هي أن الدرجات األكبر يجب أن تؤدي‬
‫إلى احتمالية أعلىيف اختيار العنصر المرتبط وأن العنصر الحاصل على أكبر درجة هو‬
‫العنصر األكثر احتمالية الختياره (‪.)1952 ،Bradley and Terry‬‬
‫‪ .1‬إثبت أن ‪ softmax‬يلبي هذا المطلب‪.‬‬
‫‪ .2‬ماذا يحدث إذا كنت تريد السماح بخيار افتراضي ال يختار فيه التفاح وال‬
‫البرتقال؟ تلميح‪ :‬اآلن لدى المستخدم ‪ 3‬اختيارات‪.‬‬
‫= )𝑏 ‪RealSoftMax(𝑎,‬‬ ‫التالي‪:‬‬ ‫التعيين‬ ‫من‬ ‫اسمها‬ ‫‪Softmax‬‬ ‫‪ .5‬تشتق‬
‫))𝑏( ‪.log (exp (𝑎) + exp‬‬
‫‪ .1‬اثبت )𝑏 ‪.RealSoftMax(𝑎, 𝑏) > max(𝑎,‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪188‬‬

‫‪ .2‬ما مدى صغر حجم الفرق بين الدالتين؟ تلميح‪ :‬بدون فقدان التعميم يمكنك‬
‫ضبط ‪𝑏 = 0‬و𝑏 ≥ 𝑎‪.‬‬
‫‪ .3‬إثبت أن )𝑏𝜆 ‪ ،𝜆 RealSoftMax(𝜆𝑎,‬بشرط ‪.𝜆 > 0‬‬
‫‪−1‬‬

‫‪ .4‬أظهر ذلك لـ ∞ → 𝜆 لدينا )𝑏 ‪.𝜆−1 RealSoftMax(𝜆𝑎, 𝜆𝑏) → max(𝑎,‬‬


‫‪ .5‬كيف تبدو ‪soft-min‬؟‬
‫‪ .6‬قم بتوسيع هذا إلى أكثر من رقمين‪.‬‬
‫‪def‬‬
‫𝑖∑ ‪ 𝑔(𝐱) = log‬يشار إليها أحيانًا أيضًا باسم ‪log-partition‬‬ ‫‪ .6‬الدالة 𝑖𝑥 ‪exp‬‬
‫‪.function‬‬
‫‪ .1‬إثبت أن الدالة محدبة ‪ .convex‬تلميح‪ :‬للقيام بذلك‪ ،‬استخدم حقيقة أن‬
‫المشتق األول يرقى إلى االحتماالت من دالة ‪ softmax‬وأظهر أن المشتق الثاني‬
‫هو التباين ‪.variance‬‬
‫‪ .2‬أظهر أن 𝑔 هي الترجمة ثابتة ‪ ،invariant‬أي )𝐱(𝑔 = )𝑏 ‪.𝑔(𝐱 +‬‬
‫‪ .3‬ماذا يحدث إذا كانت بعض اإلحداثيات كبيرة جدًا؟ ماذا يحدث إذا كانوا جميعًا‬
‫صغارًا جدًا؟‬
‫‪ .4‬أظهر أنه إذا اخترنا 𝑖𝑥 𝑖‪ 𝑏 = max‬سننتهي بتطبيق مستقر عدديًا‪.‬‬
‫‪ .7‬افترض أن لدينا بعض التوزيع االحتمالي 𝑃‪ .‬لنفترض أننا اخترنا توزيعًا آخر 𝑄‬
‫باستخدام 𝛼)𝑖(𝑃 ∝ )𝑖(𝑄‪.‬‬
‫‪ .1‬أي اختيار لـ 𝛼 يتوافق مع مضاعفة درجة الحرارة؟ أي خيار يتوافق مع النصف؟‬
‫‪ .2‬ماذا يحدث إذا تركنا درجة الحرارة تتقارب ‪ converge‬الى ‪0‬؟‬
‫‪ .3‬ماذا يحدث إذا تركنا درجة الحرارة تتقارب الى ∞؟‬

‫‪The Image Classification‬‬ ‫‪4.2‬‬


‫‪Dataset‬‬
‫إحدى مجموعات البيانات ‪ Dataset‬المستخدمة على نطاق واسع لتصنيف الصور هي مجموعة‬
‫بيانات ‪ )1998 ،LeCun et al( ،MNIST‬لألرقام المكتوبة بخط اليد‪.‬يف وقت إصدارهيف ‬
‫التسعينيات‪ ،‬شكل تحديًا هائالً لمعظم خوارزميات التعلم اآللي‪ ،‬ويتألف من ‪ 60.000‬صورة‬
‫بدقة بكسل (باإلضافة إلى مجموعة بيانات اختبار من ‪ 10000‬صورة)‪ .‬لوضع األموريف نصابها‬
‫الصحيح‪،‬يف ذلك الوقت‪ ،‬تم اعتبار ‪ Sun SPARCStation 5‬بسعة ‪ 64‬ميجابايت من ذاكرة‬
‫الوصول العشوائي الهائلة و‪ MFLOPs 5‬من أحدث المعدات للتعلم اآللييف مختبرات ‪AT&T‬‬
‫‪Bell‬يف عام ‪ . 1995‬كان تحقيق دقة عاليةيف التعرف على األرقام بمثابة المكون الرئيسييف أتمتة‬
‫فرز الرسائل لـ ‪USPS‬يف التسعينيات‪ .‬الشبكات العميقة مثل ‪،LeCun et al(،LeNet-5‬‬
‫‪ )1995‬واالت المتجهات الداعمة ‪ support vector machines‬مع الثوابت ‪invariances‬‬
‫‪189‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫( ‪ ، )1996 ،Schölkopf et al.‬ومصنفات المسافة المماسية ‪tangent distance classifiers‬‬


‫( ‪ )1998 ،Simard et al.‬كلها سمحت بالوصول إلى معدالت خطأ أقل من ‪.%1‬‬

‫ألكثر من عقد من الزمان‪ ،‬عملت ‪ MNIST‬كنقطة مرجعية لمقارنة خوارزميات التعلم اآللي‪.‬‬
‫على الرغم من أنه كان يعمل بشكل جيد كمجموعة بيانات معيارية‪ ،‬إال أن النماذج البسيطة وفقًا‬
‫لمعايير اليوم تحقق دقة تصنيف تزيد عن ‪ ،٪95‬مما يجعلها غير مناسبة للتمييز بين النماذج‬
‫األقوى والنماذج األضعف‪ .‬أكثر من ذلك‪ ،‬تسمح مجموعة البيانات بمستويات عالية جدًا من‬
‫الدقة‪ ،‬ال تُرى عادةًيف العديد من مشكالت التصنيف‪ .‬هذا التطوير الخوارزمي المنحرف نحو‬
‫عائالت معينة من الخوارزميات التي يمكن أن تستفيد من مجموعات البيانات النظيفة ‪clean‬‬
‫‪ ،datasets‬مثل أساليب المجموعة النشطة وخوارزميات المجموعة النشطة التي تسعى للحد من‬
‫الحدود‪ .‬اليوم‪ ،‬تعمل ‪ MNIST‬بمثابة فحوصات سالمة أكثر من كونها معيارًا‪ .‬تشكّل شبكة‬
‫‪ )2009 ،Denget al.(،ImageNet‬تحديًا أكثر صلة بالموضوع‪ .‬لسوء الحظ‪ ،‬تعد‬
‫‪ ImageNet‬كبيرة جدًا بالنسبة للعديد من األمثلة والرسوم التوضيحيةيف هذا الكتاب‪ ،‬حيث‬
‫سيستغرق التدريب وقتًا طويالً لجعل األمثلة تفاعلية‪ .‬كبديل‪ ،‬سنركز مناقشتنايف األقسام القادمة‬
‫على مجموعة بيانات ‪ Fashion-MNIST‬المتشابهة نوعياً‪ ،‬ولكن األصغر بكثير ( ‪Xiao et‬‬
‫‪ ،)2017 ،al.‬والتي تم إصدارهايف عام ‪ .2017‬وهي تحتوي على صور لعشر فئات من المالبس‬
‫بدقة ‪ 28 × 28‬بكسل‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import time‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬

‫)(‪d2l.use_svg_display‬‬
‫‪Loading the Dataset‬‬ ‫‪4.2.1‬‬
‫نظرًا ألنها مجموعة بيانات مستخدمة بشكل متكرر‪ ،‬فإن جميع األطر الرئيسية توفر إصدارات‬
‫مُعالجة مسبقًا منها‪ .‬يمكننا تنزيل مجموعة بيانات ‪ Fashion-MNIST‬وقراءتهايف الذاكرة‬
‫باستخدام دوال إطار العمل المضمنة‪.‬‬

‫‪class FashionMNIST(d2l.DataModule): #@save‬‬


‫‪def __init__(self, batch_size=64, resize=(28, 28)):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫= ‪self.train, self.val‬‬
‫)(‪tf.keras.datasets.fashion_mnist.load_data‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪190‬‬

‫يتكون ‪ Fashion-MNIST‬من صور من ‪ 10‬فئات‪ ،‬كل منها ممثلة بـ ‪ 6000‬صورةيف مجموعة‬


‫بيانات التدريب ‪ training dataset‬و‪1000‬يف مجموعة بيانات االختبار ‪ .test dataset‬تُستخدم‬
‫مجموعة بيانات االختبار لتقييم أداء النموذج (ال يجب استخدامها للتدريب)‪ .‬وبالتالي‪ ،‬تحتوي‬
‫مجموعة التدريب ومجموعة االختبار على ‪ 60.000‬و‪ 10000‬صورة على التوالي‪.‬‬

‫))‪data = FashionMNIST(resize=(32, 32‬‬


‫)]‪len(data.train[0]), len(data.val[0‬‬
‫الصور ذات تدرج رمادي وترقيتها إلى ‪ 32 × 32‬بكسليف الدقة أعاله‪ .‬هذا مشابه لمجموعة‬
‫بيانات ‪ MNIST‬األصلية التي تتكون من صور (ثنائية) باألبيض واألسود‪ .‬الحظ‪ ،‬مع ذلك‪ ،‬أن‬
‫معظم بيانات الصور الحديثة تحتوي على ‪ 3‬قنوات (أحمر‪ ،‬أخضر‪ ،‬أزرق) وصور فائقة الطيف‬
‫‪ hyperspectral images‬يمكن أن تحتوي على أكثر من ‪ 100‬قناة (مستشعر ‪ HyMap‬به‬
‫‪ 126‬قناة)‪ .‬حسب االصطالح‪ ،‬نقوم بتخزين الصورة كموتّر 𝑤 × ‪ ، 𝑐 × ℎ‬حيث يكون 𝑐 عدد‬
‫قنوات اللون‪ ℎ،‬هو االرتفاع و𝑤 هو العرض‪.‬‬

‫‪data.train[0][0].shape‬‬
‫)‪(28, 28‬‬
‫فئات ‪ Fashion-MNIST‬لها أسماء مفهومة من قبل اإلنسان‪ .‬يتم تحويل دالة المالئمة‬
‫‪ convenience function‬التالية بين التسميات الرقمية وأسمائها‪.‬‬

‫‪@d2l.add_to_class(FashionMNIST) #@save‬‬
‫‪def text_labels(self, indices):‬‬
‫"""‪"""Return text labels.‬‬
‫‪labels = ['t-shirt', 'trouser', 'pullover', 'dress',‬‬
‫‪'coat',‬‬
‫‪'sandal', 'shirt', 'sneaker', 'bag',‬‬
‫]'‪'ankle boot‬‬
‫]‪return [labels[int(i)] for i in indices‬‬
‫‪Reading a Minibatch‬‬ ‫‪4.2.2‬‬
‫لجعل حياتنا أسهل عند القراءة من مجموعات التدريب واالختبار‪ ،‬نستخدم مكرر البيانات‬
‫المدمج ‪ built-in data iterator‬بدالً من إنشاء واحد من البداية‪ .‬تذكر أنهيف كل تكرار‪ ،‬يقرأ‬
‫مكرر البيانات دفعة صغيرة من البيانات ذات الحجم ‪ .batch_size‬نقوم أيضًا بترتيب األمثلة‬
‫عشوائيًا لمكرر بيانات التدريب‪.‬‬

‫‪@d2l.add_to_class(FashionMNIST) #@save‬‬
‫‪def get_dataloader(self, train):‬‬
‫‪data = self.train if train else self.val‬‬
‫‪process = lambda X, y: (tf.expand_dims(X, axis=3) /‬‬
‫‪255,‬‬
‫‪191‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫))'‪tf.cast(y, dtype='int32‬‬
‫‪resize_fn = lambda X, y:‬‬
‫)‪(tf.image.resize_with_pad(X, *self.resize), y‬‬
‫‪shuffle_buf = len(data[0]) if train else 1‬‬
‫‪return‬‬
‫‪tf.data.Dataset.from_tensor_slices(process(*data)).batch‬‬
‫(‬

‫)‪self.batch_size).map(resize_fn).shuffle(shuffle_buf‬‬
‫لمعرفة كيفية عمل ذلك‪ ،‬دعنا نحمل مجموعة صغيرة ‪ minibatch‬من الصور عن طريق استدعاء‬
‫طريقة ‪ train_dataloader‬المضافة حديثًا‪ .‬يحتوي على ‪ 64‬صورة‪.‬‬

‫)))(‪X, y = next(iter(data.train_dataloader‬‬
‫)‪print(X.shape, X.dtype, y.shape, y.dtype‬‬
‫‪(64, 32, 32, 1) <dtype: 'float32'> (64,) <dtype:‬‬
‫>'‪'int32‬‬
‫دعونا نلقي نظرة على الوقت المستغرق لقراءة الصور‪ .‬على الرغم من أنه محمل مدمج ‪built-‬‬
‫‪ ،in loader‬إال أنه ليس سريعًا للغاية‪ .‬ومع ذلك‪ ،‬يعد هذا كافيًا ألن معالجة الصور باستخدام‬
‫شبكة عميقة تستغرق وقتًا أطول قليالً‪ .‬ومن ثم‪ ،‬فمن الجيد بما يكفي أال يكون تدريب الشبكة‬
‫مقيدًا بإدخال معلومات‪.‬‬

‫)(‪tic = time.time‬‬
‫‪for X, y in data.train_dataloader():‬‬
‫‪continue‬‬
‫'‪f'{time.time() - tic:.2f} sec‬‬
‫'‪'0.82 sec‬‬
‫‪Visualization‬‬ ‫‪4.2.3‬‬
‫سنستخدم مجموعة بيانات ‪ Fashion-MNIST‬كثيرًا‪ .‬يمكن استخدام دالة مالئمة‬
‫‪ show_images‬لتمثيل البياني ل لصور والتسميات المرتبطة بها‪ .‬تفاصيل تنفيذه مؤجلة إلى‬
‫الملحق‪.‬‬

‫‪def show_images(imgs, num_rows, num_cols, titles=None,‬‬


‫‪scale=1.5): #@save‬‬
‫"""‪"""Plot a list of images.‬‬
‫‪raise NotImplementedError‬‬
‫دعونا نستخدمها بشكل جيد‪ .‬بشكل عام‪ ،‬من الجيد تمثيل وفحص البيانات التي تتدرب عليها‪.‬‬
‫إن البشر بارعون جدًايف اكتشاف الجوانب غير المعتادة‪ ،‬وبالتالي‪ ،‬فإن التمثيل البياني بمثابة حماية‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪192‬‬

‫إضافية ضد األخطاءيف تصميم التجارب‪ .‬فيما يلي الصور والتسميات المقابلة لها (في النص)‬
‫لألمثلة القليلة األولىيف مجموعة بيانات التدريب‪.‬‬

‫‪@d2l.add_to_class(FashionMNIST) #@save‬‬
‫‪def visualize(self, batch, nrows=1, ncols=8, labels=[]):‬‬
‫‪X, y = batch‬‬
‫‪if not labels:‬‬
‫)‪labels = self.text_labels(y‬‬
‫‪d2l.show_images(tf.squeeze(X), nrows, ncols,‬‬
‫)‪titles=labels‬‬

‫)))(‪batch = next(iter(data.val_dataloader‬‬
‫)‪data.visualize(batch‬‬

‫نحن اآلن جاهزون للعمل مع مجموعة بيانات ‪Fashion-MNIST‬يف األقسام التالية‪.‬‬

‫‪4.2.4‬‬
‫لدينا اآلن مجموعة بيانات أكثر واقعية الستخدامهايف التصنيف‪ Fashion-MNIST .‬هي‬
‫مجموعة بيانات لتصنيف المالبس تتكون من صور تمثل ‪ 10‬فئات‪ .‬سنستخدم مجموعة البيانات‬
‫هذهيف األقسام والفصول الالحقة لتقييم تصميمات الشبكات المختلفة‪ ،‬من نموذج خطي بسيط‬
‫إلى شبكات متبقية متقدمة‪ .‬كما نفعل عادةً مع الصور‪ ،‬نقرأها كموتّر للشكل (حجم الدفعة‪ ،‬عدد‬
‫القنوات‪ ،‬االرتفاع‪ ،‬العرض)‪.‬يف الوقت الحالي‪ ،‬لدينا قناة واحدة فقط ألن الصور ذات تدرج‬
‫رمادي (يستخدم التمثيل البياني أعاله لوحة ألوان زائفة لتحسين الرؤية)‪.‬‬

‫أخيرًا‪ ،‬تعد أجهزة تكرار البيانات ‪ data iterators‬مكونًا رئيسيًا لألداء الفعال‪ .‬على سبيل المثال‪،‬‬
‫قد نستخدم وحدات معالجة الرسومات ‪ GPU‬إللغاء ضغط الصورة بكفاءة‪ ،‬أو تحويل ترميز‬
‫الفيديو‪ ،‬أو غير ذلك من عمليات المعالجة المسبقة‪ .‬كلما كان ذلك ممكنًا‪ ،‬يجب أن تعتمد على‬
‫مكررات البيانات التي تم تنفيذها جيدًا والتي تستغل الحوسبة عالية األداء لتجنب إبطاء حلقة‬
‫التدريب الخاصة بك‪.‬‬

‫‪4.2.5‬‬
‫‪ .1‬هل تقليل حجم الدفعة ‪( batch_size‬على سبيل المثال‪ ،‬إلى ‪ )1‬يؤثر على أداء‬
‫القراءة؟‬
‫‪193‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪ .2‬أداء مكرر البيانات ‪ data iterator‬مهم‪ .‬هل تعتقد أن التنفيذ الحالي سريع بما فيه‬
‫الكفاية؟ استكشف الخيارات المختلفة لتحسينها‪ .‬استخدم ملف تعريف النظام لمعرفة‬
‫مكان االختناقات ‪.bottlenecks‬‬
‫‪ .3‬تحقق من وثائق ‪ API‬على اإلنترنت الخاصة بإطار العمل‪ .‬ما هي مجموعات البيانات‬
‫األخرى المتوفرة؟‬

‫‪The Base Classification Model‬‬ ‫‪4.3‬‬


‫ربما الحظت أن عمليات التنفيذ من البداية ‪ implementations from scratch‬والتنفيذ‬
‫المختصر ‪ concise implementation‬باستخدام دالة إطار العمل كانت متشابهة تمامًايف حالة‬
‫االنحدار‪ .‬وينطبق الشيء نفسه على التصنيف‪ .‬نظرًا ألن العديد من النماذجيف هذا الكتاب تتعامل‬
‫مع التصنيف‪ ،‬فمن الجدير إضافة بعض الدوال لدعم هذا اإلعداد على وجه التحديد‪ .‬يوفر هذا‬
‫القسم فئة أساسية لنماذج التصنيف لتبسيط الكود المستقبلي‪.‬‬

‫‪import tensorflow as tf‬‬


‫‪from IPython import display‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪The Classifier Class‬‬ ‫‪4.3.1‬‬
‫نحدد فئة المصنف ‪ Classifier‬أدناه‪.‬يف ‪ validation_step‬نقوم باإلبالغ عن كل من قيمة‬
‫الخطأ ودقة التصنيف ‪ classification accuracy‬على دفعة التحقق من الصحة ‪validation‬‬
‫‪ .batch‬نحن نرسم تحديثًا لكل عدد من الدفعات ‪ .num_val_batches‬هذا له فائدة توليد‬
‫متوسط الخطأ والدقة على بيانات التحقق بأكملها‪ .‬هذه األرقام المتوسطة ليست صحيحة تمامًا‬
‫إذا كانت الدفعة األخيرة تحتوي على أمثلة أقل‪ ،‬لكننا نتجاهل هذا االختالف الطفيف للحفاظ‬
‫على بساطة الرمز‪.‬‬

‫‪class Classifier(d2l.Module): #@save‬‬


‫‪def validation_step(self, batch):‬‬
‫)]‪Y_hat = self(*batch[:-1‬‬
‫‪self.plot('loss', self.loss(Y_hat, batch[-1]),‬‬
‫)‪train=False‬‬
‫‪self.plot('acc', self.accuracy(Y_hat, batch[-‬‬
‫)‪1]), train=False‬‬
‫بشكل افتراضي‪ ،‬نستخدم مُحسِّن التدرج االشتقاقي العشوائي ‪ ،SGD‬يعمل على الدفعات‬
‫الصغيرة‪ ،minibatches‬تمامًا كما فعلنايف سياق االنحدار الخطي‪.‬‬

‫‪@d2l.add_to_class(d2l.Module) #@save‬‬
‫‪def configure_optimizers(self):‬‬
‫)‪return tf.keras.optimizers.SGD(self.lr‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪194‬‬

‫‪Accuracy‬‬ ‫‪4.3.2‬‬
‫بالنظر إلى التوزيع االحتمالي المتوقع ‪ ،y_hat‬فإننا عادةً ما نختار الفئة ذات أعلى احتمالية‬
‫متوقعة عندما يتعين علينا إخراج تنبؤ صعب‪.‬يف الواقع‪ ،‬تتطلب العديد من التطبيقات أن نقوم‬
‫باالختيار‪ .‬على سبيل المثال‪ ،‬يجب أن يصنف ‪ Gmail‬بريدًا إلكترونيًا إلى "أساسي" أو "اجتماعي"‬
‫أو "تحديثات" أو "منتديات" أو "بريد عشوائي"‪ .‬قد يقدر االحتماالت داخليًا‪ ،‬ولكنيف نهاية اليوم‪،‬‬
‫يجب عليه اختيار واحد من بين الفئات‪.‬‬

‫عندما تتوافق التنبؤات مع فئة التسمية ‪ ،y‬فإنها صحيحة‪ .‬دقة التصنيف هي جزء من كل التوقعات‬
‫الصحيحة‪ .‬على الرغم من أنه قد يكون من الصعب تحسين الدقة بشكل مباشر (ال يمكن التمييز‬
‫بينها)‪ ،‬إال أنه غالبًا ما يكون مقياس األداء الذي نهتم به كثيرًا‪ .‬غالبًا ما تكون الكمية ذات الصلةيف ‬
‫المعايير‪ .‬على هذا النحو‪ ،‬سنقوم دائمًا باإلبالغ عن ذلك عند تدريب المصنفات‪.‬‬

‫يتم حساب الدقة على النحو التالي‪ .‬أوالً‪ ،‬إذا كانت ‪ y_hat‬عبارة عن مصفوفة‪ ،‬فإننا نفترض أن‬
‫البعد الثاني يخزن درجات التنبؤ لكل فئة‪ .‬نستخدم ‪argmax‬للحصول على الفئة المتوقعة‬
‫بواسطة الفهرس ألكبر إدخاليف كل صف‪ .‬ثم نقارن الفئة المتنبأ بها مع الحقيقة األساسية ‪y‬‬
‫بشكل عنصري ‪ .elementwise‬نظرًا ألن عامل المساواة == حساس ألنواع البيانات‪ ،‬فإننا نقوم‬
‫بتحويل نوع بيانات ‪ y_hat‬لمطابقة نوع بيانات ‪ .y‬والنتيجة هي موتر يحتوي على إدخاالت من‬
‫‪( 0‬خطأ) و‪( 1‬صواب)‪ .‬أخذ المجموع ينتج عنه عدد التنبؤات الصحيحة‪.‬‬

‫‪@d2l.add_to_class(Classifier) #@save‬‬
‫‪def accuracy(self, Y_hat, Y, averaged=True):‬‬
‫"""‪"""Compute the number of correct predictions.‬‬
‫))]‪Y_hat = tf.reshape(Y_hat, (-1, Y_hat.shape[-1‬‬
‫)‪preds = tf.cast(tf.argmax(Y_hat, axis=1), Y.dtype‬‬
‫‪compare = tf.cast(preds == tf.reshape(Y, -1),‬‬
‫)‪tf.float32‬‬
‫‪return tf.reduce_mean(compare) if averaged else‬‬
‫‪compare‬‬
‫‪4.3.3‬‬
‫التصنيف مشكلة شائعة بما فيه الكفاية لدرجة أنه يضمن دوال المالئمة ‪convenience‬‬
‫‪ functions‬الخاصة به‪ .‬من األهمية بمكانيف التصنيف دقة المصنف‪ .‬الحظ أنه بينما نهتم غالبًا‬
‫بالدقة‪ ،‬فإننا ندرب المصنفين لتحسين مجموعة متنوعة من األهداف األخرى ألسباب إحصائية‬
‫وحسابية‪ .‬ومع ذلك‪ ،‬بغض النظر عن دالة الخطأ التي تم تقليلها أثناء التدريب‪ ،‬فمن المفيد أن‬
‫يكون لديك طريقة مالئمة لتقييم دقة المصنف تجريبيًا‪.‬‬
‫‪195‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪4.3.4‬‬
‫𝑞‬
‫تقديرها السريع والقذر‬ ‫𝑣𝐿‬ ‫‪ .1‬قم باإلشارة إلى خطأ التحقق من الصحة 𝑣𝐿 ‪ ،‬وليكن‬
‫محسوبًا بواسطة دالة الخطأيف المتوسطيف هذا القسم‪ .‬أخيرًا‪ ،‬قم باإلشارة بواسطة‬
‫𝑞‬
‫𝑏𝑣𝑙الخطأيف آخر ‪ .minibatch‬قم بالتعبير عن 𝑣𝐿 من حيث 𝑣𝐿 و 𝑏𝑣𝑙 وأحجام العينة و‬
‫‪.minibatch‬‬
‫𝑞‬
‫غير متحيز ‪ .unbiased‬هذا هو‪ ،‬أظهر ذلك‬ ‫𝑣𝐿‬ ‫‪ .2‬أظهر أن التقدير السريع والقذر‬
‫𝑞‬
‫] 𝑣𝐿[𝐸 = ] 𝑣𝐿[𝐸‪ .‬لماذا ال تزال ترغبيف استخدام 𝑣𝐿 بدال من ذلك؟‬
‫‪ .3‬بالنظر إلى خطأ التصنيف متعدد الطبقات ‪،multiclass classification loss‬‬
‫) ‪ 𝑙(𝑦, 𝑦 ′‬التي تدل على عقوبة التقدير ‪ 𝑦 ′‬عندما نرى 𝑦 واالحتمالية المعطاة ∣ 𝑦(𝑝‬
‫)𝑥‪ ،‬قم بصياغة القاعدة لالختيار األمثل لـ ‪ .𝑦 ′‬تلميح‪ :‬عبر عن الخطأ المتوقع باستخدام‬
‫𝑙 و )𝑥 ∣ 𝑦(𝑝‪.‬‬

‫‪Softmax Regression‬‬ ‫‪Softmax‬‬ ‫‪4.4‬‬


‫‪Implementation from Scratch‬‬
‫نظرًا ألن انحدار ‪ softmax‬أساسي جدًا‪ ،‬فنحن نعتقد أنه يجب عليك معرفة كيفية تنفيذه بنفسك‪.‬‬
‫هنا‪ ،‬نقتصر على تحديد الجوانب الخاصة بـ ‪ softmax‬للنموذج وإعادة استخدام المكونات‬
‫األخرى من قسم االنحدار الخطي‪ ،‬بمايف ذلك حلقة التدريب‪.‬‬

‫‪import tensorflow as tf‬‬


‫‪from d2l import tensorflow as d2l‬‬
‫‪The Softmax‬‬ ‫‪4.4.1‬‬
‫لنبدأ بالجزء األكثر أهمية‪ :‬التخطيط من القيم القياسية ‪ Scalars‬إلى االحتماالت ‪.probabilities‬‬
‫لتجديد المعلومات‪ ،‬تذكر عملية عامل المجموع على طول أبعاد محددةيف موتر‪ ،‬كما تمت‬
‫مناقشتهيف القسم ‪ 2.3.6‬والقسم ‪ .2.3.7‬بالنظر إلى المصفوفة ‪ ،X‬يمكننا جمع كل العناصر‬
‫(افتراضيًا) أو فقط العناصر الموجودةيف نفس المحور‪ .‬يتيح لنا متغير المحور حساب مجاميع‬
‫الصفوف واألعمدة‪:‬‬

‫)]]‪X = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0‬‬


‫‪tf.reduce_sum(X, 0, keepdims=True), tf.reduce_sum(X, 1,‬‬
‫)‪keepdims=True‬‬
‫‪(<tf.Tensor: shape=(1, 3), dtype=float32,‬‬
‫‪numpy=array([[5., 7., 9.]], dtype=float32)>,‬‬
‫=‪<tf.Tensor: shape=(2, 1), dtype=float32, numpy‬‬
‫‪array([[ 6.],‬‬
‫)>)‪[15.]], dtype=float32‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪196‬‬

‫يتطلب حساب ‪ softmax‬ثالث خطوات‪ )1( :‬األس لكل مصطلح؛ (‪ )2‬مجموع كل صف‬
‫لحساب ثابت التسوية لكل مثال؛ (‪ )3‬قسمة كل صف على ثابت التسوية الخاص به ‪ ،‬مع التأكد‬
‫من أن النتيجة تصل إلى ‪.1‬‬

‫) 𝑗𝑖 𝐗( ‪exp‬‬
‫= 𝑗𝑖)𝐗(‪softmax‬‬ ‫‪.‬‬
‫) 𝑘𝑖 𝐗( ‪∑𝑘 exp‬‬

‫يسمى (لوغاريتم) المقام بدالة القسم (اللوغارتم) ‪ .(log) partition function‬تم تقديمهيف ‬
‫الفيزياء اإلحصائية ‪ statistical physics‬لتلخيص جميع الحاالت الممكنةيف مجموعة الديناميكا‬
‫الحرارية‪ .‬التنفيذ مباشر‪:‬‬

‫‪def softmax(X):‬‬
‫)‪X_exp = tf.exp(X‬‬
‫)‪partition = tf.reduce_sum(X_exp, 1, keepdims=True‬‬
‫‪return X_exp / partition # The broadcasting‬‬
‫‪mechanism is applied here‬‬
‫ألي إدخال ‪ ،X‬نحول كل عنصر إلى رقم غير سالب‪ .‬يلخص كل صف ما يصل إلى ‪ ،1‬كما هو‬
‫مطلوب لالحتمال‪ .‬تحذير‪ :‬الكود أعاله ليس قويًا ضد المدخالت الكبيرة جدًا أو الصغيرة جدًا‪.‬‬
‫في حين أن هذا كافٍ لتوضيح ما يحدث‪ ،‬يجب أال تستخدم هذا الرمز حرفيًا ألي غرض جاد‪.‬‬
‫تحتوي أطر التعلم العميق على مثل هذه الحماية المضمنة وسنستخدم ‪ softmax‬المدمجيف ‬
‫المستقبل‪.‬‬

‫))‪X = tf.random.uniform((2, 5‬‬


‫)‪X_prob = softmax(X‬‬
‫)‪X_prob, tf.reduce_sum(X_prob, 1‬‬
‫=‪(<tf.Tensor: shape=(2, 5), dtype=float32, numpy‬‬
‫‪array([[0.15478596, 0.14451225, 0.31821206, 0.1521694 ,‬‬
‫‪0.23032041],‬‬
‫‪[0.21168488, 0.29741856, 0.15408915, 0.14877847,‬‬
‫‪0.18802889]],‬‬
‫‪dtype=float32)>,‬‬
‫‪<tf.Tensor: shape=(2,), dtype=float32,‬‬
‫)>)‪numpy=array([1.0000001 , 0.99999994], dtype=float32‬‬
‫‪The Model‬‬ ‫‪4.4.2‬‬
‫لدينا اآلن كل ما نحتاجه لتنفيذ نموذج انحدار ‪ .softmax‬كمايف مثال االنحدار الخطي الخاص‬
‫بنا‪ ،‬سيتم تمثيل كل مثيل ‪ instance‬بواسطة متجه بطول ثابت‪ .‬نظرًا ألن البيانات األولية هنا‬
‫تتكون من صور ‪ 28 × 28‬بكسل‪ ،‬فإننا نقوم بتسوية كل صورة‪ ،‬ومعاملتها كمتجهات بطول ‪.784‬‬
‫‪197‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫في فصول الحقة‪ ،‬سنقدم الشبكات العصبية التالفيفية ‪،convolutional neural networks‬‬
‫والتي تستغل البنية المكانية بطريقة أكثر إرضاءً‪.‬‬

‫في انحدار ‪ ،softmax‬يجب أن يكون عدد المخرجات من شبكتنا مساويًا لعدد الفئات‪ .‬نظرًا ألن‬
‫مجموعة البيانات الخاصة بنا تتكون من ‪ 10‬فئات‪ ،‬فإن بُعد إخراج شبكتنا هو ‪ .10‬وبالتالي‪،‬‬
‫تشكل أوزاننا مصفوفة ‪ 784 × 10‬باإلضافة إلى متجه صف ‪ 1 × 10‬أبعاد للتحيزات‪ .‬كما هو‬
‫الحال مع االنحدار الخطي‪ ،‬نقوم بتهيئة األوزان ‪ W‬بضوضاء غاوسي‪ .‬تتم تهيئة التحيزات‬
‫كأصفار‪.‬‬

‫‪class SoftmaxRegressionScratch(d2l.Classifier):‬‬
‫‪def __init__(self, num_inputs, num_outputs, lr,‬‬
‫‪sigma=0.01):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫‪self.W = tf.random.normal((num_inputs,‬‬
‫)‪num_outputs), 0, sigma‬‬
‫)‪self.b = tf.zeros(num_outputs‬‬
‫)‪self.W = tf.Variable(self.W‬‬
‫)‪self.b = tf.Variable(self.b‬‬
‫يحدد الكود أدناه كيف تقوم الشبكة بتعيين كل إدخال إلى أحد المخرجات‪ .‬الحظ أننا نقوم بتسوية‬
‫كل صورة ‪ 28 × 28‬بكسليف الدُفعة إلى متجه باستخدام إعادة التشكيل ‪ reshape‬قبل تمرير‬
‫البيانات عبر نموذجنا‪.‬‬

‫)‪@d2l.add_to_class(SoftmaxRegressionScratch‬‬
‫‪def forward(self, X):‬‬
‫(‪return softmax(tf.matmul(tf.reshape‬‬
‫)‪X, (-1, self.W.shape[0])), self.W) + self.b‬‬
‫‪The Cross-Entropy Loss‬‬ ‫‪4.4.3‬‬
‫بعد ذلك نحتاج إلى تنفيذ دالة الخطأ عبر االنتروبيا (المقدمةيف القسم ‪ .)4.1.2‬قد تكون هذه‬
‫هي دالة الخطأ األكثر شيوعًايف كل التعلم العميق‪.‬يف الوقت الحالي‪ ،‬فإن تطبيقات التعلم العميق‬
‫تلقي بسهولة مشاكل التصنيف التي تفوق بكثير تلك التي يتم التعامل معها بشكل أفضل على‬
‫أنها مشاكل انحدار‪.‬‬

‫تذكر أن االنتروبيا المتقاطعة ‪ Cross-Entropy‬تأخذ احتمالية اللوغارتم السلبية لالحتمال‬


‫المتوقع المخصص للتسمية الحقيقية‪ .‬من أجل الكفاءة‪ ،‬نتجنب بايثون ‪ for-loops‬ونستخدم‬
‫الفهرسة ‪ indexing‬بدالً من ذلك‪ .‬على وجه الخصوص‪ ،‬يتيح لنا التشفير األحادي الساخن‬
‫^‬
‫تحديد مصطلحات المطابقةيف 𝐲 بتحديد مصطلحات المطابقةيف 𝐲‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪198‬‬

‫لرؤية هذا عمليًا‪ ،‬قمنا بإنشاء عينة بيانات ‪ y_hat‬مع مثالين لالحتماالت المتوقعة عبر ‪ 3‬فئات‬
‫والتسميات المقابلة لها ‪ .y‬التسميات الصحيحة هي ‪ 1‬و‪ 2‬على التوالي‪ .‬باستخدام ‪ y‬كمؤشرات‬
‫لالحتماالتيف ‪ ،y_hat‬يمكننا اختيار الحدود بكفاءة‪.‬‬

‫)]]‪y_hat = tf.constant([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5‬‬


‫)]‪y = tf.constant([0, 2‬‬
‫‪tf.boolean_mask(y_hat, tf.one_hot(y, depth=y_hat.shape[-‬‬
‫))]‪1‬‬
‫‪<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.1,‬‬
‫>)‪0.5], dtype=float32‬‬
‫يمكننا اآلن تنفيذ دالة الخطأ عبر االنتروبيا من خالل حساب المتوسط على لوغاريتمات‬
‫االحتماالت المحددة‪.‬‬

‫‪def cross_entropy(y_hat, y):‬‬


‫(‪return - tf.reduce_mean(tf.math.log(tf.boolean_mask‬‬
‫))))]‪y_hat, tf.one_hot(y, depth=y_hat.shape[-1‬‬

‫)‪cross_entropy(y_hat, y‬‬
‫>‪<tf.Tensor: shape=(), dtype=float32, numpy=1.4978662‬‬
‫)‪@d2l.add_to_class(SoftmaxRegressionScratch‬‬
‫‪def loss(self, y_hat, y):‬‬
‫)‪return cross_entropy(y_hat, y‬‬
‫‪Training‬‬ ‫‪4.4.4‬‬
‫نعيد استخدام طريقة المالءمة المحددةيف القسم ‪ 3.4‬لتدريب النموذج على ‪ 10‬فترات‪ .‬الحظ أن‬
‫كالً من عدد الفترات (‪ ،)max_epochs‬وحجم الدفعات الصغيرة (‪ ،)batch_size‬ومعدل‬
‫التعلم (‪ )lr‬هي معلمات فائقة قابلة للتعديل ‪ .adjustable hyperparameters‬هذا يعني أنه‬
‫على الرغم من عدم تعلم هذه القيم خالل حلقة التدريب األولية لدينا‪ ،‬إال أنها ال تزال تؤثر على‬
‫أداء نموذجنا‪ ،‬والبوت مقابل التدريب وأداء التعميم‪ .‬من الناحية العملية‪ ،‬سترغبيف اختيار هذه‬
‫القيم بناءً على تقسيم التحقق من صحة البيانات ثم تقييم نموذجك النهائييف نهاية المطافيف ‬
‫قسم االختبار‪ .‬كما تمت مناقشتهيف القسم ‪ ،3.6.3‬سوف نتعامل مع بيانات اختبار ‪Fashion-‬‬
‫‪ MNIST‬باعتبارها مجموعة التحقق من الصحة‪ ،‬وبالتالي اإلبالغ عن خطأ التحقق من الصحة‬
‫ودقة التحقق من الصحة على هذا التقسيم‪.‬‬

‫)‪data = d2l.FashionMNIST(batch_size=256‬‬
‫‪model = SoftmaxRegressionScratch(num_inputs=784,‬‬
‫)‪num_outputs=10, lr=0.1‬‬
‫)‪trainer = d2l.Trainer(max_epochs=10‬‬
‫)‪trainer.fit(model, data‬‬
‫‪199‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪Prediction‬‬ ‫‪4.4.5‬‬
‫اآلن بعد اكتمال التدريب‪ ،‬أصبح نموذجنا جاهزًا لتصنيف بعض الصور‪.‬‬

‫)))(‪X, y = next(iter(data.val_dataloader‬‬
‫)‪preds = tf.argmax(model(X), axis=1‬‬
‫‪preds.shape‬‬
‫)]‪TensorShape([256‬‬
‫نحن مهتمون أكثر بالصور التي نسميها ‪ label‬بشكل غير صحيح‪ .‬نتخيلها من خالل مقارنة‬
‫تسمياتها الفعلية (السطر األول من إخراج النص) مع التنبؤات من النموذج (السطر الثاني من‬
‫إخراج النص)‬

‫‪wrong = tf.cast(preds, y.dtype) != y‬‬


‫]‪X, y, preds = X[wrong], y[wrong], preds[wrong‬‬
‫(‪labels = [a+'\n'+b for a, b in zip‬‬
‫]))‪data.text_labels(y), data.text_labels(preds‬‬
‫)‪data.visualize([X, y], labels=labels‬‬

‫‪4.4.6‬‬
‫لقد بدأنا اآلنيف اكتساب بعض الخبرةيف حل مشاكل االنحدار الخطي والتصنيف‪ .‬بواسطته‪،‬‬
‫وصلنا إلى ما يمكن القول إنه حالة فن النمذجة اإلحصائيةيف الستينيات والسبعينيات من القرن‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪200‬‬

‫الماضي‪.‬يف القسم التالي‪ ،‬سنوضح لك كيفية االستفادة من أطر التعلم العميق لتنفيذ هذا النموذج‬
‫بشكل أكثر كفاءة‪.‬‬

‫‪4.4.7‬‬
‫‪ .1‬في هذا القسم‪ ،‬قمنا بتنفيذ دالة ‪ softmax‬بشكل مباشر بناءً على التعريف الرياضي‬
‫لعملية ‪ .softmax‬كما نوقشيف القسم ‪ ،4.1‬يمكن أن يتسبب هذايف عدم استقرار رقمي‬
‫‪.numerical instabilities‬‬
‫‪ .1‬اختبر ما إذا كان ‪ softmax‬ال يزال يعمل بشكل صحيح إذا كانت قيمة اإلدخال‬
‫‪ 100‬؟‬
‫‪ .2‬اختبر ما إذا كان ‪ softmax‬ال يزال يعمل بشكل صحيح إذا كان أكبر المدخالت‬
‫أصغر من ‪ −100‬؟‬
‫‪ .3‬قم بتنفيذ اإلصالح بالنظر إلى القيمة المتعلقة بأكبر إدخاليف الوسيطة‪.‬‬
‫‪ .2‬تنفيذ دالة عبر_انتروبيا ‪ cross_entropy‬تتبع تعريف دالة الخطأ عبر االنتروبيا‬
‫^‬
‫𝑖𝑦 ‪∑𝑖 𝑦𝑖 log‬‬
‫‪ .1‬جربهيف مثال الكود أعاله‪.‬‬
‫‪ .2‬لماذا تعتقد أنه يعمل بشكل أبطأ؟‬
‫‪ .3‬هل يجب عليك استخدامه؟يف أي الحاالت يكون له معنى؟‬
‫‪ .4‬ما الذي تحتاج إلى توخي الحذر منه؟ تلميح‪ :‬ضعيف اعتبارك مجال اللوغاريتم‪.‬‬
‫‪ .3‬هل من الجيد دائمًا إرجاع التسمية األكثر احتماالً؟ على سبيل المثال‪ ،‬هل ستفعل هذا‬
‫من أجل التشخيص الطبي؟ كيف ستحاول معالجة هذا؟‬
‫‪ .4‬افترض أننا نريد استخدام انحدار ‪ softmax‬للتنبؤ بالكلمة التالية بناءً على بعض‬
‫الميزات‪ .‬ما هي بعض المشاكل التي قد تنشأ من المفردات الكبيرة؟‬
‫‪ .5‬جرب المعلمات الفائقة ‪ hyperparameters‬للشفرة أعاله‪ .‬خاصه‪:‬‬
‫‪ .1‬ارسم كيف يتغير خطأ التحقق أثناء تغيير معدل التعلم‪.‬‬
‫‪ .2‬هل يتغير التحقق من الصحة وخطأ التدريب كلما قمت بتغيير حجم الدفعات‬
‫الصغيرة؟ إلى أي مدى يجب أن تذهب قبل أن ترى تأثيرًا كبيرًا أم صغيرًا؟‬

‫‪Softmax‬‬ ‫‪4.5‬‬
‫مثلما سهّلت أطر التعلم العميق عالية المستوى تنفيذ االنحدار الخطي (انظر القسم ‪ ،)3.5‬فهي‬
‫مناسبة أيضًا هنا‪.‬‬

‫‪import tensorflow as tf‬‬


‫‪from d2l import tensorflow as d2l‬‬
‫‪201‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪Defining the Model‬‬ ‫‪4.5.1‬‬


‫كمايف القسم ‪ ،3.5‬نقوم ببناء الطبقة المتصلة بالكامل باستخدام الطبقة المضمنة ‪built-in‬‬
‫‪ .layer‬ثم تستدعي طريقة __‪ __call‬المضمنة ‪forward‬كلما احتجنا إلى تطبيق الشبكة‬
‫على بعض المدخالت‪.‬‬

‫‪class SoftmaxRegression(d2l.Classifier):‬‬
‫‪def __init__(self, num_outputs, lr):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫)(‪self.net = tf.keras.models.Sequential‬‬
‫))(‪self.net.add(tf.keras.layers.Flatten‬‬
‫))‪self.net.add(tf.keras.layers.Dense(num_outputs‬‬

‫‪def forward(self, X):‬‬


‫)‪return self.net(X‬‬
‫‪Softmax Revisited‬‬ ‫‪4.5.2‬‬
‫في القسم ‪ ،4.4‬قمنا بحساب ناتج نموذجنا وطبقنا خطأ االنتروبيا المتقاطعة‪.‬يف حين أن هذا‬
‫معقول رياضيًا تمامًا‪ ،‬إال أنه محفوف بالمخاطر من الناحية الحسابية‪ ،‬بسبب ‪ underflow‬و‬
‫‪ overflow‬يف األس‪.‬‬
‫^‬ ‫) 𝑗𝑜( ‪exp‬‬
‫∑ = 𝑗𝑦 ‪ .‬إذا كان بعضها كبيرًا جدًا‪،‬‬ ‫تذكر أن دالة ‪ softmax‬تحسب االحتماالت عبر‬
‫𝑘‬ ‫) 𝑘𝑜( ‪exp‬‬
‫أي إيجابي جدًا‪ ،‬فقد يكون أكبر من أكبر رقم يمكننا الحصول عليه ألنواع بيانات معينة‪ .‬هذا‬
‫يسمى الفائض ‪ .overflow‬وبالمثل‪ ،‬إذا كانت جميع المعامالت ‪ arguments‬سلبية للغاية‪،‬‬
‫فسنحصل على ‪ .underflow‬على سبيل المثال‪ ،‬تغطي أرقام الفاصلة العائمة ذات الدقة الواحدة‬
‫تقريبًا نطاق إلى ‪ .10−38‬على هذا النحو‪ ،‬إذا كان الحد األكبريف 𝐨 يقع خارج الفترة الزمنية‬
‫‪def‬‬
‫]‪ ، [−90,90‬فلن تكون النتيجة مستقرة‪ .‬حل هذه المشكلة هو طرح 𝑘𝑜 𝑥𝑎𝑚 = 𝑜 من كافة‬
‫𝑘‬
‫اإلدخاالت‪:‬‬

‫^‬ ‫𝑗𝑜 ‪exp‬‬ ‫𝑜 ‪exp (𝑜𝑗 − 𝑜)exp‬‬ ‫)𝑜 ‪exp (𝑜𝑗 −‬‬
‫= 𝑗𝑦‬ ‫=‬ ‫=‬ ‫‪.‬‬
‫)𝑜 ‪∑𝑘 exp 𝑜𝑘 ∑𝑘 exp (𝑜𝑘 − 𝑜)exp 𝑜 ∑𝑘 exp (𝑜𝑘 −‬‬

‫من خالل البناء نعرف ‪ 𝑜𝑗 − 𝑜 ≤ 0‬لكل 𝑗‪ .‬على هذا النحو‪ ،‬بالنسبة لمشكلة تصنيف فئة 𝑞 ‪ ،‬يتم‬
‫احتواء المقاميف الفاصل الزمني ]𝑞 ‪ .[1,‬عالوة على ذلك‪ ،‬ال يتجاوز البسط أبدًا ‪ ، 1‬وبالتالي يمنع‬
‫التدفق العددي ‪ .numerical overflow‬يحدث التدفق العددي فقط عندما )𝑜 ‪exp (𝑜𝑗 −‬‬
‫تُقيم عدديًا كـ ‪ .0‬ومع ذلك‪ ،‬على بعد خطوات قليلة على الطريق‪ ،‬قد نجد أنفسنايف مأزق عندما‬
‫^‬
‫كما ‪ .log 0‬على وجه الخصوص‪،‬يف االنتشار الخلفي‬ ‫نريد حساب 𝑗𝑦 ‪log‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪202‬‬

‫‪ ،backpropagation‬قد نجد أنفسنايف مواجهة شاشة من نتائج ‪ NaN‬المخيفة (ليس رقمًا‬


‫‪.)Not a Number‬‬

‫لحسن الحظ‪ ،‬يتم إنقاذنا من حقيقة أنه على الرغم من أننا نحسب الدوال األسية‪ ،‬فإننا نعتزميف ‬
‫النهاية أخذ ‪( log‬عند حساب خطأ االنتروبيا المتقاطعة)‪ .‬من خالل الجمع بين ‪ softmax‬و‬
‫‪ ،cross-entropy‬يمكننا الهروب من مشكالت االستقرار العددي تمامًا‪ .‬نملك‪:‬‬

‫^‬ ‫)𝑜 ‪exp (𝑜𝑗 −‬‬


‫‪log 𝑦𝑗 = log‬‬ ‫∑ ‪= 𝑜𝑗 − 𝑜 − log‬‬ ‫‪exp (𝑜𝑘 − 𝑜).‬‬
‫)𝑜 ‪∑𝑘 exp (𝑜𝑘 −‬‬
‫𝑘‬

‫هذا يتجنب كالً من الفائض ‪ overflow‬والفيضان ‪ .underflow‬سنرغبيف االحتفاظ بدالة‬


‫‪ softmax‬التقليديةيف متناول اليديف حالة رغبتنايف تقييم احتماالت اإلخراج من خالل نموذجنا‪.‬‬
‫ولكن بدالً من تمرير احتماالت ‪ softmax‬إلى دالة الخسارة الجديدة لدينا‪ ،‬نقوم فقط بتمرير‬
‫السجالت ‪ logits‬وحساب ‪ softmax‬وسجله مرة واحدة داخل دالة فقدان االنتروبيا‪ ،‬والتي تقوم‬
‫بأشياء ذكية مثل "خدعة”‪." “LogSumExp trick‬‬

‫‪@d2l.add_to_class(d2l.Classifier) #@save‬‬
‫‪def loss(self, Y_hat, Y, averaged=True):‬‬
‫))]‪Y_hat = tf.reshape(Y_hat, (-1, Y_hat.shape[-1‬‬
‫))‪Y = tf.reshape(Y, (-1,‬‬
‫= ‪fn‬‬
‫‪tf.keras.losses.SparseCategoricalCrossentropy(from_logit‬‬
‫)‪s=True‬‬
‫)‪return fn(Y, Y_hat‬‬
‫‪Training‬‬ ‫‪4.5.3‬‬
‫بعد ذلك نقوم بتدريب نموذجنا‪ .‬كما كان من قبل‪ ،‬نستخدم صور ‪ ،Fashion-MNIST‬تسطح‬
‫‪ flattened‬إلى ‪ 784‬متجهًا للميزات ذات األبعاد‪.‬‬

‫)‪data = d2l.FashionMNIST(batch_size=256‬‬
‫)‪model = SoftmaxRegression(num_outputs=10, lr=0.1‬‬
‫)‪trainer = d2l.Trainer(max_epochs=10‬‬
‫)‪trainer.fit(model, data‬‬
‫‪203‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫كمايف السابق‪ ،‬تتقارب هذه الخوارزمية مع حل يحقق دقة الئقة‪ ،‬وإن كان هذا الوقت يحتوي على‬
‫عدد أقل من سطور التعليمات البرمجية عن ذي قبل‪.‬‬

‫‪4.5.4‬‬
‫تعد واجهات برمجة التطبيقات ‪ APIs‬عالية المستوى مالئمة للغايةيف إخفاء الجوانب التي يحتمل‬
‫أن تكون خطرة عن مستخدميها‪ ،‬مثل االستقرار العددي ‪ .numerical stability‬عالوة على‬
‫ذلك‪ ،‬فهي تسمح للمستخدمين بتصميم النماذج بإيجاز مع عدد قليل جدًا من أسطر التعليمات‬
‫البرمجية‪ .‬هذا هو بمثابة نعمة ونقمة‪ .‬الفائدة الواضحة هي أنه يجعل األشياء سهلة الوصول‪ ،‬حتى‬
‫للمهندسين الذين لم يأخذوا فئة واحدة من اإلحصائياتيف حياتهم (في الواقع‪ ،‬هذا هو أحد‬
‫الجماهير المستهدفة للكتاب)‪ .‬لكن إخفاء الحواف الحادة يأتي أيضًا مع ثمن‪ :‬عامل مثبط إلضافة‬
‫مكونات جديدة ومختلفة بمفردك‪ ،‬نظرًا لوجود ذاكرة عضلية قليلة للقيام بذلك‪ .‬عالوة على ذلك‪،‬‬
‫فإنه يجعل من الصعب إصالح األشياء كلما فشلت الحشوة الحامية ‪protective padding‬‬
‫إلطار العمليف تغطية جميع حاالت الزاوية بالكامل‪ .‬مرة أخرى‪ ،‬هذا يرجع إلى عدم اإللمام‪.‬‬

‫على هذا النحو‪ ،‬نحثك بشدة على مراجعة كل من العظام المجردة واإلصدارات األنيقة للعديد‬
‫من التطبيقات التالية‪ .‬بينما نؤكد على سهولة الفهم‪ ،‬فإن التطبيقات عادة ما تكون عالية األداء‬
‫(التالفيف ‪ convolutions‬هي االستثناء الكبير هنا)‪ .‬نعتزم السماح لك بالبناء عليها عندما‬
‫تخترع شيئًا جديدًا ال يمكن ألي إطار عمل أن يمنحك إياه‪.‬‬

‫‪4.5.5‬‬
‫‪ .1‬يستخدم التعلم العميق العديد من تنسيقات األرقام المختلفة‪ ،‬بمايف ذلك الدقة‬
‫المزدوجة لـ ‪( FP64‬نادرًا جدًا)‪ ،‬الدقة الفردية ‪( BFLOAT16 ،FP32‬جيدة‬
‫للتمثيالت المضغوطة) ‪( FP16 ،‬غير مستقر جدًا) ‪( TF32 ،‬تنسيق جديد من‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪204‬‬

‫‪،)NVIDIA‬و ‪ .INT8‬احسب أصغر وأكبر وسيطة للدالة األسية التي ال تؤدي‬


‫نتيجتها إلى تدفق رقمي ‪ numerical underflow‬أو ‪.overflow‬‬
‫‪ INT8 .2‬هو تنسيق محدود للغاية بأرقام غير صفرية من ‪ 1‬إلى ‪ .255‬كيف يمكنك‬
‫توسيع نطاقها الديناميكي دون استخدام المزيد من البتات؟ هل الضرب والجمع‬
‫القياسيان مازاال يعمالن؟‬
‫‪ .3‬زيادة عدد فترات التدريب ‪ .number of epochs for training‬لماذا قد تنخفض‬
‫دقة التحقق بعد فترة؟ كيف يمكننا إصالح هذا؟‬
‫‪ .4‬ماذا يحدث كلما زادت معدل التعلم؟ قارن منحنيات الخطأ للعديد من معدالت التعلم‪.‬‬
‫أيهما يعمل بشكل أفضل؟ متى؟‬

‫‪Generalization in Classification‬‬ ‫‪4.6‬‬


‫حتى اآلن‪ ،‬ركزنا على كيفية معالجة مشاكل التصنيف متعدد الطبقات ‪multiclass‬‬
‫‪ classification problems‬من خالل تدريب الشبكات العصبية (الخطية) ذات المخرجات‬
‫المتعددة ودوال ‪ .softmax‬عند تفسير مخرجات نموذجنا على أنها تنبؤات احتمالية‪ ،‬قمنا بتحفيز‬
‫واشتقاق دالة خطأ االنتروبيا المتقاطعة ‪ ،cross-entropy loss function‬والتي تحسب‬
‫احتمالية اللوغارتم السلبي ‪ negative log likelihood‬التي يخصصها نموذجنا (لمجموعة‬
‫ثابتة من المعلمات) للتسميات الفعلية‪ .‬وأخيرًا‪ ،‬نضع هذه األدوات موضع التنفيذ من خالل‬
‫مالءمة ‪ fitting‬نموذجنا لمجموعة التدريب‪ .‬ومع ذلك‪ ،‬كما هو الحال دائمًا‪ ،‬فإن هدفنا هو تعلم‬
‫األنماط العامة ‪ ،general patterns‬كما تم تقييمها تجريبياً على بيانات غير مرئية من قبل‬
‫‪( unseen data‬مجموعة االختبار)‪ .‬الدقة العاليةيف مجموعة التدريب ال تعني شيئًا‪ .‬عندما تكون‬
‫كل من مدخالتنا فريدة من نوعها (وهذا ينطبق بالفعل على معظم مجموعات البيانات عالية‬
‫األبعاد)‪ ،‬يمكننا تحقيق دقة مثاليةيف مجموعة التدريب بمجرد حفظ مجموعة البياناتيف فترة‬
‫التدريب األولى‪ ،‬ثم البحث عن التسمية كلما رأينا صورة جديدة‪ .‬ومع ذلك‪ ،‬فإن حفظ التسميات‬
‫الدقيقة المرتبطة بأمثلة التدريب الدقيقة ال يخبرنا بكيفية تصنيف األمثلة الجديدة‪.‬يف غياب المزيد‬
‫من اإلرشادات‪ ،‬قد نضطر إلى الرجوع إلى التخمين العشوائي كلما واجهنا أمثلة جديدة‪.‬‬

‫يتطلب عدد من األسئلة الملحة اهتمامًا فوريًا‪ .1 :‬كم عدد أمثلة االختبار التي نحتاجها لتقدير دقة‬
‫المصنفات الخاصة بنا على السكان األساسيين؟ ‪ .2‬ماذا يحدث إذا واصلنا تقييم النماذجيف نفس‬
‫االختبار بشكل متكرر؟ ‪ . 3‬لماذا يجب أن نتوقع أن مالءمة نماذجنا الخطية لمجموعة التدريب‬
‫يجب أن تكون أفضل من مخطط الحفظ الساذج لدينا؟‬

‫بينما قدم القسم ‪ 3.6‬أساسيات الضبط الزائد ‪ overfitting‬والتعميم ‪generalization‬يف سياق‬


‫االنحدار الخطي‪ ،‬فإن هذا الفصل سوف يتعمق قليالً‪ ،‬حيث يقدم بعض األفكار التأسيسية لنظرية‬
‫‪205‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫التعلم اإلحصائي‪ .‬اتضح أنه يمكننايف كثير من األحيان ضمان التعميم بشكل مسبق‪ :‬بالنسبة للعديد‬
‫من النماذج‪ ،‬وألي حد أعلى مرغوب فيه على فجوة التعميم 𝜖‪ ،‬يمكننايف كثير من األحيان تحديد‬
‫عدد معين من العينات 𝑛 المطلوبة مثل إذا كانت مجموعة التدريب لدينا تحتوي على عينات 𝑛‬
‫على األقل‪ ،‬ثم يقع خطأنا التجريبييف نطاق 𝜖 للخطأ الحقيقي‪ ،‬ألي توزيع لتوليد البيانات ‪data‬‬
‫‪ .generating distribution‬لسوء الحظ‪ ،‬اتضح أيضًا أنه بينما توفر هذه األنواع من الضمانات‬
‫مجموعة عميقة من اللبنات الفكرية‪ ،‬إال أنها ذات فائدة عملية محدودة لممارسي التعلم العميق‪.‬‬
‫باختصار‪ ،‬تشير هذه الضمانات إلى أن ضمان تعميم الشبكات العصبية العميقة بشكل مسبق‬
‫يتطلب عددًا سخيفًا من األمثلة (ربما تريليونات أو أكثر)‪ ،‬حتى عندما نجد أنهيف المهام التي نهتم‬
‫بها تلك الشبكات العصبية العميقة عادةً ما يتم تعميمها جيدًا بشكل ملحوظ مع بعيد‪ .‬عدد أقل‬
‫من األمثلة (باآلالف)‪ .‬وبالتالي‪ ،‬غالبًا ما يتخلى ممارسو التعلم العميق عن الضمانات المسبقة‬
‫تمامًا‪ ،‬وبدالً من ذلك يستخدمون األساليب على أساس أنهم قد تعمموا جيدًا على مشكالت‬
‫مماثلةيف الماضي‪ ،‬ويصادقون على التعميم بعد ذلك من خالل التقييمات التجريبية‪ .‬عندما نصل‬
‫إلى القسم ‪ ،5‬سنعيد النظريف التعميم ونقدم مقدمة خفيفة لألدبيات العلمية الواسعة التي نشأت‬
‫في محاوالت لشرح سبب تعميم الشبكات العصبية العميقةيف الممارسة‪.‬‬

‫‪The Test Set‬‬ ‫‪4.6.1‬‬


‫نظرًا ألننا بدأنا بالفعليف االعتماد على مجموعات االختبار كأسلوب معياري ذهبي لتقييم خطأ‬
‫التعميم‪ ،‬فلنبدأ من خالل مناقشة خصائص تقديرات الخطأ هذه‪ .‬دعنا نركز على مصنف ثابت‬
‫𝑓‪ ،‬دون القلق بشأن كيفية الحصول عليه‪ .‬عالوة على ذلك‪ ،‬افترض أننا نمتلك مجموعة بيانات‬
‫جديدة من األمثلة ‪ 𝒟 = (𝐱 (𝑖) , 𝑦 (𝑖) )𝑛𝑖=1‬التي لم تستخدم لتدريب المصنف 𝑓‪ .‬الخطأ التجريبي‬
‫لمصنفنا 𝑓 على 𝒟 هو ببساطة جزء من الحاالت التي ال يتفق فيها التنبؤ ) )𝑖( 𝐱(𝑓 مع التسمية‬
‫الحقيقية )𝑖( 𝑦‪ ،‬ويعطى بالتعبير التالي‪:‬‬
‫𝑛‬
‫‪1‬‬
‫‪𝜖𝒟 (𝑓) = ∑ 𝟏 (𝑓(𝐱 (𝑖) ) ≠ 𝑦 (𝑖) ).‬‬
‫𝑛‬
‫‪𝑖=1‬‬

‫على النقيض من ذلك‪ ،‬فإن الخطأ السكاني ‪ population error‬هو الجزء المتوقع من األمثلة‬
‫في المجموعة األساسية (بعض التوزيعات )𝑌 ‪ 𝑃(𝑋,‬التي تتميز بدالة كثافة االحتمال )𝑦 ‪𝑝(𝐱,‬‬
‫التي ال يتفق المصنف لدينا مع التسمية الحقيقية ‪:true label‬‬

‫‪𝜖(𝑓) = 𝐸(𝐱,𝑦)∼𝑃 𝟏(𝑓(𝐱) ≠ 𝑦) = ∫ ∫ 𝟏(𝑓(𝐱) ≠ 𝑦)𝑝(𝐱, 𝑦)𝑑𝐱𝑑𝑦.‬‬

‫بينما )𝑓(𝜖 هي الكمية التي نهتم بها بالفعل‪ ،‬ال يمكننا مالحظتها مباشرة‪ ،‬تمامًا كما ال يمكننا أن‬
‫نالحظ بشكل مباشر متوسط الطوليف عدد كبير من السكان دون قياس كل شخص‪ .‬يمكننا فقط‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪206‬‬

‫تقدير هذه الكمية بناءً على العينات‪ .‬نظرًا ألن مجموعة االختبار 𝒟 الخاصة بنا ممثلة إحصائيًا‬
‫للسكان األساسيين‪ ،‬فيمكننا عرض )𝑓( 𝒟𝜖 كمقدر إحصائي للخطأ السكاني )𝑓(𝜖‪ .‬عالوة على‬
‫ذلك‪ ،‬نظرًا ألن كمية االهتمام )𝑓(𝜖 لدينا هي توقع (للمتغير العشوائي )𝑌 ≠ )𝑋(𝑓(𝟏) والمقدر‬
‫المقابل )𝑓( 𝒟𝜖 هو متوسط العينة‪ ،‬فإن تقدير خطأ السكان هو ببساطة المشكلة الكالسيكية لتقدير‬
‫المتوسط‪ ،‬والتي قد تتذكرها من القسم ‪.2.6‬‬

‫هناك نتيجة كالسيكية مهمة من نظرية االحتماالت تسمى نظرية الحد المركزي ‪central limit‬‬
‫‪ theorem‬تضمن أنه كلما امتلكنا 𝑛 عينات عشوائية مأخوذة من أي توزيع بمتوسط 𝜇 وانحراف‬
‫^‬
‫معياري 𝜎‪ ،‬حيث يقترب عدد العينات 𝑛 من الالنهاية‪ ،‬فإن متوسط العينة 𝜇 يميل تقريبًا نحو‬
‫التوزيع الطبيعي المتمحور حول الوسط الحقيقي واالنحراف المعياري 𝑛√‪ .𝜎/‬بالفعل‪ ،‬هذا‬
‫يخبرنا بشيء مهم‪ :‬مع تزايد عدد األمثلة‪ ،‬يجب أن يقترب خطأ االختبار )𝑓( 𝒟𝜖 لدينا من الخطأ‬
‫الحقيقي )𝑓(𝜖 بمعدل )𝑛√‪ .𝒪(1/‬وبالتالي‪ ،‬لتقدير خطأ االختبار لدينا مرتين بدقة‪ ،‬يجب أن‬
‫نجمع مجموعة اختبار أكبر بأربعة أضعاف‪ .‬لتقليل خطأ االختبار لدينا بعامل مائة‪ ،‬يجب أن نجمع‬
‫مجموعة اختبار أكبر بعشرة آالف مرة‪ .‬بشكل عام‪ ،‬غالبًا ما يكون هذا المعدل )𝑛√‪ 𝒪(1/‬هو‬
‫أفضل ما يمكن أن نأملهيف اإلحصائيات‪.‬‬

‫اآلن بعد أن عرفنا شيئًا عن المعدل المقارب ‪ asymptotic rate‬الذي يتقارب عنده خطأ االختبار‬
‫)𝑓( 𝒟𝜖 لدينا مع الخطأ الحقيقي )𝑓(𝜖‪ ،‬يمكننا تكبير بعض التفاصيل المهمة‪ .‬تذكر أن المتغير‬
‫العشوائي محل االهتمام )𝑌 ≠ )𝑋(𝑓(𝟏 يمكن أن يأخذ القيم ‪ 0‬و ‪ 1‬فقط‪ ،‬وبالتالي فهو متغير‬
‫برنولي العشوائي ‪ ،Bernoulli random variable‬يتميز بمعامل يشير إلى احتمال أن يأخذ‬
‫قيمة ‪ .1‬هنا‪ 1 ،‬يعني أن المصنف الخاص بنا قد ارتكب خطأ‪ ،‬وبالتالي فإن معلمة متغيرنا‬
‫العشوائي هييف الواقع معدل الخطأ الحقيقي )𝑓(𝜖‪ .‬يعتمد تباين ‪ 𝜎 2‬برنولي على معاملته (هنا‬
‫)𝑓(𝜖) وفقًا للتعبير ))𝑓(𝜖 ‪ .𝜖(𝑓)(1 −‬بينما )𝑓(𝜖 غير معروفيف البداية‪ ،‬نعلم أنه ال يمكن أن‬
‫يكون أكبر من ‪ .1‬يكشف القليل من االستقصاء عن هذه الدالة أن تبايننا يكون أعلى عندما يكون‬
‫معدل الخطأ الحقيقي قريبًا من ‪ 0‬ويمكن أن يكون أقل بكثير عندما يكون قريبًا من ‪ 0‬أو قريبًا من‬
‫‪ .1‬يخبرنا هذا أن االنحراف المعياري المقارب لتقديرنا )𝑓( 𝒟𝜖 للخطأ )𝑓(𝜖 (على اختيار عينات‬
‫االختبار) ال يمكن أن يكون أكبر من 𝑛‪.√0.25/‬‬

‫إذا تجاهلنا حقيقة أن هذا المعدل يميز السلوك حيث يقترب حجم مجموعة االختبار من الالنهاية‬
‫وليس عندما نمتلك عينات محدودة‪ ،‬فهذا يخبرنا أنه إذا أردنا أن يقترب خطأ االختبار )𝑓( 𝒟𝜖‬
‫الخاص بنا من الخطأ السكاني )𝑓(𝜖 بحيث يتوافق االنحراف المعياري مع فترة زمنية قدرها‬
‫‪ ،±0.01‬ثم يجب أن نجمع ما يقرب من ‪ 2500‬عينة‪ .‬إذا أردنا احتواء انحرافين معياريينيف هذا‬
‫النطاق وبالتالي يكون ‪ ٪95‬من ذلك ‪ ،𝜖𝒟 (𝑓) ∈ 𝜖(𝑓) ± 0.01‬فسنحتاج إلى ‪ 10000‬عينة!‬
‫‪207‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫اتضح أن هذا هو حجم مجموعات االختبار للعديد من المعايير الشائعةيف التعلم اآللي‪ .‬قد تندهش‬
‫عندما تكتشف أنه يتم نشر اآلالف من أوراق التعلم العميق التطبيقية كل عام مما يجعل قدرًا كبيرًا‬
‫من التحسيناتيف معدل الخطأ ‪ 0.01‬أو أقل‪ .‬بالطبع‪ ،‬عندما تكون معدالت الخطأ أقرب بكثير لـ‬
‫‪ ،0‬فإن تحسين ‪ 0.01‬يمكن أن يكون بالفعل مشكلة كبيرة‪.‬‬

‫إحدى السمات المزعجة لتحليلنا حتى اآلن هي أنه يخبرنا فقط عن التقارب ‪ ،asymptotics‬أي‬
‫كيف تتطور العالقة بين 𝒟𝜖 و 𝜖 تتطور كحجم العينة وتذهب إلى ما ال نهاية‪ .‬لحسن الحظ‪ ،‬نظرًا‬
‫ألن متغيرنا العشوائي محدود‪ ،‬يمكننا الحصول على حدود عينة محدودة صالحة من خالل تطبيق‬
‫متباينة طبقاً لـ ‪:)1963( Hoeffding‬‬

‫‪𝑃(𝜖𝒟 (𝑓) − 𝜖(𝑓) ≥ 𝑡) < exp (−2𝑛𝑡 2 ).‬‬

‫إن حل أصغر حجم لمجموعة بيانات من شأنه أن يسمح لنا باالستنتاج بثقة ‪ ٪95‬أن المسافة 𝑡‬
‫بين تقديرنا )𝑓( 𝒟𝜖 ومعدل الخطأ الحقيقي )𝑓(𝜖 ال تتجاوز ‪ ،0.01‬ستجد أن األمثلة ‪15000‬‬
‫تقريبًا مطلوبة مقارنة باألمثلة ‪ 10000‬التي اقترحها التحليل المقارب أعاله‪ .‬إذا تعمقتيف ‬
‫اإلحصائيات ستجد أن هذا االتجاه ثابت بشكل عام‪ .‬عادةً ما تكون الضمانات التي يتم االحتفاظ‬
‫بها حتىيف العينات المحدودة أكثر تحفظًا قليالً‪ .‬الحظ أنهيف مخطط األشياء‪ ،‬هذه األرقام ليست‬
‫متباعدة كثيرًا‪ ،‬مما يعكس الفائدة العامة للتحليل المقارب إلعطائنا أرقام الملعب حتى لو لم يكن‬
‫هناك ضمانات يمكننا تقديمها إلى المحكمة‪.‬‬

‫‪Test Set Reuse‬‬ ‫‪4.6.2‬‬


‫بمعنى ما‪ ،‬أنت اآلن جاهز للنجاحيف إجراء بحث تجريبي للتعلم اآللي‪ .‬تم تطوير جميع النماذج‬
‫العملية تقريبًا والتحقق من صحتها بناءً على أداء مجموعة االختبار وأنت اآلن خبيريف مجموعة‬
‫االختبار‪ .‬بالنسبة ألي مصنف ثابت 𝑓‪ ،‬فأنت تعلم تقييم خطأ االختبار )𝑓( 𝒟𝜖 الخاص به‪ ،‬ومعرفة‬
‫ما يمكن (وما ال يمكن) قوله بشأن الخطأ السكاني )𝑓(𝜖 الخاص به‪.‬‬

‫فلنفترض أنك تأخذ هذه المعرفة وتستعد لتدريب نموذجك األول ‪ .𝑓1‬بمعرفة مدى الثقة التي‬
‫تحتاجها لتكون على ثقة من أداء معدل الخطأ الخاص بالمصنف‪ ،‬يمكنك تطبيق تحليلنا أعاله‬
‫لتحديد عدد مناسب من األمثلة لتخصيصها لمجموعة االختبار‪ .‬عالوة على ذلك‪ ،‬لنفترض أنك‬
‫أخذت الدروس من القسم ‪ 3.6‬إلى القلب وتأكدت من الحفاظ على قدسية مجموعة االختبار‬
‫من خالل إجراء جميع تحليلك األولي‪ ،‬وضبط المعلمة الفائقة‪ ،‬وحتى االختيار من بين العديد‬
‫من هياكل النماذج المتنافسة على مجموعة التحقق من الصحة‪ .‬أخيرًا تقوم بتقييم النموذج ‪𝑓1‬‬
‫الخاص بك على مجموعة االختبار واإلبالغ عن تقدير غير متحيز ‪ unbiased estimate‬لخطأ‬
‫السكان مع فاصل ثقة مرتبط‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪208‬‬

‫حتى اآلن يبدو أن كل شيء يسير على ما يرام‪ .‬ومع ذلك‪،‬يف تلك الليلة‪ ،‬تستيقظيف الثالثة صباحًا‬
‫بفكرة رائعة لنهج جديد للنمذجة‪.‬يف اليوم التالي‪ ،‬تقوم بترميز نموذجك الجديد ‪ ،𝑓2‬وضبط‬
‫المعلمات الفائقة الخاصة به على مجموعة التحقق من الصحة ‪ ،validation set‬وال تجعل‬
‫نموذجك الجديد يعمل فحسب‪ ،‬بل يبدو أن معدل الخطأ فيه أقل بكثير من معدل الخطأ للنموذج‬
‫األول ‪ .𝑓1‬ومع ذلك‪ ،‬فإن إثارة االكتشاف تتالشى فجأة بينما تستعد للتقييم النهائي‪ .‬ليس لديك‬
‫مجموعة اختبار!‬

‫على الرغم من أن مجموعة االختبار األصلية 𝒟 ال تزال موجودة على الخادم الخاص بك‪ ،‬فإنك‬
‫تواجه اآلن مشكلتين هائلتين‪ .‬أوالً‪ ،‬عندما جمعت مجموعة االختبار الخاصة بك‪ ،‬قمت بتحديد‬
‫مستوى الدقة المطلوب على افتراض أنك كنت تقيم مصنفًا واحدًا 𝑓‪ .‬ومع ذلك‪ ،‬إذا دخلتيف ‬
‫مجال تقييم المصنفات المتعددة 𝑘𝑓 ‪𝑓1 , . . . ,‬يف نفس مجموعة االختبار‪ ،‬فيجب أن تفكريف مشكلة‬
‫االكتشاف الخاطئ‪ .‬من قبل‪ ،‬ربما كنت متأكدًا بنسبة ‪ ٪95‬من أنه ‪𝜖𝒟 (𝑓) ∈ 𝜖(𝑓) ± 0.01‬‬
‫بالنسبة لمصنف واحد 𝑓‪ ،‬وبالتالي فإن احتمال وجود نتيجة مضللة كان ‪ ٪5‬فقط‪ .‬مع وجود 𝑘‬
‫من المصنفاتيف المزيج‪ ،‬قد يكون من الصعب ضمان عدم وجود حتى واحد منهم يكون أداء‬
‫مجموعة االختبار مضلالً‪ .‬مع وجود ‪ 20‬مصنفًا قيد الدراسة‪ ،‬قد ال يكون لديك أي سلطة على‬
‫اإلطالق الستبعاد احتمال حصول واحد منهم على األقل على درجة مضللة‪ .‬تتعلق هذه المشكلة‬
‫باختبار الفرضيات المتعددة ‪ ،multiple hypothesis testing‬والتي على الرغم من األدبيات‬
‫الكثيرةيف اإلحصاء‪ ،‬ال تزال مشكلة مستمرة تعصف بالبحث العلمي‪.‬‬

‫إذا لم يكن ذلك كافيًا للقلق‪ ،‬فهناك سبب خاص لعدم الثقةيف النتائج التي تحصل عليهايف ‬
‫التقييمات الالحقة‪ .‬تذكر أن تحليلنا ألداء مجموعة االختبار استند إلى افتراض أن المصنف قد‬
‫تم اختياره بدون أي اتصال بمجموعة االختبار‪ ،‬وبالتالي يمكننا عرض مجموعة االختبار على أنها‬
‫مستمدة عشوائيًا من السكان األساسيين‪ .‬هنا‪ ،‬ال تختبر دوال متعددة فحسب‪ ،‬بل تم اختيار الدالة‬
‫الالحقة ‪ 𝑓2‬بعد مالحظة أداء مجموعة االختبار لـ ‪ .𝑓1‬بمجرد تسرب المعلومات من مجموعة‬
‫االختبار إلى مصمم النماذج‪ ،‬ال يمكن أن تكون مجموعة اختبار حقيقية مرة أخرى بالمعنى الدقيق‬
‫للكلمة‪ .‬تسمى هذه المشكلة فرط التجهيز التكيفي ‪ ،adaptive overfitting‬وقد ظهرت مؤخرًا‬
‫كموضوع يثير اهتمامًا شديدًا لمنظري التعلم واإلحصائيين (‪ .)2015 ،Dwork et al.‬لحسن‬
‫الحظ‪،‬يف حين أنه من الممكن تسريب جميع المعلومات من مجموعة االنتظار ‪،holdout set‬‬
‫والسيناريوهات النظرية لألسوأ قاتمة‪ ،‬فقد تكون هذه التحليالت متحفظة للغاية‪ .‬من الناحية‬
‫العملية‪ ،‬احرص على إنشاء مجموعات اختبار حقيقية‪ ،‬واستشرها بشكل غير متكرر قدر اإلمكان‪،‬‬
‫ولمراعاة اختبار الفرضيات المتعددة عند اإلبالغ عن فترات الثقة‪ ،‬ولزيادة يقظتك بشكل أكثر‬
‫قوة عندما تكون المخاطر عالية وحجم مجموعة البيانات الخاصة بك صغيرًا‪ .‬عند تشغيل سلسلة‬
‫من التحديات المعيارية‪ ،‬غالبًا ما يكون من الممارسات الجيدة االحتفاظ بالعديد من مجموعات‬
‫‪209‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫االختبار بحيث يمكن بعد كل جولة تخفيض مجموعة االختبار القديمة إلى مجموعة التحقق من‬
‫الصحة‪.‬‬

‫‪Statistical Learning Theory‬‬ ‫‪4.6.3‬‬


‫في الحال‪ ،‬مجموعات االختبار هي كل ما لدينا حقًا‪ ،‬ومع ذلك تبدو هذه الحقيقة غير مرضية‬
‫بشكل غريب‪ .‬أوالً‪ ،‬نادرًا ما نمتلك مجموعة اختبار حقيقية ‪ -‬ما لم نكن نحن من أنشأ مجموعة‬
‫البيانات‪ ،‬فمن المحتمل أن شخصًا آخر قد قام بالفعل بتقييم المصنف الخاص به على "مجموعة‬
‫االختبار" المزعومة‪ .‬وحتى عندما نحصل على الدرجات األولى‪ ،‬سرعان ما نجد أنفسنا محبطين‪،‬‬
‫ونتمنى أن نتمكن من تقييم محاوالتنا الالحقةيف النمذجة دون الشعور بالضيق بأننا ال نستطيع‬
‫الوثوق بأرقامنا‪ .‬عالوة على ذلك‪ ،‬حتى مجموعة االختبار الحقيقية يمكنها فقط أن تخبرنا الحقًا‬
‫عما إذا كان المصنف قد تعمم ‪generalized‬يف الواقع على السكان‪ ،‬وليس ما إذا كان لدينا أي‬
‫سبب لتوقع مقدمًا أنه ينبغي تعميمه‪.‬‬

‫مع وضع هذه الهواجسيف االعتبار‪ ،‬قد تكون اآلن مستعدًا بشكل كافٍ لرؤية جاذبية نظرية التعلم‬
‫اإلحصائي ‪ ،statistical learning‬الحقل الفرعي الرياضي للتعلم اآللي الذي يهدف ممارسوه‬
‫إلى توضيح المبادئ األساسية التي تشرح لماذا ‪ /‬متى يمكن للنماذج المدربة على البيانات‬
‫التجريبية التعميم على بيانات غير مرئية ‪ .unseen data‬كان أحد األهداف األساسية لعدة عقود‬
‫من الباحثينيف التعلم اإلحصائي هو تقييد فجوة التعميم ‪ ،generalization gap‬فيما يتعلق‬
‫بخصائص فئة النموذج‪ ،‬وعدد العيناتيف مجموعة البيانات‪.‬‬

‫يهدف منظرو التعلم ‪ Learning theorists‬إلى ربط الفرق بين الخطأ التجريبي ) 𝒮𝑓( 𝒮𝜖‬
‫للمصنف المتعلم 𝒮𝑓‪ ،‬سواء تم تدريبه أو تقييمه على مجموعة التدريب 𝒮‪ ،‬والخطأ الحقيقي‬
‫لنفس المصنف على السكان األساسيين‪ .‬قد يبدو هذا مشابهًا لمشكلة التقييم التي تناولناها للتو‬
‫ولكن هناك فرق كبير‪ .‬من قبل‪ ،‬تم إصالح المصنف وكنا بحاجة إلى مجموعة بيانات فقط‬
‫ألغراض التقييم‪ .‬وبالفعل‪ ،‬فإن أي مصنف ثابت 𝑓 ال يعمم‪ :‬خطأهيف مجموعة بيانات (غير مرئية‬
‫سابقًا) هو تقدير غير متحيز لخطأ السكان‪ .‬ولكن ماذا يمكننا أن نقول عندما يتم تدريب المصنف‬
‫وتقييمه على نفس مجموعة البيانات؟ هل يمكننا أن نكون على ثقة من أن خطأ التدريب سيكون‬
‫قريبًا من خطأ االختبار؟‬

‫افترض أنه يجب اختيار المصنف 𝒮𝑓 الذي تعلمناه من بين مجموعة دوال محددة مسبقًا ‪ .ℱ‬تذكر‬
‫من مناقشتنا لمجموعات االختبار أنهيف حين أنه من السهل تقدير خطأ مصنف واحد‪ ،‬فإن األشياء‬
‫تصبح صعبة عندما نبدأيف التفكيريف مجموعات المصنفات‪ .‬حتى إذا كان الخطأ التجريبي ألي‬
‫مصنف واحد (ثابت) قريبًا من خطأه الحقيقي مع احتمال كبير‪ ،‬بمجرد أن نفكريف مجموعة من‬
‫المصنفات‪ ،‬نحتاج إلى القلق بشأن احتمال أن يتلقى مصنف واحد فقطيف المجموعة خطاً سيئًا‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪210‬‬

‫في التقدير خطأ ‪ .‬القلق هو أنه إذا تلقى مصنف واحد فقطيف مجموعتنا خطأ منخفضًا مضللًا‪،‬‬
‫فقد نختاره وبالتالي نقلل بشكل كبير من الخطأ السكاني‪ .‬عالوة على ذلك‪ ،‬حتى بالنسبة للنماذج‬
‫الخطية‪ ،‬نظرًا لتقييم معلماتها باستمرار‪ ،‬فإننا نختار عادةً من بين فئة ال حصر لها من الدوال‬
‫(∞ = |‪.)|ℱ‬‬

‫يتمثل أحد الحلول الطموحة للمشكلةيف تطوير أدوات تحليلية إلثبات التقارب المنتظم‬
‫‪ ،uniform convergence‬أي أنه مع وجود احتمال كبير‪ ،‬فإن معدل الخطأ التجريبي لكل‬
‫مصنفيف الفئة ‪ 𝑓 ∈ ℱ‬سوف يتقاربيف نفس الوقت مع معدل الخطأ الحقيقي‪ .‬بعبارة أخرى‪،‬‬
‫نسعى إلى مبدأ نظري من شأنه أن يسمح لنا أن نذكر أنه مع وجود احتمال على األقل 𝛿 ‪1 −‬‬
‫(بالنسبة للبعض الصغير 𝛿)‪ ،‬لن يتم تقدير معدل خطأ المصنف )𝑓(𝜖 (من بين جميع المصنفات‬
‫في الفئة ‪ )ℱ‬بأكثر من مقدار ضئيل 𝛼‪ .‬من الواضح أنه ال يمكننا إصدار مثل هذه العبارات لجميع‬
‫فئات النموذج ‪ .ℱ‬تذكر فئة آالت الحفظ التي تحقق دائمًا خطأ تجريبيًا ولكنها ال تتفوق أبدًا على‬
‫التخمين العشوائي على المجتمع األساسي‪.‬‬

‫بمعنى أن طبقة الحفظ مرنة للغاية‪ .‬ال يمكن لنتيجة تقارب موحدة كهذه أن تصمد‪ .‬من ناحية‬
‫أخرى‪ ،‬المصنف الثابت عديم الفائدة ‪ -‬فهو معمم تمامًا‪ ،‬لكنه ال يناسب بيانات التدريب وال‬
‫بيانات االختبار‪ .‬وهكذا تم تأطير السؤال المركزي للتعلم تاريخيًا كمقايضة بين فئات نموذج أكثر‬
‫مرونة (تباين أعلى) تتالءم بشكل أفضل مع بيانات التدريب ولكنها تنطوي على مخاطر أكثر من‬
‫الالزم‪ ،‬مقابل فئات نموذجية أكثر صرامة (تحيز أعلى) تتعمم جيدًا ولكنها تنطوي على مخاطر‬
‫غير مناسبة‪ .‬كان السؤال المركزييف نظرية التعلم هو تطوير التحليل الرياضي المناسب لتحديد‬
‫مكان وجود نموذج على طول هذا الطيف‪ ،‬وتقديم الضمانات المرتبطة به‪.‬‬

‫في سلسلة من األوراق البحثية األساسية‪ ،‬وسع فابنيك وشيرفونينكيس نظرية تقارب الترددات‬
‫النسبية إلى فئات دوال أكثر عمومية (‪Vapnik ، 1964 ، Vapnik and Chervonenkis‬‬
‫‪Vapnik and ، 1971 ، Vapnik and Chervonenkis ، 1968 ، and Chervonenkis‬‬
‫‪Vapnik and ، 1991 ،Vapnik and Chervonenkis ، 1981 ، Chervonenkis‬‬
‫‪ .)1974 ،Chervonenkis‬أحد المساهمات الرئيسية لهذا النوع من العمل هو بُعد ‪Vapnik-‬‬
‫)‪ ،Chervonenkis (VC‬والذي يقيس (فكرة واحدة عن) مدى تعقيد (المرونة) لفئة النموذج‪.‬‬
‫عالوة على ذلك‪ ،‬فإن إحدى نتائجهم الرئيسية تحدد الفرق بين الخطأ التجريبي وخطأ السكان‬
‫كدالة لبعد ‪ VC‬وعدد العينات‪:‬‬

‫‪𝑃(𝑅[𝑝, 𝑓] − 𝑅emp [𝐗, 𝐘, 𝑓] < 𝛼) ≥ 1 − 𝛿 for 𝛼 ≥ 𝑐√(VC − log 𝛿)/𝑛.‬‬


‫‪211‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪ 𝛿 > 0‬هو احتمال انتهاك الحد‪ ،‬و 𝛼 هو الحد األعلى لفجوة التعميم‪ ،‬و𝑛 هو حجم مجموعة‬
‫البيانات‪ .‬أخيرًا‪ 𝑐 > 0،‬هو ثابت يعتمد فقط على حجم الخسارة التي يمكن تكبدها‪ .‬قد يكون‬
‫أحد استخدامات الحد هو توصيل القيم المرغوبة لـ 𝛿 و 𝛼 وتحديد عدد العينات المراد جمعها‪.‬‬
‫يحدد بُعد ‪ VC‬أكبر عدد من نقاط البيانات التي يمكننا تعيين أي تصنيف عشوائي (ثنائي) لها‬
‫ولكل منها تجد نموذجًا 𝑓 مايف الفئة يتوافق مع هذا التصنيف‪ .‬على سبيل المثال‪ ،‬النماذج الخطية‬
‫على المدخالت ذات األبعاد لها أبعاد 𝑑 ‪ .VC‬من السهل مالحظة أن الخط يمكنه تعيين أي‬
‫تصنيف ممكن لثالث نقاطيف بعدين‪ ،‬ولكن ليس ألربع‪ .‬لسوء الحظ‪ ،‬تميل النظرية إلى التشاؤم‬
‫المفرط بالنسبة للنماذج األكثر تعقيدًا والحصول على هذا الضمان يتطلب عادةً أمثلة أكثر بكثير‬
‫مما هو مطلوب بالفعل لتحقيق معدل الخطأ المطلوب‪ .‬الحظ أيضًا أن تحديد فئة النموذج و 𝛿 ‪.‬‬
‫معدل الخطأ لدينا يتحلل مرة أخرى مع المعدل المعتاد )𝑛√‪ .𝒪(1/‬يبدو من غير المحتمل أن‬
‫نتمكن من القيام بعمل أفضل من حيث‪ .‬ومع ذلك‪ ،‬نظرًا ألننا نغير فئة النموذج‪ ،‬يمكن أن يقدم‬
‫بُعد ‪ VC‬صورة متشائمة لفجوة التعميم‪.‬‬

‫‪4.6.4‬‬
‫الطريقة األكثر مباشرة لتقييم النموذج هي الرجوع إلى مجموعة اختبار تتألف من بيانات غير‬
‫مرئية من قبل‪ .‬توفر تقييمات مجموعة االختبار تقديرًا غير متحيز للخطأ الحقيقي وتتقارب مع‬
‫المعدل المطلوب )𝑛√‪ 𝒪(1/‬مع نمو مجموعة االختبار‪ .‬يمكننا تقديم فترات ثقة تقريبية بناءً‬
‫على توزيعات مقاربة دقيقة أو فترات ثقة محدودة صالحة للعينة بناءً على ضمانات عينة محدودة‬
‫(أكثر تحفظًا)‪ .‬إن تقييم مجموعة االختباراتيف الواقع هو حجر األساس ألبحاث التعلم اآللي‬
‫الحديثة‪ .‬ومع ذلك‪ ،‬نادرًا ما تكون مجموعات االختبار مجموعات اختبار حقيقية (يستخدمها‬
‫باحثون متعددون مرارًا وتكرارًا)‪ .‬بمجرد استخدام نفس مجموعة االختبار لتقييم نماذج متعددة‪،‬‬
‫قد يكون من الصعب التحكميف االكتشاف الخاطئ‪ .‬هذا يمكن أن يسبب مشاكل ضخمة من‬
‫الناحية النظرية‪ .‬من الناحية العملية‪ ،‬تعتمد أهمية المشكلة على حجم مجموعات االنتظار المعنية‬
‫وما إذا كانت تستخدم فقط الختيار المعلمات الفائقة أو ما إذا كانت تقوم بتسريب المعلومات‬
‫بشكل مباشر أكثر‪ .‬ومع ذلك‪ ،‬فمن الممارسات الجيدة تنظيم مجموعات اختبار حقيقية (أو‬
‫متعددة) وأن تكون متحفظًا قدر اإلمكان بشأن عدد مرات استخدامها‪.‬‬

‫على أمل تقديم حل أكثر إرضاءً‪ ،‬طور منظرو التعلم اإلحصائي طرقًا لضمان التقارب المنتظم‬
‫على فئة النموذج‪ .‬إذا اقترب خطأ تجريبي لكل نموذج بالفعل مع خطأه الحقيقييف وقت واحد‪،‬‬
‫فعندئذٍ لنا الحريةيف اختيار النموذج األفضل أداءً‪ ،‬وتقليل خطأ التدريب‪ ،‬مع العلم أنه سيؤدي‬
‫أيضًا أداءً جيدًا بالمثل على بيانات االنتظار‪ .‬بشكل حاسم‪ ،‬يجب أن تعتمد أي من هذه النتائج‬
‫على بعض خصائص فئة النموذج‪ .‬قدم فالديمير فابنيك وأليكسي تشيرنوفينكيس بُعد ‪،VC‬‬
‫وقدموا نتائج تقارب موحدة تنطبق على جميع الطرزيف فئة ‪ .VC‬إن أخطاء التدريب لجميع‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪212‬‬

‫النماذجيف الفصل مضمونة (في نفس الوقت) لتكون قريبة من أخطائهم الحقيقية‪ ،‬ومضمونة‬
‫لتقترب من معدالتها )𝑛√‪ .𝒪(1/‬بعد االكتشاف الثوري لبعد ‪ ،VC‬تم اقتراح العديد من تدابير‬
‫التعقيد البديلة‪ ،‬كل منها يسهل ضمان التعميم المماثل ‪ .analogous generalization‬انظر‬
‫‪ )2005( .Boucheron et al‬لمناقشة تفصيلية للعديد من الطرق المتقدمة لقياس تعقيد الدالة‪.‬‬
‫لسوء الحظ‪ ،‬بينما أصبحت مقاييس التعقيد هذه أدوات مفيدة على نطاق واسعيف النظرية‬
‫اإلحصائية‪ ،‬فقد تبين أنها عاجزة (كما تم تطبيقها بشكل مباشر) لشرح سبب تعميم الشبكات‬
‫العصبية العميقة‪ .‬غالبًا ما تحتوي الشبكات العصبية العميقة على ماليين المعلمات (أو أكثر)‪،‬‬
‫ويمكنها بسهولة تعيين تسميات عشوائية لمجموعات كبيرة من النقاط‪ .‬ومع ذلك‪ ،‬فإنها تعمم‬
‫جيدًا على المشكالت العملية‪ ،‬ومن المدهش أنها غالبًا ما تعمم بشكل أفضل‪ ،‬عندما تكون أكبر‬
‫وأعمق‪ ،‬على الرغم من تكبدها أبعادًا أكبر لـ ‪.VC‬يف الفصل التالي‪ ،‬سوف نعيد النظريف التعميميف ‬
‫سياق التعلم العميق‪.‬‬

‫‪4.6.5‬‬
‫‪ .1‬إذا كنا نرغبيف تقدير الخطأ لنموذج ثابت 𝑓 مع ‪ 0.0001‬واحتمال أكبر من ‪،٪99.9‬‬
‫فكم عدد العينات التي نحتاجها؟‬
‫‪ .2‬افترض أن شخصًا آخر يمتلك مجموعة اختبار معنونة 𝒟 وال يوفر سوى المدخالت‬
‫(الميزات) غير المسماة ‪ .unlabeled‬افترض اآلن أنه ال يمكنك الوصول إلى تسميات‬
‫مجموعة االختبار إال عن طريق تشغيل نموذج 𝑓 (ال توجد قيود مفروضة على فئة‬
‫النموذج) على كل من المدخالت غير المسماة وتلقي الخطأ المقابل )𝑓( 𝒟𝜖‪ .‬كم عدد‬
‫النماذج التي تحتاج إلى تقييمها قبل تسريب مجموعة االختبار بأكملها وبالتالي قد‬
‫يبدو أنها تحتوي على خطأ ‪ ،0‬بغض النظر عن خطأك الحقيقي؟‬
‫الخامسة‬ ‫الدرجة‬ ‫من‬ ‫الحدود‬ ‫كثيرات‬ ‫لفئة‬ ‫‪VC‬‬ ‫بُعد‬ ‫هو‬ ‫‪ .3‬ما‬
‫‪5‬؟‬ ‫‪th‬‬
‫‪-order polynomials‬‬
‫‪ .4‬ما هو بُعد ‪ VC‬للمستطيالت المحاذية للمحور‪ axis-aligned rectangles‬في‬
‫البيانات ثنائية األبعاد؟‬

‫‪Environment and Distribution Shift‬‬ ‫‪4.7‬‬


‫في األقسام السابقة‪ ،‬عملنا من خالل عدد من التطبيقات العملية للتعلم اآللي‪ ،‬ونالئم النماذج‬
‫لمجموعة متنوعة من مجموعات البيانات‪ .‬ومع ذلك‪ ،‬لم نتوقف أبدًا عن التفكيريف مصدر‬
‫البياناتيف المقام األول أو ما نخطط لفعلهيف النهاية بمخرجات نماذجنا‪.‬يف كثير من األحيان‪،‬‬
‫يندفع مطورو التعلم اآللي الذين يمتلكون البيانات لتطوير نماذج دون التوقف مؤقتًا للنظريف هذه‬
‫المشكالت األساسية‪.‬‬
‫‪213‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫يمكن إرجاع العديد من عمليات نشر التعلم اآللي الفاشلة إلى هذا النمط‪.‬يف بعض األحيان‪ ،‬يبدو‬
‫أن النماذج تعمل بشكل رائع كما تم قياسها من خالل دقة مجموعة االختبار ولكنها تفشل بشكل‬
‫كارثييف النشر عندما يتغير توزيع البيانات فجأة‪ .‬بشكل أكثر مكرًا‪،‬يف بعض األحيان‪ ،‬يمكن أن‬
‫يكون نشر نموذج ما هو العامل المحفز الذي يزعج توزيع البيانات‪ .‬لنفترض‪ ،‬على سبيل المثال‪،‬‬
‫أننا دربنا نموذجًا للتنبؤ بمن سيسدد مقابل التخلف عن سداد القرض‪ ،‬ووجدنا أن اختيار مقدم‬
‫الطلب لألحذية كان مرتبطًا بمخاطر التخلف عن السداد (تشير أوكسفورد إلى السداد‪ ،‬وتشير‬
‫األحذية الرياضية إلى التقصير)‪ .‬قد نميل بعد ذلك إلى منح قروض لجميع المتقدمين الذين‬
‫يرتدون أحذية أوكسفورد ورفض ارتداء جميع المتقدمين لألحذية الرياضية‪.‬‬

‫في هذه الحالة‪ ،‬قد يكون لقفزة غير مدروسة من التعرف على األنماط إلى اتخاذ القرار وفشلنايف ‬
‫التفكير النقدييف البيئة عواقب وخيمة‪ .‬بالنسبة للمبتدئين‪ ،‬بمجرد أن بدأنايف اتخاذ القرارات بناءً‬
‫على األحذية‪ ،‬سيتعرف العمالء على سلوكهم ويغيرونه‪ .‬قبل مضي وقت طويل‪ ،‬كان جميع‬
‫المتقدمين يرتدون أحذية أوكسفورد‪ ،‬دون أي تحسن متزامنيف الجدارة االئتمانية‪ .‬يستغرق األمر‬
‫دقيقة الستيعاب هذا ألن مشكالت مماثلة تكثريف العديد من تطبيقات التعلم اآللي‪ :‬من خالل‬
‫تقديم قراراتنا المستندة إلى النموذج للبيئة‪ ،‬قد نكسر النموذج‪.‬‬

‫بينما ال يمكننا إعطاء هذه الموضوعات معالجة كاملةيف قسم واحد‪ ،‬فإننا نهدف هنا إلى الكشف‬
‫عن بعض االهتمامات المشتركة‪ ،‬وتحفيز التفكير النقدي المطلوب الكتشاف هذه المواقف‬
‫مبكرًا‪ ،‬وتخفيف الضرر‪ ،‬واستخدام التعلم اآللي بمسؤولية‪ .‬بعض الحلول بسيطة (اسأل عن‬
‫البيانات "الصحيحة")‪ ،‬وبعضها صعب تقنيًا (تنفيذ نظام التعلم المعزز ‪reinforcement‬‬
‫‪ ،)learning system‬والبعض اآلخر يتطلب أن نتخطى مجال التنبؤ اإلحصائي تمامًا ونكافح‬
‫األسئلة الفلسفية الصعبة المتعلقة باألخالق‪ .‬تطبيق الخوارزميات‪.‬‬

‫‪Types of Distribution Shift‬‬ ‫‪4.7.1‬‬


‫للبدء‪ ،‬نتمسك بإعداد التنبؤ السلبي مع األخذيف االعتبار الطرق المختلفة التي قد تتغير بها‬
‫توزيعات البيانات وما يمكن فعله إلنقاذ أداء النموذج‪.‬يف أحد اإلعدادات الكالسيكية‪ ،‬نفترض أنه‬
‫تم أخذ عينات من بيانات التدريب الخاصة بنا من بعض التوزيعات )𝑦 ‪ 𝑝𝑆 (𝐱,‬ولكن بيانات‬
‫االختبار الخاصة بنا ستتألف من أمثلة غير مسماة مأخوذة من توزيع مختلف )𝑦 ‪ .𝑝𝑇 (𝐱,‬بالفعل‪،‬‬
‫يجب أن نواجه حقيقة واقعية‪.‬يف غياب أي افتراضات حول كيفية ارتباط 𝑆𝑝و 𝑇𝑝 ببعضها البعض‪،‬‬
‫فإن تعلم مصنف قوي أمر مستحيل‪.‬‬

‫النظريف مشكلة التصنيف الثنائي ‪ ،binary classification problem‬حيث نرغبيف التمييز بين‬
‫الكالب والقطط‪ .‬إذا كان التوزيع يمكن أن يتغير بطرق عشوائية‪ ،‬فإن إعدادنا يسمح بالحالة‬
‫المرضية التي يظل فيها التوزيع على المدخالت ثابتًا‪ 𝑝𝑆 (𝐱) = 𝑝𝑇 (𝐱) :‬ولكن جميع التسميات‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪214‬‬

‫مقلوبة‪ .𝑝𝑆 (𝑦 ∣ 𝐱) = 1 − 𝑝𝑇 (𝑦 ∣ 𝐱) :‬بعبارة أخرى‪ ،‬إذا استطاع الله أن يقرر فجأة أن كل‬
‫"القطط" أصبحت اآلن كالبًا وأن ما نطلق عليه سابقًا "كالب" أصبح اآلن قططًا ‪ -‬دون أي تغيير‬
‫في توزيع المدخالت )𝐱(𝑝 ‪ ،‬فال يمكننا تمييز هذا اإلعداد عن واحد التي لم يتغير فيها التوزيع‬
‫على اإلطالق‪.‬‬

‫لحسن الحظ‪،‬يف ظل بعض االفتراضات المقيدة حول الطرق التي قد تتغير بها بياناتنايف المستقبل‪،‬‬
‫يمكن للخوارزميات المبدئية أن تكتشف التحول ‪ shift‬وأحيانًا تتكيف بشكل سريع‪ ،‬مما يحسن‬
‫دقة المصنف األصلي‪.‬‬

‫‪Covariate Shift‬‬ ‫‪4.7.1.1‬‬


‫من بين فئات تحول التوزيع ‪ ،distribution shift‬قد يكون التحول المتغير ‪covariate shift‬‬
‫هو األكثر دراسة على نطاق واسع‪ .‬هنا‪ ،‬نفترض أنه بينما قد يتغير توزيع المدخالت بمرور الوقت‪،‬‬
‫فإن دالة وضع العالمات (التسميات)‪ ،‬أي التوزيع الشرطي )𝐱 ∣ 𝑦(𝑃 ال تتغير‪ .‬يسمي‬
‫اإلحصائيون هذا التحول المتغير ‪ covariate shift‬ألن المشكلة تنشأ بسبب تحوليف توزيع‬
‫المتغيرات المشتركة (الميزات)‪ .‬بينما يمكننا أحيانًا التفكيريف تحول التوزيع دون التذرع بالسببية‪،‬‬
‫نالحظ أن التحول المتغير هو االفتراض الطبيعي الذي يجب استدعاؤهيف اإلعدادات التي نعتقد‬
‫فيها أن ‪ x‬تسبب 𝑦 ‪.‬‬

‫ضعيف اعتبارك التحدي المتمثليف التمييز بين القطط والكالب‪ .‬قد تتكون بيانات التدريب‬
‫الخاصة بنا من صور من النوع الموضحيف الشكل ‪.4.7.1‬‬

‫الشكل ‪ 4.7.1‬بيانات التدريب للتمييز بين القطط والكالب‪.‬‬

‫يطلب منايف وقت االختبار تصنيف الصوريف الشكل ‪.4.7.2‬‬


‫‪215‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫الشكل ‪ 4.7.2‬بيانات االختبار للتمييز بين القطط والكالب‪.‬‬

‫تتكون مجموعة التدريب من صور ‪ ،photos‬بينما تحتوي مجموعة االختبار على رسوم متحركة‬
‫‪ cartoons‬فقط‪ .‬يمكن أن يؤدي التدريب على مجموعة بيانات ذات خصائص مختلفة إلى حد‬
‫كبير عن مجموعة االختبار إلى حدوث مشكلةيف غياب خطة متماسكة لكيفية التكيف مع المجال‬
‫الجديد‪.‬‬

‫‪Label Shift‬‬ ‫‪4.7.1.2‬‬


‫يصف تحول التسمية ‪ Label Shift‬المشكلة العكسية ‪ .converse problem‬هنا‪ ،‬نفترض أن‬
‫التسمية الهامشية )𝑦(𝑃 يمكن أن تتغير ولكن التوزيع الشرطي للفئة )𝑦 ∣ 𝐱(𝑃 يظل ثابتًا عبر‬
‫المجاالت‪ .‬إن تحول التسمية هو افتراض معقول يجب القيام به عندما نعتقد أن هذه ‪ y‬تسبب‬
‫𝑥‪ .‬على سبيل المثال‪ ،‬قد نرغبيف التنبؤ بالتشخيصاتيف ضوء أعراضها (أو غيرها من المظاهر)‪،‬‬
‫حتى مع تغير االنتشار النسبي للتشخيصات بمرور الوقت‪ .‬تحول التسمية هو االفتراض المناسب‬
‫هنا ألن األمراض تسبب األعراض‪.‬يف بعض الحاالت المتدهورة‪ ،‬يمكن أن يحدث تحول التسمية‬
‫وافتراضات التحول المتغيريف وقت واحد‪ .‬على سبيل المثال‪ ،‬عندما تكون التسمية حتمية‪ ،‬سيتم‬
‫استيفاء افتراض التحول المتغير‪ ،‬حتى عندما تكون ‪ y‬تسبب 𝑥‪ .‬ومن المثير لالهتمام‪،‬يف هذه‬
‫الحاالت‪ ،‬أنه غالبًا ما يكون من المفيد العمل بالطرق التي تتدفق من افتراض تحول التسمية‪.‬‬
‫وذلك ألن هذه األساليب تميل إلى التعامل مع الكائنات التي تبدو وكأنها تسميات (غالبًا ما تكون‬
‫منخفضة األبعاد)‪ ،‬على عكس الكائنات التي تشبه المدخالت‪ ،‬والتي تميل إلى أن تكون عالية‬
‫األبعاديف التعلم العميق‪.‬‬

‫‪Concept Shift‬‬ ‫‪4.7.1.3‬‬


‫قد نواجه أيضًا مشكلة تحول ‪ Concept Shift‬المفهوم ذات الصلة‪ ،‬والتي تنشأ عندما تتغير‬
‫تعريفات التسميات ذاتها‪ .‬هذا يبدو غريبًا ‪ -‬القطة قطة‪ ،‬أليس كذلك؟ ومع ذلك‪ ،‬تخضع الفئات‬
‫األخرى للتغييراتيف االستخدام بمرور الوقت‪ .‬تخضع المعايير التشخيصية للمرض العقلي‪،‬‬
‫والمسميات العصرية‪ ،‬والوظائف‪ ،‬لقدر كبير من تغيير المفهوم‪ .‬اتضح أننا إذا تجولنايف جميع‬
‫أنحاء الواليات المتحدة‪ ،‬وقمنا بتغيير مصدر بياناتنا حسب المنطقة الجغرافية‪ ،‬فسنجد تحولًا‬
‫كبيرًايف المفهوم فيما يتعلق بتوزيع أسماء المشروبات الغازية كما هو موضحيف الشكل ‪.4.7.3‬‬

‫إذا أردنا بناء نظام ترجمة آلية ‪ ،machine translation system‬فقد يختلف التوزيع ∣ 𝑦(𝑃‬
‫)𝐱 حسب موقعنا‪ .‬قد يكون من الصعب اكتشاف هذه المشكلة‪ .‬قد نأمليف استغالل المعرفة التي‬
‫ال تحدث إال بشكل تدريجي إما بالمعنى الزمني أو الجغرافي‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪216‬‬

‫الشكل ‪ 4.7.3‬تحول المفهوميف أسماء المشروبات الغازيةيف الواليات المتحدة‪.‬‬

‫‪Examples of Distribution Shift‬‬ ‫‪4.7.2‬‬


‫قبل الخوضيف الشكليات والخوارزميات‪ ،‬يمكننا مناقشة بعض المواقف الملموسة التي قد ال‬
‫يكون فيها المتغير المشترك أو تحول المفهوم واضحًا‪.‬‬

‫‪Medical Diagnostics‬‬ ‫‪4.7.2.1‬‬


‫تخيل أنك تريد تصميم خوارزمية الكتشاف السرطان‪ .‬تقوم بجمع البيانات من األشخاص‬
‫األصحاء والمرضى وتقوم بتدريب الخوارزمية الخاصة بك‪ .‬إنه يعمل بشكل جيد‪ ،‬مما يمنحك‬
‫دقة عالية وتخلص إلى أنك مستعد لمهنة ناجحةيف التشخيص الطبي‪ .‬ليس بهذه السرعة‪.‬‬

‫قد تختلف التوزيعات التي أدت إلى بيانات التدريب وتلك التي ستواجههايف البرية اختالفًا كبيرًا‪.‬‬
‫حدث هذا لشركة ناشئة مؤسفة عمل معها بعضنا (المؤلفون) منذ سنوات‪ .‬كانوا يطورون اختبارًا‬
‫للدم لمرض يصيبيف الغالب كبار السن من الرجال ويأملونيف دراسته باستخدام عينات الدم التي‬
‫جمعوها من المرضى‪ .‬ومع ذلك‪ ،‬فإن الحصول على عينات دم من الرجال األصحاء أكثر صعوبة‬
‫بكثير من المرضى الموجودين بالفعليف النظام‪ .‬للتعويض‪ ،‬طلبت الشركة الناشئة التبرع بالدم من‬
‫الطالبيف الحرم الجامعي لتكون بمثابة ضوابط صحيةيف تطوير اختباراتهم‪ .‬ثم سألوا عما إذا كان‬
‫بإمكاننا مساعدتهميف بناء مصنف الكتشاف المرض‪.‬‬

‫كما أوضحنا لهم‪ ،‬سيكون من السهل بالفعل التمييز بين األفواج الصحية والمريضة بدقة شبه‬
‫كاملة‪ .‬ومع ذلك‪ ،‬هذا ألن األشخاص الخاضعين لالختبار اختلفوايف العمر ومستويات الهرمونات‬
‫والنشاط البدني والنظام الغذائي واستهالك الكحول والعديد من العوامل األخرى غير المرتبطة‬
‫‪217‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫بالمرض‪ .‬لم يكن هذا هو الحال مع المرضى الحقيقيين‪ .‬نظرًا إلجراءات أخذ العينات الخاصة‬
‫بهم‪ ،‬يمكننا أن نتوقع مواجهة تحول متغير شديد‪ .‬عالوة على ذلك‪ ،‬من غير المحتمل أن تكون‬
‫هذه الحالة قابلة للتصحيح بالطرق التقليدية‪ .‬باختصار‪ ،‬لقد أهدروا مبلغًا كبيرًا من المال‪.‬‬

‫‪Self-Driving Cars‬‬ ‫‪4.7.2.2‬‬


‫لنفترض أن شركة ما أرادت االستفادة من التعلم اآللي لتطوير سيارات ذاتية القيادة‪ .‬أحد المكونات‬
‫الرئيسية هنا هو جهاز الكشف ‪ roadside detector‬على جانب الطريق‪ .‬نظرًا ألن الحصول على‬
‫البيانات المشروحة الحقيقية باهظ التكلفة‪ ،‬فقد كانت لديهم فكرة (ذكية ومشكوك فيها)‬
‫الستخدام البيانات التركيبية ‪ synthetic data‬من محرك عرض األلعاب كبيانات تدريب إضافية‪.‬‬
‫لقد نجح هذا األمر جيدًايف "بيانات االختبار" المستمدة من محرك العرض‪ .‬لألسف‪ ،‬داخل سيارة‬
‫حقيقية كانت كارثة‪ .‬كما اتضح‪ ،‬تم تقديم جانب الطريق بنسيج بسيط للغاية‪ .‬واألهم من ذلك‪،‬‬
‫أن كل جوانب الطريق قد تم تقديمها بنفس الملمس وتعرف كاشف جانب الطريق على هذه‬
‫"الميزة" بسرعة كبيرة‪.‬‬

‫حدث شيء مشابه للجيش األمريكي عندما حاولوا اكتشاف الدباباتيف الغابة ألول مرة‪ .‬التقطوا‬
‫صورًا جوية للغابة بدون دبابات‪ ،‬ثم قادوا الدبابات إلى الغابة والتقطوا مجموعة أخرى من الصور‪.‬‬
‫يبدو أن المصنف يعمل بشكل مثالي‪ .‬لسوء الحظ‪ ،‬فقد تعلمت فقط كيفية التمييز بين األشجار‬
‫ذات الظالل من األشجار التي ليس لها ظالل ‪ -‬تم التقاط المجموعة األولى من الصوريف الصباح‬
‫الباكر‪ ،‬والمجموعة الثانية عند الظهر‪.‬‬

‫‪Nonstationary Distributions‬‬ ‫‪4.7.2.3‬‬


‫ينشأ موقف أكثر دقة عندما يتغير التوزيع ببطء (يُعرف أيضًا بالتوزيع غير الثابت) وال يتم تحديث‬
‫النموذج بشكل كافٍ‪ .‬فيما يلي بعض الحاالت النموذجية‪.‬‬

‫نقوم بتدريب نموذج إعالن حسابي ثم نفشليف تحديثه بشكل متكرر (على سبيل‬ ‫•‬
‫المثال‪ ،‬ننسى أن ندمج جهازًا جديدًا غامضًا يسمى ‪ iPad‬تم إطالقه للتو)‪.‬‬
‫نحن نبني عامل تصفية البريد العشوائي ‪ .spam filter‬إنه يعمل جيدًايف اكتشاف جميع‬ ‫•‬
‫الرسائل غير المرغوب فيها التي رأيناها حتى اآلن‪ .‬ولكن بعد ذلك‪ ،‬يستيقظ مرسلو‬
‫البريد العشوائي ويصنعون رسائل جديدة تبدو مختلفة عن أي شيء رأيناه من قبل‪.‬‬
‫نحن نبني نظام توصية المنتج ‪ .product recommendation system‬إنه يعمل‬ ‫•‬
‫طوال فصل الشتاء ولكنه يستمر بعد ذلكيف التوصية بقبعات سانتا لفترة طويلة بعد عيد‬
‫الميالد‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪218‬‬

‫‪More Anecdotes‬‬ ‫‪4.7.2.4‬‬


‫نبني جهاز كشف الوجه ‪ .face detector‬يعمل بشكل جيد على جميع المعايير‪ .‬لسوء‬ ‫•‬
‫الحظ‪ ،‬فشليف بيانات االختبار ‪ -‬األمثلة المخالفة هي لقطات قريبة حيث يمأل الوجه‬
‫الصورة بأكملها (لم تكن مثل هذه البيانات موجودةيف مجموعة التدريب)‪.‬‬
‫نحن نبني محرك بحث على شبكة اإلنترنت لسوق الواليات المتحدة ونريد نشرهيف ‬ ‫•‬
‫المملكة المتحدة‪.‬‬
‫نقوم بتدريب مصنف الصور عن طريق تجميع مجموعة بيانات كبيرة حيث يتم تمثيل‬ ‫•‬
‫كل مجموعة من مجموعة كبيرة من الفئات بالتساوييف مجموعة البيانات‪ ،‬لنقل ‪1000‬‬
‫فئة‪ ،‬ممثلة بـ ‪ 1000‬صورة لكل منها‪ .‬ثم ننشر النظاميف العالم الحقيقي‪ ،‬حيث يكون‬
‫التوزيع الفعلي للتسميات للصور الفوتوغرافية غير منتظم بالتأكيد‪.‬‬

‫‪Correction of Distribution Shift‬‬ ‫‪4.7.3‬‬


‫كما ناقشنا‪ ،‬هناك العديد من الحاالت التي يختلف فيها توزيع التدريب واالختبار )𝑦 ‪.𝑃(𝐱,‬يف ‬
‫بعض الحاالت‪ ،‬نكون محظوظين وتعمل النماذج على الرغم من تغيير المتغير أو التسمية أو‬
‫المفهوم‪.‬يف حاالت أخرى‪ ،‬يمكننا أن نفعل ما هو أفضل من خالل استخدام استراتيجيات قائمة‬
‫على المبادئ للتعامل مع هذا التحول‪ .‬ينمو الجزء المتبقي من هذا القسم بدرجة أكبر من الناحية‬
‫الفنية‪ .‬يمكن ل لقارئ الذي نفد صبره المتابعة إلى القسم التالي ألن هذه المادة ليست شرطًا أساسيًا‬
‫للمفاهيم الالحقة‪.‬‬

‫‪Empirical Risk and Risk‬‬ ‫‪4.7.3.1‬‬


‫دعنا نفكر أوالً فيما يحدث بالضبط أثناء تدريب النموذج‪ :‬نحن نكرر الميزات والتسميات‬
‫المرتبطة ببيانات التدريب }) 𝑛𝑦 ‪ {(𝐱1 , 𝑦1 ), … , (𝐱𝑛 ,‬ونحدِّث معلمات النموذج 𝑓 بعد كل‬
‫دفعات صغيرة‪ .‬من أجل التبسيط‪ ،‬ال نفكريف التنظيم ‪ ،regularization‬لذلك فإننا نقلل إلى حد‬
‫كبير الخطأيف التدريب‪:‬‬
‫𝑛‬
‫‪1‬‬
‫‪minimize ∑ 𝑙(𝑓(𝐱𝑖 ), 𝑦𝑖 ),‬‬
‫𝑓‬ ‫𝑛‬
‫‪𝑖=1‬‬

‫حيث 𝑙 هي دالة الخطأ التي تقيس "مدى سوء" التنبؤ ) 𝑖𝐱(𝑓 الذي يُعطى التسمية المرتبطة به 𝑖𝑦‪.‬‬
‫يسمي اإلحصائيون المصطلحيف (‪ )4.7.1‬الخطر التجريبية ‪ .empirical risk‬الخطر التجريبي‬
‫هو متوسط الخطأ على بيانات التدريب لتقريب الخطر‪ ،‬وهو توقع الخسارة على مجموعة البيانات‬
‫بأكملها المستمدة من توزيعها الحقيقي )𝑦 ‪:𝑝(𝐱,‬‬

‫‪𝐸𝑝(𝐱,𝑦) [𝑙(𝑓(𝐱), 𝑦)] = ∫ ∫ 𝑙(𝑓(𝐱), 𝑦)𝑝(𝐱, 𝑦)𝑑𝐱𝑑𝑦.‬‬


‫‪219‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫ومع ذلك‪ ،‬من الناحية العملية‪ ،‬ال يمكننا عادةً الحصول على مجموعة البيانات بالكامل‪ .‬وبالتالي‪،‬‬
‫فإن تقليل الخطر التجريبي ‪ ،empirical risk minimization‬والذي يقلل من المخاطر‬
‫التجريبيةيف (‪ ،)4.7.1‬هو استراتيجية عملية للتعلم اآللي‪ ،‬على أمل التقريب من تقليل المخاطر‪.‬‬

‫‪Covariate Shift Correction‬‬ ‫‪4.7.3.2‬‬


‫افترض أننا نريد تقدير بعض التبعية )𝐱 ∣ 𝑦(𝑃 التي قمنا بتسمية البيانات ) 𝑖𝑦 ‪ (𝐱𝑖 ,‬الخاصة بها‪.‬‬
‫لسوء الحظ‪ ،‬يتم استخالص المالحظات 𝑖𝐱 من توزيع بعض المصادر بدالً من التوزيع‬
‫المستهدف‪ .‬لحسن الحظ‪ ،‬فإن افتراض التبعية يعني أن التوزيع المشروط ال يتغير‪𝑝(𝑦 ∣ 𝐱) = :‬‬
‫)𝐱 ∣ 𝑦(𝑞‪ .‬إذا كان توزيع المصدر )𝐱(𝑞 "خاطئًا"‪ ،‬فيمكننا تصحيح ذلك باستخدام الهوية البسيطة‬
‫التاليةيف المخاطرة‪:‬‬

‫)𝐱(𝑝‬
‫)𝐱(𝑞)𝐱 ∣ 𝑦(𝑞)𝑦 ‪∫ ∫ 𝑙(𝑓(𝐱), 𝑦)𝑝(𝑦 ∣ 𝐱)𝑝(𝐱)𝑑𝐱𝑑𝑦 = ∫ ∫ 𝑙(𝑓(𝐱),‬‬ ‫‪𝑑𝐱𝑑𝑦.‬‬
‫)𝐱(𝑞‬

‫بعبارة أخرى‪ ،‬نحتاج إلى إعادة وزن ‪ reweigh‬كل مثال من البيانات بنسبة احتمالية استخالصه‬
‫من التوزيع الصحيح إلى التوزيع الخطأ‪:‬‬

‫‪def‬‬ ‫) 𝑖 𝐱(𝑝‬
‫= 𝑖𝛽‬ ‫‪.‬‬
‫) 𝑖 𝐱(𝑞‬

‫بتوصيل الوزن 𝑖𝛽 لكل مثال بيانات ) 𝑖𝑦 ‪ (𝐱 𝑖 ,‬يمكننا تدريب نموذجنا باستخدام تقليل المخاطر‬
‫التجريبية الموزونة ‪:weighted empirical risk minimization‬‬
‫𝑛‬
‫‪1‬‬
‫∑ ‪minimize‬‬ ‫‪𝛽𝑖 𝑙(𝑓(𝐱𝑖 ), 𝑦𝑖 ).‬‬
‫𝑓‬ ‫𝑛‬
‫‪𝑖=1‬‬

‫لألسف‪ ،‬ال نعرف هذه النسبة‪ ،‬لذا قبل أن نتمكن من فعل أي شيء مفيد نحتاج إلى تقديرها‪.‬‬
‫تتوفر العديد من الطرق‪ ،‬بمايف ذلك بعض األساليب النظرية المشغلة التي تحاول إعادة معايرة‬
‫عامل التوقع مباشرة باستخدام الحد األدنى من المعايير أو الحد األقصى لمبدأ االنتروبيا‪ .‬الحظ‬
‫أنه ألي نهج من هذا القبيل‪ ،‬نحتاج إلى عينات مأخوذة من كال التوزيعين ‪" -‬صحيح" 𝑝‪ ،‬على‬
‫سبيل المثال‪ ،‬من خالل الوصول إلى بيانات االختبار‪ ،‬وتلك المستخدمة إلنشاء مجموعة التدريب‬
‫𝑞 (األخير متاح بشكل ضئيل)‪ .‬الحظ مع ذلك‪ ،‬أننا نحتاج فقط إلى ميزات )𝐱(𝑝 ∼ 𝐱؛ ال نحتاج‬
‫للوصول إلى التسميات )𝑦(𝑝 ∼ 𝑦‪.‬‬

‫في هذه الحالة‪ ،‬يوجد نهج فعال للغاية سيعطي نتائج جيدة تقريبًا مثل األصل‪ :‬االنحدار اللوجستي‬
‫‪ ،logistic regression‬وهو حالة خاصة من انحدار ‪( softmax‬انظر القسم ‪ )4.1‬للتصنيف‬
‫الثنائي‪ .‬هذا هو كل ما هو مطلوب لحساب نسب االحتمال المقدرة‪ .‬نتعلم المصنف للتمييز بين‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪220‬‬

‫البيانات المستمدة من )𝐱(𝑝 والبيانات المستمدة من )𝐱(𝑞 ‪ .‬إذا كان من المستحيل التمييز بين‬
‫التوزيعين‪ ،‬فهذا يعني أن الحاالت المرتبطة من المرجح أن تأتي من أحد التوزيعين‪ .‬من ناحية‬
‫أخرى‪ ،‬فإن أي حاالت يمكن تمييزها بشكل جيد يجب أن يكون لها وزن زائد أو ناقص بشكل‬
‫كبير وفقًا لذلك‪.‬‬

‫من أجل التبسيط‪ ،‬افترض أن لدينا عددًا متساويًا من المثيالت من كال التوزيعين )𝐱(𝑝 و)𝐱(𝑞‬
‫على التوالي‪ .‬قم اآلن باإلشارة إلى التسميات 𝑧 الى ‪ 1‬للبيانات المستمدة من 𝑝 للبيانات المستمدة‬
‫من 𝑞‪ .‬ثم يتم إعطاء االحتماليف مجموعة بيانات مختلطة بواسطة‬

‫)𝐱(𝑝‬ ‫)𝐱 ∣ ‪𝑃(𝑧 = 1‬‬ ‫)𝐱(𝑝‬


‫= )𝐱 ∣ ‪𝑃(𝑧 = 1‬‬ ‫‪and hence‬‬ ‫=‬ ‫‪.‬‬
‫)𝐱(𝑞 ‪𝑝(𝐱) +‬‬ ‫)𝐱(𝑞 )𝐱 ∣ ‪𝑃(𝑧 = −1‬‬
‫‪1‬‬
‫وبالتالي‪ ،‬إذا استخدمنا نهج االنحدار اللوجستي‪ ،‬حيث ))𝐱(‪ℎ( 𝑃(𝑧 = 1 ∣ 𝐱) = 1+exp (−ℎ‬‬
‫هي دالة ذات معلمات)‪ ،‬يتبع ذلك‬

‫))) 𝑖𝐱(‪1/(1 + exp (−ℎ‬‬


‫= 𝑖𝛽‬ ‫‪= exp (ℎ(𝐱𝑖 )).‬‬
‫))) 𝑖𝐱(‪exp (−ℎ(𝐱𝑖 ))/(1 + exp (−ℎ‬‬

‫نتيجة لذلك‪ ،‬نحتاج إلى حل مشكلتين‪ :‬األولى للتمييز بين البيانات المستمدة من كال التوزيعين‪،‬‬
‫ثم مشكلة تقليل المخاطر التجريبية الموزونةيف (‪ )4.7.5‬حيث نزن المصطلحات حسب 𝑖𝛽‪.‬‬

‫اآلن نحن جاهزون لوصف خوارزمية التصحيح‪ .‬افترض أن لدينا مجموعة تدريب‬
‫}) 𝑛𝑦 ‪ {(𝐱1 , 𝑦1 ), … , (𝐱𝑛 ,‬ومجموعة اختبار غير مسماة } 𝑚𝐮 ‪ .{𝐮1 , … ,‬بالنسبة إلى تحول‬
‫المتغير ‪ ،covariate shift‬نفترض أن يتم استخالص 𝑖𝐱 لكل من 𝑛 ≤ 𝑖 ≤ ‪ 1‬بعض توزيعات‬
‫المصدر و 𝑖𝐮 لكل 𝑚 ≤ 𝑖 ≤ ‪ 1‬مستمدون من التوزيع المستهدف‪ .‬فيما يلي خوارزمية نموذجية‬
‫لتصحيح التحول المتغير‪:‬‬

‫‪ .1‬إنشاء مجموعة تدريب التصنيف الثنائي‪:‬‬

‫})‪.{(𝐱1 , −1), … , (𝐱𝑛 , −1), (𝐮1 , 1), … , (𝐮𝑚 , 1‬‬

‫‪ .2‬تدريب مصنف ثنائي باستخدام االنحدار اللوجستي للحصول على دالة ‪.ℎ‬‬
‫‪ .3‬وزن بيانات التدريب باستخدام )) 𝑖𝐱(‪ 𝛽𝑖 = exp (ℎ‬أو أفضل = 𝑖𝛽‬
‫)𝑐 ‪ 𝑚𝑖𝑛(exp (ℎ(𝐱𝑖 )),‬لبعض ثابت 𝑐‪.‬‬
‫‪ .4‬استخدام األوزان 𝑖𝛽 للتدريب على }) 𝑛𝑦 ‪{(𝐱1 , 𝑦1 ), … , (𝐱𝑛 ,‬يف (‪.)4.7.5‬‬

‫الحظ أن الخوارزمية أعاله تعتمد على افتراض حاسم‪ .‬لكي يعمل هذا المخطط‪ ،‬نحتاج إلى أن‬
‫يكون لكل مثال بياناتيف الهدف (على سبيل المثال‪ ،‬وقت االختبار) احتمالية غير صفرية‬
‫‪221‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫لحدوثهايف وقت التدريب‪ .‬إذا وجدنا نقطة حيث ‪ 𝑝(𝐱) > 0‬ولكن ‪ ، 𝑞(𝐱) = 0‬فإن وزن‬
‫األهمية المقابل يجب أن يكون النهائي‪.‬‬

‫‪Label Shift Correction‬‬ ‫‪4.7.3.3‬‬


‫افترض أننا نتعامل مع مهمة تصنيف مع الفئات 𝑘‪ .‬باستخدام نفس الترميزيف القسم ‪،4.7.3.2‬‬
‫𝑞 و 𝑝 هما توزيع المصدر (على سبيل المثال‪ ،‬وقت التدريب ‪ )training time‬والتوزيع‬
‫المستهدف (على سبيل المثال‪ ،‬وقت االختبار ‪ ،)test time‬على التوالي‪ .‬افترض أن توزيع‬
‫التسميات يتغير بمرور الوقت‪ ، 𝑞(𝑦) ≠ 𝑝(𝑦):‬لكن التوزيع الشرطي للفئة يظل كما هو‪𝑞(𝐱 ∣ :‬‬
‫)𝑦 ∣ 𝐱(𝑝 = )𝑦‪ .‬إذا كان توزيع المصدر )𝑦(𝑞 "خاطئًا"‪ ،‬فيمكننا تصحيح ذلك وفقًا للهوية‬
‫التاليةيف الخطر كما هو محدديف (‪:)4.7.2‬‬

‫)𝑦(𝑝‬
‫)𝑦(𝑞)𝑦 ∣ 𝐱(𝑞)𝑦 ‪∫ ∫ 𝑙(𝑓(𝐱), 𝑦)𝑝(𝐱 ∣ 𝑦)𝑝(𝑦)𝑑𝐱𝑑𝑦 = ∫ ∫ 𝑙(𝑓(𝐱),‬‬ ‫‪𝑑𝐱𝑑𝑦.‬‬
‫)𝑦(𝑞‬

‫هنا‪ ،‬سوف تتوافق أوزان األهمية الخاصة بنا مع نسب احتمالية التسمية‬

‫‪def‬‬ ‫) 𝑖𝑦(𝑝‬
‫= 𝑖𝛽‬ ‫‪.‬‬
‫) 𝑖𝑦(𝑞‬

‫أحد األشياء اللطيفة حول تحول التسمية ‪ label shift‬هو أنه إذا كان لدينا نموذج جيد بشكل‬
‫معقول لتوزيع المصدر‪ ،‬فيمكننا الحصول على تقديرات متسقة لهذه األوزان دون الحاجة إلى‬
‫التعامل مع البعد المحيط‪.‬يف التعلم العميق‪ ،‬تميل المدخالت إلى أن تكون كائنات عالية األبعاد‬
‫مثل الصور‪،‬يف حين أن التسميات غالبًا ما تكون كائنات أبسط مثل الفئات‪.‬‬

‫لتقدير توزيع التسمية المستهدف‪ ،‬نأخذ أوالً المصنف الجيد الجاهز لدينا (عادةً ما يتم تدريبه‬
‫على بيانات التدريب) ونحسب مصفوفة االرتباك ‪ confusion matrix‬الخاصة به باستخدام‬
‫مجموعة التحقق من الصحة (أيضًا من توزيع التدريب)‪ .‬مصفوفة االرتباك ( ‪confusion‬‬
‫‪ ،𝐂 )matrix‬هي مجرد مصفوفة‪ ،‬حيث يتوافق كل عمود مع فئة التسمية (الحقيقة األساسية)‬
‫ويتوافق كل صف مع الفئة المتوقعة لنموذجنا‪ .‬تمثل قيمة كل خلية 𝑗𝑖𝑐 جزءًا من إجمالي التوقعات‬
‫في مجموعة التحقق حيث كان التسمية الحقيقية كانت 𝑗 وتوقع نموذجنا 𝑖‪.‬‬

‫اآلن‪ ،‬ال يمكننا حساب مصفوفة االرتباك على البيانات الهدف مباشرةً‪ ،‬ألننا ال نرى تسميات‬
‫األمثلة التي نراهايف البرية‪ ،‬إال إذا استثمرنايف خط أنابيب معقد للتعليقات التوضيحيةيف الوقت‬
‫الفعلي‪ .‬ومع ذلك‪ ،‬ما يمكننا القيام به هو متوسط جميع تنبؤاتنايف وقت االختبار معًا‪ ،‬مما يؤدي‬
‫^‬ ‫^‬
‫إلى متوسط مخرجات النموذج 𝑘‪ 𝜇(𝐲) ∈ ℝ‬الذي ‪𝑖 th‬عنصر ) 𝑖𝑦(𝜇 هو جزء من التوقعات‬
‫اإلجماليةيف مجموعة االختبار حيث توقع نموذجنا‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪222‬‬

‫اتضح أنهيف ظل بعض الظروف المعتدلة ‪ -‬إذا كان المصنف لدينا دقيقًا بشكل معقوليف المقام‬
‫األول‪ ،‬وإذا كانت البيانات المستهدفة تحتوي فقط على الفئات التي رأيناها من قبل‪ ،‬وإذا كان‬
‫افتراض تحول التسمية ثابتًايف المقام األول (أقوى افتراض هنا) ‪ ،‬ثم يمكننا تقدير توزيع تسمية‬
‫مجموعة االختبار عن طريق حل نظام خطي بسيط‬
‫^‬
‫‪𝐂𝑝(𝐲) = 𝜇(𝐲),‬‬
‫^‬
‫‪ ∑𝑘𝑗=1‬يحمل لكل 𝑘 ≤ 𝑖 ≤ ‪ ، 1‬حيث ) 𝑗𝑦(𝑝 هو‬ ‫ألنه كتقدير ) 𝑖𝑦(𝜇 = ) 𝑗𝑦(𝑝 𝑗𝑖𝑐‬
‫‪𝑗 th‬عنصر متجه توزيع التسمية ذي 𝑘أبعاد )𝐲(𝑝‪ .‬إذا كان المصنف لدينا دقيقًا بما يكفي لتبدأ به‪،‬‬
‫^‬
‫فستكون مصفوفة االرتباك 𝐂 قابلة للعكس‪ ،‬وسنحصل على حل )𝐲(𝜇 ‪𝑝(𝐲) = 𝐂 −1‬‬

‫نظرًا ألننا نالحظ التسميات على بيانات المصدر‪ ،‬فمن السهل تقدير التوزيع )𝑦(𝑞‪ .‬ثم بالنسبة‬
‫ألي مثال تدريبي 𝑖 مع التسمية 𝑖𝑦‪ ،‬يمكننا أن نأخذ النسبة المقدرة لدينا ) 𝑖𝑦(𝑞‪ 𝑝(𝑦𝑖 )/‬لحساب‬
‫الوزن 𝑖𝛽‪ ،‬ونعوض هذايف تقليل المخاطر التجريبية الموزونةيف (‪.)4.7.5‬‬

‫‪Concept Shift Correction‬‬ ‫‪4.7.3.4‬‬


‫من الصعب إصالح تحول المفهوم بطريقة مبدئية‪ .‬على سبيل المثال‪،‬يف حالة تغيرت فيها المشكلة‬
‫فجأة من تمييز القطط عن الكالب إلى تمييز بين الحيوانات البيضاء والسوداء‪ ،‬سيكون من غير‬
‫المعقول افتراض أنه يمكننا القيام بعمل أفضل بكثير من مجرد جمع تسميات جديدة والتدريب‬
‫من نقطة الصفر‪ .‬لحسن الحظ‪،‬يف الممارسة العملية‪ ،‬مثل هذه التحوالت المتطرفة نادرة‪ .‬بدالً من‬
‫ذلك‪ ،‬ما يحدث عادةً هو أن المهمة تتغير ببطء‪ .‬لجعل األمور أكثر واقعية‪ ،‬إليك بعض األمثلة‪:‬‬

‫في اإلعالنات الحاسوبية‪ ،‬يتم إطالق منتجات جديدة‪ ،‬وتصبح المنتجات القديمة أقل‬ ‫•‬
‫شعبية‪ .‬هذا يعني أن التوزيع على اإلعالنات وشعبيتها يتغيران تدريجيًا وأي متنبئ بنسبة‬
‫النقر إلى الظهور يجب أن يتغير تدريجيًا معه‪.‬‬
‫تتدهور عدسات كاميرات المرور تدريجيًا بسبب التآ كل البيئي‪ ،‬مما يؤثر على جودة‬ ‫•‬
‫الصورة بشكل تدريجي‪.‬‬
‫يتغير محتوى األخبار تدريجيًا (على سبيل المثال‪ ،‬تظل معظم األخبار دون تغيير ولكن‬ ‫•‬
‫تظهر قصص جديدة)‪.‬‬

‫في مثل هذه الحاالت‪ ،‬يمكننا استخدام نفس النهج الذي استخدمناه لشبكات التدريب لجعلها‬
‫تتكيف مع التغييريف البيانات‪ .‬بمعنى آخر‪ ،‬نستخدم أوزان الشبكة الحالية ونقوم ببساطة ببعض‬
‫خطوات التحديث باستخدام البيانات الجديدة بدالً من التدريب من البداية‪.‬‬
‫‪223‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪A Taxonomy of Learning Problems‬‬ ‫‪4.7.4‬‬


‫مسلحين بالمعرفة حول كيفية التعامل مع التغييراتيف التوزيعات‪ ،‬يمكننا اآلن النظريف بعض‬
‫الجوانب األخرى لصياغة مشكلة التعلم اآللي‪.‬‬

‫‪Batch Learning‬‬ ‫‪4.7.4.1‬‬


‫في التعلم الجماعي ‪ ،Batch Learning‬لدينا إمكانية الوصول إلى ميزات التدريب والتسميات‬
‫}) 𝑛𝑦 ‪ ،{(𝐱1 , 𝑦1 ), … , (𝐱𝑛 ,‬والتي نستخدمها لتدريب نموذج )𝐱(𝑓‪.‬يف وقت الحق‪ ،‬قمنا بنشر‬
‫هذا النموذج لتسجيل بيانات جديدة )𝑦 ‪ (𝐱,‬مستمدة من نفس التوزيع‪ .‬هذا هو االفتراض‬
‫االفتراضي ألي من المشاكل التي نناقشها هنا‪ .‬على سبيل المثال‪ ،‬قد نقوم بتدريب جهاز الكشف‬
‫عن القطط بناءً على الكثير من صور القطط والكالب‪ .‬بمجرد أن نقوم بتدريبه‪ ،‬نقوم بشحنه كجزء‬
‫من نظام الرؤية الحاسوبية الذكي الذي يسمح للقطط بالدخول‪ .‬ثم يتم تثبيتهيف منزل العميل وال‬
‫يتم تحديثه مرة أخرى (باستثناء الظروف القصوى)‪.‬‬

‫‪Online Learning‬‬ ‫‪4.7.4.2‬‬


‫تخيل اآلن أن البيانات ) 𝑖𝑦 ‪ (𝐱𝑖 ,‬تصل عينة واحدةيف كل مرة‪ .‬بشكل أكثر تحديدًا‪ ،‬افترض أننا‬
‫نالحظ 𝑖𝐱 أوالً‪ ،‬ثم نحتاج إلى التوصل إلى تقدير ) 𝑖𝐱(𝑓 وفقط بمجرد قيامنا بذلك‪ ،‬نالحظه‬
‫ونتلقى مكافأة أو نتحمل خسارة‪ ،‬نظرًا لقرارنا‪ .‬تقع العديد من المشاكل الحقيقيةيف هذه الفئة‪.‬‬
‫على سبيل المثال‪ ،‬نحتاج إلى توقع سعر سهم الغد‪ ،‬وهذا يسمح لنا بالتداول بناءً على هذا التقدير‬
‫وفي نهاية اليوم نكتشف ما إذا كان تقديرنا يسمح لنا بتحقيق ربح‪ .‬بعبارة أخرى‪،‬يف التعلم‬
‫االونالين ‪ ،Online Learning‬لدينا الدورة التالية حيث نعمل باستمرار على تحسين نموذجنا‬
‫في ضوء المالحظات الجديدة‪.‬‬

‫‪Bandits 4.7.4.3‬‬
‫‪ Bandits‬هي حالة خاصة للمشكلة المذكورة أعاله‪ .‬بينمايف معظم مشاكل التعلم لدينا دالة 𝑓ذات‬
‫معلمات باستمرار حيث نريد معرفة معلماتها (على سبيل المثال‪ ،‬شبكة عميقة)‪،‬يف مشكلة‬
‫‪ Bandits‬لدينا فقط عدد محدود من األسلحة التي يمكننا سحبها‪ ،‬أي عدد محدود من اإلجراءات‬
‫يمكننا أخذه‪ .‬ليس من المستغرب جدًا أنه يمكن الحصول على ضمانات نظرية أقوى من حيث‬
‫األمثلية لهذه المشكلة األبسط‪ .‬ندرجها بشكل أساسي ألن هذه المشكلة غال ًبا ما يتم التعامل معها‬
‫(بشكل مربك) كما لو كانت بيئة تعليمية مميزة‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪224‬‬

‫‪Control‬‬ ‫‪4.7.4.4‬‬
‫في كثير من الحاالت تتذكر البيئة ما فعلناه‪ .‬ليس بالضرورة بطريقة عدائية ولكنها ستتذكر فقط‬
‫وستعتمد االستجابة على ما حدث من قبل‪ .‬على سبيل المثال‪ ،‬ستالحظ وحدة التحكميف غالية‬
‫القهوة درجات حرارة مختلفة اعتمادًا على ما إذا كانت تسخن الغالية مسبقًا‪ .‬تعد خوارزميات‬
‫وحدة التحكم ‪( PID‬تناسبي تكاملي تفاضلي ‪ )proportional-integral-derivative‬خيارًا‬
‫شائعًا هناك‪ .‬وبالمثل‪ ،‬سيعتمد سلوك المستخدم على موقع األخبار على ما أظهرناه له سابقًا (على‬
‫سبيل المثال‪ ،‬سيقرأ معظم األخبار مرة واحدة فقط)‪ .‬تشكل العديد من هذه الخوارزميات نموذجًا‬
‫للبيئة التي تعمل فيها بحيث تجعل قراراتها تبدو أقل عشوائية‪.‬يف اآلونة األخيرة‪ ،‬تم أيضًا استخدام‬
‫نظرية التحكم (على سبيل المثال‪ ،‬متغيرات ‪ )PID‬لضبط المعلمات الفائقة تلقائيًا لتحقيق جودة‬
‫أفضل لفك التشابك وإعادة البناء‪ ،‬وتحسين تنوع النص الذي تم إنشاؤه وجودة إعادة بناء الصور‬
‫التي تم إنشاؤها (‪.)2020 ،Shao et al.‬‬

‫‪Reinforcement Learning‬‬ ‫‪4.7.4.5‬‬


‫في الحالة العامة لبيئة ذات ذاكرة‪ ،‬قد نواجه مواقف تحاول فيها البيئة التعاون معنا (ألعاب تعاونية‬
‫‪ ،cooperative games‬على وجه الخصوص لأللعاب ذات المجموع غير الصفري ‪non-‬‬
‫‪ ،)zero-sum games‬أو حاالت أخرى حيث ستحاول البيئة الفوز‪ .‬الشطرنج أو ‪ Go‬أو‬
‫‪ Backgammon‬أو ‪ StarCraft‬هي بعض الحاالتيف التعلم المعزز ‪Reinforcement‬‬
‫‪ .Learning‬وبالمثل‪ ،‬قد نرغبيف بناء وحدة تحكم جيدة للسيارات ذاتية القيادة‪ .‬من المحتمل‬
‫أن تستجيب السيارات األخرى ألسلوب قيادة السيارة المستقلة بطرق غير بديهية‪ ،‬على سبيل‬
‫المثال‪ ،‬محاولة تجنبها ومحاولة التسببيف وقوع حادث ومحاولة التعاون معها‪.‬‬

‫‪Considering the Environment‬‬ ‫‪4.7.4.6‬‬


‫أحد الفروق الرئيسية بين المواقف المختلفة المذكورة أعاله هو أن نفس اإلستراتيجية التي ربما‬
‫نجحت طوال الوقتيف حالة البيئة الثابتة‪ ،‬قد ال تعمل طوال الوقت عندما تكون البيئة قادرة على‬
‫التكيف‪ .‬على سبيل المثال‪ ،‬من المرجح أن تختفي فرصة المراجحة ‪arbitrage opportunity‬‬
‫التي اكتشفها المتداول بمجرد أن يبدأيف استغاللها‪ .‬تحدد السرعة والطريقة التي تتغير بها البيئة‬
‫إلى حد كبير نوع الخوارزميات التي يمكننا استخدامها‪ .‬على سبيل المثال‪ ،‬إذا علمنا أن األشياء‬
‫قد تتغير ببطء فقط‪ ،‬فيمكننا إجبار أي تقدير على التغيير ببطء فقط أيضًا‪ .‬إذا علمنا أن البيئة قد‬
‫تتغير على الفور‪ ،‬ولكن بشكل نادر جدًا‪ ،‬فيمكننا السماح بذلك‪ .‬هذه األنواع من المعرفة ضرورية‬
‫لعالم البيانات الطموح للتعامل مع تحول المفهوم‪ ،‬أي عندما تكون المشكلة التي يحاول حلها‬
‫مع مرور الوقت‪.‬‬
‫‪225‬‬ ‫الفصل الرابع‪ :‬الشبكات العصبية الخطية للتصنيف‬

‫‪Fairness,‬‬ ‫‪4.7.5‬‬
‫‪Accountability, and Transparency in Machine Learning‬‬
‫أخيرًا‪ ،‬من المهم أن تتذكر أنه عند نشر أنظمة التعلم اآللي‪ ،‬فأنت ال تقوم فقط بتحسين نموذج‬
‫تنبؤي ‪ -‬فأنت تقدم عادةً أداة ستُستخدم (جزئيًا أو كليًا) ألتمتة القرارات‪ .‬يمكن أن تؤثر هذه‬
‫األ نظمة التقنية على حياة األفراد الخاضعين للقرارات الناتجة‪ .‬ال تثير القفزة من التفكيريف ‬
‫التنبؤات إلى القرارات أسئلة فنية جديدة فحسب‪ ،‬بل تثير أيضًا عددًا كبيرًا من األسئلة األخالقية‬
‫التي يجب مراعاتها بعناية‪ .‬إذا كنا ننشر نظامًا تشخيصيًا طبيًا‪ ،‬فنحن بحاجة إلى معرفة الفئات‬
‫السكانية التي قد يعمل بها وأيها قد ال يعمل‪ .‬قد يؤدي التغاضي عن المخاطر المتوقعة على رفاهية‬
‫مجموعة سكانية فرعية إلى تقديم رعاية أدنى‪ .‬عالوة على ذلك‪ ،‬بمجرد التفكيريف أنظمة صنع‬
‫القرار‪ ،‬يجب أن نتراجع ونعيد النظريف كيفية تقييمنا لتقنيتنا‪ .‬من بين النتائج األخرى لهذا التغيير‬
‫في النطاق‪ ،‬سنجد أن الدقة نادراً ما تكون المقياس الصحيح‪ .‬على سبيل المثال‪ ،‬عند ترجمة‬
‫التنبؤات إلى أفعال‪ ،‬غالبًا ما نرغبيف مراعاة حساسية التكلفة المحتملة للخطأ بطرق مختلفة‪ .‬إذا‬
‫كان من الممكن النظر إلى إحدى طرق سوء تصنيف صورة ما على أنها خفة عرقية‪،‬يف حين أن‬
‫التصنيف الخاطئ إلى فئة مختلفة سيكون غير ضار‪ ،‬فقد نرغبيف تعديل عتباتنا وفقًا لذلك‪ ،‬مع‬
‫مراعاة القيم المجتمعيةيف تصميم بروتوكول اتخاذ القرار‪ .‬نريد أيضًا توخي الحذر بشأن الكيفية‬
‫التي يمكن أن تؤدي بها أنظمة التنبؤ إلى حلقات التغذية الراجعة‪ .‬على سبيل المثال‪ ،‬ضعيف ‬
‫اعتبارك أنظمة الشرطة التنبؤية ‪ ،predictive policing systems‬التي تخصص ضباط‬
‫الدورياتيف المناطق التي ترتفع فيها معدالت الجريمة المتوقعة‪ .‬من السهل أن ترى كيف يمكن‬
‫أن يظهر نمط مقلق‪:‬‬

‫‪ .1‬األحياء التي بها جرائم أكثر تحصل على المزيد من الدوريات‪.‬‬


‫‪ .2‬وبالتالي‪ ،‬تم اكتشاف المزيد من الجرائميف هذه األحياء‪ ،‬وإدخال بيانات التدريب‬
‫المتاحة للتكراريف المستقبل‪.‬‬
‫‪ .3‬يتعرض النموذج لمزيد من اإليجابيات‪ ،‬ويتوقع المزيد من الجرائميف هذه األحياء‪.‬‬
‫‪ .4‬في التكرار التالي‪ ،‬يستهدف النموذج المحدث الحي نفسه بشكل أكبر مما يؤدي إلى‬
‫اكتشاف المزيد من الجرائم‪ ،‬وما إلى ذلك‪.‬‬

‫في كثير من األحيان‪ ،‬ال يتم احتساب اآلليات المختلفة التي يتم من خاللها اقتران تنبؤات النموذج‬
‫ببيانات التدريب الخاصة بهيف عملية النمذجة‪ .‬يمكن أن يؤدي هذا إلى ما يسميه الباحثون حلقات‬
‫التغذية الراجعة الجامحة ‪ .runaway feedback loops‬باإلضافة إلى ذلك‪ ،‬نريد توخي الحذر‬
‫بشأن ما إذا كنا نعالج المشكلة الصحيحةيف المقام األول‪ .‬تلعب الخوارزميات التنبؤية اآلن دورًا‬
‫كبيرًايف التوسطيف نشر المعلومات‪ .‬هل يجب أن يتم تحديد األخبار التي يواجهها الفرد من خالل‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪226‬‬

‫مجموعة صفحات ‪ Facebook‬التي أعجبتهم؟ هذه مجرد أمثلة قليلة من بين العديد من‬
‫المعضالت األخالقية الملحة التي قد تواجههايف مهنة تعلم اآللة‪.‬‬

‫‪4.7.6‬‬
‫في كثير من الحاالت ال تأتي مجموعات التدريب واالختبار من نفس التوزيع‪ .‬وهذا ما‬ ‫•‬
‫يسمى تحول التوزيع ‪.distribution shift‬‬
‫الخطر ‪ risk‬هو توقع الخسارة على مجموع البيانات المستمدة من توزيعها الحقيقي‪.‬‬ ‫•‬
‫ومع ذلك‪ ،‬عادة ما تكون هذه المجموعة بأكملها غير متوفرة‪ .‬الخطر التجريبي‬
‫‪ Empirical risk‬هو متوسط الخسارة على بيانات التدريب لتقريب المخاطر‪.‬يف ‬
‫الممارسة العملية‪ ،‬نقوم بتقليل المخاطر التجريبية ‪.empirical risk minimization‬‬
‫وفقًا لالفتراضات المقابلة‪ ،‬يمكن اكتشاف تحول المتغير ‪ covariate shift‬وتحول‬ ‫•‬
‫التسمية ‪ label shift‬وتصحيحهمايف وقت االختبار‪ .‬يمكن أن يصبح الفشليف تفسير‬
‫هذا التحيز مشكلةيف وقت االختبار‪.‬‬
‫في بعض الحاالت‪ ،‬قد تتذكر البيئة اإلجراءات اآللية وتستجيب بطرق مفاجئة‪ .‬يجب‬ ‫•‬
‫أن نأخذيف الحسبان هذا االحتمال عند بناء النماذج واالستمراريف مراقبة األنظمة الحية‪،‬‬
‫واالنفتاح على احتمال أن تصبح نماذجنا والبيئة متشابكة بطرق غير متوقعة‪.‬‬

‫‪4.7.7‬‬
‫‪ .1‬ماذا يمكن أن يحدث عندما نغير سلوك محرك البحث؟ ماذا يمكن أن يفعل‬
‫المستخدمون؟ ماذا عن المعلنين؟‬
‫‪ .2‬نفذ كاشف التحول المتغير ‪ .covariate shift detector‬تلميح‪ :‬بناء مصنف‪.‬‬
‫‪ .3‬استخدم مصحح تحول المتغير ‪.covariate shift corrector‬‬
‫‪ .4‬إلى جانب تحول التوزيع ‪ ،distribution shift‬ما الذي يمكن أن يؤثر أيضًا على كيفية‬
‫تقريب المخاطر التجريبية للمخاطر؟‬
‫البيرسيبترون متعدد‬
‫الطبقات‬ ‫‪5‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪228‬‬

‫‪Multilayer‬‬ ‫‪5‬‬
‫‪Perceptrons‬‬
‫في هذا الفصل‪ ،‬سوف نقدم لك أول شبكة عميقة حقًا‪ .‬تُعرف أبسط الشبكات العميقة باسم‬
‫البيرسيبترون متعدد الطبقات ‪ ،Multilayer Perceptrons‬وهي تتكون من طبقات متعددة من‬
‫الخاليا العصبية‪ ،‬كل منها مرتبطة تمامًا بتلك الموجودةيف الطبقة أدناه (التي تتلقى منها‬
‫المدخالت) وتلك الموجودة أعاله (والتي بدورها تؤثر عليها)‪ .‬على الرغم من أن التمايز التلقائي‬
‫يبسط بشكل كبير تنفيذ خوارزميات التعلم العميق‪ ،‬إال أننا سنتعمقيف كيفية حساب هذه التدرجات‬
‫‪gradients‬يف الشبكات العميقة‪ .‬بعد ذلك سنكون مستعدين لمناقشة القضايا المتعلقة باالستقرار‬
‫العددي وتهيئة المعلمات التي تعتبر أساسية لتدريب الشبكات العميقة بنجاح‪ .‬عندما نقوم‬
‫بتدريب مثل هذه النماذج عالية السعة‪ ،‬فإننا نخاطر بالضبط الزائد ‪ .overfitting‬وبالتالي‪ ،‬سنعيد‬
‫النظريف التنظيم ‪ regularization‬والتعميم ‪ generalization‬للشبكات العميقة‪ .‬طوال الوقت‪،‬‬
‫نهدف إلى منحك فهمًا قويًا ليس فقط للمفاهيم ولكن أيضًا لممارسة استخدام الشبكات العميقة‪.‬‬
‫في نهاية هذا الفصل‪ ،‬نطبق ما قدمناه حتى اآلن على حالة حقيقية‪ :‬التنبؤ بأسعار المنزل‪ .‬نرسل‬
‫األمور المتعلقة باألداء الحسابي وقابلية التوسع وكفاءة نماذجنا إلى الفصول الالحقة‪.‬‬

‫‪Multilayer Perceptrons‬‬ ‫‪5.1‬‬


‫في القسم ‪ ،4‬قدمنا انحدار ‪( softmax‬القسم ‪ ،)4.1‬وتنفيذ الخوارزمية من البداية (القسم ‪)4.4‬‬
‫واستخدام واجهات برمجة التطبيقات ‪ APIs‬عالية المستوى (القسم ‪ .)4.5‬سمح لنا ذلك‬
‫بتدريب المصنفات القادرة على التعرف على ‪ 10‬فئات من المالبس من الصور منخفضة الدقة‪.‬‬
‫على طول الطريق‪ ،‬تعلمنا كيفية تبديل البيانات ‪ ،wrangle data‬وإجبار مخرجاتنا على توزيع‬
‫احتمالي صالح‪ ،‬وتطبيق دالة خطأ مناسبة‪ ،‬وتقليلها فيما يتعلق بمعلمات نموذجنا‪ .‬اآلن وقد أتقننا‬
‫هذه الميكانيكايف سياق النماذج الخطية البسيطة‪ ،‬يمكننا إطالق استكشافنا للشبكات العصبية‬
‫العميقة‪ ،‬فئة النماذج الغنية نسبيًا التي يهتم بها هذا الكتاب بشكل أساسي‪.‬‬

‫‪Hidden Layers‬‬ ‫‪5.1.1‬‬


‫وصفنا التحوالت األفينية ‪affine transformations‬يف القسم ‪ 3.1.1.1‬كتحوالت خطية مع‬
‫تحيز إضافي‪ .‬للبدء‪ ،‬تذكر بنية النموذج المقابلة لمثال انحدار ‪ softmax‬الموضحيف الشكل‬
‫‪ . 4.1.1‬يقوم هذا النموذج بتعيين المدخالت مباشرة إلى المخرجات عبر تحويل أفيني واحد‪،‬‬
‫متبوعًا بعملية ‪ .softmax‬إذا كانت تسمياتنا مرتبطة حقًا ببيانات اإلدخال عن طريق تحويل أفيني‬
‫بسيط‪ ،‬فسيكون هذا النهج كافيًا‪ .‬ومع ذلك‪ ،‬فإن الخطية (في التحوالت األفينية) هي افتراض‬
‫قوي‪.‬‬
‫‪229‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Limitations of Linear Models‬‬ ‫‪5.1.1.1‬‬


‫على سبيل المثال‪ ،‬تشير الخطية ‪ linearity‬إلى االفتراض األضعف للرتابة ‪weaker‬‬
‫‪ ،assumption of monotonicity‬أي أن أي زيادةيف ميزتنا يجب أن تتسبب دائمًايف زيادة‬
‫ناتج نموذجنا (إذا كان الوزن المقابل موجبًا)‪ ،‬أو يتسبب دائمًايف انخفاض ناتج نموذجنا (إذا كان‬
‫الوزن المقابل سلبي)‪.‬يف بعض األحيان يكون هذا منطقيًا‪ .‬على سبيل المثال‪ ،‬إذا كنا نحاول التنبؤ‬
‫بما إذا كان الفرد سوف يسدد قرضًا‪ ،‬فقد نفترض بشكل معقول أن جميع األشياء األخرى‬
‫متساوية‪ ،‬فمن المرجح دائمًا أن يسدد مقدم الطلب ذو الدخل المرتفع أكثر من الشخص ذي‬
‫الدخل المنخفض‪.‬يف حين أن هذه العالقة رتيبة‪ ،‬من المحتمل أال تكون مرتبطة خطيًا باحتمال‬
‫السداد‪ .‬من المحتمل أن تتوافق الزيادةيف الدخل من ‪ 0‬دوالر إلى ‪ 50000‬دوالر مع زيادة أكبريف ‬
‫احتمالية السداد مقارنة بالزيادة من ‪ 1‬مليون دوالر إلى ‪ 1.05‬مليون دوالر‪ .‬قد تكون إحدى طرق‬
‫التعامل مع هذا هي المعالجة الالحقة لنتائجنا بحيث تصبح الخطية أكثر منطقية‪ ،‬باستخدام‬
‫الخريطة اللوجيستية ‪( logistic map‬وبالتالي لوغاريتم احتمالية النتيجة)‪.‬‬

‫الحظ أنه يمكننا بسهولة التوصل إلى أمثلة تنتهك الرتابة ‪ .monotonicity‬قل على سبيل المثال‬
‫أننا نريد التنبؤ بالصحة كدالةيف درجة حرارة الجسم‪ .‬بالنسبة لألفراد الذين تزيد درجة حرارة الجسم‬
‫عن ‪ 37‬درجة مئوية (‪ 98.6‬درجة فهرنهايت)‪ ،‬تشير درجات الحرارة المرتفعة إلى مخاطر أكبر‪.‬‬
‫ومع ذلك‪ ،‬بالنسبة لألفراد الذين تقل درجة حرارة أجسامهم عن ‪ 37‬درجة مئوية‪ ،‬فإن درجات‬
‫الحرارة المنخفضة تشير إلى مخاطر أكبر! مرة أخرى‪ ،‬قد نحل المشكلة ببعض المعالجة المسبقة‬
‫الذكية‪ ،‬مثل استخدام المسافة من ‪ 37‬درجة مئوية كميزة‪.‬‬

‫ولكن ماذا عن تصنيف صور القطط والكالب؟ هل يجب أن تؤدي زيادة كثافة البكسليف الموقع‬
‫(‪ ) 17 ،13‬دائمًا إلى زيادة (أو تقليل دائمًا) احتمالية أن الصورة تصور كلبًا؟ يتوافق االعتماد على‬
‫نموذج خطي مع االفتراض الضمني بأن المطلب الوحيد للتمييز بين القطط والكالب هو تقييم‬
‫سطوع وحدات البكسل الفردية‪ .‬هذا النهج محكوم عليه بالفشليف عالم يحافظ فيه عكس الصورة‬
‫على الفئة‪.‬‬

‫ومع ذلك‪ ،‬على الرغم من العبث الواضح للخطية هنا‪ ،‬مقارنةً بأمثلتنا السابقة‪ ،‬فمن غير الواضح‬
‫أنه يمكننا معالجة المشكلة بإصالح بسيط للمعالجة المسبقة‪ .‬وذلك ألن أهمية أي بكسل تعتمد‬
‫بطرق معقدة على سياقها (قيم وحدات البكسل المحيطة)‪.‬يف حين أنه قد يكون هناك تمثيل‬
‫لبياناتنا يأخذيف االعتبار التفاعالت ذات الصلة بين ميزاتنا‪ ،‬وعلى رأسها سيكون النموذج الخطي‬
‫مناسبًا‪ ،‬فنحن ببساطة ال نعرف كيفية حسابه يدويًا‪ .‬مع الشبكات العصبية العميقة‪ ،‬استخدمنا‬
‫بيانات المراقبة لتعلم بشكل مشترك كال من التمثيل عبر الطبقات المخفية والمتنبئ الخطي الذي‬
‫يعمل على هذا التمثيل‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪230‬‬

‫تمت دراسة مشكلة الالخطية ‪ nonlinearity‬هذه لمدة قرن على األقل (‪ .)1928 ،Fisher‬على‬
‫سبيل المثال‪ ،‬تستخدم أشجار القرار ‪decision trees‬يف أبسط أشكالها سلسلة من القرارات‬
‫الثنائية التخاذ قرار بشأن عضوية الفئة (‪ .)2014 ،Quinlan‬وبالمثل‪ ،‬تم استخدام طرق النواة‬
‫‪ kernel methods‬لعقود عديدة لنمذجة التبعيات غير الخطية ( ‪ .)1950 ،Aronszajn‬وقد‬
‫وجد هذا طريقه‪ ،‬على سبيل المثال‪،‬يف نماذج الخيوط الالمعلمية ‪nonparametric spline‬‬
‫‪ )1990 ،Wahba( models‬وطرق النواة‪ .)2002 ، Schölkopf and Smola( ،‬إنه أيضًا‬
‫شيء يحله الدماغ بشكل طبيعي تمامًا‪ .‬بعد كل شيء‪ ،‬تتغذى الخاليا العصبيةيف الخاليا العصبية‬
‫األخرى التي بدورها تغذي الخاليا العصبية األخرى مرة أخرى (‪،y Cajal and Azoulay‬‬
‫‪ .)1894‬وبالتالي لدينا سلسلة من التحوالت البسيطة نسبيًا‪.‬‬

‫‪Incorporating Hidden Layers‬‬ ‫‪5.1.1.2‬‬


‫يمكننا التغلب على قيود النماذج الخطية من خالل دمج طبقة مخفية واحدة أو أكثر‪ .‬أسهل طريقة‬
‫للقيام بذلك هي تكديس العديد من الطبقات المتصلة بالكامل فوق بعضها البعض‪ .‬تتغذى كل‬
‫طبقةيف الطبقة التي فوقها‪ ،‬حتى ننتج النواتج‪ .‬يمكننا أن نفكريف الطبقات األولى ‪ 𝐿 − 1‬على أنها‬
‫تمثيلنا والطبقة األخيرة على أنها متنبئ خطي‪ .‬يُطلق على هذه البنية عادةً اسم بيرسيبترون متعدد‬
‫الطبقات ‪ ،Multilayer perceptron‬وغالبًا ما يتم اختصاره باسم ‪( MLP‬الشكل ‪.)5.1.1‬‬

‫الشكل ‪ MLP 5.1.1‬مع طبقة مخفية من ‪ 5‬وحدات مخفية‪.‬‬

‫يحتوي ‪ MLP‬هذا على ‪ 4‬مدخالت و‪ 3‬مخرجات‪ ،‬وتحتوي طبقته المخفية على ‪ 5‬وحدات‬
‫مخفية‪ .‬نظرًا ألن طبقة اإلدخال ‪ input layer‬ال تتضمن أي حسابات‪ ،‬فإن إنتاج مخرجات بهذه‬
‫الشبكة يتطلب تنفيذ الحسابات لكل من الطبقات المخفية والمخرجات؛ وبالتالي‪ ،‬فإن عدد‬
‫‪231‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫الطبقاتيف ‪ MLP‬هذا هو ‪ .2‬الحظ أن كال الطبقتين متصلتان بالكامل ‪ .fully connected‬يؤثر‬


‫كل إدخال على كل خلية عصبيةيف الطبقة المخفية ‪ ،hidden layer‬ويؤثر كل منها بدوره على‬
‫كل خلية عصبيةيف طبقة اإلخراج ‪ .output layer‬لألسف‪ ،‬لم ننتهي بعد‪.‬‬

‫‪From Linear to Nonlinear‬‬ ‫‪5.1.1.3‬‬


‫‪ 𝐗 ∈ ℝ‬إلى دفعة صغيرة من 𝑛 من األمثلة حيث‬ ‫𝑑×𝑛‬
‫كما كان من قبل‪ ،‬نشير بواسطة المصفوفة‬
‫يحتوي كل مثال على 𝑑 مدخالت (ميزات)‪ .‬بالنسبة إلى ‪ MLP‬ذات الطبقة المخفية الواحدة‬
‫والتي تحتوي طبقتها المخفية على ‪ ℎ‬وحدات مخفية ‪ ،hidden units‬فإننا نشير إلى مخرجات‬
‫الطبقة المخفية ‪ ،𝐇 ∈ ℝ𝑛×ℎ‬والتي تمثل تمثيالت مخفية ‪ .hidden representations‬نظرًا‬
‫ألن كال من الطبقات المخفية والمخرجة متصلتان تمامًا ‪ ،fully connected‬فلدينا أوزان‬
‫وتحيزات طبقة مخفية ‪ 𝐖 (1) ∈ ℝ𝑑×ℎ‬و ‪ 𝐛 (1) ∈ ℝ1×ℎ‬على التوالي وأوزان وتحيزات طبقة‬
‫المخرجات 𝑞×‪ 𝐖 (2) ∈ ℝℎ‬و 𝑞×‪ 𝐛 (2) ∈ ℝ1‬على التوالي‪ .‬هذا يسمح لنا بحساب مخرجات‬
‫𝑞×𝑛‪ MLP 𝐎 ∈ ℝ‬ذات الطبقة الواحدة المخفية على النحو التالي‪:‬‬

‫‪𝐇 = 𝐗𝐖 (1) + 𝐛 (1) ,‬‬


‫‪𝐎 = 𝐇𝐖 (2) + 𝐛 (2) .‬‬
‫الحظ أنه بعد إضافة الطبقة المخفية‪ ،‬يتطلب نموذجنا اآلن تتبع مجموعات إضافية من المعلمات‬
‫وتحديثها‪ .‬إذن ما الذي ربحناهيف المقابل؟ قد تتفاجأ عندما تكتشف ‪-‬يف النموذج المحدد أعاله‬
‫‪ -‬أننا ال نكسب شيئًا مقابل مشاكلنا! السبب واضح‪ .‬يتم إعطاء الوحدات المخفية أعاله بواسطة‬
‫دالة أفينية للمدخالت‪ ،‬والمخرجات (‪ )pre-softmax‬هي مجرد دالة أفينية للوحدات المخفية‪.‬‬
‫عالوة على ذلك‪ ،‬كان نموذجنا الخطي قادرًا بالفعل على تمثيل أي دالة أفيني‪.‬‬

‫لرؤية هذا بشكل رسمي‪ ،‬يمكننا فقط طي الطبقة المخفيةيف التعريف أعاله‪ ،‬مما ينتج عنه نموذج‬
‫طبقة واحدة مكافئ مع معلمات )‪ 𝐖 = 𝐖 (1) 𝐖 (2‬و )‪:𝐛 = 𝐛 (1) 𝐖 (2) + 𝐛 (2‬‬

‫‪𝐎 = (𝐗𝐖 (1) + 𝐛 (1) )𝐖 (2) + 𝐛 (2) = 𝐗𝐖 (1) 𝐖 (2) + 𝐛 (1) 𝐖 (2) + 𝐛 (2) = 𝐗𝐖 + 𝐛.‬‬

‫من أجل إدراك إمكانات البنى متعددة الطبقات‪ ،‬نحتاج إلى عنصر رئيسي آخر‪ :‬دالة تنشيط غير‬
‫خطية 𝜎 (‪ )nonlinear activation function‬يتم تطبيقها على كل وحدة مخفية بعد التحويل‬
‫األفيني ‪ .affine transformation‬على سبيل المثال‪ ،‬الخيار الشائع هو دالة التنشيط ‪ReLU‬‬
‫(‪ 𝜎(𝑥) = max(0, 𝑥) )2010 ،Nair and Hinton( )Rectified Linear Unit‬التي‬
‫تعمل على عناصرها من حيث العناصر ‪ .element-wise‬تسمى مخرجات دوال التنشيط)⋅(𝜎‬
‫عمليات التنشيط ‪ .activations‬بشكل عام‪ ،‬مع وجود دوال التنشيطيف مكانها الصحيح‪ ،‬لم يعد‬
‫من الممكن طي ‪ MLP‬الخاص بنا يف نموذج خطي‪:‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪232‬‬

‫‪𝐇 = 𝜎(𝐗𝐖 (1) + 𝐛 (1) ),‬‬


‫𝐎‬ ‫‪= 𝐇𝐖 (2) + 𝐛 (2) .‬‬
‫نظرًا ألن كل صفيف 𝐗 يتوافق مع مثاليف الدفعات الصغيرة ‪ ،minibatch‬مع بعض إساءة‬
‫استخدام الترميز‪ ،‬فإننا نحدد الالخطية 𝜎 لتطبيقها على مدخالته بطريقة ‪ ،row-wise‬أي مثال‬
‫واحديف كل مرة‪ .‬الحظ أننا استخدمنا نفس الترميز لـ ‪ softmax‬عندما أشرنا إلى ‪row-wise‬‬
‫القسم ‪.4.1.1.3‬يف كثير من األحيان‪ ،‬ال تنطبق دوال التنشيط التي نستخدمها فقط على الصفوف‬
‫ولكن من حيث العناصر‪ .‬هذا يعني أنه بعد حساب الجزء الخطي من الطبقة‪ ،‬يمكننا حساب كل‬
‫تنشيط دون النظر إلى القيم التي اتخذتها الوحدات المخفية األخرى‪.‬‬

‫لبناء ‪ MLPs‬أكثر عمومية‪ ،‬يمكننا االستمراريف تكديس هذه الطبقات المخفية‪ ،‬على سبيل المثال‬
‫) )‪ ،𝐇 (1) = 𝜎1 (𝐗𝐖 (1) + 𝐛 (1‬و) )‪ 𝐇 (2) = 𝜎2 (𝐇 (1) 𝐖 (2) + 𝐛 (2‬إحداها فوق األخرى‪،‬‬
‫مما يؤدي إلى إنتاج المزيد من النماذج التعبيرية‪.‬‬

‫‪Universal Approximators‬‬ ‫‪5.1.1.4‬‬


‫نحن نعلم أن الدماغ قادر على تحليل إحصائي متطور للغاية‪ .‬على هذا النحو‪ ،‬يجدر بنا أن نسأل‪،‬‬
‫إلى أي مدى يمكن أن تكون قوة الشبكة العميقة‪ .‬تمت اإلجابة على هذا السؤال عدة مرات‪ ،‬على‬
‫سبيل المثال‪،‬يف ‪)1989( Cybenko‬يف سياق ‪ ،MLPs‬وفي ‪)1984( Micchelli‬يف سياق‬
‫إعادة إنتاج مساحات ‪ kernel Hilbert‬بطريقة يمكن اعتبارها شبكات دالة أساس شعاعي‬
‫(‪ )RBF‬بطبقة واحدة مخفية‪ .‬تشير هذه (والنتائج ذات الصلة) إلى أنه حتى مع وجود شبكة ذات‬
‫طبقة واحدة مخفية‪ ،‬مع توفير عدد كافٍ من العقد (ربما بشكل سخيف)‪ ،‬ومجموعة األوزان‬
‫الصحيحة‪ ،‬يمكننا نمذجة أي دالة‪.‬يف الواقع‪ ،‬تعلم هذه الدالة هو الجزء الصعب‪ .‬قد تعتقد أن‬
‫شبكتك العصبية تشبه إلى حد ما لغة البرمجة سي‪ .‬اللغة‪ ،‬مثل أي لغة حديثة أخرى‪ ،‬قادرة على‬
‫التعبير عن أي برنامج محوسب‪ .‬لكنيف الواقع‪ ،‬فإن الخروج ببرنامج يلبي المواصفات الخاصة‬
‫بك هو الجزء الصعب‪.‬‬

‫عالوة على ذلك‪ ،‬لمجرد أن شبكة الطبقة الواحدة المخفية يمكن أن تتعلم أي دالة ال يعني أنه‬
‫يجب عليك محاولة حل جميع مشاكلك مع شبكات الطبقة المفردة المخفية‪.‬يف الواقع‪ ،‬تعتبر‬
‫طرق النواة ‪kernel methods‬يف هذه الحالة أكثر فاعلية‪ ،‬ألنها قادرة على حل المشكلة تمامًا‬
‫حتىيف المساحات ذات األبعاد الالنهائية (‪Schölkopf ،1971 ،Kimeldorf and Wahba‬‬
‫‪.)2001 ،et al.‬يف الواقع‪ ،‬يمكننا تقريب العديد من الدوال بشكل أكثر إحكاما باستخدام شبكات‬
‫أعمق (مقابل شبكات أوسع) (‪ .)2014 ،Simonyan and Zisserman‬سنتطرق إلى حجج‬
‫أكثر صرامةيف الفصول الالحقة‪.‬‬
‫‪233‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Activation Functions‬‬ ‫‪5.1.2‬‬


‫تحدد دوال التنشيط ‪ Activation functions‬ما إذا كان يجب تنشيط الخلية العصبية أم ال عن‬
‫طريق حساب مجموع االوزان وإضافة المزيد من التحيز معه‪ .‬هم مشغلون قابلون للتفاضل‬
‫لتحويل إشارات اإلدخال إلى مخرجات‪ ،‬بينما يضيف معظمهم الالخطية‪ .‬نظرًا ألن دوال التنشيط‬
‫أساسية للتعلم العميق‪ ،‬فلنستعرض بإيجاز بعض دوال التنشيط الشائعة‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪ReLU‬‬ ‫‪5.1.2.1‬‬
‫الخيار األكثر شيوعًا‪ ،‬نظرًا لبساطة التنفيذ وأدائه الجيديف مجموعة متنوعة من المهام التنبؤية‪ ،‬هو‬
‫الوحدة الخطية المصححة )‪ .)2010 ،Nair and Hinton( ،(ReLU‬يوفر ‪ ReLU‬عملية‬
‫تحويل غير خطية بسيطة للغاية‪ .‬بالنظر لعنصر ما 𝑥‪ ،‬يتم تعريف الدالة على أنها الحد األقصى‬
‫لهذا العنصر و ‪:0‬‬

‫‪ReLU(𝑥) = 𝑚𝑎𝑥(𝑥, 0).‬‬

‫بشكل غير رسمي‪ ،‬تحتفظ دالة ‪ ReLU‬بالعناصر اإليجابية فقط وتتجاهل جميع العناصر السلبية‬
‫عن طريق ضبط التنشيطات المقابلة على ‪ .0‬الكتساب بعض الحدس‪ ،‬يمكننا رسم الدالة‪ .‬كما‬
‫ترى‪ ،‬فإن دالة التنشيط خطية متعددة التعريف ‪.activation function is piecewise linear‬‬

‫عندما يكون اإلدخال سالبًا‪ ،‬يكون مشتق الدالة ‪ ReLU‬هو ‪ ،0‬وعندما يكون اإلدخال موجبًا‪،‬‬
‫يكون مشتق دالة ‪ ReLU‬هو ‪ .1‬الحظ أن دالة ‪ ReLU‬غير قابلة لالشتقاق ‪not‬‬
‫‪ differentiable‬عندما يأخذ اإلدخال قيمة تساوي بالضبط ‪.0‬يف هذه الحاالت‪ ،‬نستخدم مشتق‬
‫الجانب األيسر افتراضيًا ونقول إن المشتق يساوي ‪ 0‬عندما يكون اإلدخال ‪ .0‬يمكننا التخلص‬
‫من هذا ألن المدخالت قد ال تكون أبدًا صفرًا (قد يقول علماء الرياضيات أنه ال يمكن تمييزها‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪234‬‬

‫في مجموعة من قياس الصفر)‪ .‬هناك قول مأثور قديم مفاده أنه إذا كانت الظروف الحدودية‬
‫الدقيقة مهمة‪ ،‬فربما نقوم بعمل رياضيات (حقيقية)‪ ،‬وليس هندسة‪.‬‬

‫‪"There is an old adage that if subtle boundary conditions matter, we‬‬


‫"‪are probably doing (real) mathematics, not engineering‬‬

‫قد تنطبق هذه الحكمة التقليدية هنا‪ ،‬أو على األقل‪ ،‬حقيقة أننا ال نقوم بإجراء تحسين مقيد‬
‫( ‪ .)1970 ،Rockafellar ، 1965 ،Mangasarian‬نرسم مشتق دالة ‪ ReLU‬الموضحة‬
‫أدناه‪.‬‬

‫‪with tf.GradientTape() as t:‬‬


‫)‪y = tf.nn.relu(x‬‬
‫‪d2l.plot(x.numpy(), t.gradient(y, x).numpy(), 'x', 'grad‬‬
‫‪of relu',‬‬
‫))‪figsize=(5, 2.5‬‬

‫سبب استخدام ‪ ReLU‬هو أن مشتقاته حسنة التصرف بشكل خاص‪ :‬إما أنها تتالشى أو تترك‬
‫المدخل تمر‪ .‬هذا يجعل التحسين يتصرف بشكل أفضل ويخفف من المشكلة الموثقة جيدًا‬
‫المتمثلةيف اختفاء التدرجات ‪ vanishing gradients‬التي ابتليت بها اإلصدارات السابقة من‬
‫الشبكات العصبية (المزيد حول هذا الحقًا)‪.‬‬

‫الحظ أن هناك العديد من المتغيرات لدالة ‪ ،ReLU‬بمايف ذلك دالة )‪ ReLU (pReLU‬ذات‬
‫المعلمات (‪ .)2015 ،He et al.( )parameterized ReLU‬يضيف هذا االختالف مصطلحًا‬
‫خطيًا إلى ‪ ،ReLU‬لذلك ال تزال بعض المعلومات تصل‪ ،‬حتى عندما تكون الوسيطة سلبية‪:‬‬

‫‪pReLU(𝑥) = 𝑚𝑎𝑥(0, 𝑥) + 𝛼𝑚𝑖𝑛(0, 𝑥).‬‬


‫‪235‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Sigmoid‬‬ ‫‪. 5.1.2.2‬‬


‫تعمل دالة ‪ Sigmoid‬على تحويل مدخالتها‪ ،‬والتي تكمن القيميف المجال‪ ،‬إلى مخرجات تقع‬
‫على الفاصل الزمني (‪ .)1 ،0‬لهذا السبب‪ ،‬غالبًا ما يُطلق على ‪ Sigmoid‬دالة سحق ‪squashing‬‬
‫‪ :function‬إنه يسحق أي إدخاليف النطاق )‪ (-inf, inf‬إلى بعض القيمةيف النطاق (‪:)1 ، 0‬‬

‫‪1‬‬
‫= )𝑥(‪sigmoid‬‬ ‫‪.‬‬
‫)𝑥‪1 + exp (−‬‬

‫في أقدم الشبكات العصبية‪ ،‬كان العلماء مهتمين بنمذجة الخاليا العصبية البيولوجية التي إما تطلق‬
‫‪ fire‬أو ال تطلق ‪ .not fire‬وهكذا ركز رواد هذا المجال‪ ،‬بالعودة إلى ‪ McCulloch‬و‪،Pitts‬‬
‫مخترعي الخاليا العصبية االصطناعية‪ ،‬على وحدات العتبة ‪thresholding units‬‬
‫(‪ .)1943 ،McCulloch and Pitts‬يأخذ تنشيط العتبة القيمة ‪ 0‬عندما يكون إدخاله أقل من‬
‫بعض العتبة والقيمة ‪ 1‬عندما يتجاوز اإلدخال الحد‪.‬‬

‫عندما تحول االنتباه إلى التعلم القائم على التدرج ‪ ،gradient based learning‬كانت دالة‬
‫‪ Sigmoid‬اختيارًا طبيعيًا ألنها تقريب سلس وقابل للتفاضل لوحدة العتبة‪ .‬ال تزال ‪Sigmoid‬‬
‫تستخدم على نطاق واسع كدوال تنشيطيف وحدات اإلخراج‪ ،‬عندما نريد تفسير المخرجات على‬
‫أنها احتماالت لمشاكل التصنيف الثنائي‪ :‬يمكنك التفكيريف ‪ Sigmoid‬كحالة خاصة من‬
‫‪ .softmax‬ومع ذلك‪ ،‬تم استبدال ‪Sigmoid‬يف الغالب بـ ‪ ReLU‬األبسط واألكثر سهولةيف ‬
‫التدريب لمعظم االستخداماتيف الطبقات المخفية‪ .‬يتعلق الكثير من هذا بحقيقة أن ‪Sigmoid‬‬
‫يفرض تحديات على التحسين (‪ )1998 ،LeCun et al.‬نظرًا ألن تدرجه يتالشى بسبب‬
‫المدخالت اإليجابية والسلبية الكبيرة‪ .‬هذا يمكن أن يؤدي إلى الهضاب ‪ plateaus‬التي يصعب‬
‫الهروب منها‪ .‬ومع ذلك‪ ،‬فإن ‪ Sigmoid‬مهمة‪.‬يف الفصول الالحقة (على سبيل المثال‪ ،‬القسم‬
‫‪ )10.1‬حول الشبكات العصبية المتكررة‪ ،‬سنصف البنى التي تستفيد من وحدات ‪Sigmoid‬‬
‫للتحكميف تدفق المعلومات عبر الوقت‪.‬‬

‫أدناه‪ ،‬نرسم دالة ‪ .Sigmoid‬الحظ أنه عندما يكون اإلدخال قريبًا من ‪ ،0‬تقترب دالة ‪Sigmoid‬‬
‫من التحويل الخطي ‪.linear transformation‬‬

‫)‪y = tf.nn.sigmoid(x‬‬
‫‪d2l.plot(x.numpy(), y.numpy(), 'x', 'sigmoid(x)',‬‬
‫))‪figsize=(5, 2.5‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪236‬‬

‫يتم الحصول على مشتق دالة ‪ Sigmoid‬بالمعادلة التالية‪:‬‬

‫𝑑‬ ‫)𝑥‪exp (−‬‬


‫= )𝑥(‪sigmoid‬‬ ‫‪= sigmoid(𝑥)(1 − sigmoid(𝑥)).‬‬
‫𝑥𝑑‬ ‫‪(1 + exp (−𝑥))2‬‬

‫تم رسم مشتق دالة ‪ Sigmoid‬أدناه‪ .‬الحظ أنه عندما يكون اإلدخال ‪ ،0‬فإن مشتق دالة ‪Sigmoid‬‬
‫يصل إلى ‪ 0.25‬كحد أقصى‪ .‬عندما ينحرف المدخل عن ‪0‬يف أي اتجاه‪ ،‬يقترب المشتق من ‪.0‬‬

‫‪with tf.GradientTape() as t:‬‬


‫)‪y = tf.nn.sigmoid(x‬‬
‫‪d2l.plot(x.numpy(), t.gradient(y, x).numpy(), 'x', 'grad‬‬
‫‪of sigmoid',‬‬
‫))‪figsize=(5, 2.5‬‬
‫‪237‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Tanh‬‬ ‫‪5.1.2.3‬‬
‫مثل الدالة ‪ ،sigmoid‬تقوم دالة ‪( tanh‬الظل الزائدي ‪ )hyperbolic tangent‬أيضًا بسحق‬
‫مدخالتها‪ ،‬وتحويلها إلى عناصريف الفترة بين ‪ 1-‬و‪:1‬‬

‫)𝑥‪1 − exp (−2‬‬


‫= )𝑥(‪tanh‬‬ ‫‪.‬‬
‫)𝑥‪1 + exp (−2‬‬

‫نرسم دالة ‪ tanh‬أدناه‪ .‬الحظ أنه عندما يقترب اإلدخال من الصفر‪ ،‬تقترب الدالة ‪ tanh‬من‬
‫التحويل الخطي‪ .‬على الرغم من أن شكل الدالة مشابه لشكل دالة ‪ ،Sigmoid‬إال أن دالة ‪tanh‬‬
‫تُظهر تناظرًا نقطيًا حول أصل نظام اإلحداثيات (‪.)1992 ،Kalman and Kwasny‬‬

‫)‪y = tf.nn.tanh(x‬‬
‫‪d2l.plot(x.numpy(), y.numpy(), 'x', 'tanh(x)',‬‬
‫))‪figsize=(5, 2.5‬‬

‫مشتق التابع ‪ tanh‬هو‪:‬‬

‫𝑑‬
‫‪tanh(𝑥) = 1 − tanh2 (𝑥).‬‬
‫𝑥𝑑‬
‫تم رسمه أدناه‪ .‬عندما يقترب المدخل من الصفر‪ ،‬يقترب مشتق الدالة ‪ tanh‬من ‪ 1‬كحد أقصى‪.‬‬
‫وكما رأينا مع دالة ‪ ،Sigmoid‬حيث يتحرك اإلدخال بعيدًا عن الصفريف أي من االتجاهين‪،‬‬
‫يقترب مشتق الدالة ‪ tanh‬من الصفر‪.‬‬

‫‪with tf.GradientTape() as t:‬‬


‫)‪y = tf.nn.tanh(x‬‬
‫‪d2l.plot(x.numpy(), t.gradient(y, x).numpy(), 'x', 'grad‬‬
‫‪of tanh',‬‬
‫))‪figsize=(5, 2.5‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪238‬‬

‫‪. 5.1.3‬‬
‫نحن نعرف اآلن كيفية دمج الالخطية لبناء بنيات شبكة عصبية معبرة متعددة الطبقات‪ .‬كمالحظة‬
‫جانبية‪ ،‬فإن معرفتك تضعك بالفعليف قيادة مجموعة أدوات مماثلة للممارس حوالي عام ‪.1990‬‬
‫في بعض النواحي‪ ،‬لديك ميزة على أي شخص يعمليف التسعينيات‪ ،‬ألنه يمكنك االستفادة من‬
‫أطر التعلم العميق القوية مفتوحة المصدر لبناء النماذج بسرعة‪ ،‬باستخدام بضعة أسطر فقط من‬
‫التعليمات البرمجية‪.‬يف السابق‪ ،‬كان تدريب هذه الشبكات يتطلب من الباحثين ترميز الطبقات‬
‫والمشتقات بشكل صريحيف ‪ C‬أو ‪ Fortran‬أو حتى ‪( Lisp‬في حالة ‪.)LeNet‬‬
‫فائدة ثانوية هي أن ‪ ReLU‬أكثر قابلية للتحسين بشكل ملحوظ من ‪ Sigmoid‬أو دالة ‪.tanh‬‬
‫يمكن للمرء أن يجادليف أن هذا كان أحد االبتكارات الرئيسية التي ساعدت على عودة التعلم‬
‫العميق خالل العقد الماضي‪ .‬الحظ‪ ،‬مع ذلك‪ ،‬أن البحثيف دوال التنشيط لم يتوقف‪ .‬على سبيل‬
‫المثال‪ ،‬يمكن أن تؤدي دالة تنشيط ‪ 𝜎(𝑥) = 𝑥sigmoid(𝛽𝑥) Swish‬كما هو مقترحيف ‬
‫(‪ )2017 ،Ramachandran et al.‬إلى دقة أفضليف كثير من الحاالت‪.‬‬

‫‪5.1.4‬‬
‫‪ .1‬أظهر أن إضافة طبقات إلى شبكة عميقة خطية ‪ ،linear deep network‬أي شبكة‬
‫بدون الالخطية ال يمكنها أبدًا زيادة القوة التعبيرية للشبكة‪ .‬أعط مثاال حيث يقلل ذلك‬
‫بنشاط‪.‬‬
‫‪ .2‬احسب مشتق من دالة التنشيط ‪.pReLU‬‬
‫‪ .3‬احسب مشتق من دالة التنشيط ‪.𝑥sigmoid(𝛽𝑥) Swish‬‬
‫‪ .4‬أظهر أن ‪ MLP‬باستخدام ‪ ReLU‬فقط (أو ‪ )pReLU‬يبني دالة خطية مستمرة‬
‫متعددة التعريفات ‪.continuous piecewise linear function‬‬
‫‪ Sigmoid .5‬و ‪ tanh‬متشابهان جدا‪.‬‬
‫‪239‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪ .1‬اظهر )𝑥‪.tanh(𝑥) + 1 = 2sigmoid(2‬‬


‫‪ .2‬إثبت أن فئات الدوال المحددة بواسطة كال الالخطيين متطابقة‪ .‬تلميح‪ :‬الطبقات‬
‫االفينية ‪ affine layers‬لها مصطلحات متحيزة أيضًا‪.‬‬
‫‪ .6‬افترض أن لدينا خاصية غير خطية تنطبق على الدفعات الصغيرة واحديف كل مرة‪ ،‬مثل‬
‫تسوية الدُفعات ‪ .)2015 ،Ioffe and Szegedy ( batch normalization‬ما أنواع‬
‫المشاكل التي تتوقع أن يسببها هذا؟‬
‫‪ .7‬قدم مثاالً حيث تختفي التدرجات لدالة التنشيط ‪.Sigmoid‬‬

‫‪Implementation of‬‬ ‫‪5.2‬‬


‫‪Multilayer Perceptron‬‬
‫البيرسيبترون متعدد الطبقات (‪ )MLPs‬ليس أكثر تعقيدًايف التنفيذ من النماذج الخطية البسيطة‪.‬‬
‫يتمثل االختالف المفاهيمي الرئيسييف أننا نجمع طبقات متعددة اآلن‪.‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫‪Implementation from Scratch‬‬ ‫‪5.2.1‬‬
‫لنبدأ مرة أخرى بتنفيذ مثل هذه الشبكة من البداية‪.‬‬
‫‪Initializing Model Parameters‬‬ ‫‪5.2.1.1‬‬
‫تذكر أن ‪ Fashion-MNIST‬يحتوي على ‪ 10‬فئات‪ ،‬وأن كل صورة تتكون من شبكة‬
‫‪ 28 × 28 = 784‬من قيم البكسل الرمادية‪ .‬كما كان من قبل‪ ،‬سوف نتجاهل البنية المكانية بين‬
‫وحدات البكسليف الوقت الحالي‪ ،‬لذلك يمكننا التفكيريف هذا على أنه مجموعة بيانات تصنيف‬
‫تحتوي على ‪ 784‬ميزة إدخال و‪ 10‬فئات‪ .‬للبدء‪ ،‬سنقوم بتطبيق ‪ MLP‬بطبقة مخفية واحدة‬
‫و‪ 256‬وحدة مخفية‪ .‬يمكن ضبط كل من عدد الطبقات وعرضها (تعتبر معلمات فائقة)‪ .‬عادة‪،‬‬
‫نختار عروض الطبقة لتكون قابلة للقسمة على قوى أكبر من ‪ .2‬وهذا فعال من الناحية الحسابية‬
‫نظرًا للطريقة التي يتم بها تخصيص الذاكرة ومعالجتهايف األجهزة‪.‬‬
‫مرة أخرى‪ ،‬سنقوم بتمثيل معلماتنا بعدة موترات ‪ .tensors‬الحظ أنه بالنسبة لكل طبقة‪ ،‬يجب‬
‫أن نتتبع مصفوفة وزن ‪ weight matrix‬واحدة ومتجه تحيز ‪ bias vector‬واحد‪ .‬كما هو الحال‬
‫دائمًا‪ ،‬نخصص ذاكرة لتدرجات الخطأ ‪ gradients of the loss‬فيما يتعلق بهذه المعلمات‪.‬‬
‫‪class MLPScratch(d2l.Classifier):‬‬
‫‪def __init__(self, num_inputs, num_outputs, num_hiddens,‬‬
‫‪lr, sigma=0.01):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫(‪self.W1 = tf.Variable‬‬
‫* ))‪tf.random.normal((num_inputs, num_hiddens‬‬
‫)‪sigma‬‬
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 240

self.b1 = tf.Variable(tf.zeros(num_hiddens))
self.W2 = tf.Variable(
tf.random.normal((num_hiddens, num_outputs)) *
sigma)
self.b2 = tf.Variable(tf.zeros(num_outputs))
Model 5.2.1.2
‫ بأنفسنا بدالً من‬ReLU ‫ سنقوم بتنفيذ تنشيط‬،‫للتأكد من أننا نعرف كيف يعمل كل شيء‬
.ً‫ المدمجة مباشرة‬relu ‫استدعاء دالة‬
def relu(X):
return tf.math.maximum(X, 0)
‫ فنحن نعيد تشكيل كل صورة ثنائية األبعاد إلى متجه مسطح‬،‫نظرًا ألننا نتجاهل البنية المكانية‬
‫ نطبق نموذجنا ببضعة أسطر من التعليمات‬،‫ أخيرًا‬.num_inputs ‫بطول عدد المدخالت‬
.‫ فهذا كل ما يتطلبه األمر‬،‫ المدمج‬autograd ‫ نظرًا ألننا نستخدم إطار عمل‬.‫البرمجية‬
@d2l.add_to_class(MLPScratch)
def forward(self, X):
X = tf.reshape(X, (-1, self.num_inputs))
H = relu(tf.matmul(X, self.W1) + self.b1)
return tf.matmul(H, self.W2) + self.b2
Training 5.2.1.3
‫ نحدد النموذج‬.softmax ‫ هي نفسها تمامًا النحدار‬MLPs ‫ فإن حلقة التدريب لـ‬،‫لحسن الحظ‬
.‫يف النموذج والبيانات‬fit ‫والبيانات والمدرب وأخيراً نستدعي الدالة‬
model = MLPScratch(num_inputs=784, num_outputs=10,
num_hiddens=256, lr=0.1)
data = d2l.FashionMNIST(batch_size=256)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)
‫‪241‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Concise Implementation‬‬ ‫‪5.2.2‬‬


‫كما قد تتوقع‪ ،‬من خالل االعتماد على واجهات برمجة التطبيقات ‪ APIs‬عالية المستوى‪ ،‬يمكننا‬
‫تنفيذ ‪ MLPs‬بشكل أكثر دقة‪.‬‬
‫‪Model‬‬ ‫‪5.2.2.1‬‬
‫بالمقارنة مع تنفيذنا المختصر لتطبيق انحدار ‪( softmax‬القسم ‪ ،)4.5‬فإن االختالف الوحيد‬
‫هو أننا نضيف طبقتين متصلتين تمامًا ‪ fully connected‬حيث أضفنا سابقًا واحدة فقط‪ .‬األولى‬
‫هي الطبقة المخفية ‪ ،hidden layer‬والثانية هي الطبقة الناتجة ‪.output layer‬‬
‫‪class MLP(d2l.Classifier):‬‬
‫‪def __init__(self, num_outputs, num_hiddens, lr):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫[(‪self.net = tf.keras.models.Sequential‬‬
‫‪tf.keras.layers.Flatten(),‬‬
‫‪tf.keras.layers.Dense(num_hiddens,‬‬
‫‪activation='relu'),‬‬
‫)])‪tf.keras.layers.Dense(num_outputs‬‬
‫‪Training‬‬ ‫‪5.2.2.2‬‬
‫حلقة التدريب هي نفسها تمامًا عندما طبقنا انحدار ‪ .softmax‬تمكننا هذه النمطية من فصل‬
‫األمور المتعلقة بهندسة النموذج عن االعتبارات المتعامدة‪.‬‬
‫)‪model = MLP(num_outputs=10, num_hiddens=256, lr=0.1‬‬
‫)‪trainer.fit(model, data‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪242‬‬

‫‪5.2.3‬‬
‫اآلن بعد أن أصبح لدينا مزيد من الممارسةيف تصميم الشبكات العميقة‪ ،‬فإن الخطوة من طبقة‬
‫واحدة إلى طبقات متعددة من الشبكات العميقة لم تعد تشكل تحديًا كبيرًا بعد اآلن‪ .‬على وجه‬
‫الخصوص‪ ،‬يمكننا إعادة استخدام خوارزمية التدريب ومحمل البيانات‪ .‬الحظ‪ ،‬على الرغم من‬
‫ذلك‪ ،‬أن تنفيذ ‪ MLPs‬من الصفر مع ذلك فوضوي‪ :‬تسمية معلمات النموذج وتتبعها تجعل من‬
‫الصعب توسيع النماذج‪ .‬على سبيل المثال‪ ،‬تخيل أنك ترغبيف إدراج طبقة أخرى بين الطبقتين‬
‫‪ 42‬و ‪ .43‬قد تكون هذه اآلن طبقة ‪ ،42b‬إال إذا كنا على استعداد إلجراء إعادة تسمية متسلسلة‪.‬‬
‫عالوة على ذلك‪ ،‬إذا قمنا بتنفيذ الشبكة من البداية‪ ،‬فسيكون من الصعب جدًا على إطار العمل‬
‫إجراء تحسينات مفيدةيف األداء‪.‬‬
‫ومع ذلك ‪ ،‬فقد وصلت اآلن إلى أحدث ما توصلت إليه التكنولوجيايف أواخر الثمانينيات عندما‬
‫كانت الشبكات العميقة المتصلة بالكامل هي الطريقة المفضلة لنمذجة الشبكة العصبية‪ .‬ستكون‬
‫خطوتنا المفاهيمية التالية هي النظريف الصور‪ .‬قبل القيام بذلك‪ ،‬نحتاج إلى مراجعة عدد من‬
‫األساسيات اإلحصائية والتفاصيل حول كيفية حساب النماذج بكفاءة‪.‬‬
‫‪5.2.4‬‬
‫‪ .1‬قم بتغيير عدد الوحدات المخفية ورسم كيف يؤثر عددها على دقة النموذج‪ .‬ما هي‬
‫أفضل قيمة لهذا المعامل الفائق؟‬
‫‪ .2‬حاول إضافة طبقة مخفية لترى كيف تؤثر على النتائج‪.‬‬
‫‪ .3‬لماذا يعتبر إدخال طبقة مخفية ذات خلية عصبية واحدة فكرة سيئة؟ ما الخطأ الذي‬
‫يمكن أن يحدث؟‬
‫‪ .4‬كيف تغيير معدل التعلم يغير نتائجك؟ مع إصالح جميع المعلمات األخرى‪ ،‬ما هو‬
‫معدل التعلم الذي يمنحك أفضل النتائج؟ كيف يرتبط هذا بعدد الفترات؟‬
‫‪ .5‬دعنا نقوم بالتحسين عبر جميع المعلمات الفائقة معًا‪ ،‬أي معدل التعلم وعدد الفترات‬
‫وعدد الطبقات المخفية وعدد الوحدات المخفية لكل طبقة‪.‬‬
‫‪ .1‬ما هي أفضل نتيجة يمكنك الحصول عليها من خالل تحسينها جميعًا؟‬
‫‪ .2‬لماذا يعتبر التعامل مع العديد من المعلمات الفائقة أكثر صعوبة؟‬
‫‪ .3‬صِف إستراتيجية فعالة للتحسين عبر معايير متعددة بشكل مشترك‪.‬‬
‫‪ .6‬قارن بين سرعة إطار العمل والتنفيذ من الصفر لمشكلة صعبة‪ .‬كيف تتغير مع تعقيد‬
‫الشبكة؟‬
‫‪ .7‬قم بقياس سرعة عمليات ضرب مصفوفة الموتر للحصول على مصفوفات جيدة‬
‫المحاذاة ‪ well-aligned‬وغير المحاذاة ‪ .misaligned‬على سبيل المثال‪ ،‬اختبر‬
‫المصفوفات ذات األبعاد ‪ 1024‬و‪ 1025‬و‪ 1026‬و‪ 1028‬و‪.1032‬‬
‫‪ .1‬كيف يتغير هذا بين وحدات معالجة الرسومات ‪ GPUs‬ووحدات المعالجة‬
‫المركزية ‪CPUs‬؟‬
‫‪243‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪ .2‬حدد عرض ناقل الذاكرة ‪ memory bus width‬لوحدة المعالجة المركزية‬


‫‪ CPU‬ووحدة معالجة الرسومات ‪.GPU‬‬
‫‪ .8‬جرب دوال التنشيط المختلفة‪ .‬أيهما أفضل؟‬
‫‪ .9‬هل هناك فرق بين التهيئة للوزن للشبكة؟ هل يهم؟‬
‫‪Forward Propagation‬‬ ‫‪5.3‬‬
‫‪Backward‬‬ ‫‪Propagation‬‬
‫‪Computational Graphs‬‬
‫حتى اآلن‪ ،‬قمنا بتدريب نماذجنا باستخدام التدرج االشتقاقي العشوائي المصغر ‪minibatch‬‬
‫‪ .SGD‬ومع ذلك‪ ،‬عندما قمنا بتطبيق الخوارزمية‪ ،‬كنا قلقين فقط بشأن الحسابات التي ينطوي‬
‫عليها االنتشار األمامي ‪ Forward Propagation‬من خالل النموذج‪ .‬عندما حان الوقت‬
‫لحساب التدرجات‪ ،‬استدعينا للتو دالة االنتشار الخلفي ‪ backpropagation‬التي يوفرها إطار‬
‫عمل التعلم العميق‪.‬‬
‫يعمل الحساب التلقائي للتدرجات (التمايز التلقائي ‪ )automatic differentiation‬على‬
‫تبسيط تطبيق خوارزميات التعلم العميق بشكل كبير‪ .‬قبل التفاضل التلقائي‪ ،‬كانت التغييرات‬
‫الصغيرة على النماذج المعقدة تتطلب إعادة حساب المشتقات المعقدة يدويًا‪.‬يف كثير من‬
‫األحيان‪ ،‬كان من المثير للدهشة أن األوراق األكاديمية كان عليها تخصيص العديد من الصفحات‬
‫الشتقاق قواعد التحديث‪ .‬بينما يجب أن نستمريف االعتماد على التفاضل التلقائي حتى نتمكن‬
‫من التركيز على األجزاء المثيرة لالهتمام‪ ،‬يجب أن تعرف كيف يتم حساب هذه التدرجات‬
‫‪ gradients‬إذا كنت تريد تجاوز الفهم الضحل للتعلم العميق‪.‬‬
‫في هذا القسم‪ ،‬نلقي نظرة عميقة على تفاصيل االنتشار الخلفي ‪backward propagation‬‬
‫(يُطلق عليه أكثر شيوعًا ‪ .)backpropagation‬لنقل بعض البصيرة لكل من التقنيات‬
‫وتطبيقاتها‪ ،‬نعتمد على بعض الرياضيات األساسية والرسوم البيانية الحسابية ‪computational‬‬
‫‪ .graphs‬للبدء‪ ،‬نركز عرضنا على طبقة ‪ MLP‬ذات طبقة واحدة مخفية مع تناقص الوزن‬
‫‪( weight decay‬التنظيم ‪ ، ℓ2‬على أن يتم وصفهيف الفصول الالحقة)‪.‬‬
‫‪Forward Propagation‬‬ ‫‪5.3.1‬‬
‫يشير االنتشار األمامي ‪( Forward Propagation‬أو التمرير األمامي) إلى حساب وتخزين‬
‫المتغيرات الوسيطة (بمايف ذلك المخرجات) للشبكة العصبية بالترتيب من طبقة اإلدخال إلى‬
‫طبقة اإلخراج‪ .‬نحن نعمل اآلن خطوة بخطوة من خالل آليات الشبكة العصبية بطبقة مخفية‬
‫واحدة‪ .‬قد يبدو هذا ممالً‪ ،‬لكن بالكلمات األبدية للمبدع الفانك جيمس براون‪ ،‬يجب أن "تدفع‬
‫الثمن لتكون الرئيس"‪.‬‬
‫من أجل البساطة‪ ،‬دعنا نفترض أن مثال اإلدخال هو ‪ 𝐱 ∈ ℝ‬وأن الطبقة المخفية ال تتضمن‬
‫𝑑‬

‫مصطلح التحيز‪ .‬هنا المتغير الوسيط هو‪:‬‬


‫‪𝐳 = 𝐖 (1) 𝐱,‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪244‬‬

‫حيث 𝑑×‪ 𝐖 (1) ∈ ℝℎ‬هي معلمة وزن الطبقة المخفية‪ .‬بعد تشغيل المتغير الوسيط ‪𝐳 ∈ ℝℎ‬‬
‫من خالل دالة التنشيط 𝜙‪ ،‬نحصل على متجه التنشيط المخفي للطول ‪،ℎ‬‬

‫‪𝐡 = 𝜙(𝐳).‬‬

‫ناتج الطبقة المخفية 𝐡 هو أيضًا متغير وسيط‪ .‬بافتراض أن معلمات الطبقة المخرجة تمتلك وزنًا‬
‫فقط ‪ ،𝐖 (2) ∈ ℝ𝑞×ℎ‬فيمكننا الحصول على متغير طبقة اإلخراج مع متجه الطول 𝑞‪:‬‬

‫‪𝐨 = 𝐖 (2) 𝐡.‬‬

‫بافتراض أن دالة الخطأ 𝑙 ومثال التسمية 𝑦‪ ،‬يمكننا بعد ذلك حساب مصطلح الخطأ لمثال بيانات‬
‫واحد‪،‬‬

‫‪𝐿 = 𝑙(𝐨, 𝑦).‬‬

‫وفقًا لتعريف التنظيم ‪ ℓ2‬الذي سنقدمه الحقًا‪ ،‬نظرًا للمعلمة الفائقة‪ ،‬فإن مصطلح التنظيم هو‬

‫‪𝐽 = 𝐿 + 𝑠.‬‬

‫نشير إلى 𝐽 كدالة الهدف ‪objective function‬يف المناقشة التالية‪.‬‬

‫‪Computational Graph of‬‬ ‫‪5.3.2‬‬


‫‪Forward Propagation‬‬
‫يساعدنا رسم الرسوم البيانية الحسابية ‪ computational graphs‬على تصور تبعيات المشغلين‬
‫والمتغيراتيف الحساب‪ .‬يحتوي الشكل ‪ 5.3.1‬على الرسم البياني المرتبط بالشبكة البسيطة‬
‫الموضحة أعاله‪ ،‬حيث تشير المربعات إلى المتغيرات ‪ variables‬وتشير الدوائر إلى العوامل‬
‫‪ .operators‬الزاوية اليسرى السفلية تشير إلى اإلدخال والزاوية اليمنى العلوية هي اإلخراج‪ .‬الحظ‬
‫أن اتجاهات األسهم (التي توضح تدفق البيانات ‪ )data flow‬هييف المقام األول إلى اليمين‬
‫والصعود‪.‬‬

‫الشكل ‪ 5.3.1‬رسم بياني حسابي لالنتشار األمامي‪.‬‬


‫‪245‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫يشير االنتشار الخلفي ‪ Backpropagation‬إلى طريقة حساب التدرج ‪ gradient‬لمعلمات‬


‫الشبكة العصبية‪ .‬باختصار‪ ،‬تعبر الطريقة الشبكة بترتيب عكسي‪ ،‬من المخرجات إلى طبقة‬
‫اإلدخال‪ ،‬وفقًا لقاعدة السلسلة ‪ chain rule‬من حساب التفاضل والتكامل‪ .‬تقوم الخوارزمية‬
‫بتخزين أي متغيرات وسيطة (مشتقات جزئية) مطلوبة أثناء حساب التدرج فيما يتعلق ببعض‬
‫المعلمات‪ .‬افترض أن لدينا دوال )𝖷(𝑓 = 𝖸 و)𝖸(𝑔 = 𝖹 ‪ ،‬أن المدخالت والمخرجات 𝖹 ‪𝖷, 𝖸,‬‬
‫عبارة عن موتر ألشكال عشوائية‪ .‬باستخدام قاعدة السلسلة‪ ،‬يمكننا حساب مشتقة 𝖹 بالنسبة إلى‬
‫𝖷 بواسطة‪:‬‬

‫𝖹𝜕‬ ‫𝖸𝜕 𝖹𝜕‬


‫‪= prod( , ).‬‬
‫𝖷𝜕‬ ‫𝖷𝜕 𝖸𝜕‬
‫هنا نستخدم عامل التشغيل ‪ prod‬لمضاعفة وسيطاته بعد تنفيذ العمليات الضرورية‪ ،‬مثل‬
‫التحويل وتبديل مواضع اإلدخال‪ .‬بالنسبة إلى المتجهات‪ ،‬هذا واضح ومباشر‪ :‬إنه ببساطة ضرب‬
‫مصفوفة‪-‬مصفوفة‪ .‬بالنسبة للموترات ذات األبعاد األعلى‪ ،‬نستخدم النظير ‪counterpart‬‬
‫المناسب‪ .‬يخفي عامل التشغيل ‪ prod‬كل الرموز العلوية‪.‬‬

‫تذكر أن معلمات الشبكة البسيطة ذات الطبقة المخفية‪ ،‬والتي يوجد رسمها البياني الحسابييف ‬
‫الشكل ‪ ،5.3.1‬هي )‪ 𝐖 (1‬و )‪ .𝐖 (2‬الهدف من االنتشار الخلفي ‪ backpropagation‬هو‬
‫حساب التدرجات )‪ 𝜕𝐽/𝜕𝐖 (1‬و )‪ .𝜕𝐽/𝜕𝐖 (2‬لتحقيق ذلك‪ ،‬نطبق قاعدة السلسلة ونحسب‪،‬‬
‫بدورنا‪ ،‬التدرج لكل متغير وسيط ومعلمة‪ .‬يتم عكس ترتيب الحسابات بالنسبة إلى تلك التي يتم‬
‫إجراؤهايف االنتشار األمامي‪ ،‬نظرًا ألننا نحتاج إلى البدء بنتيجة الرسم البياني الحسابي والعمليف ‬
‫طريقنا نحو المعلمات‪ .‬الخطوة األولى هي حساب تدرجات دالة الهدف 𝑠 ‪ 𝐽 = 𝐿 +‬فيما يتعلق‬
‫بمصطلح الخطأ 𝐿 ومصطلح التنظيم 𝑠‪.‬‬

‫𝐽𝜕‬ ‫𝐽𝜕‬
‫‪= 1and = 1.‬‬
‫𝐿𝜕‬ ‫𝑠𝜕‬
‫بعد ذلك‪ ،‬نحسب التدرج لدالة الهدف فيما يتعلق بمتغير طبقة المخرجات 𝐨 وفقًا لقاعدة‬
‫السلسلة‪:‬‬

‫𝐽𝜕‬ ‫𝐿𝜕 𝐽𝜕‬ ‫𝐿𝜕‬


‫= ) ‪= prod( ,‬‬ ‫‪∈ ℝ𝑞 .‬‬
‫𝐨𝜕‬ ‫𝐨𝜕 𝐿𝜕‬ ‫𝐨𝜕‬
‫بعد ذلك‪ ،‬نحسب تدرجات مصطلح التنظيم فيما يتعلق بكل من المعلمتين‪:‬‬

‫𝑠𝜕‬ ‫𝑠𝜕‬
‫)‪(1‬‬
‫‪= 𝜆𝐖 (1) and‬‬ ‫‪= 𝜆𝐖 (2) .‬‬
‫𝐖𝜕‬ ‫)‪𝜕𝐖 (2‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪246‬‬

‫اآلن نحن قادرون على حساب التدرج ‪ 𝜕𝐽/𝜕𝐖 (2) ∈ ℝ𝑞×ℎ‬لمعلمات النموذج األقرب إلى‬
‫طبقة اإلخراج‪ .‬ينتج عن استخدام قاعدة السلسلة‪:‬‬

‫𝐽𝜕‬ ‫𝐨𝜕 𝐽𝜕‬ ‫𝑠𝜕 𝐽𝜕‬ ‫⊤ 𝐽𝜕‬


‫)‪(2‬‬
‫‪= prod( ,‬‬ ‫)‪(2‬‬
‫‪) + prod( ,‬‬ ‫)‪(2‬‬
‫=)‬ ‫‪𝐡 + 𝜆𝐖 (2) .‬‬
‫𝐖𝜕‬ ‫𝐖𝜕 𝐨𝜕‬ ‫𝐖𝜕 𝑠𝜕‬ ‫𝐨𝜕‬
‫للحصول على التدرج فيما يتعلق )‪ ، 𝐖 (1‬نحتاج إلى مواصلة ‪ backpropagation‬على طول‬
‫طبقة اإلخراج إلى الطبقة المخفية‪ .‬يتم إعطاء التدرج فيما يتعلق بإخراج الطبقة المخفية‬
‫‪ 𝜕𝐽/𝜕𝐡 ∈ ℝℎ‬بواسطة‬

‫𝐽𝜕‬ ‫𝐨𝜕 𝐽𝜕‬ ‫𝐽𝜕 ⊤‬


‫)‪= prod( , ) = 𝐖 (2‬‬ ‫‪.‬‬
‫𝐡𝜕‬ ‫𝐡𝜕 𝐨𝜕‬ ‫𝐨𝜕‬
‫نظرًا ألن دالة التنشيط 𝜙 تنطبق على العناصر‪ ،‬فإن حساب التدرج ‪ 𝜕𝐽/𝜕𝐳 ∈ ℝℎ‬للمتغير الوسيط‬
‫𝐳يتطلب أن نستخدم عامل الضرب العنصري ‪،elementwise multiplication operator‬‬
‫والذي نشير إليه بـ ⊙‪:‬‬

‫𝐽𝜕‬ ‫𝐡𝜕 𝐽𝜕‬ ‫𝐽𝜕‬


‫= ) ‪= prod( ,‬‬ ‫‪⊙ 𝜙 ′ (𝐳).‬‬
‫𝐳𝜕‬ ‫𝐳𝜕 𝐡𝜕‬ ‫𝐡𝜕‬
‫أخيرًا‪ ،‬يمكننا الحصول على التدرج 𝑑×‪ 𝜕𝐽/𝜕𝐖 (1) ∈ ℝℎ‬لمعلمات النموذج األقرب إلى طبقة‬
‫اإلدخال‪ .‬وفقًا لقاعدة السلسلة‪ ،‬نحصل على‬

‫𝐽𝜕‬ ‫𝐳𝜕 𝐽𝜕‬ ‫𝑠𝜕 𝐽𝜕‬ ‫𝐽𝜕‬


‫)‪(1‬‬
‫‪= prod( ,‬‬ ‫)‪(1‬‬
‫‪) + prod( ,‬‬ ‫)‪(1‬‬
‫‪) = 𝐱 ⊤ + 𝜆𝐖 (1) .‬‬
‫𝐖𝜕‬ ‫𝐖𝜕 𝐳𝜕‬ ‫𝐖𝜕 𝑠𝜕‬ ‫𝐳𝜕‬
‫‪Training Neural Networks‬‬ ‫‪5.3.4‬‬
‫عند تدريب الشبكات العصبية‪ ،‬يعتمد االنتشار األمامي والخلفي على بعضهما البعض‪ .‬على وجه‬
‫الخصوص‪ ،‬من أجل االنتشار األمامي‪ ،‬نجتاز الرسم البياني الحسابييف اتجاه التبعيات ونحسب‬
‫جميع المتغيرات على مسارها‪ .‬ثم يتم استخدام هذه من أجل االنتشار الخلفي حيث يتم عكس‬
‫ترتيب الحساب على الرسم البياني‪.‬‬

‫خذ الشبكة البسيطة المذكورة أعاله كمثال للتوضيح‪ .‬من ناحية أخرى‪ ،‬يعتمد حساب مصطلح‬
‫التنظيم (‪ ) 5.3.5‬أثناء االنتشار األمامي على القيم الحالية لمعلمات النموذج )‪ 𝐖 (1‬و )‪.𝐖 (2‬‬
‫يتم تقديمها بواسطة خوارزمية التحسين وفقًا لالنتشار الخلفييف التكرار األخير‪ .‬من ناحية أخرى‪،‬‬
‫يعتمد حساب التدرج للمعامل (‪ )5.3.11‬أثناء االنتشار الخلفي على القيمة الحالية لمخرجات‬
‫الطبقة المخفية 𝐡‪ ،‬والتي يتم تقديمها عن طريق االنتشار األمامي‪.‬‬
‫‪247‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫لذلك عند تدريب الشبكات العصبية‪ ،‬بعد تهيئة معلمات النموذج‪ ،‬نتبادل االنتشار األمامي مع‬
‫االنتشار الخلفي‪ ،‬وتحديث معلمات النموذج باستخدام التدرجات المعطاة عن طريق االنتشار‬
‫الخلفي‪ .‬الحظ أن االنتشار الخلفي يعيد استخدام القيم الوسيطة المخزنة من االنتشار األمامي‬
‫لتجنب الحسابات المكررة‪ .‬إحدى العواقب هي أننا بحاجة إلى االحتفاظ بالقيم الوسيطة حتى‬
‫يكتمل االنتشار الخلفي‪ .‬هذا أيضًا أحد األسباب التي تجعل التدريب يتطلب ذاكرة أكبر بكثير‬
‫من التوقع البسيط‪ .‬إلى جانب ذلك‪ ،‬يتناسب حجم هذه القيم الوسيطة تقريبًا مع عدد طبقات‬
‫الشبكة وحجم الدُفعة‪ .‬وبالتالي‪ ،‬فإن تدريب شبكات أعمق باستخدام أحجام دفعات أكبر يؤدي‬
‫بسهولة أكبر إلى نفاد أخطاء الذاكرة‪.‬‬

‫‪5.3.5‬‬
‫يحسب االنتشار األمامي المتغيرات الوسيطة ويخزنها بالتسلسل داخل الرسم البياني‬ ‫•‬
‫الحسابي المحدد بواسطة الشبكة العصبية‪ .‬ينطلق من المدخالت إلى طبقة اإلخراج‪.‬‬
‫يقوم االنتشار الخلفي بحساب وتخزين تدرجات المتغيرات والمعلمات الوسيطة‬ ‫•‬
‫بشكل تسلسلي داخل الشبكة العصبية بالترتيب المعكوس‪.‬‬
‫عند تدريب نماذج التعلم العميق‪ ،‬فإن االنتشار األمامي واالنتشار الخلفي مترابطان‪.‬‬ ‫•‬
‫يتطلب التدريب ذاكرة أكبر بكثير من التوقع‪.‬‬ ‫•‬

‫‪5.3.6‬‬
‫‪ .1‬افترض أن مدخالت 𝐗 بعض الدوال العددية 𝑓 عبارة عن مصفوفات 𝑚 × 𝑛‪ .‬ما هي‬
‫أبعاد التدرج 𝑓 بالنسبة لـ 𝐗؟‬
‫‪ .2‬أضف تحيزًا إلى الطبقة المخفية من النموذج الموضحيف هذا القسم (ال تحتاج إلى‬
‫تضمين التحيزيف مصطلح التنظيم)‪.‬‬
‫‪ .1‬ارسم الرسم البياني الحسابي المطابق‪.‬‬
‫‪ .2‬اشتق معادالت االنتشار األمامية والخلفية‪.‬‬
‫‪ .3‬احسب بصمة الذاكرة ‪ memory footprint‬للتدريب والتنبؤيف النموذج الموضحيف ‬
‫هذا القسم‪.‬‬
‫‪ .4‬افترض أنك تريد حساب المشتقات الثانية‪ .‬ماذا يحدث للرسم البياني الحسابي؟ كم‬
‫من الوقت تتوقع أن تستغرق العملية الحسابية؟‬
‫‪ .5‬افترض أن الرسم البياني الحسابي كبير جدًا بالنسبة لوحدة معالجة الرسومات ‪GPU‬‬
‫الخاصة بك‪.‬‬
‫‪ .1‬هل يمكنك تقسيمها على أكثر من وحدة معالجة رسومات ‪GPU‬؟‬
‫‪ .2‬ما هي مزايا وعيوب التدريب على ‪ minibatch‬أصغر؟‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪248‬‬

‫‪Numerical Stability and‬‬ ‫‪5.4‬‬


‫‪Initialization‬‬
‫حتى اآلن‪ ،‬كل نموذج قمنا بتطبيقه يتطلب أن نقوم بتهيئة معلماته وفقًا لبعض التوزيعات المحددة‬
‫مسبقًا‪ .‬حتى اآلن‪ ،‬أخذنا مخطط التهيئة كأمر مسلم به‪ ،‬مع إخفاء تفاصيل كيفية اتخاذ هذه‬
‫الخيارات‪ .‬قد يكون لديك انطباع بأن هذه الخيارات ليست مهمة بشكل خاص‪ .‬على العكس من‬
‫ذلك‪ ،‬يلعب اختيار مخطط التهيئة دورًا مهمًايف تعلم الشبكة العصبية‪ ،‬ويمكن أن يكون حاسمًا‬
‫للحفاظ على االستقرار العددي‪ .‬عالوة على ذلك‪ ،‬يمكن ربط هذه االختيارات بطرق مثيرة باختيار‬
‫دالة التنشيط الالخطي‪ .‬يمكن أن تحدد الدالة التي نختارها وكيف نهيئ المعلمات مدى سرعة‬
‫تقارب خوارزمية التحسين الخاصة بنا‪ .‬قد تؤدي الخيارات السيئة هنا إلى مواجهة تدرجات‬
‫متدرجة أو متالشية أثناء التدريب‪.‬يف هذا القسم‪ ،‬نتعمقيف هذه الموضوعات بمزيد من التفاصيل‬
‫ونناقش بعض االستدالالت المفيدة التي ستجدها مفيدة طوال حياتك المهنيةيف التعلم العميق‪.‬‬

‫‪Vanishing and Exploding Gradients‬‬ ‫‪5.4.1‬‬


‫ضعيف اعتبارك شبكة عميقة ذات طبقات 𝐿 ومدخالت 𝐱 ومخرجات 𝐨‪ .‬مع تحديد كل طبقة 𝑙‬
‫من خالل تحويل 𝑙𝑓 يتم تحديد معلماته بواسطة األوزان )𝑙( 𝐖‪ ،‬والتي يكون ناتج الطبقة المخفية‬
‫)𝑙(𝐡 (ليكن 𝐱 = )‪ ،)𝐡(0‬يمكن التعبير عن شبكتنا على النحو التالي‪:‬‬

‫‪𝐡(𝑙) = 𝑓𝑙 (𝐡(𝑙−1) ) and thus 𝐨 = 𝑓𝐿 ∘ … ∘ 𝑓1 (𝐱).‬‬

‫إذا كانت جميع مخرجات ومدخالت الطبقة المخفية عبارة عن متجهات‪ ،‬فيمكننا كتابة التدرج‬
‫𝐨 فيما يتعلق بأي مجموعة من المعلمات )𝑙( 𝐖 على النحو التالي‪:‬‬

‫‪𝜕𝐖 (𝑙) 𝐨 = 𝜕𝐡(𝐿−1) 𝐡(𝐿) ⋅ … ⋅ 𝜕𝐡(𝑙) 𝐡(𝑙+1) 𝜕𝐖(𝑙) 𝐡(𝑙) .‬‬


‫⏟‬ ‫⏟‬ ‫⏟‬
‫‪def‬‬ ‫‪def‬‬ ‫‪def‬‬
‫= )𝐿( 𝐌‬ ‫= )‪𝐌 (𝑙+1‬‬ ‫= )𝑙( 𝐯‬

‫بمعنى آخر‪ ،‬هذا التدرج هو ناتج ضرب 𝑙 ‪ 𝐿 −‬مصفوفات )‪ 𝐌 (𝐿) ⋅ … ⋅ 𝐌 (𝑙+1‬ومتجه التدرج‬
‫)𝑙( 𝐯‪ .‬وبالتالي نحن عرضة لنفس مشاكل التدفق العددي ‪ numerical underflow‬الذي غالبًا‬
‫ما يظهر عند ضرب العديد من االحتماالت معًا‪ .‬عند التعامل مع االحتماالت‪ ،‬فإن الحيلة الشائعة‬
‫هي التبديل إلى مساحة اللوغارتيم ‪ ،log-space‬أي تحويل الضغط من الجزء العشري إلى أس‬
‫التمثيل العددي‪ .‬لسوء الحظ‪ ،‬فإن مشكلتنا أعاله أكثر خطورة‪:‬يف البداية قد تحتوي المصفوفات‬
‫)𝑙( 𝐌 على مجموعة متنوعة من القيم الذاتية ‪ .eigenvalues‬قد تكون صغيرة أو كبيرة‪ ،‬وقد‬
‫يكون منتجها كبيرًا جدًا أو صغيرًا جدًا‪.‬‬

‫تتجاوز المخاطر التي تشكلها التدرجات غير المستقرة التمثيل العددي‪ .‬كما تهدد التدرجات ذات‬
‫الحجم غير المتوقع أيضًا استقرار خوارزميات التحسين الخاصة بنا‪ .‬قد نواجه تحديثات‬
‫‪249‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫للمعلمات إما (‪ )1‬كبيرة جدًا‪ ،‬مما يؤدي إلى تدمير نموذجنا (مشكلة التدرج ‪exploding‬‬
‫‪)gradient problem‬؛ أو (‪ )2‬صغيرة للغاية (مشكلة التدرج المتالشي ‪vanishing‬‬
‫‪ ،)gradient problem‬مما يجعل التعلم مستحيالً ألن المعلمات بالكاد تتحركيف كل تحديث‪.‬‬

‫‪Vanishing Gradients‬‬ ‫‪5.4.1.1‬‬


‫أحد األسباب المتكررة لمشكلة تالشي التدرج ‪ vanishing gradient‬هو اختيار دالة التنشيط‬
‫التي يتم إلحاقها بعد العمليات الخطية لكل طبقة‪ .‬تاريخيا‪ ،‬كانت دالة ‪1/(1 +( sigmoid‬‬
‫))𝑥‪()exp (−‬المقدمةيف القسم ‪ )5.1‬شائعة ألنها تشبه دالة العتبة ‪.thresholding function‬‬
‫نظرًا ألن الشبكات العصبية االصطناعية المبكرة كانت مستوحاة من الشبكات العصبية البيولوجية‪،‬‬
‫فإن فكرة الخاليا العصبية التي تطلق ‪ fire‬إما بشكل كامل أو ال تطلق ‪( not fire‬مثل الخاليا‬
‫العصبية البيولوجية) تبدو جذابة‪ .‬دعونا نلقي نظرة فاحصة على دالة ‪ sigmoid‬لنرى لماذا يمكن‬
‫أن يتسببيف تالشي التدرجات‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬

‫))‪x = tf.Variable(tf.range(-8.0, 8.0, 0.1‬‬


‫‪with tf.GradientTape() as t:‬‬
‫)‪y = tf.nn.sigmoid(x‬‬
‫‪d2l.plot(x.numpy(), [y.numpy(), t.gradient(y,‬‬
‫‪x).numpy()],‬‬
‫‪legend=['sigmoid', 'gradient'], figsize=(4.5,‬‬
‫))‪2.5‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪250‬‬

‫كما ترون‪ ،‬يتالشى تدرج ‪ sigmoid‬عندما تكون مدخالته كبيرة وعندما تكون صغيرة‪ .‬عالوة‬
‫على ذلك‪ ،‬عند االنتشار الخلفي عبر العديد من الطبقات‪ ،‬ما لم نكنيف منطقة معتدلة ‪ ،‬حيث‬
‫تقترب مدخالت العديد من ‪ sigmoid‬من الصفر ‪ ،‬فقد تختفي تدرجات المنتج الكلي‪ .‬عندما‬
‫تفتخر شبكتنا بالعديد من الطبقات‪ ،‬ما لم نتوخى الحذر‪ ،‬فمن المحتمل أن يتم قطع التدرجيف ‬
‫طبقة ما‪.‬يف الواقع‪ ،‬كانت هذه المشكلة تصيب التدريب الشبكي العميق‪ .‬وبالتالي‪ ،‬فإن ‪،ReLU‬‬
‫التي هي أكثر استقرارًا (ولكنها أقل قبولًا من الناحية العصبية)‪ ،‬ظهرت كخيار افتراضي‬
‫للممارسين‪.‬‬

‫‪Exploding Gradients‬‬ ‫‪5.4.1.2‬‬


‫المشكلة المعاكسة‪ ،‬عندما تنفجر التدرجات‪ ،‬يمكن أن تكون محيرة بالمثل‪ .‬لتوضيح هذا بشكل‬
‫أفضل قليالً‪ ،‬نرسم ‪ 100‬مصفوفة عشوائية غاوسية ونضربها ببعض المصفوفة األولية‪ .‬بالنسبة‬
‫للمقياس الذي اخترناه (اختيار التباين ‪ ،)𝜎 2 = 1‬ينفجر منتج المصفوفة‪ .‬عندما يحدث هذا‬
‫بسبب تهيئة شبكة عميقة‪ ،‬فليس لدينا فرصة للحصول على مُحسِّن هبوط التدرج ‪gradient‬‬
‫‪ descent optimizer‬ليتقارب‪.‬‬

‫))‪M = tf.random.normal((4, 4‬‬


‫)‪print('a single matrix \n', M‬‬
‫‪for i in range(100):‬‬
‫)))‪M = tf.matmul(M, tf.random.normal((4, 4‬‬

‫))(‪print('after multiplying 100 matrices\n', M.numpy‬‬


‫‪a single matrix‬‬
‫(‪tf.Tensor‬‬
‫‪[[-3.7870526e-01 -8.8691898e-02 -1.1780064e+00‬‬
‫]‪4.2226687e-01‬‬
‫‪[ 1.5102199e+00 2.2903053e-01 -9.1348571e-01 -‬‬
‫]‪2.0801425e-01‬‬
‫‪[-1.3337844e-03 8.2335420e-02 -2.4707975e+00 -‬‬
‫]‪1.1889901e+00‬‬
‫‪[ 7.2899163e-01 -7.2341427e-02 9.2103463e-01 -‬‬
‫)‪1.6827035e-01]], shape=(4, 4), dtype=float32‬‬
‫‪after multiplying 100 matrices‬‬
‫‪[[-1.4607350e+24 -5.4140549e+23 -1.7785702e+23‬‬
‫]‪1.0161147e+24‬‬
‫‪[ 2.3161050e+24 8.5843912e+23 2.8200557e+23 -‬‬
‫]‪1.6111261e+24‬‬
‫‪[-1.0695384e+24 -3.9641278e+23 -1.3022544e+23‬‬
‫]‪7.4399098e+23‬‬
‫‪251‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪[ 1.6060195e+24‬‬ ‫‪5.9525373e+23‬‬ ‫‪1.9554657e+23 -‬‬


‫]]‪1.1171773e+24‬‬
‫‪Breaking the Symmetry‬‬ ‫‪5.4.1.3‬‬
‫مشكلة أخرىيف تصميم الشبكة العصبية هي التناظر او التماثل ‪ symmetry‬المتأصليف ‬
‫معامالتهم‪ .‬افترض أن لدينا ‪ MLP‬بسيطًا بطبقة مخفية واحدة ووحدتين‪.‬يف هذه الحالة‪ ،‬يمكننا‬
‫تبديل أوزان )‪ 𝐖 (1‬الطبقة األولى وكذلك تبديل أوزان طبقة المخرجات للحصول على الدالة‬
‫نفسها‪ .‬ال يوجد شيء مميز يفرق بين الوحدة المخفية األولى والوحدة المخفية الثانية‪ .‬بعبارة‬
‫أخرى‪ ،‬لدينا تناظر تبادلي بين الوحدات المخفية لكل طبقة‪.‬‬

‫هذا أكثر من مجرد مصدر إزعاج نظري‪ .‬ضعيف اعتبارك ‪ MLP‬ذات الطبقة المخفية الواحدة‬
‫المذكورة أعاله مع وحدتين مخفيتين‪ .‬للتوضيح‪ ،‬افترض أن طبقة المخرجات تحول الوحدتين‬
‫المخفيتين إلى وحدة إخراج واحدة فقط‪ .‬تخيل ما سيحدث إذا قمنا بتهيئة جميع معلمات الطبقة‬
‫المخفية كـ 𝑐 = )‪ 𝐖 (1‬بالنسبة لبعض الثوابت 𝑐‪.‬يف هذه الحالة‪ ،‬أثناء االنتشار األمامي‪ ،‬تأخذ إما‬
‫الوحدة المخفية نفس المدخالت والمعلمات‪ ،‬وتنتج نفس التنشيط‪ ،‬الذي يتم تغذيته إلى وحدة‬
‫اإلخراج‪ .‬أثناء االنتشار الخلفي‪ ،‬فإن التمييز بين وحدة اإلخراج فيما يتعلق بالمعلمات )‪𝐖 (1‬‬
‫يعطي التدرج الذي تأخذ جميع عناصره نفس القيمة‪ .‬وهكذا‪ ،‬بعد التكرار القائم على التدرج‬
‫(على سبيل المثال‪ ،‬التدرج االشتقاقي العشوائي المصغر)‪ ،‬ال تزال جميع العناصر تأخذ نفس‬
‫القيمة‪ .‬لن تكسر مثل هذه التكرارات التناظر من تلقاء نفسها وقد ال نتمكن أبدًا من إدراك القوة‬
‫التعبيرية للشبكة‪ .‬تتصرف الطبقة المخفية كما لو كانت تحتوي على وحدة واحدة فقط‪ .‬الحظ‬
‫أنهيف حين أن التدرج االشتقاقي العشوائي المصغر لن يكسر هذا التناظر‪ ،‬فإن تسوية التسرب‬
‫‪( dropout regularization‬التي سيتم تقديمها الحقًا) ستفعل!‬

‫‪Parameter Initialization‬‬ ‫‪5.4.2‬‬


‫إحدى طرق معالجة ‪ -‬أو على األقل التخفيف ‪ -‬المشكالت التي أثيرت أعاله هي من خالل‬
‫التهيئة الدقيقة ‪ .careful initialization‬كما سنرى الحقًا‪ ،‬يمكن أن تؤدي الرعاية اإلضافية‬
‫أثناء التحسين والتنظيم المناسب إلى زيادة تعزيز االستقرار‪.‬‬

‫‪Default Initialization‬‬ ‫‪5.4.2.1‬‬


‫في األقسام السابقة‪ ،‬على سبيل المثال‪،‬يف القسم ‪ ،3.5‬استخدمنا التوزيع الطبيعي ‪normal‬‬
‫‪ distribution‬لتهيئة قيم األوزان الخاصة بنا‪ .‬إذا لم نحدد طريقة التهيئة‪ ،‬فسيستخدم إطار العمل‬
‫طريقة تهيئة عشوائية افتراضية‪ ،‬والتي غالبًا ما تعمل جيدًايف الممارسة العملية ألحجام المشكالت‬
‫المعتدلة‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪252‬‬

‫‪Xavier‬‬ ‫‪5.4.2.2‬‬
‫دعنا نلقي نظرة على توزيع مقياس الناتج 𝑖𝑜 لبعض الطبقات المتصلة بالكامل بدون الالخطية‪.‬‬
‫مع ‪ 𝑛in‬المدخالت 𝑗𝑥 واألوزان 𝑗𝑖𝑤 المرتبطة بها لهذه الطبقة‪ ،‬يتم إعطاء اإلخراج بواسطة‬
‫‪𝑛in‬‬

‫∑ = 𝑖𝑜‬ ‫‪𝑤𝑖𝑗 𝑥𝑗 .‬‬


‫‪𝑗=1‬‬

‫يتم رسم جميع األوزان 𝑗𝑖𝑤 بشكل مستقل عن نفس التوزيع‪ .‬عالوة على ذلك‪ ،‬لنفترض أن هذا‬
‫التوزيع ليس له أي متوسط وتباين ‪ .𝜎 2‬الحظ أن هذا ال يعني أن التوزيع يجب أن يكون غاوسيًا‪،‬‬
‫فقط أن المتوسط والتباين يجب أن يكونا موجودين‪.‬يف الوقت الحالي‪ ،‬لنفترض أن مدخالت‬
‫الطبقة 𝑗𝑥 لها أيضًا متوسط صفر وتباين ‪ 𝛾 2‬وأنها مستقلة عن 𝑗𝑖𝑤 ومستقلة عن بعضها البعض‪.‬‬
‫في هذه الحالة‪ ،‬يمكننا حساب المتوسط والتباين 𝑖𝑜 على النحو التالي‪:‬‬
‫‪𝑛in‬‬

‫] 𝑖𝑜[𝐸‬ ‫∑=‬ ‫] 𝑗𝑥 𝑗𝑖𝑤[𝐸‬


‫‪𝑗=1‬‬
‫‪𝑛in‬‬

‫∑=‬ ‫] 𝑗𝑥[𝐸] 𝑗𝑖𝑤[𝐸‬


‫‪𝑗=1‬‬
‫‪= 0,‬‬
‫] 𝑖𝑜[‪Var‬‬ ‫‪= 𝐸[𝑜𝑖2 ] −‬‬ ‫‪(𝐸[𝑜𝑖 ])2‬‬
‫‪𝑛in‬‬

‫∑=‬ ‫‪𝐸[𝑤𝑖𝑗2 𝑥𝑗2 ] − 0‬‬


‫‪𝑗=1‬‬
‫‪𝑛in‬‬

‫∑=‬ ‫] ‪𝐸[𝑤𝑖𝑗2 ]𝐸[𝑥𝑗2‬‬


‫‪𝑗=1‬‬
‫‪= 𝑛in 𝜎 2 𝛾 2 .‬‬

‫طريقة واحدة للحفاظ على التباين ثابتًا هي تعيين ‪ .𝑛in 𝜎 2 = 1‬اآلن النظريف االنتشار الخلفي‪.‬‬
‫هناك نواجه مشكلة مماثلة‪ ،‬وإن كان يتم نشر التدرجات من الطبقات األقرب إلى اإلخراج‪.‬‬
‫باستخدام نفس المنطق الخاص باالنتشار األمامي‪ ،‬نرى أن تباين التدرجات يمكن أن ينفجر ما‬
‫لم يكن ‪ 𝑛out 𝜎 2 = 1‬حيث ‪ 𝑛out‬عدد مخرجات هذه الطبقة‪ ،‬أين‪ .‬هذا يتركنايف مأزق‪ :‬ال يمكننا‬
‫تلبية كال الشرطينيف وقت واحد‪ .‬بدالً من ذلك‪ ،‬نحاول ببساطة أن نحقق‬

‫‪1‬‬ ‫‪2‬‬
‫√ = 𝜎 ‪(𝑛in + 𝑛out )𝜎 2 = 1 or equivalently‬‬ ‫‪.‬‬
‫‪2‬‬ ‫‪𝑛in + 𝑛out‬‬
‫‪253‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫هذا هو السبب الكامن وراء تهيئة ‪ Xavier‬الحالية والمفيدة عمليًا‪ ،‬والتي سميت على اسم‬
‫المؤلف األول لمنشئيها ( ‪ .)2010 ،Glorot and Bengio‬نموذجياً‪ ،‬عينات التهيئة ‪Xavier‬‬
‫‪2‬‬
‫= ‪ . 𝜎 2‬يمكننا أيضًا تكييف حدس‬ ‫األوزان من توزيع غاوسي بمتوسط صفر وتباين‬
‫‪𝑛in +𝑛out‬‬
‫‪ Xavier‬الختيار التباين عند أخذ عينات من األوزان من توزيع منتظم‪ .‬الحظ أن التوزيع المنتظم‬
‫‪𝑎2‬‬ ‫‪𝑎2‬‬
‫يف حالتنا على ‪ 𝜎 2‬إلى اقتراح التهيئة وفقًا لـ‬ ‫‪ .‬يؤدي توصيل‬ ‫)𝑎 ‪ 𝑈(−𝑎,‬له تباين‬
‫‪3‬‬ ‫‪3‬‬

‫‪6‬‬ ‫‪6‬‬
‫√‪𝑈(−‬‬ ‫√‪,‬‬ ‫‪).‬‬
‫‪𝑛in + 𝑛out 𝑛in + 𝑛out‬‬

‫على الرغم من أن افتراض عدم وجود الالخطيةيف التفكير الرياضي أعاله يمكن انتهاكه بسهولةيف ‬
‫الشبكات العصبية‪ ،‬إال أن طريقة تهيئة ‪ Xavier‬تعمل بشكل جيديف الممارسة العملية‪.‬‬

‫‪Beyond‬‬ ‫‪5.4.2.3‬‬
‫المنطق أعاله بالكاد يخدش سطح األساليب الحديثة لتهيئة المعلمة ‪parameter‬‬
‫‪ .initialization‬غالبًا ما ينفذ إطار التعلم العميق أكثر من اثنتي عشرة عملية استكشاف مختلفة‪.‬‬
‫عالوة على ذلك‪ ،‬ال تزال تهيئة المعلمة منطقة ساخنة للبحث األساسييف التعلم العميق‪ .‬من بين‬
‫هذه االستدالالت المتخصصة للمعلمات المقيدة (المشتركة) والدقة الفائقة ‪super-‬‬
‫‪ resolution‬ونماذج التسلسل ‪ sequence models‬وغيرها من المواقف‪ .‬على سبيل المثال‪،‬‬
‫‪ .Xiao et al‬أظهر إمكانية تدريب ‪ 10000‬طبقة من الشبكات العصبية بدون حيل معمارية‬
‫باستخدام طريقة تهيئة مصممة بعناية (‪.)2018 ،Xiao et al.‬‬

‫إذا كان الموضوع يثير اهتمامك‪ ،‬فإننا نقترح التعمقيف عروض هذه الوحدة‪ ،‬وقراءة األوراق التي‬
‫اقترحت وحلل كل إرشادية‪ ،‬ثم استكشاف أحدث المنشورات حول هذا الموضوع‪ .‬ربما سوف‬
‫تتعثر أو تخترع فكرة ذكية وتساهميف تنفيذ أطر التعلم العميق‪.‬‬

‫‪5.4.3‬‬
‫يعد تالشي وانفجار التدرجات من المشكالت الشائعةيف الشبكات العميقة‪ .‬مطلوب‬ ‫•‬
‫عناية كبيرةيف تهيئة المعلمات لضمان أن تظل التدرجات والمعلمات خاضعة للرقابة‬
‫بشكل جيد‪.‬‬
‫هناك حاجة إلى أساليب التهيئة االستدالل الحدسية ‪Initialization heuristics‬‬ ‫•‬
‫للتأكد من أن التدرجات األولية ليست كبيرة جدًا وال صغيرة جدًا‪.‬‬
‫تعمل دوال تنشيط ‪ ReLU‬على تخفيف مشكلة تالشي التدرج‪ .‬هذا يمكن أن يسرع‬ ‫•‬
‫من التقارب‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪254‬‬

‫التهيئة العشوائية ‪ Random initialization‬هي المفتاح لضمان كسر التناظر‬ ‫•‬


‫‪ symmetry‬قبل التحسين‪.‬‬
‫تشير تهيئة ‪ Xavier‬إلى أنه‪ ،‬لكل طبقة‪ ،‬ال يتأثر التباينيف أي ناتج بعدد المدخالت‪،‬‬ ‫•‬
‫وال يتأثر تباين أي تدرج بعدد المخرجات‪.‬‬

‫‪5.4.4‬‬
‫‪ .1‬هل يمكنك تصميم حاالت أخرى قد تعرض فيها الشبكة العصبية تناظرًا يتطلب كسرًا‬
‫‪ breaking‬إلى جانب تناظر التقليب ‪permutation symmetry‬يف طبقات ‪MLP‬؟‬
‫‪ .2‬هل يمكننا تهيئة جميع معلمات الوزنيف االنحدار الخطي أويف انحدار ‪ softmax‬إلى‬
‫نفس القيمة؟‬
‫‪ .3‬ابحث عن الحدود التحليلية للقيم الذاتية لحاصل ضرب مصفوفتين‪ .‬ماذا يخبرك هذا‬
‫عن ضمان تكييف التدرجات بشكل جيد؟‬
‫‪ .4‬إذا علمنا أن بعض المصطلحات تتباعد ‪ ،diverge‬فهل يمكننا إصالح هذا بعد‬
‫الحقيقة؟ انظر إلى الورقة حول مقياس المعدل التكيفي للطبقات لإللهام ( ‪You et‬‬
‫‪.)2017 ،al.‬‬

‫‪Generalization in Deep Learning‬‬ ‫‪5.5‬‬


‫في القسم ‪ 3‬والقسم ‪ ،4‬عالجنا مشاكل االنحدار والتصنيف من خالل مالءمة ‪ fitting‬النماذج‬
‫الخطية لبيانات التدريب‪.‬يف كلتا الحالتين‪ ،‬قدمنا خوارزميات عملية للعثور على المعلمات التي‬
‫زادت من احتمالية تسميات التدريب المرصودة‪ .‬وبعد ذلك‪ ،‬قرب نهاية كل فصل‪ ،‬تذكرنا أن‬
‫مالءمة بيانات التدريب كانت مجرد هدف وسيط‪ .‬كان سعينا الحقيقي طوال الوقت هو اكتشاف‬
‫األنماط العامة التي يمكننا على أساسها إجراء تنبؤات دقيقة حتى على األمثلة الجديدة المستمدة‬
‫من نفس المجموعة األساسية‪ .‬باحثو التعلم اآللي هم مستهلكون لخوارزميات التحسين‪.‬يف بعض‬
‫األحيان‪ ،‬يجب علينا تطوير خوارزميات تحسين جديدة‪ .‬ولكنيف نهاية المطاف‪ ،‬فإن التحسين هو‬
‫مجرد وسيلة لتحقيق غاية‪ .‬يعد التعلم اآللييف جوهره نظامًا إحصائيًا ونرغبيف تحسين خطأ‬
‫التدريب فقط بقدر ما يؤدي بعض المبادئ اإلحصائية (المعروفة أو غير المعروفة) إلى التعميم‬
‫الناتج عن مجموعة التدريب‪.‬‬

‫على الجانب المشرق‪ ،‬اتضح أن الشبكات العصبية العميقة المدربة عن طريق التدرج االشتقاقي‬
‫العشوائي ‪ SGD‬تعمم جيدًا بشكل ملحوظ عبر مشاكل التنبؤ التي ال تعد وال تحصى‪ ،‬والتي‬
‫تشمل الرؤية الحاسوبية ‪computer vision‬؛ معالجة اللغة الطبيعية ‪natural language‬‬
‫‪ processing‬؛ بيانات السالسل الزمنية ‪ time series data‬؛ أنظمة التوصية ‪recommender‬‬
‫‪systems‬؛ السجالت الصحية اإللكترونية ‪electronic health records‬؛ طي البروتين‬
‫‪255‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪ Protein folding‬؛ تقريب دالة القيمةيف ألعاب الفيديو وألعاب الطاولة ؛ ومجاالت أخرى ال‬
‫حصر لها‪ .‬على الجانب السلبي‪ ،‬إذا كنت تبحث عن حساب مباشر إما لقصة التحسين (لماذا‬
‫يمكننا مالءمتها لبيانات التدريب) أو قصة التعميم (لماذا تعمم النماذج الناتجة على أمثلة غير‬
‫مرئية)‪ ،‬إذن قد ترغبيف سكب شاي لنفسك‪.‬يف حين أن إجراءاتنا لتحسين النماذج الخطية‬
‫والخصائص اإلحصائية للحلول موصوفة جيدًا من خالل مجموعة نظرية شاملة‪ ،‬فإن فهمنا للتعلم‬
‫العميق ال يزال يشبه الغرب المتوحش على كال الجبهتين‪.‬‬

‫تتطور نظرية وممارسة التعلم العميق بسرعة على كال الجبهتين‪ ،‬حيث يتبنى المنظرون‬
‫استراتيجيات جديدة لشرح ما يحدث‪ ،‬حتى مع استمرار الممارسينيف االبتكار بوتيرة مذهلة‪،‬‬
‫وبناء ترسانات من االستدالل لتدريب الشبكات العميقة ومجموعة من البديهيات والمعارف‬
‫الشعبية التي تقدم إرشادات لتحديد التقنيات التي يجب تطبيقهايف أي مواقف‪.‬‬

‫لفترة طويلة ‪ ،‬لم نقرأ يف الوقت الحالي هو أن نظرية التعلم العميق قد أنتجت خطوط هجوم واعدة‬
‫ونتائج رائعة متفرقة ‪ ،‬لكنها ال تزال بعيدة كل البعد عن تفسير شامل لكل من (‪ )1‬سبب قدرتنا‬
‫على تحسين الشبكات العصبية و (‪ ) ) 2‬كيف تمكنت النماذج التي تم تعلمها من خالل ‪SGD‬‬
‫من التعميم جيدًا ‪ ،‬حتىيف المهام عالية األبعاد‪ .‬ومع ذلك‪ ،‬من الناحية العملية‪ )1( ،‬نادرًا ما يمثل‬
‫مشكلة (يمكننا دائمًا العثور على المعلمات التي تناسب جميع بيانات التدريب لدينا) وبالتالي‬
‫فإن فهم التعميم هو المشكلة األكبر‪ .‬من ناحية أخرى‪ ،‬حتىيف غياب الراحة التي توفرها النظرية‬
‫العلمية المتماسكة‪ ،‬فقد طور الممارسون مجموعة كبيرة من التقنيات التي قد تساعدك على إنتاج‬
‫نماذج تُعمم جيدًايف الممارسة‪.‬يف حين أنه ال يمكن ألي ملخص بليغ أن ينصف موضوع التعميم‬
‫الكبيريف التعلم العميق‪ ،‬وبينما ال تزال الحالة العامة للبحث بعيدة عن الحل‪ ،‬نأمل‪،‬يف هذا القسم‪،‬‬
‫أن نقدم نظرة عامة واسعة عن حالة البحث والممارسة‪.‬‬

‫‪Revisiting Overfitting‬‬ ‫‪5.5.1‬‬


‫‪and Regularization‬‬
‫تذكر أن نهجنايف تدريب نماذج التعلم اآللي يتكون عادةً من مرحلتين‪ )1( :‬مالءمة ‪ fit‬بيانات‬
‫التدريب؛ و (‪ )2‬تقدير خطأ التعميم ‪( generalization error‬الخطأ الحقيقي على السكان‬
‫األساسيين) من خالل تقييم النموذج على بيانات االنتظار‪ .‬يُطلق على الفرق بين مالءمتنا لبيانات‬
‫التدريب ومدى مالءمتنا لبيانات االختبار فجوة التعميم ‪ generalization gap‬وعندما تكون‬
‫فجوة التعميم كبيرة‪ ،‬نقول إن نماذجنا تتالءم مع بيانات التدريب‪.‬يف الحاالت القصوى من فرط‬
‫التجهيز ‪ ،overfitting‬قد نالئم بيانات التدريب تمامًا‪ ،‬حتى عندما يظل خطأ االختبار كبيرًا‪.‬‬
‫ومن وجهة النظر الكالسيكية‪ ،‬فإن التفسير هو أن نماذجنا معقدة للغاية‪ ،‬وتتطلب إما تقليص عدد‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪256‬‬

‫الميزات‪ ،‬أو عدد المعلمات غير الصفرية التي تم تعلمها‪ ،‬أو حجم المعلمات كما تم تحديدها‬
‫كمياً‪ .‬تذكر مخطط تعقيد النموذج مقابل الخطأ (الشكل ‪ )3.6.1‬من القسم ‪.3.6‬‬

‫لكن التعلم العميق يعقد هذه الصورة بطرق غير بديهية‪ .‬أوالً‪ ،‬بالنسبة إلى مشاكل التصنيف‪ ،‬عادةً‬
‫ما تكون نماذجنا معبرة بما يكفي لتناسب تمامًا كل مثال تدريبي‪ ،‬حتىيف مجموعات البيانات‬
‫التي تتكون من الماليين (‪.)2021 ،Zhang et al.‬يف الصورة الكالسيكية‪ ،‬قد نعتقد أن هذا‬
‫اإلعداد يقعيف أقصى اليمين المتطرف لمحور تعقيد النموذج‪ ،‬وأن أي تحسيناتيف خطأ التعميم‬
‫يجب أن تأتي عن طريق التنظيم ‪ ،regularization‬إما عن طريق تقليل تعقيد فئة النموذج‪ ،‬أو‬
‫عن طريق تطبيق عقوبة ‪ ،penalty‬تقيد بشدة مجموعة القيم التي قد تتخذها معلماتنا‪ .‬ولكن‬
‫هذا هو المكان الذي تبدأ فيه األموريف أن تصبح غريبة‪.‬‬

‫الغريب‪ ،‬بالنسبة للعديد من مهام التعلم العميق (على سبيل المثال‪ ،‬التعرف على الصور وتصنيف‬
‫النص) نختار عادةً من بين البنى النموذجية‪ ،‬والتي يمكن أن تحقق جميعها خطأ تدريب منخفض‬
‫بشكل تعسفي (وخطأ تدريب صفري)‪ .‬نظرًا ألن جميع النماذج قيد الدراسة ال تحقق أي خطأيف ‬
‫التدريب‪ ،‬فإن السبيل الوحيد لتحقيق المزيد من المكاسب هو تقليل الضبط الزائد (فرط‬
‫التجهيز)‪ .‬واألغرب من ذلك‪ ،‬أنه على الرغم من مالءمة بيانات التدريب بشكل مثالي‪ ،‬يمكننايف ‬
‫الواقع تقليل خطأ التعميم بشكل أكبر عن طريق جعل النموذج أكثر تعبيرًا‪ ،‬على سبيل المثال‪،‬‬
‫إضافة طبقات أو عقد أو تدريب لعدد أكبر من الفترات ‪ .epochs‬الغريب حتى اآلن‪ ،‬أن النمط‬
‫الذي يربط فجوة التعميم بتعقيد النموذج (كما تم التقاطه‪ ،‬على سبيل المثال‪،‬يف عمق أو عرض‬
‫الشبكات) يمكن أن يكون غير رتيب ‪ ،non-monotonic‬مع تعقيد أكبر يضريف البداية ولكنه‬
‫يساعد الحقًا فيما يسمى نمط "النسب المزدوج ‪،.Nakkiran et al(( "double-descent‬‬
‫‪ .) 2021‬وبالتالي فإن ممارس التعلم العميق يمتلك مجموعة من الحيل‪ ،‬والتي يبدو أن بعضها‬
‫يقيد النموذج بطريقة ما والبعض اآلخر يجعله يبدو أكثر تعبيراً‪ ،‬وكلها‪ ،‬بمعنى ما‪ ،‬يتم تطبيقها‬
‫لتخفيف فرط التجهيز‪.‬‬

‫ومما يزيد األمور تعقيدًا‪،‬يف حين أن الضمانات التي توفرها نظرية التعلم الكالسيكية يمكن أن‬
‫تكون متحفظة حتى بالنسبة للنماذج الكالسيكية‪ ،‬فإنها تبدو عاجزة عن تفسير سبب تعميم‬
‫الشبكات العصبية العميقةيف المقام األول‪ .‬نظرًا ألن الشبكات العصبية العميقة قادرة على تركيب‬
‫تسميات عشوائية حتى لمجموعات البيانات الكبيرة‪ ،‬وعلى الرغم من استخدام طرق مألوفة مثل‬
‫التنظيم‪ ،‬فإن حدود التعميم التقليدية القائمة على التعقيد‪ ،‬على سبيل المثال‪ ،‬تلك القائمة على‬
‫بُعد ‪ VC‬أو تعقيد ‪ Rademacher‬لفئة فرضية ال يمكنها تفسير السبب تعمم الشبكات العصبية‪.‬‬
‫‪257‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Inspiration from Nonparametrics‬‬ ‫‪5.5.2‬‬


‫عند االقتراب من التعلم العميق ألول مرة‪ ،‬من المغري اعتبارها نماذج بارامترية‪ .‬بعد كل شيء‪،‬‬
‫النماذج لديها الماليين من المعلمات‪ .‬عندما نقوم بتحديث النماذج‪ ،‬نقوم بتحديث معلماتها‪.‬‬
‫عندما نحفظ النماذج‪ ،‬نكتب معلماتها على القرص‪ .‬ومع ذلك‪ ،‬فإن الرياضيات وعلوم الكمبيوتر‬
‫مليئة بالتغييرات غير البديهيةيف المنظور‪ ،‬وتبدو التشابهات المفاجئة مشاكل مختلفة على ما يبدو‪.‬‬
‫بينما تحتوي الشبكات العصبية بوضوح على معلمات‪ ،‬من بعض النواحي‪ ،‬قد يكون من المفيد‬
‫التفكير فيها على أنها تتصرف مثل النماذج الالمعلمية (غير البارامترية)‪ .‬إذن ما الذي يجعل‬
‫نموذجًا غير معلمي على وجه التحديد؟ بينما يغطي االسم مجموعة متنوعة من األساليب‪ ،‬فإن‬
‫أحد الموضوعات الشائعة هو أن األساليب الالمعلمية تميل إلى أن يكون لها مستوى من التعقيد‬
‫ينمو مع زيادة كمية البيانات المتاحة‪.‬‬

‫ربما يكون أبسط مثال على نموذج غير معلمي هو خوارزمية الجار األقرب ‪k-nearest‬‬
‫‪(neighbor‬سنغطي المزيد من النماذج الالمعلمية الحقًا‪ ،‬كمايف القسم ‪ .)11.2‬هنا‪،‬يف وقت‬
‫التدريب‪ ،‬يحفظ المتعلم ببساطة مجموعة البيانات‪ .‬ثم‪،‬يف وقت التنبؤ‪ ،‬عندما يواجه المتعلم نقطة‬
‫جديدة 𝐱 ‪ ،‬يبحث عن أقرب الجيران (𝑘 من النقاط ‪ 𝐱𝑖′‬تقلل من بعض المسافة ) ‪.)𝑑(𝐱, 𝐱𝑖′‬‬
‫عندما ‪ ، 𝑘 = 1‬تسمى هذه الخوارزمية ‪ ،1-nearest neighbors‬وستحقق الخوارزمية دائمًا‬
‫خطأ تدريب قدره صفر‪ .‬لكن هذا ال يعني أن الخوارزمية لن تعمم‪.‬يف الواقع‪ ،‬اتضح أنهيف ظل بعض‬
‫الظروف المعتدلة‪ ،‬تكون خوارزمية الجار األقرب متسقة (تتقاربيف النهاية إلى المتنبئ األمثل)‪.‬‬

‫الحظ أن أحد الجيران األقرب يتطلب أن نحدد بعض دوال المسافة 𝑑 ‪ ،‬أو بشكل مكافئ‪ ،‬أن‬
‫نحدد بعض دوال األساس ذات القيمة المتجهية )𝐱(𝜙 لتمييز بياناتنا‪ .‬ألي اختيار لمقياس‬
‫المسافة‪ ،‬سنحقق ‪ 0‬خطأ تدريب ونصليف النهاية إلى متنبئ مثالي‪ ،‬لكن مقاييس المسافة المختلفة‬
‫𝑑 ت شفر تحيزات استقرائية مختلفة وبكمية محدودة من البيانات المتاحة ستنتج تنبؤات مختلفة‪.‬‬
‫تمثل االختيارات المختلفة لمقياس المسافة 𝑑 افتراضات مختلفة حول األنماط األساسية‬
‫وسيعتمد أداء المتنبئين المختلفين على مدى توافق االفتراضات مع البيانات المرصودة‪.‬‬

‫بمعنى ما‪ ،‬نظرًا ألن الشبكات العصبية مفرطةيف المعلمات‪ ،‬وتمتلك العديد من المعلمات أكثر‬
‫مما هو مطلوب لمالءمة بيانات التدريب‪ ،‬فإنها تميل إلى استيفاء بيانات التدريب (لتناسبها تمامًا)‬
‫وبالتالي تتصرف‪،‬يف بعض النواحي‪ ،‬مثل النماذج الالمعلمية ‪ .nonparametric models‬أثبتت‬
‫األبحاث النظرية الحديثة ارتباطًا عميقًا بين الشبكات العصبية الكبيرة والطرق الالمعلمية‪ ،‬وال‬
‫سيما طرق النواة ‪ .kernel methods‬على وجه الخصوص‪ ،‬أظهر (‪ )2018 ،Jacot et al.‬أنه‬
‫في الحد األقصى‪ ،‬مع نمو البيرسيبترون متعدد الطبقات مع أوزان مُهيأة عشوائيًا بشكل ال نهائي‪،‬‬
‫تصبح مكافئة لطرق النواة (الالبارامترية) الختيار معين لدالة النواة ‪( kernel‬بشكل أساسي‪ ،‬دالة‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪258‬‬

‫المسافة)‪ ،‬والتي يسمونها نواة المماس العصبية ‪.neural tangent kernel‬يف حين أن نماذج‬
‫نواة المماس العصبية الحالية قد ال تفسر بشكل كامل سلوك الشبكات العميقة الحديثة‪ ،‬فإن‬
‫نجاحها كأداة تحليلية يؤكد فائدة النمذجة الالمعلمية لفهم سلوك الشبكات العميقة ذات‬
‫المعلمات المفرطة‪.‬‬

‫‪Early Stopping‬‬ ‫‪5.5.3‬‬


‫في حين أن الشبكات العصبية العميقة قادرة على مالئمة ‪ fitting‬تسميات عشوائية‪ ،‬حتى عندما‬
‫يتم تعيين التسميات بشكل غير صحيح أو عشوائي (‪ ،)2021 ،Zhang et al.‬فإن هذه القدرة‬
‫تظهر فقط عبر العديد من تكرارات التدريب‪ .‬كشف خط عمل جديد (‪)2017 ،Rolnick et al.‬‬
‫أنهيف إعداد ضوضاء التسمية‪ ،‬تميل الشبكات العصبية إلى احتواء البيانات المصنفة بشكل نظيف‬
‫أوالً وبعد ذلك فقط الستيفاء البيانات ذات التسمية الخاطئة ‪ .mislabeled data‬عالوة على‬
‫ذلك‪ ،‬فقد ثبت أن هذه الظاهرة تُترجم مباشرة إلى ضمان على التعميم‪ :‬فكلما كان النموذج مناسبًا‬
‫للبيانات المصنفة بشكل واضح ولكن ليس األمثلة المعنونة عشوائيًا المدرجةيف مجموعة‬
‫التدريب‪ ،‬فقد تم تعميمهيف الواقع (‪.)2021 ،Garg et al.‬‬

‫تساعد هذه النتائج معًايف تحفيز التوقف المبكر ‪ ،early stopping‬وهي تقنية كالسيكية لتنظيم‬
‫الشبكات العصبية العميقة‪ .‬هنا‪ ،‬بدالً من تقييد قيم األوزان بشكل مباشر‪ ،‬يقيد المرء عدد فترات‬
‫التدريب‪ .‬الطريقة األكثر شيوعًا لتحديد معايير التوقف هي مراقبة خطأ التحقق من الصحة خالل‬
‫التدريب (عادةً عن طريق التحقق مرة واحدة بعد كل فترة) وقطع التدريب عندما ال ينخفض‬
‫خطأ التحقق بأكثر من مقدار صغير لبعض الفترات‪ .‬هذا يسمى أحيانًا معايير الصبر ‪patience‬‬
‫‪ .criteria‬إلى جانب إمكانية أن يؤدي إلى تعميم أفضل‪،‬يف وضع التسميات الصاخبة ‪noisy‬‬
‫‪ ،labels‬هناك فائدة أخرى للتوقف المبكر وهي الوقت الذي يتم توفيره‪ .‬بمجرد استيفاء معايير‬
‫الصبر‪ ،‬يمكن للمرء إنهاء التدريب‪ .‬بالنسبة للنماذج الكبيرة التي قد تتطلب أيامًا من التدريبيف ‬
‫وقت واحد عبر ‪ 8‬وحدات معالجة رسومات أو أكثر‪ ،‬يمكن أن يوفر التوقف المبكر الذي يتم‬
‫ضبطه جيدًا على الباحثين أيامًا من الوقت ويمكن أن يوفر على أصحاب العمل عدة آالف من‬
‫الدوالرات‪.‬‬

‫والجدير بالذكر أنهيف حالة عدم وجود ضوضاء على التسمية وتكون مجموعات البيانات قابلة‬
‫للتحقيق (يمكن فصل الفئات حقًا‪ ،‬على سبيل المثال‪ ،‬التمييز بين القطط والكالب)‪ ،‬فإن التوقف‬
‫المبكر ال يؤدي إلى تحسينات كبيرةيف التعميم‪ .‬من ناحية أخرى‪ ،‬عندما يكون هناك ضوضاءيف ‬
‫التسمية‪ ،‬أو تباين جوهرييف التسمية (على سبيل المثال‪ ،‬التنبؤ بالوفيات بين المرضى)‪ ،‬فإن‬
‫التوقف المبكر أمر بالغ األهمية‪ .‬عادة ما تكون نماذج التدريب حتى تستكمل البيانات المزعجة‬
‫فكرة سيئة‪.‬‬
‫‪259‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Classical‬‬ ‫‪5.5.4‬‬
‫‪Regularization Methods for Deep Networks‬‬
‫في القسم ‪ ،3‬وصفنا العديد من تقنيات التنظيم الكالسيكية لتقييد تعقيد نماذجنا‪ .‬على وجه‬
‫الخصوص‪ ،‬قدم القسم ‪ 3.7‬طريقة تسمى انحالل الوزن ‪ ،weight decay‬والتي تتكون من‬
‫إضافة مصطلح تنظيم إلى دالة الخطأ لمعاقبة القيم الكبيرة لألوزان‪ .‬اعتمادًا على معيار الوزن الذي‬
‫يتم المعاقبة عليه‪ ،‬تُعرف هذه التقنية إما باسم تنظيم ‪( ridge‬للعقوبة ‪ )ℓ2‬أو تنظيم ‪( lasso‬للعقوبة‬
‫‪.)ℓ1‬يف التحليل الكالسيكي لهؤالء المنظمين‪ ،‬يُنظر إليهم على أنهم يقيدون القيم التي يمكن أن‬
‫تأخذها األوزان بشكل كافٍ لمنع النموذج من مالءمة التسميات العشوائية‪.‬‬

‫في تطبيقات التعلم العميق‪ ،‬يظل انحالل الوزن أداة شائعة‪ .‬ومع ذلك‪ ،‬فقد الحظ الباحثون أن‬
‫نقاط القوة النموذجية للتنظيم غير كافية لمنع الشبكات من استيفاء البيانات (‪،.Zhang et al‬‬
‫‪ .)2021‬وبالتالي فإن الفوائد إذا فُسرت على أنها تنظيم قد تكون منطقية فقط باالقتران مع معايير‬
‫التوقف المبكر‪.‬يف غياب التوقف المبكر‪ ،‬من الممكن أن تؤدي هذه األساليب إلى تعميم أفضل‪،‬‬
‫ليس ألنها تقيد بشكل هادف قوة الشبكة العصبية ولكن ألنها تقوم بطريقة ما بتشفير التحيزات‬
‫االستقرائية ‪ inductive biases‬التي تتوافق بشكل أفضل مع األنماط الموجودةيف مجموعات‬
‫بيانات االهتمامات‪ .‬وهكذا‪ ،‬يظل المنظمون الكالسيكيون شائعينيف تطبيقات التعلم العميق‪،‬‬
‫حتى لو كان األساس المنطقي النظري لفعاليتهم مختلفًا جذريًا‪.‬‬

‫والجدير بالذكر أن باحثي التعلم العميق قد اعتمدوا أيضًا على التقنيات التي تم تعميمها ألول مرة‬
‫في سياقات التنظيم الكالسيكية‪ ،‬مثل إضافة الضوضاء إلى مدخالت النموذج‪.‬يف القسم التالي‪،‬‬
‫سنقدم تقنية الحذف العشوائي(التسرب) ‪ dropout‬الشهيرة (التي ابتكرها سريفاستافا وآخرون‬
‫(‪ ،))2014‬والتي أصبحت الدعامة األساسية للتعلم العميق‪ ،‬حتى مع بقاء األساس النظري‬
‫لفعاليتها غامضًا بالمثل‪.‬‬

‫‪5.5.5‬‬
‫على عكس النماذج الخطية الكالسيكية‪ ،‬التي تميل إلى أن تحتوي على معلمات أقل من األمثلة‪،‬‬
‫تميل الشبكات العميقة إلى اإلفراطيف تحديد المعلمات‪ ،‬وفي معظم المهام تكون قادرة على‬
‫مالءمة مجموعة التدريب بشكل مثالي‪ .‬يتحدى نظام االستيفاء ‪ interpolation regime‬هذا‬
‫العديد من البديهيات الشديدة السرعة‪ .‬من الناحية الوظيفية‪ ،‬تبدو الشبكات العصبية مثل النماذج‬
‫البارامترية‪ .‬لكن التفكير فيها كنماذج غير معلمية يمكن أن يكون أحيانًا مصدرًا أكثر موثوقية‬
‫للحدس‪ .‬نظرًا ألنه غالبًا ما تكون جميع الشبكات العميقة قيد الدراسة قادرة على مالءمة جميع‬
‫تسميات التدريب‪ ،‬يجب أن تأتي جميع المكاسب تقريبًا عن طريق التخفيف من فرط التجهيز‬
‫(سد فجوة التعميم)‪ .‬ومن المفارقات أن التدخالت التي تقلل فجوة التعميم تظهر أحيانًا أنها تزيد‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪260‬‬

‫من تعقيد النموذج وفي أوقات أخرى يبدو أنها تقلل من التعقيد‪ .‬ومع ذلك‪ ،‬نادرًا ما تقلل هذه‬
‫األساليب التعقيد بما يكفي للنظرية الكالسيكية لشرح تعميم الشبكات العميقة‪ ،‬ولماذا تؤدي‬
‫بعض الخيارات إلى تحسين التعميم يظليف الغالب سؤالًا مفتوحًا كبيرًا على الرغم من الجهود‬
‫المتضافرة للعديد من الباحثين الالمعين‪.‬‬

‫‪5.5.6‬‬
‫‪ .1‬بأي معنى تفشل المقاييس التقليدية القائمة على التعقيديف تفسير تعميم الشبكات‬
‫العصبية العميقة؟‬
‫‪ .2‬لماذا يمكن اعتبار التوقف المبكر تقنية تنظيم ‪regularization technique‬؟‬
‫‪ .3‬كيف يحدد الباحثون عادة معايير التوقف ‪stopping criteria‬؟‬
‫‪ .4‬ما هو العامل المهم الذي يبدو أنه يميز الحاالت عندما يؤدي التوقف المبكر إلى‬
‫تحسينات كبيرةيف التعميم ‪generalization‬؟‬
‫‪ .5‬بعد التعميم‪ ،‬صف فائدة أخرى للتوقف المبكر ‪.early stopping‬‬

‫‪Dropout‬‬ ‫‪5.6‬‬
‫دعونا نفكر بإيجاز فيما نتوقعه من نموذج تنبؤي جيد ‪ .good predictive model‬نريدها أن‬
‫تعمل بشكل جيد على البيانات غير المرئية ‪ .unseen data‬تقترح نظرية التعميم الكالسيكية أنه‬
‫لسد الفجوة بين أداء التدريب واالختبار‪ ،‬يجب أن نهدف إلى نموذج بسيط‪ .‬يمكن أن تأتي البساطة‬
‫في شكل عدد صغير من األبعاد‪ .‬اكتشفنا ذلك عند مناقشة دوال األساس األحادي ‪monomial‬‬
‫‪ basis functions‬للنماذج الخطيةيف القسم ‪ .3.6‬باإلضافة إلى ذلك‪ ،‬كما رأينا عند مناقشة‬
‫تناقص الوزن (التنظيم ‪)ℓ2‬يف القسم ‪ ،3.7‬فإن المعيار ‪( norm‬العكسي) للمعلمات يمثل أيضًا‬
‫مقياسًا مفيدًا للبساطة‪ .‬مفهوم آخر مفيد للبساطة هو النعومة ‪ ،smoothness‬أي أن الدالة ال ينبغي‬
‫أن تكون حساسة للتغييرات الصغيرةيف مدخالتها‪ .‬على سبيل المثال‪ ،‬عندما نصنف الصور‪ ،‬نتوقع‬
‫أن تكون إضافة بعض الضوضاء العشوائية إلى وحدات البكسل غير ضارةيف الغالب‪.‬‬

‫في عام ‪ ،1995‬صاغ كريستوفر بيشوب هذه الفكرة عندما أثبت أن التدريب باستخدام ضوضاء‬
‫اإلدخال يعادل تنظيم تيخونوف ‪ .)1995 ،Bishop( Tikhonov regularization‬رسم هذا‬
‫العمل ارتباطًا رياضيًا واضحًا بين شرط أن تكون الدالة سلسة ‪( smooth‬وبالتالي بسيطة)‪،‬‬
‫ومتطلبات أن تكون مرنة ‪ resilient‬لالضطراباتيف المدخالت‪.‬‬

‫ثم‪،‬يف عام ‪ ،2014‬سريفاستافا وآخرون‪ )2014 ،.Srivastava et al( .‬فكرة ذكية عن كيفية‬
‫تطبيق فكرة بيشوب على الطبقات الداخلية للشبكة أيضًا‪ .‬تتضمن فكرتهم‪ ،‬المسماة الحذف‬
‫العشوائي (التسرب) ‪ ،dropout‬حقن الضوضاء أثناء حساب كل طبقة داخلية أثناء االنتشار‬
‫األمامي‪ ،‬وقد أصبحت تقنية قياسية لتدريب الشبكات العصبية‪ .‬تسمى هذه الطريقة بـ ‪dropout‬‬
‫‪261‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫ألننا حرفيا نتخلى عن بعض الخاليا العصبية أثناء التدريب‪ .‬خالل التدريب‪،‬يف كل تكرار‪ ،‬يتكون‬
‫الحذف العشوائي القياسي من تصفية جزء من العقديف كل طبقة قبل حساب الطبقة التالية‪.‬‬

‫لكي نكون واضحين‪ ،‬نحن نفرض روايتنا الخاصة باالرتباط بـبيشوب‪ .‬تقدم الورقة األصلية حول‬
‫‪ dropout‬حدسًا من خالل تشبيه مدهش للتكاثر الجنسي‪ .‬يجادل المؤلفون بأن فرط التجهيز‬
‫ل لشبكة العصبية يتميز بحالة تعتمد فيها كل طبقة على نمط معين من التنشيطاتيف الطبقة السابقة‪،‬‬
‫مما يطلق على هذا الشرط التكيف المشترك ‪ .condition co-adaptation‬وهم يزعمون أن‬
‫‪ dropout‬يؤدي إلى تفكك التكيف المشترك تمامًا كما يُقال إن التكاثر الجنسي يفكك الجينات‬
‫المتكيفة معًا‪.‬يف حين أن شرح هذه النظرية مطروح للنقاش بالتأكيد‪ ،‬فقد أثبت أسلوب ‪dropout‬‬
‫نفسه أنه ثابت‪ ،‬ويتم تنفيذ أشكال مختلفة من ‪dropout‬يف معظم مكتبات التعلم العميق‪.‬‬

‫التحدي ال رئيسي هو كيفية ضخ هذه الضوضاء‪ .‬تتمثل إحدى األفكاريف حقن الضوضاء بطريقة‬
‫غير منحازة بحيث تكون القيمة المتوقعة لكل طبقة ‪ -‬أثناء تثبيت الطبقات األخرى ‪ -‬مساوية‬
‫للقيمة التي كانت ستأخذهايف غياب الضوضاء‪.‬يف عمل بيشوب‪ ،‬أضاف ضوضاء غاوسية إلى‬
‫المدخالت إلى نموذج خطي‪.‬يف كل تكرار تدريبي‪ ،‬أضاف ضوضاء مأخوذة من توزيع بمتوسط‬
‫صفر ) ‪ 𝜖 ∼ 𝒩(0, 𝜎 2‬إلى المدخالت 𝐱 ‪ ،‬مما أسفر عن نقطة مضطربة 𝜖 ‪.𝐱 ′ = 𝐱 +‬يف توقع‬
‫𝐱 = ] ‪.𝐸[𝐱 ′‬‬

‫في تنظيم ‪ dropout‬القياسي‪ ،‬يقوم أحد األصفار بإزالة بعض أجزاء العقديف كل طبقة ثم يقوم‬
‫بإزالة الحواف من كل طبقة عن طريق التسوية بواسطة جزء العقد التي تم االحتفاظ بها (غير‬
‫المسقطة او المحذوفة ‪ .)not dropped out‬بمعنى آخر‪ ،‬مع احتمال الحذف العشوائي 𝑝 ‪،‬‬
‫يتم استبدال كل تنشيط وسيط ‪ ℎ‬بمتغير عشوائي ‪ ℎ′‬على النحو التالي‪:‬‬

‫‪0‬‬ ‫𝑝 ‪with probability‬‬


‫‪′‬‬
‫‪ℎ ={ ℎ‬‬
‫‪otherwise‬‬
‫𝑝‪1−‬‬

‫حسب التصميم‪ ،‬يظل التوقع دون تغيير‪ ،‬أي ‪.𝐸[ℎ′ ] = ℎ‬‬

‫‪Dropout in Practice‬‬ ‫‪5.6.1‬‬


‫تذكر ‪ MLP‬بطبقة مخفية و‪ 5‬وحدات مخفيةيف الشكل ‪ .5.1.1‬عندما نطبق ‪ dropout‬على‬
‫طبقة مخفية‪ ،‬مع استبعاد كل وحدة مخفية باحتمالية‪ ،‬يمكن عرض النتيجة كشبكة تحتوي فقط‬
‫على مجموعة فرعية من الخاليا العصبية األصلية‪.‬يف الشكل ‪ ℎ2 ،5.6.1‬و ‪ ℎ5‬تتم إزالتها‪.‬‬
‫وبالتالي‪ ،‬فإن حساب النواتج لم يعد يعتمد على ‪ ℎ2‬أو ‪ ℎ5‬والتدرج الخاص بكل منها يختفي‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪262‬‬

‫أيضًا عند إجراء االنتشار الخلفي‪ .‬بهذه الطريقة‪ ،‬ال يمكن أن يعتمد حساب طبقة المخرجات‬
‫بشكل مفرط على أي عنصر واحد من ‪.ℎ1 , … , ℎ5‬‬

‫الشكل ‪ MLP 5.6.1‬قبل وبعد ‪.dropout‬‬

‫عادة‪ ،‬نقوم بتعطيل ‪dropout‬يف وقت االختبار‪ .‬بالنظر إلى نموذج مدرب ومثال جديد‪ ،‬فإننا ال‬
‫نتجاهل أي عقد وبالتالي ال نحتاج إلى التسوية ‪ .normalization‬ومع ذلك‪ ،‬هناك بعض‬
‫االستثناءات‪ :‬يستخدم بعض الباحثين ‪dropout‬يف وقت االختبار كإرشاد لتقدير عدم اليقين‬
‫‪uncertainty‬يف تنبؤات الشبكة العصبية‪ :‬إذا اتفقت التوقعات عبر العديد من أقنعة ‪dropout‬‬
‫المختلفة‪ ،‬فقد نقول إن الشبكة أكثر ثقة‪.‬‬

‫‪Implementation from Scratch‬‬ ‫‪5.6.2‬‬


‫لتنفيذ دالة ‪ dropout‬لطبقة واحدة‪ ،‬يجب علينا سحب أكبر عدد ممكن من العينات من متغير‬
‫برنولي العشوائي (ثنائي) حيث تحتوي الطبقة الخاصة بنا على أبعاد‪ ،‬حيث يأخذ المتغير العشوائي‬
‫قيمة ‪( 1‬احتفظ بها) مع االحتمال 𝑝 ‪ 1 −‬و‪( 0‬إسقاط ‪ )dropout‬مع االحتمال 𝑝‪ .‬تتمثل إحدى‬
‫الطرق السهلة لتنفيذ ذلكيف سحب عينات أوالً من التوزيع المنتظم ]‪ .𝑈[0,1‬ثم يمكننا االحتفاظ‬
‫بتلك العقد التي تكون العينة المقابلة لها أكبر من 𝑝 ‪ ،‬وإسقاط الباقي‪.‬‬

‫في الكود التالي‪ ،‬نقوم بتنفيذ دالة ‪ dropout_layer‬التي تسقط العناصريف إدخال الموتر ‪X‬‬
‫مع احتمال ‪ ،dropout‬مع إعادة قياس الباقي كما هو موضح أعاله‪ :‬قسمة الناجين على ‪1.0-‬‬
‫‪.dropout‬‬

‫‪import tensorflow as tf‬‬


‫‪from d2l import tensorflow as d2l‬‬

‫‪def dropout_layer(X, dropout):‬‬


‫‪assert 0 <= dropout <= 1‬‬
263 ‫ البيرسيبترون متعدد الطبقات‬:‫الفصل الخامس‬

if dropout == 1: return tf.zeros_like(X)


mask = tf.random.uniform(
shape=tf.shape(X), minval=0, maxval=1) < 1 -
dropout
return tf.cast(mask, dtype=tf.float32) * X / (1.0 -
dropout)
‫ نقوم بتمرير‬،‫يف سطور الكود التالية‬.‫ على بعض األمثلة‬dropout_layer r ‫يمكننا اختبار دالة‬
‫ على‬1 ‫ و‬0.5 ‫ و‬0 ‫ مع االحتماالت‬،dropout ‫ الخاص بنا من خالل عملية التسرب‬X ‫اإلدخال‬
.‫التوالي‬

X = tf.reshape(tf.range(16, dtype=tf.float32), (2, 8))


print('dropout_p = 0:', dropout_layer(X, 0))
print('dropout_p = 0.5:', dropout_layer(X, 0.5))
print('dropout_p = 1:', dropout_layer(X, 1))
dropout_p = 0: tf.Tensor(
[[ 0. 1. 2. 3. 4. 5. 6. 7.]
[ 8. 9. 10. 11. 12. 13. 14. 15.]], shape=(2, 8),
dtype=float32)
dropout_p = 0.5: tf.Tensor(
[[ 0. 0. 0. 6. 0. 0. 12. 0.]
[16. 18. 20. 0. 0. 0. 0. 0.]], shape=(2, 8),
dtype=float32)
dropout_p = 1: tf.Tensor(
[[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]], shape=(2, 8),
dtype=float32)
Defining the Model 5.6.2.1
‫ يمكننا تعيين‬.)‫ على إخراج كل طبقة مخفية (باتباع دالة التنشيط‬dropout ‫يطبق النموذج أدناه‬
dropout ‫ يتمثل االتجاه الشائعيف تعيين احتمالية‬.‫ لكل طبقة على حدة‬dropout ‫احتماالت‬
.‫ نشط فقط أثناء التدريب‬dropout ‫ نحن نضمن أن‬.‫أقل بالقرب من طبقة اإلدخال‬

class DropoutMLPScratch(d2l.Classifier):
def __init__(self, num_outputs, num_hiddens_1,
num_hiddens_2,
dropout_1, dropout_2, lr):
super().__init__()
self.save_hyperparameters()
self.lin1 = tf.keras.layers.Dense(num_hiddens_1,
activation='relu')
‫ األساسيات والمقدمات‬:‫التعمق في التعلم العميق‬ 264

self.lin2 = tf.keras.layers.Dense(num_hiddens_2,
activation='relu')
self.lin3 = tf.keras.layers.Dense(num_outputs)

def forward(self, X):


H1 = self.lin1(tf.reshape(X, (X.shape[0], -1)))
if self.training:
H1 = dropout_layer(H1, self.dropout_1)
H2 = self.lin2(H1)
if self.training:
H2 = dropout_layer(H2, self.dropout_2)
return self.lin3(H2)
Training 5.6.2.2
.‫ الموصوف سابقًا‬MLPs ‫ما يلي مشابه لتدريب‬

hparams = {'num_outputs':10, 'num_hiddens_1':256,


'num_hiddens_2':256,
'dropout_1':0.5, 'dropout_2':0.5, 'lr':0.1}
model = DropoutMLPScratch(**hparams)
data = d2l.FashionMNIST(batch_size=256)
trainer = d2l.Trainer(max_epochs=10)
trainer.fit(model, data)

Concise Implementation 5.6.3


‫ كل ما نحتاج إلى القيام به هو إضافة‬،‫ عالية المستوى‬API ‫باستخدام واجهات برمجة التطبيقات‬
‫ باعتباره الوسيطة‬Dropout ‫ لتمرير احتمال‬،‫ بعد كل طبقة متصلة بالكامل‬Dropout ‫طبقة‬
‫ بشكل عشوائي مخرجات الطبقة‬Dropout ‫ ستسقط طبقة‬،‫ أثناء التدريب‬.‫الوحيدة لمنشئها‬
.‫ المحدد‬Dropout ‫ المدخالت إلى الطبقة الالحقة) وفقًا الحتمال‬،‫السابقة (أو بشكل مكافئ‬
265 ‫ البيرسيبترون متعدد الطبقات‬:‫الفصل الخامس‬

‫ ببساطة بتمرير البيانات من خاللها أثناء‬Dropout ‫ تقوم طبقة‬،‫عندما ال تكونيف وضع التدريب‬
.‫االختبار‬

class DropoutMLP(d2l.Classifier):
def __init__(self, num_outputs, num_hiddens_1,
num_hiddens_2,
dropout_1, dropout_2, lr):
super().__init__()
self.save_hyperparameters()
self.net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(num_hiddens_1,
activation=tf.nn.relu),
tf.keras.layers.Dropout(dropout_1),
tf.keras.layers.Dense(num_hiddens_2,
activation=tf.nn.relu),
tf.keras.layers.Dropout(dropout_2),
tf.keras.layers.Dense(num_outputs)])
.‫ نقوم بتدريب النموذج‬،‫بعد ذلك‬

model = DropoutMLP(**hparams)
trainer.fit(model, data)
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪266‬‬

‫‪5.6.4‬‬
‫إلى جانب التحكميف عدد األبعاد وحجم متجه الوزن ‪ ،weight vector‬فإن‬ ‫•‬
‫‪ Dropout‬هو أداة أخرى لتجنب الضبط الزائد ‪ .overfitting‬غالبا ما يتم استخدامها‬
‫بشكل مشترك‪.‬‬
‫يستبدل ‪ Dropout‬التنشيط ‪ ℎ‬بمتغير عشوائي ذي قيمة متوقعة ‪.ℎ‬‬ ‫•‬
‫يستخدم ‪ Dropout‬فقط أثناء التدريب‪.‬‬ ‫•‬

‫‪5.6.5‬‬
‫‪ .1‬ماذا يحدث إذا قمت بتغيير احتماالت ‪ Dropout‬للطبقتين األولى والثانية؟ على وجه‬
‫الخصوص‪ ،‬ماذا يحدث إذا قمت بتبديل الطبقات لكلتا الطبقتين؟ صمم تجربة لإلجابة‬
‫على هذه األسئلة‪ ،‬ووصف نتائجك من الناحية الكمية‪ ،‬ولخص النتائج النوعية‪.‬‬
‫‪ .2‬قم بزيادة عدد الفترات ‪ number of epochs‬ومقارنة النتائج التي تم الحصول عليها‬
‫عند استخدام ‪ Dropout‬مع تلك التي تم الحصول عليها عند عدم استخدامها‪.‬‬
‫‪ .3‬ما هو تباين التنشيطاتيف كل طبقة مخفية عندما يتم تطبيق ‪ Dropout‬وال يتم تطبيقه؟‬
‫ارسم مخططًا إلظهار كيفية تطور هذه الكمية بمرور الوقت لكال النموذجين‪.‬‬
‫‪ .4‬لماذا ال يتم استخدام ‪ Dropout‬عادةيف وقت االختبار ‪test time‬؟‬
‫‪ .5‬باستخدام النموذجيف هذا القسم كمثال‪ ،‬قارن بين تأثيرات استخدام ‪Dropout‬‬
‫وتناقص الوزن ‪ .weight decay‬ماذا يحدث عند استخدام ‪ Dropout‬وتناقص الوزن‬
‫في نفس الوقت؟ هل النتائج مضافة؟ هل هناك عوائد متناقصة (أو أسوأ)؟ هل يلغون‬
‫بعضهم البعض؟‬
‫‪ .6‬ماذا يحدث إذا طبقنا ‪ Dropout‬على األوزان الفردية لمصفوفة الوزن بدالً من‬
‫التنشيطات؟‬
‫‪ .7‬اخترع تقنية أخرى لحقن ضوضاء عشوائيةيف كل طبقة تختلف عن تقنية ‪Dropout‬‬
‫القياسية‪ .‬هل يمكنك تطوير طريقة تتفوقيف األداء على مجموعة بيانات ‪Fashion-‬‬
‫‪( MNIST‬للهندسة المعمارية الثابتة)؟‬

‫‪Predicting House Prices on‬‬ ‫‪5.7‬‬


‫‪Kaggle‬‬
‫اآلن بعد أن قدمنا بعض األدوات األساسية لبناء وتدريب شبكات عميقة وتنظيمها باستخدام‬
‫تقنيات بمايف ذلك تناقص الوزن و ‪ ،dropout‬نحن على استعداد لوضع كل هذه المعرفة موضع‬
‫التنفيذ من خالل المشاركةيف مسابقة ‪ . Kaggle‬تعتبر مسابقة التنبؤ بأسعار المنزل مكانًا رائعًا‬
‫للبدء‪ .‬البيانات عامة إلى حد ما وال تظهر بنية غريبة قد تتطلب نماذج متخصصة (مثل الصوت‬
‫‪267‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫أو الفيديو)‪ .‬مجموعة البيانات هذه‪ ،‬التي جمعها ‪ Bart de Cock‬في عام ‪،De Cock( ،2011‬‬
‫‪ ،)2011‬تغطي أسعار المنازليف ‪IA ، Ames‬من الفترة ‪ .2010-2006‬إنه أكبر بكثير من‬
‫مجموعة بيانات اإلسكان الشهيرةيف بوسطن ‪ Boston housing dataset‬لهاريسون وروبينفيلد‬
‫(‪ ،)1978‬ويضم المزيد من األمثلة والمزيد من الميزات‪.‬‬

‫في هذا القسم‪ ،‬سنرشدك إلى تفاصيل المعالجة المسبقة للبيانات وتصميم النموذج واختيار‬
‫المعلمة الفائقة‪ .‬نأمل أن تكتسب من خالل نهج عملي بعض البديهيات التي ستوجهكيف حياتك‬
‫المهنية كعالم بيانات‪.‬‬

‫‪Downloading Data‬‬ ‫‪5.7.1‬‬


‫خالل الكتاب‪ ،‬سنقوم بتدريب واختبار النماذج على مجموعات البيانات المختلفة التي تم‬
‫تنزيلها‪ .‬هنا‪ ،‬نقوم بتنفيذ دالتين مفيدتين لتنزيل الملفات واستخراج ملفات ‪ zip‬أو ‪ .tar‬مرة‬
‫أخرى‪ ،‬نرجئ تنفيذها إلى القسم ‪.20.7‬‬

‫‪def download(url, folder, sha1_hash=None):‬‬


‫‪"""Download a file to folder and return the local‬‬
‫"""‪filepath.‬‬

‫‪def extract(filename, folder):‬‬


‫"""‪"""Extract a zip/tar file into folder.‬‬

‫الشكل ‪ 5.7.1‬موقع ‪ Kaggle‬اإللكتروني‪.‬‬


‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪268‬‬

‫‪Kaggle 5.7.2‬‬
‫‪ Kaggle‬هي منصة شهيرة تستضيف مسابقات التعلم اآللي‪ .‬تركز كل مسابقة على مجموعة‬
‫بيانات والعديد منها برعاية أصحاب المصلحة الذين يقدمون جوائز للحلول الفائزة‪ .‬تساعد‬
‫المنصة المستخدمين على التفاعل عبر المنتديات واالكواد المشتركة‪ ،‬مما يعزز التعاون‬
‫والمنافسة‪.‬يف حين أن مطاردة المتصدرين غالبًا ما تخرج عن نطاق السيطرة‪ ،‬مع تركيز الباحثين‬
‫على خطوات المعالجة المسبقة بدالً من طرح األسئلة األساسية‪ ،‬هناك أيضًا قيمة هائلةيف ‬
‫موضوعية النظام األساسي الذي يسهل المقارنات الكمية المباشرة بين األساليب المتنافسة‬
‫باإلضافة إلى مشاركة الكود بحيث يمكن للجميع أن يتعلموا ما نجح وما لم ينجح‪ .‬إذا كنت ترغب‬
‫في المشاركةيف مسابقة ‪ ،Kaggle‬فستحتاج أوالً إلى التسجيل للحصول على حساب (انظر الشكل‬
‫‪.)5.7.1‬‬

‫في صفحة مسابقة التنبؤ بسعر المنزل‪ ،‬كما هو موضحيف الشكل ‪ ،5.7.2‬يمكنك العثور على‬
‫مجموعة البيانات (ضمن عالمة التبويب "البيانات")‪ ،‬وإرسال التنبؤات‪ ،‬واالطالع على الترتيب‬
‫الخاص بك‪ ،‬عنوان ‪ URL‬موجود هنا‪:‬‬

‫‪https://www.kaggle.com/c/house-prices-advanced-regression-‬‬
‫‪techniques‬‬

‫شكل ‪ 5.7.2‬صفحة مسابقة التنبؤ بسعر المنزل‪.‬‬

‫‪Accessing and Reading‬‬ ‫‪5.7.3‬‬


‫‪the Dataset‬‬
‫الحظ أن بيانات المسابقة مقسمة إلى مجموعات تدريب ‪ training‬واختبار ‪ .test‬يتضمن كل‬
‫سجل قيمة ممتلكات المنزل والسمات مثل نوع الشارع ‪ street type‬وسنة البناء ‪year of‬‬
‫‪269‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪ construction‬ونوع السقف ‪ roof type‬وحالة الطابق السفلي ‪ basement condition‬وما‬


‫إلى ذلك‪ .‬تتكون الميزات من أنواع بيانات مختلفة‪ .‬على سبيل المثال‪ ،‬يتم تمثيل سنة البناء بعدد‬
‫صحيح‪ ،‬ونوع السقف بالتخصيصات الفئوية المنفصلة‪ ،‬والميزات األخرى بأرقام الفاصلة‬
‫العائمة‪ .‬وهنا حيث يعقد الواقع األشياء‪ :‬بالنسبة لبعض األمثلة‪ ،‬بعض البيانات مفقودة تمامًا مع‬
‫وضع عالمة على القيمة المفقودة ببساطة على أنها "‪ ."na‬سعر كل منزل مشموليف مجموعة‬
‫التدريب فقط (إنها منافسة بعد كل شيء)‪ .‬سنرغبيف تقسيم مجموعة التدريب إلنشاء مجموعة‬
‫التحقق من الصحة ‪ ،validation set‬لكننا فقط نقوم بتقييم نماذجنا على مجموعة االختبار‬
‫الرسمية بعد تحميل التنبؤات إلى ‪ .Kaggle‬تحتوي عالمة التبويب "البيانات"يف عالمة تبويب‬
‫المنافسةيف الشكل ‪ 5.7.2‬على روابط لتنزيل البيانات‪.‬‬

‫‪%matplotlib inline‬‬
‫‪import numpy as np‬‬
‫‪import pandas as pd‬‬
‫‪import tensorflow as tf‬‬
‫‪from d2l import tensorflow as d2l‬‬
‫للبدء‪ ،‬سنقرأ البيانات ونعالجها باستخدام ‪ ،pandas‬والتي قدمناهايف القسم ‪ .2.2‬للسهولة‪،‬‬
‫يمكننا تنزيل مجموعة بيانات اإلسكان ‪ Kaggle‬وتخزينها مؤقتًا‪ .‬إذا كان الملف المطابق‬
‫لمجموعة البيانات هذه موجودًا بالفعليف دليل ذاكرة التخزين المؤقت وكان ‪ SHA-1‬يتطابق‬
‫مع ‪ ،sha1_hash‬فسيستخدم الكود الخاص بنا الملف المخزن مؤقتًا لتجنب انسداد اإلنترنت‬
‫بالتنزيالت الزائدة عن الحاجة‪.‬‬

‫‪class KaggleHouse(d2l.DataModule):‬‬
‫‪def __init__(self, batch_size, train=None,‬‬
‫‪val=None):‬‬
‫)(__‪super().__init‬‬
‫)(‪self.save_hyperparameters‬‬
‫‪if self.train is None:‬‬
‫(‪self.raw_train = pd.read_csv(d2l.download‬‬
‫‪d2l.DATA_URL +‬‬
‫‪'kaggle_house_pred_train.csv', self.root,‬‬

‫))'‪sha1_hash='585e9cc93e70b39160e7921475f9bcd7d31219ce‬‬
‫(‪self.raw_val = pd.read_csv(d2l.download‬‬
‫‪d2l.DATA_URL +‬‬
‫‪'kaggle_house_pred_test.csv', self.root,‬‬

‫))'‪sha1_hash='fa19780a7b011d9b009e8bff8e99922a8ee2eb90‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪270‬‬

‫تتضمن مجموعة بيانات التدريب ‪ 1460‬مثاالً و‪ 80‬ميزة و‪ 1‬تسمية‪ ،‬بينما تحتوي بيانات التحقق‬
‫من الصحة على ‪ 1459‬مثاالً و‪ 80‬ميزة‪.‬‬

‫)‪data = KaggleHouse(batch_size=64‬‬
‫)‪print(data.raw_train.shape‬‬
‫)‪print(data.raw_val.shape‬‬
‫‪Downloading ../data/kaggle_house_pred_train.csv from‬‬
‫‪http://d2l-data.s3-‬‬
‫‪accelerate.amazonaws.com/kaggle_house_pred_train.csv...‬‬
‫‪Downloading ../data/kaggle_house_pred_test.csv from‬‬
‫‪http://d2l-data.s3-‬‬
‫‪accelerate.amazonaws.com/kaggle_house_pred_test.csv...‬‬
‫)‪(1460, 81‬‬
‫)‪(1459, 80‬‬
‫‪Data Preprocessing‬‬ ‫‪5.7.4‬‬
‫دعنا نلقي نظرة على الميزات األربع األولى واألخيرة باإلضافة إلى التصنيف (سعر البيع‬
‫‪ )SalePrice‬من األمثلة األربعة األولى‪.‬‬

‫)]]‪print(data.raw_train.iloc[:4, [0, 1, 2, 3, -3, -2, -1‬‬


‫‪Id‬‬ ‫‪MSSubClass MSZoning‬‬ ‫‪LotFrontage SaleType SaleCondition‬‬ ‫‪SalePrice‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪60‬‬ ‫‪RL‬‬ ‫‪65.0‬‬ ‫‪WD‬‬ ‫‪Normal‬‬ ‫‪208500‬‬
‫‪1‬‬ ‫‪2‬‬ ‫‪20‬‬ ‫‪RL‬‬ ‫‪80.0‬‬ ‫‪WD‬‬ ‫‪Normal‬‬ ‫‪181500‬‬
‫‪2‬‬ ‫‪3‬‬ ‫‪60‬‬ ‫‪RL‬‬ ‫‪68.0‬‬ ‫‪WD‬‬ ‫‪Normal‬‬ ‫‪223500‬‬
‫‪3‬‬ ‫‪4‬‬ ‫‪70‬‬ ‫‪RL‬‬ ‫‪60.0‬‬ ‫‪WD‬‬ ‫‪Abnorml‬‬ ‫‪140000‬‬
‫يمكننا أن نرى أنهيف كل مثال‪ ،‬الميزة األولى هي المعرف ‪ .ID‬هذا يساعد النموذج على تحديد‬
‫كل مثال تدريب‪.‬يف حين أن هذا مناسب‪ ،‬إال أنه ال يحمل أي معلومات ألغراض التنبؤ‪ .‬ومن ثم‪،‬‬
‫سنقوم بإزالته من مجموعة البيانات قبل إدخال البياناتيف النموذج‪ .‬إلى جانب ذلك‪ ،‬بالنظر إلى‬
‫مجموعة متنوعة من أنواع البيانات‪ ،‬سنحتاج إلى معالجة البيانات مسبقًا قبل أن نبدأيف النمذجة‬
‫‪.modeling‬‬

‫لنبدأ بالسمات العددية ‪ .numerical features‬أوالً‪ ،‬نطبق االستدالل ‪ ،heuristic‬مع استبدال‬


‫جميع القيم المفقودة ‪ missing values‬بمتوسط الميزة المقابلة‪ .‬بعد ذلك‪ ،‬لوضع جميع‬
‫الميزات على مقياس مشترك‪ ،‬نقوم بتوحيد البيانات عن طريق إعادة قياس الميزات إلى صفر‬
‫متوسط ‪ zero mean‬وتباين الوحدة ‪:unit variance‬‬
‫𝜇‪𝑥−‬‬
‫←𝑥‬ ‫‪,‬‬
‫𝜎‬
271 ‫ البيرسيبترون متعدد الطبقات‬:‫الفصل الخامس‬

‫ للتحقق من أن هذا يحول‬.‫ على التوالي‬،‫حيث 𝜇 و 𝜎 تشير إلى المتوسط واالنحراف المعياري‬
𝑥−𝜇
𝐸[ 𝜎
] = ‫ الحظ ذلك‬،‫بالفعل ميزتنا (المتغير) بحيث ال يحتوي متوسط صفر وتباين وحدة‬
𝜇−𝜇
‫ نقوم‬،‫ بشكل حدسي‬. 𝐸[(𝑥 − 𝜇)2 ] = (𝜎 2 + 𝜇2 ) − 2𝜇2 + 𝜇2 = 𝜎 2 ‫وذلك‬ 𝜎
=0
‫ نظرًا ألننا ال نعرف مسبقًا أي‬،‫ ثانيًا‬.‫ ثبت أنه مناسب للتحسين‬،ً‫ أوال‬.‫بتوحيد البيانات لسببين‬
‫ ال نريد معاقبة المعامالت المخصصة لميزة واحدة أكثر من أي ميزة‬،‫الميزات ستكون ذات صلة‬
.‫أخرى‬

‫ يتضمن ذلك ميزات مثل‬.discrete values ‫بعد ذلك نتعامل مع القيم المتقطعة‬
‫ بنفس الطريقة‬one-hot encoding ‫ نقوم باستبدالها بترميز واحد ساخن‬."MSZoning"
‫ على‬.)4.1.1 ‫التي قمنا بها سابقًا بتحويل التسميات متعددة الفئات إلى متجهات (انظر القسم‬
‫ بإسقاط ميزة‬."RM" ‫" و‬RL" ‫" القيمتين‬MSZoning" ‫ تفترض‬،‫سبيل المثال‬
‫و‬ "MSZoning_RL" ‫للمؤشر‬ ‫جديدتين‬ ‫ميزتين‬ ‫إنشاء‬ ‫يتم‬ ،”MSZoning"
‫ إذا كانت القيمة األصلية‬،‫ وفقًا للترميز الواحد الساخن‬.1 ‫ أو‬0 ‫" بقيم إما‬MSZoning_RM"
MSZoning_RM“‫ و‬1 ‫” تساوي‬MSZoning_RL ‫ القيمة‬،”RL" ‫" هي‬MSZoning" ‫لـ‬
.‫تقوم بذلك تلقائيًا لنا‬pandas ‫ حزمة‬.0 ‫”تساوي‬

@d2l.add_to_class(KaggleHouse)
def preprocess(self):
# Remove the ID and label columns
label = 'SalePrice'
features = pd.concat(
(self.raw_train.drop(columns=['Id', label]),
self.raw_val.drop(columns=['Id'])))
# Standardize numerical columns
numeric_features = features.dtypes[features.dtypes
!= 'object'].index
features[numeric_features] =
features[numeric_features].apply(
lambda x: (x - x.mean()) / (x.std()))
# Replace NAN numerical features by 0
features[numeric_features] =
features[numeric_features].fillna(0)
# Replace discrete features by one-hot encoding.
features = pd.get_dummies(features, dummy_na=True)
# Save preprocessed features
self.train =
features[:self.raw_train.shape[0]].copy()
self.train[label] = self.raw_train[label]
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪272‬‬

‫)(‪self.val = features[self.raw_train.shape[0]:].copy‬‬
‫يمكنك أن ترى أن هذا التحويل يزيد عدد الميزات من ‪ 79‬إلى ‪( 331‬باستثناء أعمدة المعرف‬
‫‪ ID‬والتسمية ‪.)label‬‬

‫)(‪data.preprocess‬‬
‫‪data.train.shape‬‬
‫)‪(1460, 332‬‬
‫‪Error Measure‬‬ ‫‪5.7.5‬‬
‫للبدء‪ ،‬سنقوم بتدريب نموذج خطي بخسارة مربعة ‪ .squared loss‬ليس من المستغرب أن‬
‫نموذجنا الخطي لن يؤدي إلى إرسال فائز بالمنافسة ولكنه يوفر فحصًا للعقل لمعرفة ما إذا كانت‬
‫هناك معلومات مفيدةيف البيانات‪ .‬إذا لم نتمكن من القيام بما هو أفضل من التخمين العشوائي‬
‫هنا‪ ،‬فقد تكون هناك فرصة جيدة لوجود خطأيف معالجة البيانات‪ .‬وإذا نجحت األشياء‪ ،‬فسيكون‬
‫النموذج الخطي بمثابة خط أساس يمنحنا بعض الحدس حول مدى قرب النموذج البسيط من‬
‫أفضل النماذج المبلغ عنها‪ ،‬مما يمنحنا إحساسًا بمدى المكاسب التي يجب أن نتوقعها من‬
‫النماذج األكثر رواجًا‪.‬‬

‫مع أسعار المساكن‪ ،‬كما هو الحال مع أسعار األسهم‪ ،‬نهتم بالكميات النسبية أكثر من الكميات‬
‫^‬
‫^‬ ‫𝑦‪𝑦−‬‬
‫من الخطأ المطلق 𝑦 ‪.𝑦 −‬‬ ‫𝑦‬
‫المطلقة‪ .‬وبالتالي فإننا نميل إلى االهتمام أكثر بالخطأ النسبي‬
‫على سبيل المثال‪ ،‬إذا تم إيقاف توقعنا بمقدار ‪100,000‬دوالر أمريكي عند تقدير سعر منزليف ‬
‫ريف أوهايو‪ ،‬حيث تبلغ قيمة المنزل النموذجي ‪125,000‬دوالر أمريكي‪ ،‬فمن المحتمل أننا نقوم‬
‫بعمل رهيب‪ .‬من ناحية أخرى‪ ،‬إذا أخطأنا بهذا المبلغيف لوس ألتوس هيلز‪ ،‬كاليفورنيا‪ ،‬فقد يمثل‬
‫هذا تنبوًا دقيقًا بشكل مذهل (هناك‪ ،‬يتجاوز متوسط سعر المنزل ‪ 4‬ماليين دوالر أمريكي)‪.‬‬

‫تتمثل إحدى طرق معالجة هذه المشكلةيف قياس التناقضيف لوغاريتم تقديرات األسعار‪.‬يف الواقع‪،‬‬
‫يعد هذا أيضًا مقياس الخطأ الرسمي الذي تستخدمه المسابقة لتقييم جودة الطلبات المقدمة‪.‬‬
‫^‬
‫𝑦‬ ‫^‬
‫≤ 𝛿‪ . 𝑒 −‬يؤدي‬ ‫بعد كل شيء‪ ،‬قيمة صغيرة 𝛿 لـ 𝛿 ≤ |𝑦 ‪ |log 𝑦 − log‬تترجم إلى 𝛿 𝑒 ≤‬
‫𝑦‬
‫هذا إلى الخطأ الجذر التربيعي ‪ root-mean-squared-error‬التالي بين لوغاريتم السعر‬
‫المتوقع ‪ predicted price‬ولوغاريتم سعر التسمية ‪:label price‬‬

‫𝑛‬
‫‪1‬‬ ‫^‬
‫∑ √‬ ‫‪(log 𝑦𝑖 − log 𝑦𝑖 )2 .‬‬
‫𝑛‬
‫‪𝑖=1‬‬

‫)‪@d2l.add_to_class(KaggleHouse‬‬
‫‪def get_dataloader(self, train):‬‬
273 ‫ البيرسيبترون متعدد الطبقات‬:‫الفصل الخامس‬

label = 'SalePrice'
data = self.train if train else self.val
if label not in data: return
get_tensor = lambda x: tf.constant(x.values,
dtype=tf.float32)
# Logarithm of prices
tensors = (get_tensor(data.drop(columns=[label])),
# X

tf.reshape(tf.math.log(get_tensor(data[label])), (-1,
1))) # Y
return self.get_tensorloader(tensors, train)
K-Fold Cross Validation 5.7.6
‫ حيث ناقشنا كيفية التعامل مع اختيار‬،3.6.3 ‫قد تتذكر أننا قدمنا التحقق المتبادليف القسم‬
‫ نحتاج‬.‫ سنستخدم هذا بشكل جيد لتحديد تصميم النموذج وضبط المعلمات الفائقة‬.‫النموذج‬
‫ يتم المضي قدمًا عن طريق تقطيع‬.‫ 𝑖 طي البياناتيف إجراء تحقق متقاطع‬th ‫أوالً إلى دالة تُرجع‬
‫ الحظ أن هذه ليست الطريقة األكثر‬.‫ 𝑖المقطع كبيانات تحقق وإعادة الباقي كبيانات تدريب‬th
‫فاعلية للتعامل مع البيانات وسنفعل بالتأكيد شيئًا أكثر ذكاءً إذا كانت مجموعة البيانات الخاصة‬
‫ لكن هذا التعقيد اإلضافي قد يؤدي إلى تشويش الكود الخاصة بنا دون داع لذلك‬.‫بنا أكبر بكثير‬
.‫يمكننا حذفها بأمان هنا بسبب بساطة مشكلتنا‬

def k_fold_data(data, k):


rets = []
fold_size = data.train.shape[0] // k
for j in range(k):
idx = range(j * fold_size, (j+1) * fold_size)
rets.append(KaggleHouse(data.batch_size,
data.train.drop(index=idx),
data.train.loc[idx]))
return rets
.K-Fold ‫يتم إرجاع متوسط خطأ التحقق من الصحة عندما نتدرب 𝐾مراتيف التحقق المتبادل‬

def k_fold(trainer, data, k, lr):


val_loss, models = [], []
for i, data_fold in enumerate(k_fold_data(data, k)):
model = d2l.LinearRegression(lr)
model.board.yscale='log'
if i != 0: model.board.display = False
trainer.fit(model, data_fold)
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪274‬‬

‫‪val_loss.append(float(model.board.data['val_loss'][-‬‬
‫))‪1].y‬‬
‫)‪models.append(model‬‬
‫= ‪print(f'average validation log mse‬‬
‫)'})‪{sum(val_loss)/len(val_loss‬‬
‫‪return models‬‬
‫‪Model Selection‬‬ ‫‪5.7.7‬‬
‫في هذا المثال‪ ،‬نختار مجموعة غير مضبوطة من المعلمات الفائقة ونتركها للقارئ لتحسين‬
‫النموذج‪ .‬قد يستغرق العثور على خيار جيد وقتًا‪ ،‬اعتمادًا على عدد المتغيرات التي يحسنها المرء‪.‬‬
‫مع وجود مجموعة بيانات كبيرة بما يكفي‪ ،‬واألنواع العادية من المعلمات الفائقة‪ ،‬يميل التحقق‬
‫المتبادل ‪ K-Fold‬إلى أن يكون مرنًا بشكل معقول ضد االختبارات المتعددة‪ .‬ومع ذلك‪ ،‬إذا‬
‫جربنا عددًا كبيرًا بشكل غير معقول من الخيارات‪ ،‬فقد نحالفنا الحظ ونجد أن أداء التحقق من‬
‫الصحة لم يعد يمثل الخطأ الحقيقي‪.‬‬

‫)‪trainer = d2l.Trainer(max_epochs=10‬‬
‫)‪models = k_fold(trainer, data, k=5, lr=0.01‬‬
‫‪average validation log mse = 0.1782047653198242‬‬

‫الحظ أنهيف بعض األحيان يمكن أن يكون عدد أخطاء التدريب لمجموعة من المعلمات الفائقة‬
‫منخفضًا جدًا‪ ،‬حتى مع ارتفاع عدد األخطاءيف التحقق المتبادل ‪ K-Fold‬بشكل كبير‪ .‬هذا يشير‬
‫إلى أننا نفرطيف التجهيز ‪ .overfitting‬خالل التدريب‪ ،‬سترغبيف مراقبة كال الرقمين‪ .‬قد يشير‬
‫التجاوز األقل إلى أن بياناتنا يمكن أن تدعم نموذجًا أكثر قوة‪ .‬قد يوحي فرط التجهيز الهائل بأنه‬
‫يمكننا االستفادة من خالل دمج تقنيات التنظيم ‪.regularization‬‬
‫‪275‬‬ ‫الفصل الخامس‪ :‬البيرسيبترون متعدد الطبقات‬

‫‪Submitting Predictions on Kaggle‬‬ ‫‪5.7.8‬‬


‫اآلن بعد أن عرفنا ما يجب أن يكون عليه االختيار الجيد للمعلمات الفائقة‪ ،‬يمكننا حساب متوسط‬
‫التنبؤاتيف االختبار الذي تم تعيينه بواسطة جميع النماذج‪ .‬سيؤدي حفظ التنبؤاتيف ملف ‪csv‬‬
‫إلى تبسيط تحميل النتائج إلى ‪ .Kaggle‬سيُنشئ الكود التالي ملفًا يسمى ‪.submission.csv‬‬

‫‪preds = [model(tf.constant(data.val.values,‬‬
‫))‪dtype=tf.float32‬‬
‫]‪for model in models‬‬
‫‪# Taking exponentiation of predictions in the logarithm‬‬
‫‪scale‬‬
‫‪ensemble_preds = tf.reduce_mean(tf.exp(tf.concat(preds,‬‬
‫)‪1)), 1‬‬
‫‪submission = pd.DataFrame({'Id':data.raw_val.Id,‬‬

‫)})(‪'SalePrice':ensemble_preds.numpy‬‬
‫)‪submission.to_csv('submission.csv', index=False‬‬

‫الشكل ‪ 5.7.3‬تقديم البيانات إلى‪Kaggle‬‬

‫بعد ذلك‪ ،‬كما هو موضحيف الشكل ‪ ،5.7.3‬يمكننا تقديم تنبؤاتنا على ‪ Kaggle‬ومعرفة كيفية‬
‫مقارنتها بأسعار المنازل الفعلية (التسميات ‪)labels‬يف مجموعة االختبار‪ .‬الخطوات بسيطة‬
‫للغاية‪:‬‬

‫قم بتسجيل الدخول إلى موقع ‪ Kaggle‬اإللكتروني وقم بزيارة صفحة مسابقة التنبؤ‬ ‫•‬
‫بأسعار المنازل‪.‬‬
‫التعمق في التعلم العميق‪ :‬األساسيات والمقدمات‬ ‫‪276‬‬

‫انقر فوق الزر "إرسال التوقعات ‪ " Submit Predictions‬أو "التقديم المتأخر" (حتى‬ ‫•‬
‫كتابة هذه السطور‪ ،‬يوجد الزر على اليمين)‪.‬‬
‫انقر فوق الزر "تحميل ملف التقديم ‪" Upload Submission File‬يف المربع‬ ‫•‬
‫المتقطع أسفل الصفحة وحدد ملف التنبؤ الذي ترغبيف تحميله‪.‬‬
‫انقر فوق الزر "تقديم ‪" Make Submission‬يف أسفل الصفحة لعرض النتائج الخاصة‬ ‫•‬
‫بك‪.‬‬

‫‪5.7.9‬‬
‫غالبًا ما تحتوي البيانات الحقيقية على مزيج من أنواع البيانات المختلفة وتحتاج إلى‬ ‫•‬
‫معالجة مسبقة‪.‬‬
‫إعادة قياس ‪ Rescaling‬البيانات ذات القيمة الحقيقية إلى متوسط الصفر وتباين‬ ‫•‬
‫الوحدة يعد افتراضيًا جيدًا‪ .‬لذلك يتم استبدال القيم المفقودة بمتوسطها‪.‬‬
‫يتيح لنا تحويل الميزات الفئوية ‪ categorical features‬إلى ميزات مؤشر أن نتعامل‬ ‫•‬
‫معها على أنها متجهات واحدة ساخنة‪.‬‬
‫يمكننا استخدام التحقق المتبادل ‪ K-Fold‬لتحديد النموذج وضبط المعلمات الفائقة‪.‬‬ ‫•‬
‫اللوغاريتمات مفيدة لألخطاء النسبية‪.‬‬ ‫•‬

‫‪5.7.10‬‬
‫‪ .1‬أرسل توقعاتك لهذا القسم إلى ‪ .Kaggle‬ما مدى جودة توقعاتك؟‬
‫‪ .2‬هل من الجيد دائمًا استبدال القيم المفقودة بمتوسطها؟ تلميح‪ :‬هل يمكنك بناء موقف‬
‫ال تكون فيه القيم مفقودة بشكل عشوائي؟‬
‫‪ .3‬قم بتحسين النتيجة على ‪ Kaggle‬عن طريق ضبط المعلمات الفائقة من خالل التحقق‬
‫المتبادل ‪.K-Fold‬‬
‫‪ .4‬قم بتحسين النتيجة من خالل تحسين النموذج (على سبيل المثال‪ ،‬الطبقات وتناقص‬
‫الوزن و‪.)dropout‬‬
‫‪ .5‬ماذا يحدث إذا لم نقم بتوحيد ‪ standardize‬السمات العددية المستمرة مثل ما فعلناه‬
‫في هذا القسم؟‬
‫ئ‬

You might also like