باسم الله والحمد لله والصلاة والسلام على رسول الله
أهلا وسهلا بكم في محاضراتنا المستمرة في منصّة الـ data
mining، وما زلنا في باب الـ classification أو في باب
التصنيف. سنتكلم اليوم، أو في هذه المحاضرة إن شاء
الله تعالى، عن Classifierٍ متقدمٍ جدًا، مستخدم بشكل
كبير جدًا، وهو الـ Neural Network as Classifier أو
بالتحديد الـ Back-propagation Neural Network. لـ
أُخفيكم، كان عندي تردد: أشرحه أم أشرح الـ Support
Vector Machine؟ كلاهما من المواضيع المتقدمة، و
التي تحتاج إلى Optimization عالية. لكن قررتُ أن
أشرح الـ Neural Network، كما كنا قد ذكرناه سابقًا، وخلّينا
نبدأ مع الـ Neural Network. الـ Neural Network أو
الشبكات العصبية... العصبية. بكفي أنا عصبي!
بالجمال، الشبكات العصبية هي عبارة عن
مجموعة من الـ connected input و الـ output units.
يعني، ببساطة، هي عبارة عن مجموعة من المدخلات
والمخرجات المتصلة مع بعضها البعض. وكل خط أو كل
Connection، أو كل خط، أو كل Link، له وزن معين
associated with it، مرتبط به. خلال مرحلتي التعليم
وهنا، يا جماعة الخير، بدأنا ننتبه جيدًا، لأن صار في عندي
ما يُقال لنا: نحن Machine Learning. Machine Learning هي
الفترة التي أقضيها في بناء الـ Model، لأن
هكذا قلنا في البداية خالصًا: الـ Classification، في عندي
Model-based، وفي عندي Instance-based. الـ Instance
based كان: K-Nearest Neighbor، و الـ Model-based: Decision
Tree، و الـ Naive Bayesian. سؤال مهم جدًا، أريد أن أطرحه
عليكم. أتمنى أن تفكّروا في إجابته، لأن
هل الـ Naive Bayes Model-based أم Instance-based؟
هذا سؤال. السؤال الثاني: الـ Naive Bayes Algorithm،
الجدول الذي بنيته، كم مرّة بنيته؟
المفروض مرة واحدة. متى أحتاج إلى إعادة بنائه؟ لو تغيرت
الـ Training Set الموجودة عندي. وبالتالي، المفروض
أنّ هذا الجدول يمثّل عندي الـ Model خلال مرحلة التعليم،
مرحلة الـ Learning، مرحلة بناء الـ Model، الـ Network،
الذي هو الشبكة العصبية. تحاول تعديل الأوزان التي
موجودة عندها، حتى تصل إلى
الـ Label. يعني، بين قوسين: أدخلت الـ Input، عملت
Computation، حصلت على الـ Output. أقارن بين الـ
Output الحقيقي، والـ Predicted، وتبعًا للـ Error الذي
بينهما، أو الفرق الذي بينهما، أعمل Adjustment للـ
Weights الموجودة عندها.
الآن، الـ Neural Network، بشكل عام، يا جماعة الخير، هي
تحاكي الشبكات العصبية في الإنسان، أو الجهاز
العصبي في الإنسان. في الآخر، الـ Decision في الدماغ،
والخلايا العصبية منتشرة على كل جسمك. لو أنت ساكت، أو
سرحان، وقاعد بتحل في مسألة في الـ Data Mining، وجاء
زميلك، وطرف دبوس، وحاول يشكك في يدك، بدون ما تنتبه له،
أنت، بدون إرادة، ستجد أنّ يدك تحرّكت في الاتجاه
المضاد للّمسة، بحيث أنّها، يعني، تبعد عن مصدر الخطر.
الذي صار، أنت فعليًا لا تعرف ما الذي حدث، لكن مجرد
أنّك حركت، أبعدت يدك، ثم بدأت تفكر، لأنّ كانت
الحركة، أو الجهاز العصبي، أرسل إشارة إلى الدماغ، والدماغ
أخذ Processing سريعًا جدًا، أنّه: ابعد عن
الخطر هذا. وكذلك، يحدث هذا معنا في هذا الموضوع، عندما يكون
الشغلات: حريق، إلخ. الآن، هذا الكلام لم يحدث إلا
من خلال خبرة مكتسبة، موجودة عندنا. فالـ Neural
Network جاءت، لماذا؟ لأن الناس فكّروا فيها، في الـ
خمسينات، جاءت فكرة: لماذا لا نحاول محاكاة عقل الإنسان في
التعامل؟ نحن لا نهتم كثيرًا بالصبغة التاريخية
والتفاصيل كثيرًا. لكن بشكل عام، أبسط نموذج للشبكة
الموجودة عندي، لأنّ في النهاية، كل شيء Computation،
يا جماعة الخير، هي مجموعة الـ Input. مجموعة الـ Input،
الآن، ما هو P1 إلى PR؟ هي عبارة عن الـ Attributes،
تمثّل
الـ Input. طيب، وما هو A؟
الـ Output، للـ Class الموجود عندي هنا. الـ
Class الموجود عندي. ما الذي حدث؟ ما الذي فعلته فعليًا؟
كل Attribute له وزن. فأنا آخذ، أضرب قيمة الـ
Attribute، لاحظ، أقول: أضرب قيمة الـ Attribute في
الوزن، أجمعها، أضيف لها قيمة للـ Bias، و هذه الـ Function
تُجري Decision. أي واحد من الـ Binary Classification،
أو من الـ Classes، ستكون صفر أو واحد. يعني Binary
Classification. انتبه معي، وانتبه معي عندما
قلت: آخذ قيمة الـ Attribute، وأضربها. طيب، هل من الممكن أن
أعمل مع الـ Nominal Attribute؟ لا، هذا غير ممكن. الـ Data
Set الخاصة بك يجب أن تكون رقمية بالكامل. لأن لا يوجد مدى
أذهب إليه وأقول: والله، الـ Gender Male، أضرب في خمسة.
حوّلها إلى 0، 1، أو أي Attribute رقمي تراه
مناسبًا. الـ Income، كما رأينا قبل قليل، Fair و
Excellent، أيضًا، تُحوّل إلى أرقام. وبالتالي، بدلًا
من أن تكون Category، تُحوّل إلى أرقام.
تمام، حتى لو كان هناك Coding موجودة عندي، في النهاية، ما
سيحدث سيكون كالتالي: الـ Function الخاصة بي، الـ Prediction
Function الخاصة بي، هي عبارة عن Vector من الأوزان، مضروبة
في الـ Input، زائد الـ Bias الموجود عندي. في مرحلة
الـ Learning، تصبح الشبكة تبحث عن أفضل W و B، لأنّ
أنت لا تنسَ أنّها معادلة خطّ مستقيم، تبحث عن أفضل W
و B، لكن بـ Vectors. W تمثّل الأوزان الخاصة بـ
الـ Connection، و B تمثّل الـ Bias الخاصة بالـ Network، التي
موجودة في الـ Multilayer Neural Network. شغلنا هنا
مختلف.
سابقًا، كان عندي فقط Input و Output، في الـ Simple
Neural Network. وقبل قليل، قلنا أنّها عبارة عن
مجموعة من الـ Connected Input و الـ Output Units. الآن،
في الـ Multilayer، أضيف عندي ما بين الـ Layer
الأولى، التي تمثّل الـ Input، والـ Layer
الأخيرة، التي هي الـ Output Layer، صار يمثّل عندي
ما يُسمّى الـ Hidden Layer. بالمناسبة، الكثير من
الناس يرفضون الـ Neural Network، لأنّهم يعتبرونها Black
Box.
ماذا يعني Black Box؟ Black Box بمعنى أنّي فعليًا
لا أرى ما يحدث، ولا أعرف لماذا هذه الأوزان
أصبحت هكذا. وفعلاً، هذه هي، للأسف، الـ Algorithm التي
موجودة عندنا. يعني، صعب تفسيرها.
طيب، الآن، الـ Input، حسب الرسم الذي عندي هنا،
هنا، ثلاثة Inputs، واثنان Outputs. وكما قلنا،
بما أنّها كلها أرقام، معناته الـ Input الخاصة بها ستكون 0، 1.
معناته، كل Neural Network هذه ستكون صفر، واحد في
المرحلة الأولى. في الـ Network السابق، يا جماعة الخير،
هذه الـ Function: صفر،
واحد. Two classes: الـ Class الأول، والـ Class الثاني.
هنا، صار في عندي Two Neurons في الـ Output. معناته كل
واحد فيهم يعطيني صفر أو واحد. معناته، صار في عندي
Two bits. أجعلها Two bits: صفر، صفر؛ صفر، واحد؛
واحد، صفر؛ واحد، واحد. وكأنّي أتحدّث عن Four Classes.
يعني، بالـ Multilayer Neural Network، أصبح بإمكاني أن
أُعالج Dataset أكبر، أو أحصل على Multiclass
Classification. تعالوا نشوف الشكل العام الخاص بالـ
Network. هذا الشكل الذي رأيناه، نسميه
Network Topology. الـ Network Topology، هنا، ستحدّد
فيه عدد الـ Input، أو عدد الـ Units الخاصة بالـ Input، في الـ
Input Layer. طيب، ليس لي دخل كبير بها، لماذا؟ لأنّ
عادةً، عدد الـ Input Neurons يساوي
عدد الـ Attributes. يعني، ببساطة، كل Attribute في الـ
Data Set له Input Neuron واحد. يُفضّل أن تقوم بـ
Normalization لقيم الـ Attributes. ليس تفضيلاً،
بل قد يكون إلزاميًا، في مرحلة ما. لماذا؟ لأنّ
تتجنّب الـ Bias. ضع كل الـ Attributes الموجودة بعد
ما... بعد ما قمت بـ Preprocessing، وجّهزت...
جهزت الـ Data Set، لأنّ كل الـ Data كانت مستقلة،
لكنّ مُقياسها مختلف. وبما أنّ عملية
الحساب، كما رأينا سابقًا، تكون قيمتها، مثلًا، الـ
Call بالـ Minutes، خمسمائة، ألف، خمسمائة
دقيقة، في مقابل الـ Megabytes التي الـ Data... التي أنا
استخدمتها على الـ Mobile كانت بالأ... بالأيام. فواحد
سيكون وزنه أكبر من الآخر. فما الحل؟
لا، قم بـ Scaling، لتصبح من صفر إلى واحد، وسترتاح.
الآن، Number of Hidden Layers في الـ Topology. عدد الـ
Hidden Layer. وليس هذا فقط، عدد الـ Hidden Neurons في
الـ Hidden Layer، يعني
ببساطة، أنا أتحدّث عن الـ Neural Network،
أتحدث عن Input Layer، وأتحدث عن Hidden Layer، و
أتحدث عن Output Layer. ثلاث طبقات موجودة عندي. الـ
Input و الـ Output معروفان. ها هو Number of Classes، وهنا
Number of Attributes. أبو
هنا، هنا يا سيدي العزيز، لا أحد يُحكمك في شيء، ولا يوجد
قانون واضح. الآن، نحن نتحدث، لكي يكون عندي Multi
Layer، على الأقل يكون عندي Single Layer. وعندما
يكون عندي أكثر من Two Hidden Layers، تصبح Deep
Neural Network، تمام؟ وهذا المصطلح الذي يستخدمه
اليوم في الـ Machine Learning، يسمّى: Deep
Learning. لكنّنا الآن، بشكل بسيط، نتحدث عن
Input Layer، Hidden Layer واحد، و Output
Hidden Layer. بالنسبة لعدد الـ Neurons في الـ Hidden
Layer الموجودة عندي هنا، ليس لديّ
حسب الـ Attributes عندي. أربعة Input، أربعة Attributes،
وعندي Two Classes معروفة. ربما هؤلاء... أيضًا، لا يوجد عدد
محدد للـ Neurons. متروك لكم للتجربة والقياس، أو
تجربة والخطأ، كما نسميها أحيانًا، وتحديدها،
لكن بعض الناس يقول لك: دعني أضع Initialisation
لهذا الكلام، من خلال أن أبدأ بمجموع الاثنين على اثنين.
يعني، الآن، أربعة واثنين، ستة.
على اثنين: ثلاثة. ولاحظ، وكأنّه يصير عندي رسمة الشبكة: هي أربعة
في الـ Input، ثلاثة في الـ Output، أو عفواً في الـ
Hidden، واثنان في الـ Output.
وهذه الشبكة الخاصة بي، تصبح بهذا الشكل. أصبحت
ضيقَة باتجاه الـ Output الموجودة. واحد قال: لا،
أريد أن آخذ ضعف الـ Input، أو أريد أن آخذ مجموعهما. لا أحد
سيقول لك: لا. هذا متروك لك. لماذا؟ كما قلت لك، هذه
الشبكة تحتاج إلى Optimization. الـ Neural Network من
الأشياء التي تحتاج إلى Optimization كثيرًا، وتحتاج إلى عمل
كثير في الـ Configuration. نرجع إلى الـ Simplest الـ
Neural Network الموجودة عندي. في النهاية، الـ
Function
كيف الـ neural network بتشتغل؟ بتاخد الـ input تبع الـ
attributes اللي موجودة عنده، وبتدخل إياهُ في الـ
input فترة الـ training. بتدخل اتباعاً، أو عفواً، في الـ
attributes بتدخل بشكل متوازي مع بعضها، لأن زي ما
قلنا، الـ instance بالكامل بتدخل عندي على الـ system.
بعد هيك، في أوزان الشبكة، عادة بتبدأ بـ random weight.
بتبدأ بـ random weight، و الأوزان مع كل connection
مع كل connection من الـ connections السابقة. هاي في
أول ما بتبدأ الشبكة بتحط random weight.
الخطوة اللي بعد هيك، لما أنا بعد ما بتروح تدخل، لاحظ
معايا، خلينا نقول، الـ input in your own hand. هنّفي W1
1, W1 2, W1 3, و W1 4. لأيش؟ لأن عندي 4 hidden neuron و
4 connection. الـ value تبع الـ hidden neuron، أو الـ
input neuron، هذا اللي تبع الـ attribute الأول.
خلّيني، على سبيل المثال، نقول هنا 1.7 من عشرة الآن.
1.7 من عشرة ضرب W1 1. جاية لمين؟ للـ hidden neuron.
هنا في المقابل، عندي هنا مثلاً كانت 2، وهذه الـ W 2 1.
و هذه الـ W 3 1، و هذه الـ W 1 1، و هذه الـ W 3 1، و
هذه الـ W 3 1، و هذه الـ W 3 1، و هذه الـ W 3 1، و
هذه الـ W 3 1، و هذه الـ
W 3 1، و هذه الـ W 3 1، و هذه الـ W 3 1.
وبديني decision، انه بيطلع output، و الـ output برضه
فيه إلها أوزان وبتتوزع على... يعني الآن السهم اللي
داخل على الـ neuron بيمثل الـ input، و اللي طالع منه
بيمثل الـ output تبعته. ايش الـ... اوكي، احنا عرفنا هنّ
انه الـ input. طب ايش الـ input؟ ايش الـ output؟ عفواً،
ما هي القيمة اللي طالعة عندي من الـ hidden neuron؟
هي عبارة عن تجميع على العناصر اللي موجودة عندي هنا.
ومن ثم بصدرليها بنفس الفكرة على الأوزان اللي جاي
بعدها، وهكذا بتتم عمل الشبكة. الآن هذه الشبكات
بتشتغل ضمن الـ feed forward neural network.
في الـ feed forward neural network، أنا فعلياً قاعد
بشتغل باتجاه واحد فقط، وهو الاتجاه أو التدفق
الطبيعي للشبكة، من الـ input لحد الـ output اللي
موجودة عندي. نقاط القوة في الشبكة، انه فعلياً بتتحكم
أو بتقدر تسيطر بشكل قوي على الـ noise data اللي
موجودة عندي. هان بتقدر تعمل classification على
untrained pattern، بتقدر تتحملها، detection بشكل
بسيط. مناسبة جداً للـ continuous value في الـ input و
الـ output، على خلاف اللي احنا شفناهم سابقاً، الـ
classifiers السابقة. بتشتغل مع أي قرية من الـ real
world data، حتى لو كانت بالـ handwritten. الـ
algorithm ممكن يطبق parallel بشكل متوازي، وبالتالي
هذا بيعمل على تسريع العمل. الـ weaknesses تبعتها، إنها
بتحتاج لفترة طويلة من التعليم، لأن زي ما شفنا أن
الأوزان كلها بتتغير. تخيل أنك في عندك عشرة input، في
عشرة hidden، في أربعة، أو بلاش في اتنين
output. اضرب هدول، هي عبارة عن عدد الـ connections
اللي موجودة، وعدد الـ connections بيساوي عدد الأوزان.
وبالتالي، بتكلم على 200 value كأوزان، بدها تغيير مع
كل عملية الـ training، و هذا مع كل instance، وبالتالي
موضوع الـ training هياخد منه وقت طويل. بتحتاج ده
كتير من الـ argument أو من الـ parameter. أنا بحتاج
أعملها tuning بشكل صحيح، عشان أقدر أحصل على الـ
result المطلوبة. منها إن الـ structure تبعتها أبسط
ما يمكن. ايش الـ structure؟ ايش الـ activation
function اللي أنا بدي اعتمدها؟ إلى آخره. الآن من
أهم الـ neural network اللي موجودة يا جماعة الخير،
شغلة بنسميها الـ back propagate neural network، back
propagate، الانتشار للخلف. الآن أنا هوضحها بشكل سريع.
هان، هحاول أرسمها على الصبورة، بس عشان تنتين، تلاتة،
أربعة، واحدة، تنتين، تلاتة، واحدة، تنتين، واحد، اتنين،
تلاتة.
تمام، عشان نفهم بس مبدأ الـ neural network، أو الـ
back propagate neural network، بشكل سريع، و مش هخش
في المعادلات الرياضية التفصيلية اللي هشغل عليها، لكن
أنا بهمني الآن نفهم الـ concept على السريع. الآن
تخيل أن أنا في عندي instance، أو الـ data set
المفروض الـ data set تبعتي، أو الـ data set تبعتي
مكونة من four attributes و one class attribute،
مظبوط، و one target. بنسميهم A1, A2, A3, A4، و الـ
label. طبعاً المفروض هنقل A1, A2, A3, A4، وهنا
المفروض في عندي الـ label. الآن الفكرة فيها أنه هياخد
الـ instance في الأول، أول ما بأتكلم على الـ
topology تبعتها، بروح بياخد مني عندي random weight.
بياخد أوزان من صفر لواحد، على كل الـ connections
اللي موجودة. تمام؟ الآن بياخد الـ value، مثلاً واحد،
واحد، صفر، واحد، والـ label تبعتها كانت، كانت على سبيل
مثال واحد، بالشكل هذا. فبياخد القيم اللي موجودة هنا،
وبضربها مع الأوزان اللي موجودة، لحد ما بياخد الـ
output. الآن في عندي الـ real class، وفي عندي الـ
predicted class.
الفرق بينهم، بياخد
الخطأ هذا، وبيبدأ يوزعه بالعكس. جداش الوزن كان هذا
random، جداش الـ connection، جداش كل connection ساهم
بالوزن أو بالخطأ هذا، فبتوزع عليهم الخطأ. وكل مكان
اللي predicted تبعتي صح، بتكون الـ error zero. معناته
أنا مش بحاجة أرجع. يعني، بشكل عام، الـ neural network
بشكل عام، أو الـ back propagation neural network
بشكل عام، بتشتغل على two ways. الطريقة الأولى، مرحلة الـ
prediction. باخد الـ input تبعتي، بدخلها على الـ data
على الـ neural network، بحسب لحد ما بحصل على الـ
output، بحسب الـ error، و بروح بوزن قيمة أو بعدل
الأوزان تبعاً لقيمة الخطأ اللي موجود عندهم.
وهذا فعلياً اللي بتصير عندنا في الـ neural network
في الـ back propagate الـ neural network. الـ forward
path، الـ path الأولى، بطبق الـ input و بحسب الـ output
تبع الـ activation function، و بحسب الخطأ اللي موجود
عندي. في الـ back propagate path، أنا فعلياً باخد
قيمة الخطأ، و بعدل الأوزان حسب مساهمتها في نسبة
الخطأ اللي موجودة عندنا هنا. آخر slide موجودة عندي
هان، اللي هي slide اللي لها علاقة بالبايثون. كيف
ممكن أنا أطبق الـ back propagation neural network
على الـ بايثون؟ طبعاً أنا اشتغلت كالتالي هان، عملت load
للـ iris للـ data set اللي موجودة عندي هان، from ASCII
layer.linear_model import perceptron. اشتغلت
على الأبسط، الـ neural network اللي موجودة عندنا هنا.
حددت الـ target تبعتها، و حولتها لـ numbers: setosa
طبعاً، أو not setosa. هيك لأن في الـ binary
classification، and one، أو الـ symbol. الـ neural
network بتشتغل على binary classification، زي ما شفنا.
فحولت... قلت إما هذا، فيها three classes، حولت لـ two
classes: صفر و واحد، setosa و not setosa. استدعيت
الـ neural network تبعتي، from scikit-learn.neural_
network import MLPClassifier.
الـ model هذا، بيتطلب مني اني احدد له شغلات كتيرة: عدد
الـ hidden layer، قلت له اتنين، و خمسة neuron في كل
واحدة، أو الـ solver، اللي هي الـ activation function
تبعتي، الـ alpha اللي بتمثل الـ learning rate، هذه
ما لكوش دخل فيها الآن. الـ solver و الـ hidden layer
size، الـ hidden layer size هي تبعتي المهمة بالنسبة
لي. الـ activation function هي الـ radial basis
function. وهنا بنتكلم على الـ network اللي موجودة
هنا، فقلت له أعمل train تبع الـ X و الـ Y، فرح يعدل
الأوزان اللي موجودة عندي هنا. فلما أنا بدي أزوده
الآن data، وأقول له اعملها prediction، الـ data بدها
تكون تماماً مع الـ data، مع الـ input اللي موجودة
عنديها، وهذه الـ data set هي عبارة عن مجموعة من
العناصر اللي موجودة عندها. إذا قدمت ليها as in، أو
matrix، فبياخدها، وفي الآخر هتديني prediction اللي
موجودة. يعني، باختصار بسيط جداً، أنا المفروض أن الـ data
set تبعتي، أحولها كلها لـ numeric data، في حال إذا
كنت أنا بدي اشتغل مع الـ Neural Network. بتمنى عليكم
وهذه تجربوها، وتفهموا الموضوع كويس، وزي ما قلنا
سابقا، على الـ forum اللي موجود على الـ model، أنا
مستعد إن شاء الله تعالى للإجابة على أي سؤال، وطبعاً
احنا اتعمدنا الإجابات على الـ forum، مش على الخاص،
عشان نقدر الفائدة تعمل للجميع. والسلام عليكم ورحمة
الله وبركاته.