برنامج تعليمي عميق للتعلم: من Perceptrons إلى Deep Networks
نشرت: 2022-03-11شهد مجال الذكاء الاصطناعي انتعاشًا في السنوات الأخيرة. لقد انتشر خارج العالم الأكاديمي حيث قام لاعبون كبار مثل Google و Microsoft و Facebook بإنشاء فرق بحثية خاصة بهم وإجراء بعض عمليات الاستحواذ الرائعة.
يمكن أن يُعزى بعض ذلك إلى وفرة البيانات الأولية الناتجة عن مستخدمي الشبكات الاجتماعية ، والتي يحتاج الكثير منها إلى التحليل ، وظهور حلول علوم البيانات المتقدمة ، فضلاً عن القوة الحسابية الرخيصة المتاحة عبر وحدات معالجة الرسوميات GPGPU.
ولكن بعيدًا عن هذه الظواهر ، فإن هذا الانبعاث كان مدعومًا إلى حد كبير باتجاه جديد في الذكاء الاصطناعي ، وتحديداً في التعلم الآلي ، المعروف باسم "التعلم العميق". في هذا البرنامج التعليمي ، سأقدم لك المفاهيم والخوارزميات الأساسية وراء التعلم العميق ، بدءًا من أبسط وحدة تكوين وبناءً على مفاهيم التعلم الآلي في Java.
(للإفصاح الكامل: أنا أيضًا مؤلف مكتبة Java Deep Learning ، المتاحة هنا ، ويتم تنفيذ الأمثلة الواردة في هذه المقالة باستخدام المكتبة أعلاه. إذا كنت ترغب في ذلك ، يمكنك دعمها من خلال منحها نجمة على GitHub ، الذي سأكون ممتنًا له. تعليمات الاستخدام متوفرة على الصفحة الرئيسية.)
البرنامج التعليمي الثاني والثلاثون حول التعلم الآلي
إذا لم تكن مألوفًا لك ، فاطلع على هذه المقدمة للتعلم الآلي:
الإجراء العام كما يلي:
- لدينا بعض الخوارزمية التي أعطيت مجموعة من الأمثلة المصنفة ، لنقل 10 صور لكلاب تحمل التصنيف 1 ("كلب") و 10 صور لأشياء أخرى مع التصنيف 0 ("ليس كلبًا") - لاحظ أننا نلتزم بشكل أساسي لتصنيف ثنائي خاضع للإشراف لهذه الوظيفة.
- "تتعلم" الخوارزمية التعرف على صور الكلاب ، وعند تغذية صورة جديدة ، تأمل في إنتاج الملصق الصحيح (1 إذا كانت صورة كلب ، و 0 بخلاف ذلك).
هذا الإعداد عام بشكل لا يصدق: قد تكون بياناتك أعراضًا وتسمياتك للأمراض ؛ أو يمكن أن تكون بياناتك صورًا لأحرف مكتوبة بخط اليد وتسمياتك بالأحرف الفعلية التي تمثلها.
المفاهيم: خوارزميات التعلم العميق المبكر
واحدة من أقدم خوارزميات التدريب الخاضع للإشراف هي خوارزميات Perceptron ، وهي لبنة أساسية لبناء الشبكة العصبية.
لنفترض أن لدينا نقاط n في المستوى ، مسماة "0" و "1". لقد حصلنا على نقطة جديدة ونريد تخمين تسميتها (هذا مشابه لسيناريو "كلب" و "ليس كلب" أعلاه). كيف لنا أن نفعل ذلك؟
قد يكون أحد الأساليب هو إلقاء نظرة على أقرب الجيران وإعادة تسمية تلك النقطة. ولكن الطريقة الأكثر ذكاءً للقيام بذلك تتمثل في اختيار السطر الذي يفصل البيانات المصنفة بشكل أفضل واستخدامه كمصنف خاص بك.
في هذه الحالة ، سيتم تمثيل كل جزء من بيانات الإدخال كمتجه x = ( x_1، x_2 ) وستكون وظيفتنا مثل "" 0 "إذا كانت أسفل السطر ،" 1 "إذا كانت أعلاه".
لتمثيل هذا رياضيًا ، دع الفاصل يتم تعريفه بواسطة متجه للأوزان w والإزاحة الرأسية (أو التحيز) ب . بعد ذلك ، ستجمع وظيفتنا بين المدخلات والأوزان مع دالة تحويل المجموع الموزون:
سيتم بعد ذلك إدخال نتيجة وظيفة النقل هذه في وظيفة التنشيط لإنتاج بطاقة العنونة. في المثال أعلاه ، كانت وظيفة التنشيط الخاصة بنا هي حد القطع (على سبيل المثال ، 1 إذا كانت أكبر من بعض القيمة):
تدريب Perceptron
يتكون تدريب الباسترون من إطعامه عينات تدريبية متعددة وحساب الناتج لكل منها. بعد كل عينة ، يتم تعديل الأوزان w بهذه الطريقة لتقليل خطأ الإخراج ، والذي يُعرّف على أنه الفرق بين (الهدف) المطلوب والمخرجات الفعلية . هناك وظائف خطأ أخرى ، مثل متوسط الخطأ التربيعي ، لكن المبدأ الأساسي للتدريب يظل كما هو.
عيوب منظور واحد
نهج الإدراك الفردي للتعلم العميق له عيب رئيسي واحد: يمكنه فقط تعلم الوظائف القابلة للفصل خطيًا. ما مدى أهمية هذا العيب؟ خذ XOR ، وهي دالة بسيطة نسبيًا ، ولاحظ أنه لا يمكن تصنيفها بواسطة فاصل خطي (لاحظ المحاولة الفاشلة أدناه):
لمعالجة هذه المشكلة ، سنحتاج إلى استخدام منظور متعدد الطبقات ، يُعرف أيضًا باسم الشبكة العصبية feedforward: في الواقع ، سنقوم بتكوين مجموعة من هذه المدركات معًا لإنشاء آلية أكثر قوة للتعلم.
الشبكات العصبية Feedforward للتعلم العميق
الشبكة العصبية هي في الحقيقة مجرد تركيبة من الإدراك الحسي ، متصلة بطرق مختلفة وتعمل بوظائف تنشيط مختلفة.
بالنسبة للمبتدئين ، سنلقي نظرة على الشبكة العصبية المغذية ، والتي لها الخصائص التالية:
- إدخال ومخرج وطبقة واحدة أو أكثر من الطبقات المخفية . يوضح الشكل أعلاه شبكة ذات طبقة إدخال مكونة من 3 وحدات وطبقة مخفية مكونة من 4 وحدات وطبقة إخراج مكونة من وحدتين (المصطلحات والوحدات والخلايا العصبية قابلة للتبديل).
- كل وحدة هي واحدة من الإدراك الحسي مثل تلك الموصوفة أعلاه.
- تعمل وحدات طبقة الإدخال كمدخلات لوحدات الطبقة المخفية ، بينما وحدات الطبقة المخفية هي مدخلات إلى طبقة الإخراج.
- كل اتصال بين اثنين من الخلايا العصبية له وزن w (مشابه لأوزان perceptron).
- عادةً ما يتم توصيل كل وحدة من وحدات الطبقة t بكل وحدة من الطبقة السابقة t - 1 (على الرغم من أنه يمكنك فصلها عن طريق ضبط وزنها على 0).
- لمعالجة بيانات الإدخال ، تقوم "بربط" متجه الإدخال بطبقة الإدخال ، وتعيين قيم المتجه على أنها "مخرجات" لكل وحدة من وحدات الإدخال. في هذه الحالة بالذات ، يمكن للشبكة معالجة متجه إدخال ثلاثي الأبعاد (بسبب وحدات الإدخال الثلاثة). على سبيل المثال ، إذا كان متجه الإدخال الخاص بك هو [7 ، 1 ، 2] ، فأنت تقوم بتعيين إخراج وحدة الإدخال العليا على 7 ، والوحدة الوسطى على 1 ، وهكذا. يتم بعد ذلك نشر هذه القيم للأمام إلى الوحدات المخفية باستخدام دالة نقل المجموع المرجح لكل وحدة مخفية (ومن هنا جاء مصطلح الانتشار الأمامي) ، والذي بدوره يحسب مخرجاتها (وظيفة التنشيط).
- تحسب الطبقة الناتجة مخرجاتها بنفس طريقة الطبقة المخفية. نتيجة طبقة الإخراج هي ناتج الشبكة.
ما وراء الخطية
ماذا لو سمح لكل من المدركين لدينا باستخدام وظيفة التنشيط الخطي فقط؟ بعد ذلك ، سيظل الناتج النهائي لشبكتنا عبارة عن وظيفة خطية للمدخلات ، يتم تعديلها فقط بعدد كبير من الأوزان المختلفة التي يتم جمعها عبر الشبكة. بمعنى آخر ، لا يزال التركيب الخطي لمجموعة من الوظائف الخطية مجرد وظيفة خطية. إذا كنا مقيدًا بوظائف التنشيط الخطي ، فلن تكون الشبكة العصبية المغذية أقوى من المستشعر ، بغض النظر عن عدد الطبقات التي يمتلكها.
لهذا السبب ، تستخدم معظم الشبكات العصبية وظائف التنشيط غير الخطية مثل اللوجيستية أو التان أو الثنائي أو المعدل. بدونهم ، يمكن للشبكة أن تتعلم فقط الوظائف التي هي مجموعات خطية من مدخلاتها.
مدركات التدريب
تُعرف خوارزمية التعلم العميق الأكثر شيوعًا للتدريب الخاضع للإشراف للمستقبلات متعددة الطبقات باسم backpropagation. الإجراء الأساسي:
- يتم تقديم عينة تدريبية ونشرها للأمام من خلال الشبكة.
يتم حساب خطأ الإخراج ، وعادةً ما يكون متوسط الخطأ التربيعي:
حيث t هي القيمة المستهدفة و y هو ناتج الشبكة الفعلي. حسابات الأخطاء الأخرى مقبولة أيضًا ، لكن MSE اختيار جيد.
يتم تقليل خطأ الشبكة إلى الحد الأدنى باستخدام طريقة تسمى النسب المتدرج العشوائي.
يعتبر الانحدار المتدرج عالميًا ، ولكن في حالة الشبكات العصبية ، سيكون هذا رسمًا بيانيًا لخطأ التدريب كدالة لمعلمات الإدخال. القيمة المثلى لكل وزن هي القيمة التي يحقق عندها الخطأ حدًا أدنى عالميًا . أثناء مرحلة التدريب ، يتم تحديث الأوزان بخطوات صغيرة (بعد كل عينة تدريب أو مجموعة صغيرة من عدة عينات) بطريقة يحاولون دائمًا الوصول إلى الحد الأدنى العالمي - ولكن هذه ليست مهمة سهلة ، كما هو الحال بالنسبة لك غالبًا ما ينتهي بهم الأمر في الحدود الدنيا المحلية ، مثل تلك الموجودة على اليمين. على سبيل المثال ، إذا كان الوزن بقيمة 0.6 ، فيجب تغييره باتجاه 0.4.
يمثل هذا الرقم أبسط حالة ، حيث يعتمد الخطأ على معلمة واحدة. ومع ذلك ، يعتمد خطأ الشبكة على وزن كل شبكة وتكون وظيفة الخطأ أكثر تعقيدًا بكثير.
لحسن الحظ ، يوفر backpropagation طريقة لتحديث كل وزن بين خليتين عصبيتين فيما يتعلق بخطأ الإخراج. يعتبر الاشتقاق نفسه معقدًا للغاية ، لكن تحديث الوزن لعقدة معينة له الشكل التالي (البسيط):
حيث E هو خطأ الإخراج ، و w_i هو وزن الإدخال i إلى الخلية العصبية.
بشكل أساسي ، الهدف هو التحرك في اتجاه التدرج فيما يتعلق بالوزن . المصطلح الأساسي ، بالطبع ، هو مشتق الخطأ ، والذي ليس من السهل دائمًا حسابه: كيف يمكنك العثور على هذا المشتق لوزن عشوائي لعقدة مخفية عشوائية في وسط شبكة كبيرة؟
الجواب: من خلال backpropagation. يتم حساب الأخطاء أولاً في وحدات الإخراج حيث تكون الصيغة بسيطة للغاية (بناءً على الاختلاف بين القيم المستهدفة والقيم المتوقعة) ، ثم يتم نشرها مرة أخرى عبر الشبكة بطريقة ذكية ، مما يسمح لنا بتحديث أوزاننا بكفاءة أثناء التدريب و (نأمل) الوصول إلى الحد الأدنى.
طبقة مخفية
الطبقة المخفية ذات أهمية خاصة. من خلال نظرية التقريب العام ، يمكن تدريب شبكة طبقة واحدة مخفية مع عدد محدود من الخلايا العصبية لتقريب وظيفة عشوائية عشوائية. بمعنى آخر ، طبقة مخفية واحدة قوية بما يكفي لتعلم أي وظيفة. بعد قولي هذا ، غالبًا ما نتعلم بشكل أفضل في الممارسة مع طبقات متعددة مخفية (أي شبكات أعمق).
الطبقة المخفية هي المكان الذي تخزن فيه الشبكة التمثيل التجريدي الداخلي لبيانات التدريب ، على غرار الطريقة التي يمتلك بها دماغ الإنسان (تشبيه مبسط إلى حد كبير) تمثيل داخلي للعالم الحقيقي. للمضي قدمًا في البرنامج التعليمي ، سنلقي نظرة على طرق مختلفة للتلاعب بالطبقة المخفية.
شبكة مثال
يمكنك رؤية شبكة عصبية موجّهة بسيطة (4-2-3 طبقة) تصنف مجموعة بيانات IRIS المطبقة في Java هنا من خلال طريقة testMLPSigmoidBP . تحتوي مجموعة البيانات على ثلاث فئات من نباتات القزحية مع ميزات مثل الطول الكبسي وطول البتلة وما إلى ذلك. وتقدم الشبكة 50 عينة لكل فئة. يتم تثبيت الميزات على وحدات الإدخال ، بينما تتوافق كل وحدة إخراج مع فئة واحدة من مجموعة البيانات: يشير "1/0/0" إلى أن المصنع من فئة Setosa ، ويشير "0/1/0" إلى Versicolour و " 0/0/1 "يشير إلى فيرجينيكا). خطأ التصنيف هو 2/150 (أي أنه أخطأ في تصنيف عينتين من أصل 150).
مشكلة الشبكات الكبيرة
يمكن أن تحتوي الشبكة العصبية على أكثر من طبقة مخفية واحدة: في هذه الحالة ، تقوم الطبقات العليا "ببناء" تجريدات جديدة فوق الطبقات السابقة. وكما ذكرنا سابقًا ، يمكنك غالبًا التعلم بشكل أفضل أثناء الممارسة مع الشبكات الأكبر.
ومع ذلك ، تؤدي زيادة عدد الطبقات المخفية إلى مشكلتين معروفتين:
- تلاشي التدرجات اللونية: عندما نضيف المزيد والمزيد من الطبقات المخفية ، تصبح ميزة backpropagation أقل وأقل فائدة في تمرير المعلومات إلى الطبقات السفلية. في الواقع ، مع إعادة المعلومات ، تبدأ التدرجات في التلاشي وتصبح صغيرة بالنسبة لأوزان الشبكات.
- overfitting: ربما تكون المشكلة المركزية في التعلم الآلي. باختصار ، يصف overfitting ظاهرة ملاءمة بيانات التدريب بشكل وثيق للغاية ، ربما مع فرضيات معقدة للغاية . في مثل هذه الحالة ، سينتهي المتعلم الخاص بك بتلائم بيانات التدريب بشكل جيد حقًا ، لكنه سيؤدي بشكل سيئ أكثر وأكثر في الأمثلة الحقيقية.
دعونا نلقي نظرة على بعض خوارزميات التعلم العميق لمعالجة هذه القضايا.
أجهزة التشفير التلقائي
تميل معظم فصول التعلم الآلي التمهيدية إلى التوقف عن الشبكات العصبية المغذية. لكن مساحة الشباك الممكنة أكثر ثراءً - لذا فلنكمل.
عادةً ما يكون المشفر التلقائي عبارة عن شبكة عصبية تلقائية تهدف إلى تعلم تمثيل (ترميز) مضغوط وموزع لمجموعة البيانات.
من الناحية المفاهيمية ، يتم تدريب الشبكة على "إعادة إنشاء" المدخلات ، أي أن البيانات المدخلة والهدف هي نفسها. بمعنى آخر: أنت تحاول إخراج نفس الشيء الذي أدخلته ، لكن مضغوطًا بطريقة ما. هذا نهج محير ، لذلك دعونا نلقي نظرة على مثال.
ضغط الإدخال: صور بتدرج الرمادي
لنفترض أن بيانات التدريب تتكون من 28x28 صورة ذات تدرج رمادي وأن قيمة كل بكسل مثبتة في خلية واحدة بطبقة إدخال (أي أن طبقة الإدخال ستحتوي على 784 خلية عصبية). بعد ذلك ، سيكون لطبقة الإخراج نفس عدد الوحدات (784) مثل طبقة الإدخال وستكون القيمة المستهدفة لكل وحدة إخراج هي قيمة التدرج الرمادي لبكسل واحد من الصورة.
يتمثل الحدس الكامن وراء هذه البنية في أن الشبكة لن تتعلم "رسم خرائط" بين بيانات التدريب وتسمياتها ، ولكنها ستتعلم بدلاً من ذلك الهيكل الداخلي وميزات البيانات نفسها. (لهذا السبب ، تسمى الطبقة المخفية أيضًا كاشف المعالم .) عادةً ما يكون عدد الوحدات المخفية أصغر من طبقات الإدخال / الإخراج ، مما يفرض على الشبكة معرفة أهم الميزات فقط ويحقق تقليلًا في الأبعاد.
في الواقع ، نريد عددًا قليلاً من العقد الصغيرة في الوسط لتعلم البيانات حقًا على المستوى المفاهيمي ، مما ينتج عنه تمثيل مضغوط يلتقط بطريقة ما الميزات الأساسية لمدخلاتنا.
مرض الانفلونزا
لتوضيح المزيد من أجهزة التشفير التلقائي ، دعنا نلقي نظرة على تطبيق آخر.
في هذه الحالة ، سنستخدم مجموعة بيانات بسيطة تتكون من أعراض الأنفلونزا (يُنسب إلى هذه المدونة هذه الفكرة). إذا كنت مهتمًا ، فيمكن العثور على الكود الخاص بهذا المثال في طريقة testAEBackpropagation .
إليك كيفية تقسيم مجموعة البيانات:
- هناك ست ميزات الإدخال الثنائي.
- الثلاثة الأولى هي أعراض المرض. على سبيل المثال ، يشير 1 0 0 0 0 0 إلى أن هذا المريض يعاني من ارتفاع في درجة الحرارة ، بينما يشير 0 1 0 0 0 0 إلى السعال ، ويشير 1 1 0 0 0 0 إلى السعال وارتفاع درجة الحرارة ، إلخ.
- السمات الثلاث الأخيرة هي أعراض "مضادة". عندما يكون لدى المريض واحدة من هذه ، فمن غير المرجح أن يكون مريضًا. على سبيل المثال ، يشير 0 0 0 1 0 0 إلى أن هذا المريض لديه لقاح ضد الإنفلونزا. من الممكن أن يكون لديك مجموعة من مجموعتي الميزات: 0 1 0 1 0 0 تشير إلى أن مريض اللقاح مصاب بسعال ، وهكذا دواليك.
سنعتبر المريض مريضًا عندما يكون لديه على الأقل ميزتان من السمات الثلاث الأولى ويتمتع بصحة جيدة إذا كان لديه على الأقل اثنتان من الثلاثة الثانية (مع كسر الروابط لصالح المرضى الأصحاء) ، على سبيل المثال:
- 111000 ، 101000 ، 110000 ، 011000 ، 011100 = مريض
- 000111 ، 001110 ، 000101 ، 000011 ، 000110 = صحي
سنقوم بتدريب جهاز تشفير تلقائي (باستخدام backpropagation) بستة مدخلات وست وحدات إخراج ، ولكن فقط وحدتان مخفيتان .
بعد عدة مئات من التكرارات ، نلاحظ أنه عند تقديم كل عينة من العينات "المريضة" إلى شبكة التعلم الآلي ، فإن إحدى الوحدتين المخفيتين (نفس الوحدة لكل عينة "مريضة") تعرض دائمًا قيمة تنشيط أعلى من آخر. على العكس من ذلك ، عند تقديم عينة "صحية" ، يكون تنشيط الوحدة المخفية الأخرى أعلى.
العودة إلى تعلم الآلة
في الأساس ، تعلمت وحدتنا المخفية تمثيلًا مضغوطًا لمجموعة بيانات أعراض الأنفلونزا. لنرى كيف يرتبط هذا بالتعلم ، نعود إلى مشكلة فرط التجهيز. من خلال تدريب شبكتنا على تعلم تمثيل مضغوط للبيانات ، فإننا نفضل تمثيلًا أبسط بدلاً من فرضية شديدة التعقيد تلائم بيانات التدريب.
بطريقة ما ، من خلال تفضيل هذه التمثيلات الأبسط ، نحاول تعلم البيانات بمعنى أكثر صحة.
آلات Boltzmann المقيدة
تتمثل الخطوة المنطقية التالية في النظر إلى آلات بولتزمان المقيدة (RBM) ، وهي شبكة عصبية عشوائية مولدة يمكنها معرفة توزيع الاحتمالات على مجموعة المدخلات الخاصة بها .
تتكون RBMs من طبقة مخفية ومرئية ومنحازة. على عكس شبكات التغذية الأمامية ، فإن الاتصالات بين الطبقات المرئية والمخفية غير موجهة (يمكن نشر القيم في كل من الاتجاهات المرئية إلى المخفية والمخفية إلى المرئية) ومتصلة بالكامل (كل وحدة من طبقة معينة متصلة بـ كل وحدة في التالية - إذا سمحنا لأي وحدة في أي طبقة بالاتصال بأي طبقة أخرى ، فسنحصل على آلة Boltzmann (بدلاً من Boltzmann المقيدة ).

يحتوي RBM القياسي على وحدات ثنائية مخفية ومرئية: أي أن تنشيط الوحدة هو 0 أو 1 بموجب توزيع برنولي ، ولكن هناك متغيرات مع غير الخطية الأخرى.
بينما يعرف الباحثون عن أنظمة الإدارة القائمة على النتائج لبعض الوقت الآن ، فإن الإدخال الأخير لخوارزمية التدريب غير الخاضعة للإشراف الاختلاف التباين قد جدد الاهتمام.
الاختلاف التقابلي
تعمل خوارزمية التباعد التباين أحادية الخطوة (CD-1) على النحو التالي:
- المرحلة الإيجابية :
- يتم تثبيت عينة الإدخال v على طبقة الإدخال.
- v إلى الطبقة المخفية بطريقة مماثلة لشبكات التغذية الأمامية. نتيجة تنشيط الطبقة المخفية هي h .
- المرحلة السلبية :
- انشر h مرة أخرى إلى الطبقة المرئية بالنتيجة v ' (الروابط بين الطبقات المرئية والمخفية غير موجهة وبالتالي تسمح بالحركة في كلا الاتجاهين).
- انشر حرف v الجديد إلى الطبقة المخفية بنتيجة التنشيط h .
تحديث الوزن :
حيث a هو معدل التعلم و v و v ' و h و h' و w هي نواقل.
الحدس وراء الخوارزمية هو أن المرحلة الإيجابية ( h معطى v ) تعكس التمثيل الداخلي للشبكة لبيانات العالم الحقيقي . وفي الوقت نفسه ، تمثل المرحلة السلبية محاولة لإعادة إنشاء البيانات بناءً على هذا التمثيل الداخلي ( v ' معطى h ). الهدف الرئيسي هو أن تكون البيانات التي تم إنشاؤها أقرب ما يمكن إلى العالم الحقيقي وهذا ينعكس في صيغة تحديث الوزن.
بمعنى آخر ، تمتلك الشبكة بعض الإدراك لكيفية تمثيل بيانات الإدخال ، لذا فهي تحاول إعادة إنتاج البيانات بناءً على هذا التصور. إذا لم يكن استنساخه قريبًا بدرجة كافية من الواقع ، فإنه يقوم بإجراء تعديل ويحاول مرة أخرى.
العودة الى الانفلونزا
لإثبات الاختلاف التباين ، سنستخدم نفس مجموعة بيانات الأعراض كما في السابق. شبكة الاختبار عبارة عن RBM مع ست وحدات مرئية ووحدتين مخفيتين. سنقوم بتدريب الشبكة باستخدام الاختلاف التباين مع تثبيت الأعراض v على الطبقة المرئية. أثناء الاختبار ، تظهر الأعراض مرة أخرى على الطبقة المرئية ؛ ثم يتم نشر البيانات إلى الطبقة المخفية. تمثل الوحدات المخفية الحالة المرضية / الصحية ، وهي بنية مشابهة جدًا لجهاز التشفير التلقائي (نشر البيانات من الطبقة المرئية إلى الطبقة المخفية).
بعد عدة مئات من التكرارات ، يمكننا ملاحظة نفس النتيجة كما هو الحال مع أجهزة التشفير التلقائي: تتمتع إحدى الوحدات المخفية بقيمة تنشيط أعلى عند تقديم أي من العينات "المريضة" ، بينما يكون الآخر دائمًا أكثر نشاطًا للعينات "الصحية".
يمكنك مشاهدة هذا المثال عمليًا في طريقة testContrastiveDivergence .
شبكات عميقة
لقد أثبتنا الآن أن الطبقات المخفية من أجهزة التشفير التلقائي و RBMs تعمل ككاشفات ميزات فعالة ؛ ولكن من النادر أن نتمكن من استخدام هذه الميزات مباشرة. في الواقع ، مجموعة البيانات أعلاه هي استثناء أكثر من كونها قاعدة. بدلاً من ذلك ، نحتاج إلى إيجاد طريقة ما لاستخدام هذه الميزات المكتشفة بشكل غير مباشر.
لحسن الحظ ، تم اكتشاف أن هذه الهياكل يمكن تكديسها لتشكيل شبكات عميقة . يمكن تدريب هذه الشبكات بجشع ، طبقة واحدة في كل مرة ، للمساعدة في التغلب على التدرج اللوني المتلاشي ومشاكل التجهيز الزائد المرتبطة بالانتشار الخلفي الكلاسيكي.
غالبًا ما تكون الهياكل الناتجة قوية جدًا ، وتنتج نتائج رائعة. خذ ، على سبيل المثال ، ورق "cat" الشهير من Google والذي يستخدم فيه نوعًا خاصًا من أجهزة التشفير التلقائي العميقة "لتعلم" اكتشاف وجه الإنسان والقط استنادًا إلى بيانات غير مصنفة.
دعونا نلقي نظرة فاحصة.
مكدسة المبرمجين الآليين
كما يوحي الاسم ، تتكون هذه الشبكة من عدة أجهزة تشفير تلقائية مكدسة.
تعمل الطبقة المخفية من وحدة التشفير التلقائي t كطبقة إدخال إلى وحدة التشفير التلقائي t + 1 . طبقة الإدخال الخاصة بأول وحدة تشفير تلقائية هي طبقة الإدخال للشبكة بأكملها. يعمل إجراء التدريب الطبقي الجشع على النحو التالي:
- قم بتدريب أول مشفر تلقائي ( t = 1 ، أو الاتصالات الحمراء في الشكل أعلاه ، ولكن مع طبقة إخراج إضافية) بشكل فردي باستخدام طريقة backpropagation مع جميع بيانات التدريب المتاحة.
- قم بتدريب المشفر التلقائي الثاني t = 2 (الوصلات الخضراء). نظرًا لأن طبقة الإدخال لـ t = 2 هي الطبقة المخفية لـ t = 1 ، لم نعد مهتمين بطبقة الإخراج لـ t = 1 ونقوم بإزالتها من الشبكة. يبدأ التدريب بربط عينة الإدخال بطبقة الإدخال t = 1 ، والتي يتم نشرها للأمام إلى طبقة الإخراج لـ t = 2 . بعد ذلك ، يتم تحديث أوزان (المدخلات المخفية والمخفية المخفية) لـ t = 2 باستخدام backpropagation. يستخدم t = 2 جميع عينات التدريب ، على غرار t = 1 .
- كرر الإجراء السابق لجميع الطبقات (على سبيل المثال ، قم بإزالة طبقة الإخراج من وحدة التشفير التلقائي السابقة ، واستبدلها بآخر آخر ، وتدريب مع الانتشار الخلفي).
- تسمى الخطوات 1-3 بالتدريب المسبق وترك الأوزان مهيأة بشكل صحيح. ومع ذلك ، لا يوجد تعيين بين بيانات الإدخال وتسميات الإخراج. على سبيل المثال ، إذا تم تدريب الشبكة على التعرف على صور الأرقام المكتوبة بخط اليد ، فلا يزال من غير الممكن تعيين الوحدات من آخر كاشف للميزات (على سبيل المثال ، الطبقة المخفية بآخر تشفير تلقائي) إلى نوع رقم الصورة. في هذه الحالة ، يكون الحل الأكثر شيوعًا هو إضافة طبقة (طبقات) متصلة بالكامل أو أكثر إلى الطبقة الأخيرة (الاتصالات الزرقاء). يمكن الآن النظر إلى الشبكة بأكملها على أنها مدرك متعدد الطبقات ويتم تدريبها باستخدام backpropagation (تسمى هذه الخطوة أيضًا الضبط الدقيق ).
إذن ، فإن أجهزة التشفير التلقائي المكدسة تدور حول توفير طريقة فعالة للتدريب المسبق لتهيئة أوزان الشبكة ، مما يترك لك مدركًا معقدًا متعدد الطبقات جاهزًا للتدريب (أو ضبطه بدقة ).
شبكات الإيمان العميق
كما هو الحال مع أجهزة التشفير التلقائي ، يمكننا أيضًا تكديس آلات Boltzmann لإنشاء فئة تعرف باسم شبكات المعتقد العميق (DBNs) .
في هذه الحالة ، تعمل الطبقة المخفية لـ RBM t كطبقة مرئية لـ RBM t + 1 . طبقة الإدخال لأول RBM هي طبقة الإدخال للشبكة بأكملها ، ويعمل التدريب المسبق للطبقة الجشع على النحو التالي:
- قم بتدريب أول RBM t = 1 باستخدام الاختلاف التباين مع جميع عينات التدريب.
- تدريب RBM الثاني t = 2 . نظرًا لأن الطبقة المرئية لـ t = 2 هي الطبقة المخفية لـ t = 1 ، يبدأ التدريب بربط عينة الإدخال بالطبقة المرئية من t = 1 ، والتي يتم نشرها للأمام إلى الطبقة المخفية لـ t = 1 . تعمل هذه البيانات بعد ذلك على بدء تدريب الاختلاف التباين لـ t = 2 .
- كرر الإجراء السابق لجميع الطبقات.
- على غرار أجهزة التشفير التلقائي المكدسة ، بعد التدريب المسبق ، يمكن توسيع الشبكة عن طريق توصيل طبقة أو أكثر من الطبقات المتصلة بالكامل بالطبقة المخفية النهائية لـ RBM. هذا يشكل متعدد الطبقات الإدراك الحسي والذي يمكن بعد ذلك ضبطه باستخدام backpropagation.
يشبه هذا الإجراء الإجراء الخاص بأجهزة التشفير التلقائية المكدسة ، ولكن مع استبدال المشفرات التلقائية بـ RBMs واستبدالها بخوارزمية التباعد التباين.
(ملاحظة: لمزيد من المعلومات حول إنشاء وتدريب أجهزة التشفير التلقائي المكدسة أو شبكات المعتقدات العميقة ، تحقق من نموذج التعليمات البرمجية هنا.)
الشبكات التلافيفية
كهيكل نهائي للتعلم العميق ، دعنا نلقي نظرة على الشبكات التلافيفية ، وهي فئة خاصة ومثيرة للاهتمام بشكل خاص من الشبكات التغذوية المناسبة جدًا للتعرف على الصور.
قبل أن ننظر إلى الهيكل الفعلي للشبكات التلافيفية ، نحدد أولاً مرشح الصورة ، أو المنطقة المربعة ذات الأوزان المرتبطة. يتم تطبيق مرشح عبر صورة إدخال كاملة ، وغالبًا ما تقوم بتطبيق عدة مرشحات. على سبيل المثال ، يمكنك تطبيق أربعة مرشحات 6 × 6 على صورة إدخال معينة. بعد ذلك ، البكسل الناتج مع الإحداثيات 1،1 هو المجموع المرجح لمربع 6x6 من وحدات البكسل المدخلة مع الزاوية اليسرى العلوية 1،1 وأوزان المرشح (وهو أيضًا 6x6 مربع). بكسل الإخراج 2،1 هو نتيجة مربع الإدخال مع الزاوية اليسرى العلوية 2،1 وما إلى ذلك.
مع ذلك ، يتم تحديد هذه الشبكات بالخصائص التالية:
- تطبق الطبقات التلافيفية عددًا من المرشحات على المدخلات. على سبيل المثال ، يمكن أن تحتوي الطبقة التلافيفية الأولى من الصورة على أربعة مرشحات 6 × 6. تسمى نتيجة أحد المرشحات المطبقة عبر الصورة خريطة المعالم (FM) ويساوي عدد خرائط المعالم عدد المرشحات. إذا كانت الطبقة السابقة أيضًا تلافيفية ، فسيتم تطبيق المرشحات عبر جميع FMs الخاصة بها بأوزان مختلفة ، بحيث يتم توصيل كل مدخل FM بكل FM مخرج. يتمثل الحدس الكامن وراء الأوزان المشتركة عبر الصورة في أنه سيتم اكتشاف الميزات بغض النظر عن موقعها ، بينما يسمح تعدد المرشحات لكل منها باكتشاف مجموعة مختلفة من الميزات.
- تقلل الطبقات الفرعية من حجم المدخلات. على سبيل المثال ، إذا كان الإدخال يتكون من صورة 32 × 32 وكان للطبقة منطقة عينة فرعية 2 × 2 ، فإن قيمة الإخراج ستكون صورة 16 × 16 ، مما يعني أنه يتم دمج 4 بكسل (كل 2 × 2 مربع) من صورة الإدخال في إخراج واحد بكسل. هناك عدة طرق للعينة الفرعية ، ولكن الأكثر شيوعًا هي الحد الأقصى للتجميع ومتوسط التجميع والتجميع العشوائي.
- عادةً ما يتم توصيل آخر طبقة فرعية (أو تلافيفية) بطبقة واحدة أو أكثر من الطبقات المتصلة بالكامل ، وآخرها يمثل البيانات المستهدفة.
- يتم تنفيذ التدريب باستخدام backpropagation المعدل الذي يأخذ طبقات أخذ العينات الفرعية في الاعتبار ويحدّث أوزان المرشح التلافيفي بناءً على جميع القيم التي يتم تطبيق هذا المرشح عليها.
يمكنك مشاهدة العديد من الأمثلة على الشبكات التلافيفية المدربة (مع الانتشار العكسي) على مجموعة بيانات MNIST (الصور الرمادية للأحرف المكتوبة بخط اليد) هنا ، تحديدًا في أساليب testLeNet * (أوصي بـ testLeNetTiny2 لأنها تحقق معدل خطأ منخفض يبلغ حوالي 2٪ في فترة زمنية قصيرة نسبيًا). هناك أيضًا تصور JavaScript لطيف لشبكة مماثلة هنا.
تطبيق
الآن بعد أن غطينا متغيرات الشبكة العصبية الأكثر شيوعًا ، اعتقدت أنني سأكتب قليلاً عن التحديات المطروحة أثناء تنفيذ هياكل التعلم العميق هذه.
بشكل عام ، كان هدفي في إنشاء مكتبة التعلم العميق (ولا يزال) هو بناء إطار عمل قائم على الشبكة العصبية يفي بالمعايير التالية:
- بنية مشتركة قادرة على تمثيل نماذج متنوعة (جميع المتغيرات على الشبكات العصبية التي رأيناها أعلاه ، على سبيل المثال).
- القدرة على استخدام خوارزميات تدريب متنوعة (الانتشار الخلفي ، الاختلاف التباين ، إلخ).
- أداء لائق.
لتلبية هذه المتطلبات ، اتبعت نهجًا متدرجًا (أو معياريًا) لتصميم البرنامج.
هيكل
هيا لنبدأ مع الأساسيات:
- NeuralNetworkImpl هي الفئة الأساسية لجميع نماذج الشبكات العصبية.
- تحتوي كل شبكة على مجموعة من الطبقات.
- تحتوي كل طبقة على قائمة من الاتصالات ، حيث يكون الاتصال عبارة عن رابط بين طبقتين بحيث تكون الشبكة عبارة عن رسم بياني لا دوري موجه.
هذا الهيكل مرن بما يكفي لاستخدامه في شبكات التغذية الأمامية الكلاسيكية ، وكذلك في الشبكات القائمة على النتائج والبنى الأكثر تعقيدًا مثل ImageNet.
كما يسمح للطبقة بأن تكون جزءًا من أكثر من شبكة واحدة. على سبيل المثال ، الطبقات في شبكة المعتقدات العميقة هي أيضًا طبقات في أنظمة الإدارة القائمة على النتائج المقابلة لها.
بالإضافة إلى ذلك ، تسمح هذه البنية بعرض DBN كقائمة من RBMs المكدسة خلال مرحلة ما قبل التدريب وشبكة تغذية أثناء مرحلة الضبط الدقيق ، والتي تعتبر لطيفة بشكل حدسي ومناسبة من الناحية البرمجية.
انتشار البيانات
تهتم الوحدة التالية بنشر البيانات عبر الشبكة ، وهي عملية من خطوتين:
- حدد ترتيب الطبقات. على سبيل المثال ، للحصول على النتائج من منظور متعدد الطبقات ، يتم "تثبيت" البيانات على طبقة الإدخال (وبالتالي ، هذه هي الطبقة الأولى التي يتم حسابها) ويتم نشرها على طول الطريق إلى طبقة الإخراج. لتحديث الأوزان أثناء backpropagation ، يجب نشر خطأ الإخراج عبر كل طبقة بترتيب أول عرض ، بدءًا من طبقة الإخراج. يتم تحقيق ذلك باستخدام تطبيقات مختلفة لـ LayerOrderStrategy ، والتي تستفيد من بنية الرسم البياني للشبكة ، باستخدام طرق مسح مختلفة للرسم البياني. تتضمن بعض الأمثلة استراتيجية العرض أولاً واستهداف طبقة معينة. يتم تحديد الترتيب فعليًا من خلال الاتصالات بين الطبقات ، لذلك تُعيد الاستراتيجيات قائمة مرتبة من الاتصالات.
- احسب قيمة التنشيط. تحتوي كل طبقة على ConnectionCalculator مرتبطة بها والتي تأخذ قائمة الاتصالات الخاصة بها (من الخطوة السابقة) وقيم الإدخال (من الطبقات الأخرى) وتحسب التنشيط الناتج. على سبيل المثال ، في شبكة التغذية الأمامية السينية البسيطة ، يأخذ ConnectionCalculator الخاص بالطبقة المخفية قيم طبقات الإدخال والتحيز (والتي هي ، على التوالي ، بيانات الإدخال ومجموعة من 1 ثانية ) والأوزان بين الوحدات (في حالة التوصيل الكامل الطبقات ، يتم تخزين الأوزان فعليًا في اتصال FullyConnected كمصفوفة ) ، وتحسب المجموع الموزون ، وتغذي النتيجة في دالة السيني. تنفذ حاسبات التوصيل مجموعة متنوعة من وظائف التحويل (على سبيل المثال ، المجموع الموزون ، التلافيفي) والتنشيط (على سبيل المثال ، اللوجيستية و tanh للإدراك متعدد الطبقات ، ثنائي لـ RBM). يمكن تنفيذ معظمها على وحدة معالجة الرسومات باستخدام Aparapi ويمكن استخدامها مع تدريب دفعة صغيرة.
حساب GPU مع Aparapi
كما ذكرت سابقًا ، فإن أحد أسباب عودة الشبكات العصبية إلى الظهور في السنوات الأخيرة هو أن أساليب التدريب الخاصة بهم مواتية للغاية للتوازي ، مما يسمح لك بتسريع التدريب بشكل كبير باستخدام GPGPU. في هذه الحالة ، اخترت العمل مع مكتبة Aparapi لإضافة دعم GPU.
يفرض Aparapi بعض القيود المهمة على حاسبات الاتصال:
- يُسمح فقط بالمصفوفات (والمتغيرات) أحادية البعد لأنواع البيانات الأولية.
- يُسمح فقط لأساليب الأعضاء في فئة Aparapi Kernel نفسها بأن يتم استدعاؤها من الكود القابل للتنفيذ GPU.
على هذا النحو ، يتم تخزين معظم البيانات (مصفوفات الأوزان والمدخلات والمخرجات) في مثيلات Matrix ، والتي تستخدم مصفوفات عائمة أحادية البعد داخليًا. تستخدم جميع حاسبات اتصال Aparapi إما AparapiWeightedSum (للطبقات المتصلة بالكامل ووظائف إدخال المجموع الموزون) أو AparapiSubsampling2D (لطبقات الاختزال الفرعية) أو AparapiConv2D (للطبقات التلافيفية). يمكن التغلب على بعض هذه القيود من خلال إدخال هندسة النظام غير المتجانسة. يسمح Aparapi أيضًا بتشغيل نفس الكود على كل من وحدة المعالجة المركزية ووحدة معالجة الرسومات.
تمرين
The training module implements various training algorithms. It relies on the previous two modules. For example, BackPropagationTrainer (all the trainers are using the Trainer base class) uses feedforward layer calculator for the feedforward phase and a special breadth-first layer calculator for propagating the error and updating the weights.
My latest work is on Java 8 support and some other improvements, will soon be merged into master.
خاتمة
The aim of this Java deep learning tutorial was to give you a brief introduction to the field of deep learning algorithms, beginning with the most basic unit of composition (the perceptron) and progressing through various effective and popular architectures, like that of the restricted Boltzmann machine.
The ideas behind neural networks have been around for a long time; but today, you can't step foot in the machine learning community without hearing about deep networks or some other take on deep learning. Hype shouldn't be mistaken for justification, but with the advances of GPGPU computing and the impressive progress made by researchers like Geoffrey Hinton, Yoshua Bengio, Yann LeCun and Andrew Ng, the field certainly shows a lot of promise. There's no better time to get familiar and get involved like the present.
Appendix: Resources
If you're interested in learning more, I found the following resources quite helpful during my work:
- DeepLearning.net: a portal for all things deep learning. It has some nice tutorials, software library and a great reading list.
- An active Google+ community.
- Two very good courses: Machine Learning and Neural Networks for Machine Learning, both offered on Coursera.
- The Stanford neural networks tutorial.