سألت سؤالاً على تويتر حول أهم مفهوم من مفاهيم تعلم الآلة Machine Learning يحتاج المتعلم المبتدئ فهمه بعمق ليفهم هذه المادة التي تحتاج كثيراً من المتطلبات السابقة. وكانت الإجابات رائعة وكلها تذكر المتطلبات السابقة للمادة. التعامل مع البيانات والجبر (وباقي التخصصات الرياضية) والإحصاء وإجادة لغة برمجة ما.. كانت هذه هي أغلب الإجابات.
وفي الحقيقة أنه لاتوجد إجابة خاطئة. فالكل صحيح. ولكن تعالوا أشارككم ما أعتقد، ولست أجزم، أنه مفهوم مهم ورئيسي من مفاهيم تعلم الآلة وإذا فهمه الطالب فهم جزءً مهماً من هذه المادة.
تعلم الآلة يحاول محاكاة مفهوم التعلم لدى الإنسان وهو الفرع الأكثر نجاحاً من بين علوم الذكاء الإصطناعي وذلك بنتائجه وتطبيقاته. في تعلم الآلة نحاول بناء نموذج model قادر على التعلم باستخدام فهم البيانات واستخراج العلاقات بين خصائص البيانات. وفي بعض النماذج نحاول أن تتعلم الآلة أن تستخرج الخصائص العميقة المخفية والمطمورة في البيانات التي قد لاتكون واضحة في تركيب البيانات الرئيسي مثل التعلم العميق Deep Learning.
كل نموذج يعتبر هو عقل الآلة بعد أن يتم بناؤه. ففي أغلب الخوارزميات نحتاج لبناء نموذج وكل نموذج يحتوى على عوامل Parameters وهذه العوامل ماهي إلا وزن Weight أو قيمة كل خاصية من الخصائص. هذه الأوزان هي ماسيعطيني القدرة على التنبؤ والتمييز للبيانات الجديدة. ويجب علي قبل أن أقول أنني بنيت نموذج ذكي انه يكون قادراً بشكل استثنائي على التمييز أو التنبؤ. ولذلك فمن المهم لكل متعلم أن يكون قادراً على بناء نموذج ولن يكون قادراً حتى يستطيع أن يوجد القيم الحقيقية للعموامل Parameters. ولكن كيف يوجد القيم الحقيقية للعوامل؟
تتفق أغلب خوارزميات تعلم الآلة أنها تبحث عن القيم التي تقلل لديها مقدار الخطأ في النتيجة النهائية للتنبؤ. ولذلك فأغلب الخوارزميات تقوم بإعطاء قيم أولية عشوائية للعوامل ومن ثم تقوم بتعديلها بشكل بسيط بناء على بعد النتيجة عن النتيجة الصحيحة Actual Label عن النتيجة التي تنبأنا بها Predicted Label. دعونا نأخذ مثالاً على ذلك حتى تتضح الصورة بشكل أكبر.
لنفترض أنه لدينا البيانات البسيطة التالية، حيث أن كل واحد من البيانات لديه خاصيتين x1 و x2 وكل واحد ينتمي لصنف محدد فإما أن ينتمي للصنف +1 أو -1.
يفترض أننا نستخدم البيانات في الشكل أعلاه لنقوم ببناء النموذج وهذه المرحلة تسمى مرحلة التدريب Training. وفي الحقيقة أننا نقوم بها ببساطة في كثير من الخوارزميات بطريقة متشابهة وهي بإعطاء قيم افتراضية أولية Initial Random Weights وهنا نسمي هذه القيم w1 و w2، وهي بعدد الخصائص التي لدينا، في أبسط أشكال تعلم الآلة. ومن ثم نقوم بإيجاد حاصل ضرب كل وزن في الخاصية التي تقابله وجمع الناتج كاملا ليكون لدينا قيمة واحدة لكل عنصر من عناصر البيانات.
فالوزن w1 يمثل وزن الخاصية الأولى x1 و الوزن w2 يمثل الخاصية الثانية x2. فيكون النموذج كالتالي:
predicted label = x1w1 + x2 w2
دعونا نعطي قيمة افتراضية أولية للأوزان كالتالي، w1 = 0 و w2 = 0. فكيف سيكون الناتج الأولي للتنبؤ.
لاحظوا أن كل نتائح التنبؤ كانت أصفاراً 0. ولكن في الحقيقة أنه لا يوجد لدينا تصنيف في حقيقي يساوي صفر. بل أن التصنيفات الحقيقية كما قلنا إما +1 أو -1 . ولذلك نحتاج أن نضع شرطاً يضع حداً threshold فاصلاً بين السالب والموجب. فمثلاً، إذا كان التنبؤ أكبر من أو يساوي صفر فإنني أعتبر التنبؤ يساوي +1 وإذا كان أقل من صفر فإنني أعتبره يساوي -1. ويمكن تمثيل هذا الشرط رياضياً كالتالي:
هنا نلاحظ أنه التصنيف التنبؤي لجميع البيانات سيكون مساوياً للواحد +1 حسب الشرط الموضح في المعادلة السابقة.
هل هذا النموذج جيد للتنبؤ بالتصنيف الحقيقي؟ قد يكون النموذج قد استطاع التنبؤ بالصنف الموجب، ولكنه فشل في التنبؤ الصحيح بالصنف السالبة. كيف نعرف ذلك؟ هنا يأتي دور الخطأ. هنا يأتي أحد أهم المفاهيم في تعلم الآلة. الخطأ Error أو Loss أو Residual. وكل هذه المسميات صحيحة بفوارق بسيطة لاتخل بمبادئها، ولذلك يمكن أن يقال أي من المصطلحات السابقة لتعني “الخطأ”.
الخطأ Error هو مؤشر يحدد مقدار دقة التنبؤ في النموذج وذلك بحساب الفارق بين القيمة الحقيقية والقيمة التي تنبأ بها النموذج..
حساب الخطأ
عرفنا الآن أن القيمة التي تنبأنا بها لم تكن بالدقة المطلوبة، ولكن كيف نحسب مقدار الخطأ في نموذج التنبؤ هذا؟
هناك طرق كثيرة جداً لحساب الخطأ. ولكن دعوني أتحدث هنا عن أسهلها وأقربها للمنطق في هذا المثال. إننا وبكل بساطة نحسب الفرق (ناتج الطرح) بين التصنيف الذي تنبأنا به والتصنيف الحقيقي. ولأنني يهمني شيء واحد في الخطأ فقط، ألا وهو هل التصنيف صحيح، أوغير صحيح. وسيكون صحيحاًُ عندما يكون ناتج التنبؤ متساوياً في التصنيف الحقيقي والتصنيف الذي تنبأنا به. وهنا لايوجد خطأ وسيكون الخطأ يساوي صفر Error = 0. وفي حال كان التنبؤ غير صحيح فإن الخطأ سيكون عبارة عن ناتج الطرح بين الاثنين. وستكون نتائج الخطأ لكل عنصر من عناصر البيانات مساوية لهذه القيمة.
من الشكل السابق فإنه يتضح أننا استطعنا أن نتنبأ بتصنيف نصف 50% البيانات بشكل صحيح على الرغم من أننا اخترنا الوزن بشكل عشوائي. ولذلك لابد أن نعود الان مدفوعين بالخطأ لتعديل الوزن حتى يعطيني تنبؤًا أفضل. وهنا يأتي دور الخطأ مرة أخرى في تعديل الوزن. بالنسبة للعناصر التي تم التنبؤ بها بشكل صحيح، فلا داعي لتعديل الوزن معها. ولكن نعدل الوزن مع العناصر التي تم الخطأ فيها.
وهنا سنضرب ناتج الخطأ Error لكل عنصر في مقدار التعديل. وسنأخذ التعديل بمقدار بسيط من قيمة العنصر ذاته. كيف ذلك؟ إنني هنا أرغب بتحريك الوزن (يميناً أو يساراً) بشكل ضئيل حتى تتحرك نتيجة التنبؤ. فمثلاً. نجد أن العنصر الخامس [8 4] كانت نتيجة تصنيفه خطأً بمقدار 2. وحيث أن صنفه الرئيسي يساوي -1 فإننا نحتاج أن نزيح الوزن قليلاً جهة اليسار (الجهة السالبة) حتى أحصل على نتيجة تنبؤية أفضل. فدعونا نفترض أننا أخذنا المعادلة التالية لتعديل الوزن.
new w = old w + x * (y * error)
ولنطبق هذه المعادلة على العنصر الخامس تكون نتيجة الوزن الجديد بعد أخذ الخطأ في عين الاعتبار كالتالي:
new w1 = old w1 + 4 * (-1 *2) = 0 + 4 * -2 = -8
new w2 = old w2 + 8 * (-1 *2) = 0 + 8 * -2 = -16
لاحظوا هنا أن الوزن الجديد بعد تطبيق هذه المعادلة كان -8 و -16 . وهذه القيمة كبيرة، وستأخذ التصنيف الموجب لاتجاه سالب مما سيؤدي إلى خطأ في التصنيف الموجب. ولذلك فمقدار التعديل على قيمة الوزن w لابد أن يكون تعديلا صغيراً مقارنة بقيمة العناصر. وهنا يأتي مفهوم معدل التعلم Learning Rate ودعونا نرمز له بالرمز وفي الغالب فإننا نضع قيمة صغيرة لهذا المعامل hyperparameter. فمثلاً نضع =0.01دعونا نرى تأثيره على تغير الوزن في المعادلة السابقة، حيث أن معادلة التغيير الجديدة ستكون كالتالي:
new w = old w +* x * (y * error)
وسيكون تعديل الوزن لنفس العنصر بعد إضافة معدل التعلم كالتالي:
new w1 = old w1 + 0.01 * 4 * (-1 *2) = 0 + 0.01 * 4 * -2 = -0.08
new w1 = old w1 + 0.01 * 8* (-1 *2) = 0 + 0.01 * 8 * -2 = -0.16
أي أن القيمة تضاءلت كثيرا، وهذا شيء جيد لجعل النموذج يتغير بشكل مقبول. دعونا الآن نستخدم هذا الوزن الجديد لتحديد التنبؤ بالعنصر السادس والذي قيمته [6 6].
predicted label = 6(-0.08) +6 (-0.16) = -1.44
وبتطبيق شرط الحد الفاصل بين الموجب والسالب نجد أن النموذج للمرة الأولى أصبح قادراً على التنبؤ بالصنف السالب. وهنا الخطأ سيكون صفراً أي أننا لن نقوم بالتعديل على قيمة الوزن. ونستمر هكذا حتى يتم الانتهاء من العناصر كاملة. ثم نقوم بنفس الخطوات من جديد. حتى يصبح الخطأ متلاشياً. وتستمر الحياة.. ليصبح الشكل للخوارزمية المبدئية كالتالي:
- أولا نضع قيمة عشوائية ولتكن صفراً للوزن
- ثانيا نحدد قيمة مقدار التعلم بقيمة صغيرة أصغر من الواحد وأكبر من الصفر ، وغالباً تكون إما 0.1 أو 0.01 أو 0.001 ..
- ثالثاً لكل عنصر أوجد قيمة التنبؤ بضرب العنصر في الوزن.
- رابعا لكل تنبؤ جديد حدد إما أن يكون الصنف سالباً أو موجباً
- خامساً أوجد مقدار الخطأ للتنبؤ
- سادساً حدث قيمة الوزن مستخدماً مقدار الخطأ.
- سابعاً .. كرر العملية حتى يتلاشى الخطأ..
أخيراً، أغلب نماذج تعلم الآلة (التي أثبتت جدواها) تعتمد بطريقة أو بأخرى على حساب الخطأ، ولهذا فتعلم هذا المفهوم وطريقة عمله واختلافات طرق الحساب في كل خوارزمية مهم جداً لاستيعاب ما يحصل في نماذج تعلم الآلة وكيف نقود البحث عن أفضل النتائج فيها أو مايسمى ال Optimization .. علما أنه يوجد عدد من الخوارزميات لا تعتمد عليه في أساسها ولكن فهمه ضروري في تقييمها، ولذلك فهو المشترك الدائم في بناء النماذج.