![]() |
ن المعروف لدينا في مجال التعلم العميق بأنَّ الخوارزمية التي نقوم بتعليمها من أجل إنجاز مهمة معينة كتصنيف الصور مثلاً يجب أن تتكون من عناصر أساسية هي : |
الرياضيات في التعلم العميق
مقدمة:
بسم إلله الرحمن الرحيم
من المعروف لدينا في مجال التعلم العميق بأنَّ الخوارزمية التي نقوم بتعليمها من أجل إنجاز مهمة معينة كتصنيف الصور مثلاً يجب أن تتكون من عناصر أساسية هي :
3 – دالة الكلفة (Cost function).
4 – أداة التحسين (optimization algorithm).
وهذه العناصر جميعها تعتمد إعتماد كلي على المعادلات الرياضية, حيث إنَّ مجموعة البيانات (Dataset) مثلاًّ لايمكن إستخدامها مباشرة لتعليم النموذج مالم تجرى عليها عمليات معالجة مختلفة تستخدم فيها المعادلات الرياضية, حيث يتم أولاً تحويل هذه البيانات إلى مصفوفات رياضية (Matrices) بعدها تجرى عليها عمليات مثل عملية التطبيع (Normalization) وكذلك عملية تسوية (Regularization).
أما النموذج الحاسوبي (Model) فإنَّه يتكون من مجموعة طبقات (Layers), هذه الطبقات تتكون من وحدات (Units) وكذلك أوزان (Weights), وهذه الوحدات وكذلك الأوزان تكون على شكل مصفوفات (Matrices), وكذلك بقية العناصر فإنها تعتمد إعتماد كلي على مبادئ الرياضيات من قوانين ومعادلات, ولقد رأيت من المفيد أن أقوم بكتابة سلسلة من المقالات أتناول فيها بعض المواضيع المهمة في علم الرياضيات ذات الصلة في مجال التعلم العميق (Deep learning) بشكل خاص وتعليم الآلة (Machine Learning) بشكل عام, وهذه المواضيع هي:
1 – موضوع التفاضل والتكامل (Calculus) بإستعراض القوانين المهمة فقط.
2 – موضوع الجبر الخطي (Linear algebra) بشيءٍ من التفصيل.
3 – موضوع الإحصاء والإحتمالات (Statistics and Probability).
4 – نظرية المعلومات (Information Theory).
كذلك سوف أتطرق إنشاء ألله في هذه المقالات إلى مواضيع مهمة مثل موضوع تقليل الأبعاد للبيانات بإستخدام خوارزمية تحليل المكونات الرئيسية (Principal Component Analyzing)والتي تسمى إختصاراً (PCA).
كذلك سوف أتطرق إلى موضوع دوال الفقد (Coast functions) وكيفية إختيارها لكل نموذج على ضوء نوع المهمة التي يقوم بإنجازها وذلك بإستخدام التقنية المسماة (Maximum Likelihood Estimation).
كذلك سوف أتطرق إنشاء ألله الى موضوع خوارزميات التحسين (Optimization algorithms) وأنواعها بشيئ من التفصيل.
ومن ألله تعالى نستمد العون والتوفيق.
التفاضل والتكامل
إنَّ موضوعي التفاضل والتكامل وقوانينهما هما من المواضيع المألوفة ولابأس بالتذكير بهما من خلال إستعراض سريع لبعض قوانينهما المهمة وكما يلي :
أولاًّ - قوانين التفاضل:
ثانياً – قوانين التكامل:
الجبر الخطي (Linear Algebra)
إنَّ الجبر الخطي هو أحد الفروع المهمة من علم الرياضيات ويستخدم على نطاق واسع في جميع العلوم وخاصة في العلوم الهندسية, وهو نوع من أنواع الرياضيات المتصلة (Continuous mathematics), وسمي بالخطي لأن المعادلات التي يتعامل معها هي من الدرجة الأولى (أي المعادلات الخطية).
يعد الفهم الجيد للجبر الخطي أمرًا ضروريًا لفهم العديد من خوارزميات التعلم الآلي والعمل معها ، وخاصة خوارزميات التعلم العميق (Deep learning algorithms), لذا سوف نقوم إنشاء ألله بشرح واضح وموسع لأهم مفاهيم ومصطلحات وعناصر هذا الموضوع الضرورية والتي يحتاجها كل باحث في مجال التعلم العميق مقرونةً بالتطبيقات والأمثلة المناسبة بإستخدام لغة البايثون مع بعض المكتبات الضرورية لأجل زيادة الفائدة.
1 – الأعداد والمتجهات والمصفوفات والتينسرات
(Scalars, Vectors, Matrices and Tensors)
سوف نقوم بالتعرف على العناصر الأساسية المستخدمة في الجبر الخطي وإعطاء بعض الأمثلة وكذلك إجراء بعض التطبيقات العملية على هذه العناصر من خلال المكتبة (Numpy) المخصصة لهذا الغرض.
سوف نتعرف أولاً على هذه العناصر من خلال الرسم التوضيحي التالي:
العدد (Scalar): وهو مجرد رقم واحد, ويعطى له إسم, ويكتب هذا الإسم بالحرف الصغير(Lower-Case) ومن النوع المائل (italic), مثلاً:
ومعنى هذه العبارة هو أن (a) عدد ينتمي إلى الأعداد الحقيقية (Real numbers).
المتجه (Vector): هو مجموعة من الأرقام مرتبة ترتيباً داخلياً يعطى لكل واحد من هذه الأرقام دليل (Index) لكي يمكن تمييزه والتعامل معه بشكل منفصل بعض الأحيان.
عند الإعلان عن أي متجه يعطى له إسم يكتب هذا الإسم بالحرف الصغير (Lower-Case) ومن النوع المائل (italic) وبالخط العريض (Bold), مثلاً:
ومعنى هذه العبارة أن هناك متجه (Vector) إسمه (x) يحتوي على (n) من العناصر, تنتمي جميع هذه العناصر إلى الأعداد الحقيقية (Real numbers).
إنَّ عدد عناصر كل متجه تمثل عدد أبعاده (Number of Dimensions), وفي بعض الأحيان تعبر عن الخصائص (Features) ويكتب عدد الأبعاد أو الخصائص على هيئة حرف (Superscript) يوضع أعلى الحرف الدال على نوع الأرقام أي العناصر. إنَّ نوع هذه الأرقام لايشترط أن تكون من النوع الحقيقي (Real numbers) فقط, بل من الممكن أن تستخدم أنواع أخرى مثل الأرقام الطبيعية (Normal numbers),بل ويمكن إستخدام حتى الأرقام الخيالية (Imaginary numbers).
المصفوفة (Matrix): هي مجموعة من الأرقام مرتبة ترتيباً داخلياً في بعدين (2-D) وعلى شكل صفوف (Rows) وأعمدة (Columns), حيث يعطى لكل رقم من هذه الأرقام أو العناصر دليل (Index) يتكون من رقمين, الأول يمثل رقم الصف والثاني يمثل رقم العمود.
عند الإعلان عن أي مصفوفة يعطى لها إسم يكتب بالحرف الكبير (Upper-case) ومن النوع المائل (Italic) وبالخط العريض (Bold), مثلاً:
ومعنى هذه العبارة هو أنَّ هناك مصفوفة إسمها (A) تتكون من مجموعة من الأرقام مرتبة على شكل مجموعة من الصفوف عددها (m) ومجموعة من الأعمدة عددها (n) وأنَّ جميع الأرقام التي بداخلها تنتمي إلى الأعداد الحقيقية (Real numbers).
التينسرات (Tensors): التينسرات أو الكميات الممتدة هي عبارة عن مجموعة من الأرقام مرتبة ترتيباً داخلياً في أكثر من بعدين (ثلاثة أبعاد أو أكثر), حيث إننا في بعض الحالات نحتاج إلى مصفوفة ذات ثلاثة أبعاد أو أكثر ففي هذه الحالة يجب إستخدام عنصر من نوع تينسر (Tensor), فمثلاً تكون بيانات الصورة الملونة على شكل تينسر ثلاثي الأبعاد, ونستطيع أن نقول بأنَّ هذا التينسر يتكون من ثلاث مصفوفات لكل لون مصفوفة تتكون من بعدين (إرتفاع وعرض), وكما موضحة في الرسم أدناه:
عطى لكل عنصر من عناصر التينسر دليل (Index) يتكون من ثلاثة أرقام أو أكثر حسب عدد الأبعاد الموزعة عليها هذه العناصر.
والآن نتحول إلى الأمثلة لتطبيق ماإستعرضناه من أجل زيادة الفائدة, علماً بأننا سوف نستخدم بيئة (jupyter notebook) ولغة بايثون:
إنشاء متجه بإستخدام البايثون ومكتبة (Numpy):
نقوم الآن بكتابة الكود اللازم لإنشاء متجه (Vector) ذات أربعة عناصر أو أربعة خصائص أو أربعة أبعاد, وهنا يجب التمييز بين الأبعاد الخاصة بالمتجه والأبعاد الخاصة بالتينسرات حيث إنَّ أبعاد المتجه تمثل موقع النقطة التي تحدد طول المتجه وإتجاهه حيث إنها (أي النقطة) تمثل النهاية التي ينتهي إليها المتجه والذي يبدأ من نقطة الأصل. إنَّ أبعاد المتجه إذا زادت عن ثلاثة لايمكن تصورها بالنسبة للإنسان ولكن من الممكن إعتبارها خصائص (Features) لهذه البيانات التي يحويها المتجه.
من ناحية أخرى فإنَّ المتجه إذا نظرنا إليه كمصفوفة فإنَّه يعتبر مصفوفة ذات بعد واحد (1-D).
والآن إلى كتابة الكود وتنفيذه:
أو من الممكن أن نكتب الكود بالشكل التالي:
مثال رقم 2 (Example 2)
إنشاء مصفوفة ذات شكل (3 x 2):
يمكننا إنشاء مصفوفة ذات بعدين (2 - D) وحسب الكود التالي:
حيث نلاحظ إنَّ الأقواس الكبيرة الخارجية تحوي المصفوفة بأكملها أما الأقواس الكبيرة الفرعية فإنَّ كل قوسين يحويان أحد الصفوف وبما أنه هناك ثلاثة مجموعات من الأقواس الفرعية نعلم بأنَّ هذه المصفوفة تتكون من ثلاثة صفوف وأن عدد العناصر التي توجد في داخل كل قوسين فرعيين تمثل عدد الأعمدة لتلك المصفوفة.
مثال رقم 3 (Example 3)
إنشاء تينسر ذات شكل (2 x 3 x 2):
يمكننا الآن إنشاء تينسر ذو ثلاثة أبعاد (3-D) وبالشكل الذي نرغب به وليكن (2 x 3 x 2) وحسب الكود التالي:
من الشكل أعلاه وبعد التنفيذ نلاحظ أن هذا التينسر هو عبارة عن مصفوفتين شبيهتين بالمصفوفة التي أنشأناها في المثال السابق وقد جمعتا معاً بواسطة قوسين كبيرين إضافيين, هذين القوسين يحويان التينسر بأكمله.
إن هذا التينسر هو ثلاثي الأبعاد (2 x 3 x 2), حيث إنَّ الرقم (2) من اليسار يمثل عدد المصفوفات التي يحويها هذا التينسر والرقم (3) الذي يليه يمثل عدد الصفوف لكل مصفوفة أما الرقم (2) الذي في اليمين فيمثل عدد الأعمدة لكل مصفوفة.
مثال رقم 4 (Example 4)
إنشاء متجه بإعتباره مصفوفة ذات بعد واحد:
في بعض الأحيان نحتاج إلى التعامل مع المتجه بإعتباره جزء من مصفوفة أو إذا أردنا تطبيق بعض قوانين المصفوفات عليه لذلك سوف نقوم بإنشاء هذا المتجه بإعتباره مصفوفة ذات بعد واحد وكما في الكود التالي:
نلاحظ في الشكل أعلاه أننا إستخدمنا زوجين من الأقواس الكبيرة حيث إن القوسين الكبيرين الخارجيين يحويان المصفوفة أما القوسين الكبيرين الداخليين فيمثلان صف من المصفوفة حيث إن هذه المصفوفة تحوي صفاً واحداً فقط ونستطيع أن نعتبرها مصفوفة ذات الشكل (1 x 3).
شكل العنصر (The Shape):
الشكل (Shape) هو عبارة عن عدد الأرقام التي يحتويها كل بعد من أبعاد العنصر, فمثلاً إذا كانت لدينا مصفوفة (المصفوفة تكون ذات بعدين) تتكون هذه المصفوفة من ثلاثة صفوف كل صف يحتوي على رقمين (أي عمودين) فإنَّ شكل هذه المصفوفة هو (3 x 2). الكود التالي يوضح ماقلناه وكما يلي :
السطر رقم (1) : أعلنا عن تينسر ذو ثلاثة أبعاد (3-D), حيث إنه يحتوي مصفوفتين كل مصفوفة ذات ثلاثة صفوف (3-rows) وعمودان (2-columns) لذلك سوف يكون شكل التينسر هو (2 x 3 x 2), حيث إنَّ الرقم الأول من اليسار يمثل عدد المصفوفات التي يتكون منها التينسر حيث إنَّه يسمى العمق (Deep) وهو البعد الثالث للتينسر.
في السطر رقم (5) أعلنا عن متجه (Vector) عادي, أما في السطر رقم (7) فقد أعلنا عن متجه كمصفوفة ذات بعد واحد (1-D matrix).
طول المتجه (Vector length)
نحتاج في بعض الحالات إلى معرفة عدد العناصر التي يتكون منها المتجه لإستخدامها في بعض الأكواد كالحلقات التكرارية مثلاً, وفي بعض الأحيان نحتاج إلى معرفة عدد العناصر في أحد الصفوف للمصفوفة, والمثال التالي يبين كيف نستخرج عدد العناصر للمتجه (أو طول المتجه):
السطر رقم (1): إخترنا أولاً المصفوفة الأولى من التينسر (A) والذي أنشأناه في المثال السابق عن طريق الرقم الأول من الدليل أي (A[0]) ثم إخترنا الصف الأول من هذه المصفوفة حيث إنَّه عبارة عن متجه يتكون من رقمين وقد إستخدمنا الدالة (len) لإستخراج عدد الأرقام, علماً أنَّ الدليل (Index) لكل عنصر من عناصر التينسر إذا كان ذو ثلاثة أبعاد يتكون من ثلاثة أرقام الرقم الأول يمثل رقم المصفوفة أما الرقم الثاني فيمثل رقم الصف لتلك المصفوفة والرقم الثالث يمثل رقم العمود في المصفوفة.
السطر رقم (2): إخترنا الصف الأول من صفوف المصفوفة (B) والتي أنشأناها في المثال السابق, وهذا الصف هو عبارة عن متجه يتكون من ثلاثة أرقام (أو عناصر), وقد إستخدمنا الدالة (len) لإستخراج عدد العناصر في هذا المتجه.
السطر رقم (4): لإستخراج عدد عناصر المتجه (D) والذي قمنا بإنشاءه في المثال السابق, وبما أنَّ هذا المتجه هو عبارة عن مصفوفة ذات بعد واحد فقد إستخدمنا دليل (Index) الصف الأول أي (D[0]).
وبذلك نكون قد إنتهينا من هذه المقالة وسوف تتبعها مجموعة أخرى من المقالات بإذن إلله تعالى.
جزاك كل الخير استاذنا على هذه دروس الرائعة شكلا ومضمونا
ردحذفبارك الله فيكم