سؤال

تحديث: صياغة أفضل للقضية.

أحاول أن أفهم خوارزمية backpropagation مع شبكة عصبية XOR كمثال. في هذه الحالة ، يوجد اثنين من الخلايا العصبية إدخال + 1 تحيز ، وخلايا عصبية في الطبقة المخفية + 1 ، و 1 ناتج الخلايا العصبية.

 A   B  A XOR B
 1    1   -1
 1   -1    1
-1    1    1
-1   -1   -1

A sample XOR neural network
(مصدر: wikimedia.org)

أنا استخدم backpropagation العشوائية.

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

الخطوة 1 حساب الإخراج لكل مثيل من الإدخال.
الخطوة 2 احسب الخطأ بين الخلايا العصبية (S) المخرجات (في حالتنا واحدة فقط) والقيمة المستهدفة (ق):
Step 2
الخطوه 3 نستخدم الخطأ من الخطوة 2 لحساب الخطأ لكل وحدة مخفية H:
Step 3

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

هل أفهم كل شيء هنا بشكل صحيح؟ هل يمكن لأي شخص أن يؤكد هذا؟

ما هو O (ح) من طبقة الإدخال؟ أفهم أن كل عقدة إدخال تحتوي على مخرجين: واحدة تدخل في العقدة الأولى للطبقة المخفية وواحدة تنتقل إلى الطبقة المخفية العقدة الثانية. أي من المخرجين يجب توصيله بـ O(h)*(1 - O(h)) جزء من الصيغة؟
Step 3

هل كانت مفيدة؟

المحلول

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

شيء مهم يجب وضعه في الاعتبار هو أنك تبحث دائمًا عن مشتقات وظيفة الخطأ فيما يتعلق بوحدة أو وزن. السابق هم الدلتا ، والأخير هو ما تستخدمه لتحديث أوزانك.

إذا كنت تريد أن تفهم backpropagation ، فيجب عليك فهم قاعدة السلسلة. الأمر كله يتعلق بحكم السلسلة هنا. إذا كنت لا تعرف كيف يعمل بالضبط ، فتحقق من ويكيبيديا - ليس الأمر صعبًا. ولكن بمجرد فهم الاشتقاقات ، يقع كل شيء في مكانه. يعد! قون

يمكن تكوين ∂e/∂w في ∂e/∂o ∂o/∂w عبر قاعدة السلسلة. يتم حساب ∂o/∂W بسهولة ، لأنه مجرد مشتق من تنشيط/إخراج وحدة فيما يتعلق بالأوزان. ∂e/∂o هو في الواقع ما نسميه الدلتا. (أفترض أن E و O و W من ناقلات/مصفوفات هنا)

لدينا لهم لوحدات الإخراج ، لأن هذا هو المكان الذي يمكننا فيه حساب الخطأ. (في الغالب لدينا وظيفة خطأ تصل إلى دلتا من (T_K - O_K) ، على سبيل المثال لوظيفة الخطأ التربيعية في حالة المخرجات الخطية والإنتروبيا المتقاطعة في حالة المخرجات اللوجستية.)

والسؤال الآن هو ، كيف نحصل على المشتقات للوحدات الداخلية؟ حسنًا ، نحن نعلم أن ناتج الوحدة هو مجموع جميع الوحدات الواردة الموزونة بأوزانها وتطبيق وظيفة النقل بعد ذلك. SO O_K = F (SUM (W_KJ * O_J ، لجميع J)).

إذن ما نفعله هو ، اشتقاق O_K فيما يتعلق بـ O_J. منذ delta_j = ∂e/∂o_j = ∂e/∂o_k ∂o_k/∂o_j = delta_k ∂o_k/o_j. لذلك بالنظر إلى Delta_K ، يمكننا حساب Delta_J!

هيا بنا نقوم بذلك. o_k = f (sum (w_kj * o_j ، for all j)) => ∂o_k/∂o_j = f '(sum (w_kj * o_j ، for all j)) * w_kj = f' (z_k) * w_kj.

بالنسبة لحالة وظيفة النقل sigmoidal ، يصبح هذا Z_K (1 - Z_K) * W_KJ. ((فيما يلي الخطأ في البرنامج التعليمي ، يقول المؤلف O_K (1 - O_K) * W_KJ!)

نصائح أخرى

لست متأكدًا من سؤالك ، لكنني مررت بالفعل بهذا البرنامج التعليمي بنفسي ويمكنني أن أؤكد لكم ، بخلاف خطأ مطبعي واضح ، لا يوجد شيء غير صحيح في ذلك.

سأقوم بافتراض أن سؤالك هو أنك مرتبك حول كيفية تربية الخلفية مختفي دلتا مشتقة. إذا كان هذا هو سؤالك بالفعل ، فيرجى النظر في

alt text
(مصدر: pandamatak.com)

ربما تكون في حيرة من أمرك كيف استمد المؤلف هذه المعادلة. هذا هو في الواقع تطبيق مباشر لقاعدة السلسلة متعددة المتغيرات. وهي (ما يلي مأخوذ ويكيبيديا)

"لنفترض أن كل وسيطة من z = f (u ، v) هي وظيفة متغيرة مثل u = h (x ، y) و v = g (x ، y) ، وأن هذه الوظائف كلها قابلة للتفاض سيبدو قاعدة السلسلة:

alt text

alt text "

تخيل الآن تمديد قاعدة السلسلة بحجة تحريبية إلى

ه (Z '1، z '2، .. ، z 'ن) حيث Z 'ك هو إخراج طبقة الإخراج KTH قبل التنشيط ، و z 'كجي) وهذا يعني أن e هي وظيفة z 'و z' نفسها هي وظيفة wجي (إذا لم يكن هذا منطقيًا لك في البداية فكر في بعناية شديدة حول كيفية إعداد NN.) تطبيق قاعدة السلسلة تمتد مباشرة إلى متغيرات N:

Δe (z '1، z '2، .. ، z 'ن)/ΔWجي = Σك Δe/ΔZ 'ك ΔZ 'ك/ΔWجي

هذه هي الخطوة الأكثر أهمية ، ثم يطبق المؤلف قاعدة السلسلة مرة أخرى ، وهذه المرة ضمن المبلغ لتوسيع ΔZ 'ك/ΔWجي مصطلح هذا هو

ΔZ 'ك/ΔWجي = ΔZ 'ك/ΔOي ΔOي/ΔZي ΔZي/ΔWجي.

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

حظا طيبا وفقك الله.

ما قرأته من معادلة الخطوة 3 هو:

  1. O_H = الإخراج الأخير من هذه الوحدة المخفية (O_H على طبقة الإدخال هي قيمة الإدخال الفعلية)
  2. W_KH = وزن الاتصال بين هذه الوحدة المخفية ووحدة الطبقة التالية (نحو الإخراج)
  3. delta_k = خطأ وحدة الطبقة التالية (نحو الإخراج ، نفس الوحدة مثل الرصاصة السابقة)

كل وحدة لديها خرج واحد فقط ، ولكن يتم وزن كل رابط بين الإخراج والطبقة التالية. وبالتالي فإن الإخراج هو نفسه ، ولكن في الطرف المتلقي ، ستتلقى كل وحدة قيمة مختلفة إذا كان وزن الروابط مختلفًا. يشير O_H دائمًا إلى قيمة هذه الخلايا العصبية لآخر التكرار. لا ينطبق الخطأ على طبقة الإدخال ، كما هو بحلول التعريف ، لا يحتوي الإدخال على "خطأ" في حد ذاته.

يجب حساب الخطأ طبقة حسب الطبقة ، بدءًا من جانب الإخراج ، نظرًا لأننا نحتاج إلى قيم الخطأ للطبقة N+1 لحساب الطبقة N. أنت على حق ، لا يوجد اتصال مباشر بين الإدخال والمخرجات في backpropagation.

أعتقد أن المعادلة صحيحة ، إذا كانت غير بديهية. ربما يكون الأمر مربكًا هو أنه في الانتشار إلى الأمام لكل وحدة ، يتعين علينا النظر في جميع الوحدات والروابط على يسار الوحدة (قيم الإدخال) ، ولكن لانتشار الخطأ (backpropagation) كان على الوحدات على اليمين (الإخراج (الإخراج القيمة) من الوحدة التي تتم معالجتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top