تعلم الآلة

شرح Gradient Descent في تعلم الآلة

مقدمة

يمكن تقسيم تعلم الآلة إلى قسمين مهمين وهما تعلم بإشراف Supervised Learning و تعلم بدون إشراف Unspervised Learning. التعلم بإشراف ينقسم إلى قسمين وهما التصنيف Classification والتوقع Regression. هنا شرح مفصل عن هذه المفاهيم . في هذا المقال سنقوم بشرح كيفية حل مشكلة الارتباط الخطي Linear regression بإستخدام خوارزمية Gradient Descent.

الارتباط الخطي

افترض أن لدينا الدالة التالية

f(x) = y 

ولكننا لا نعرف ما هي الدالة f، ولدينا بعض النقاط (x,y). القيمة x تمثل المدخل والقيمة y المخرج وهي القيمة الحقيقية. المشكلة أن هناك عدد لا نهائي من النقاط في خط الأعداد، ونحن نريد من المعادلة توقع y’ لأي قيمة x بإستخدام النقاط المتوفرة لدينا.

سنقوم بافترض الدالة العامة

g(x,W) = y'

القيمة ‘y تمثل المخرجات، والقيم W هي عبارة عن متغيرات يتم تحديثها بشكل مستمر.

لنأخذ مثال بسيط، افترض أن لدينا القيم التالية:

(x_0 = 1, y_0 = 3) , (x_1 = 2, y_1 = 5) , (x_2 = 3, y_2 = 7) 

ونريد توقع قيم أخرى، مثلاً x = 4 . بالنظر فإن الدالة التي تمثل هذه النقاط هي معادلة المستقيم (لأنها تقع على خط مستقيم)

f(x) = 2x + 1

لكن هل المعادلة بنفس ذكاءنا؟ الإجابة لا. الدالة تقوم فقط بافتراض الحل العام

 g(x,W) = w_1 x + w_0

ثم ستقوم بحساب افضل قيم لw0, w1. لكن السؤال كيف؟ الجواب يكمن في ما يسمى ب cost function وهي تحسب مدى قرب أو بعد القيم المتوقعة ‘y من القيم الحقيقية y.  مثلاً ممكن تحسب مربع الفرق

L= (y' - y)^2= (w_1x+w_0 - y) ^2

هذا المقياس يمثل مدى القدرة في التعلم، وبالتالي نحتاج هذه القيمة أن تكون أصغر ما يمكن. قيم x,y ثابتة وهي لدينا مسبقاً بالتالي نحتاج تحديث قيم w0 ،w1.

Gradient Descent

ما نحتاجه الآن هو تحديث قيم w0,w1 لكن كيف؟ الحل هو باستخدام الإشتقاق. الإشتقاق يقوم بحساب قيمة مهمة جداً وهي مدى تسارع الدالة عند قيمة معينة وإتجاهها. باستخدام المشتقة بإمكاننا حساب القيم الصغرى لدالة معينة. إذا حسبنا مشتقة دالة عند قيمة معينة وكانت المشتقة موجبة فإن هذا يعني أن الدالة تزايدية، وإذا كانت القيمة سالبة فإن الدالة تناقصية. فبالتالي لحساب القيم الصغرى لدالة معينة نقوم بحساب المشتقة عند نقطة معينة وإذا كانت المشتقة سالبة فإننا يجب أن نتحرك نحو اليمين (نزيد القيمة) وإذا كانت المشتقة موجبة فإننا نحتاج أن (ننقص القيمة) بمعنى آخر لتحديث قيم w1 نحسب

 w_1 = w_1 - \frac{\partial L (x)}{\partial w_1}

مشكلة حساب المشتقة أنها قد تزداد فجأة، خصوصاً في الدوال التي تتغير بشكل كبير، بالتالي نحتاج نضيف ما يسمى بمعامل التعلم learning rate

 w_1 = w_1 -\alpha \frac{\partial L (x)}{\partial w_1}

وهو يساعدنا في التحكم في مدى تسارع تحديث القيم. فإذا كانت القيمة كبيرة سيتم التعلم بشكل أكبر ولكن قد لا نصل لقيمة الدالة الصغرى.

لاحظ أن قيمة المشتقة هي

 \frac{\partial L (x)}{\partial w_1}  = 2x (w_1x+w_0 - y)

حيث أننا استخدمنا chain rule

 \frac{d}{dw}f(g(w)) = g'(w) f'(g(w))

لاحظ بأننا نشتق بالنسبة للمتغير  وبالتالي نفترض بقية القيم ثوابت. بنفس الطريقة

 w_0 = w_0 -\alpha \frac{\partial L (x)}{\partial w_0}

حيث

 \frac{\partial L (x)}{\partial w_0}  = 2 (w_1x+w_0 - y)

ملاحظة

الخوارزمية تعتمد على إيجاد مشتقة الدالة ولكن هناك مشكلة وهي أن المشتقة لا تكون موجودة دائماً. مثلاً المشتقة لدالة المقياس

 f(x) = |x|

غير موجودة عند x = 0. هناك حلول لهذه المشكلة وهي تقدير المشتقة. مثلاً نفترض دائماً ان المشتقة

 f'(x=0) = 0

المشكلة الثانية هي أن الدالة قد تحتوي على أكثر من قيمة صغرى محلية  وبالتالي لن نصل للقيمة الصغرى المطلقة. الحل لهذه المشكلة هي بتغيير معامل التعلم.

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

اظهر المزيد

‫8 تعليقات

  1. شكرا على الشرح الجميل والبسيط، ولكن اتمنى ان تضيف لنا كيف نستطيع تطبيق ذلك باستخدام مثال عملي في لغات البرمجة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى