الشبكات العصبية والتعلم العميق ، الفصل 2: ​​كيف تعمل خوارزمية backpropagation


في الفصل الأخير ، رأينا كيف يمكن للشبكات العصبية أن تتعلم بشكل مستقل الأوزان والإزاحة باستخدام خوارزمية النسب التدرج. ومع ذلك ، كانت هناك فجوة في شرحنا: لم نناقش حساب التدرج اللوني لوظيفة التكلفة. وهذه فجوة لائقة! في هذا الفصل ، سأقدم خوارزمية سريعة لحساب هذه التدرجات ، والمعروفة باسم الانتشار الخلفي.

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

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

السبب ، بالطبع ، هو الفهم. يعتمد الانتشار الخلفي على التعبير عن المشتق الجزئي /C / ∂w لدالة التكلفة C فيما يتعلق بالوزن w (أو الانحياز b) للشبكة. يُظهر التعبير مدى سرعة تغيير القيمة عند تغيير الأوزان والإزاحة. وعلى الرغم من أن هذا التعبير معقد للغاية ، إلا أنه يتمتع بجماله الخاص ، لأن كل عنصر من عناصره له تفسير طبيعي وبديهي. لذلك ، فإن backpropagation ليس مجرد خوارزمية سريعة التعلم. يعطينا فهم مفصل لكيفية تغيير الأوزان والإزاحة تغيير كل سلوك الشبكة. ويستحق الأمر دراسة التفاصيل.

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

للاحماء: نهج مصفوفة سريعة لحساب إخراج الشبكة العصبية


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

لنبدأ بسجل يتيح لنا الإشارة بوضوح إلى الأوزان على الشبكة. سوف نستخدم w l jk للدلالة على وزن اتصال الخلايا العصبية رقم k في الطبقة رقم (l-1) مع الخلية العصبية رقم j في الطبقة رقم l. لذلك ، على سبيل المثال ، يُظهر الرسم البياني أدناه وزن اتصال الخلية العصبية الرابعة للطبقة الثانية مع الخلية العصبية الثانية للطبقة الثالثة:



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

سنستخدم الرموز المشابهة للإزاحة وتنشيط الشبكة. على وجه الخصوص ، سوف تشير b l j إلى إزاحة العصبون رقم j في الطبقة رقم l. ستشير a l j إلى تنشيط الخلايا العصبية رقم j في الطبقة رقم l. يعرض الرسم البياني التالي أمثلة حول كيفية استخدام هذا الإدخال:



باستخدام هذا السجل ، يرتبط تنشيط l l من الخلايا العصبية رقم j في الطبقة رقم l مع التنشيط في الطبقة رقم (l-1) بالمعادلة التالية (مقارنة مع المعادلة (4) ومناقشتها في الفصل السابق):

alj= sigma( sumkwljkal1k+blj) tag23



حيث يذهب المجموع فوق جميع الخلايا العصبية k في الطبقة (l-1). لإعادة كتابة هذا التعبير في شكل مصفوفة ، نحدد مصفوفة وزن ث لكل طبقة l. عناصر مصفوفة الوزن هي ببساطة الأوزان المرتبطة بالطبقة رقم l ، أي أن العنصر في الصف رقم j والعمود رقم k سيكون w l jk . وبالمثل ، بالنسبة لكل طبقة ، نحدد متجه الإزاحة b l . ربما خمنت كيف يعمل هذا - ستكون مكونات ناقل الإزاحة هي القيم b l j ، مكون واحد لكل خلية عصبية في الطبقة رقم l. وأخيرًا ، نحدد متجه التنشيط a l ، الذي تكون مكوناته التنشيط a l j .

العنصر الأخير اللازم لإعادة كتابة (23) هو شكل المصفوفة لتوجيه الدالة of. لقد صادفنا بشكل متجه vectorization في الفصل الأخير - الفكرة هي أننا نريد تطبيق الوظيفة every على كل عنصر من عناصر vector v. نستخدم الترميز الواضح σ (v) للدلالة على التطبيق الحكيم للوظيفة. أي أن المكونات σ (v) هي ببساطة σ (v) j = σ (v j ). على سبيل المثال ، إذا كانت لدينا دالة f (x) = x 2 ، فإن النموذج الموجه f يعطينا

f( startbmatrix23 endbmatrix)= تبدأbmatrixf(2)f(3) endbmatrix= تبدأbmatrix49 endbmatrix tag24

تبدأتبدأ



وهذا يعني أن f المتجه يرسم ببساطة كل عنصر في المتجه.

بالنظر إلى كل أشكال الكتابة هذه ، يمكن إعادة كتابة المعادلة (23) في شكل متجه جميل وصغير:

al= sigma(wlal1+bl) tag25



يتيح لنا مثل هذا التعبير إلقاء نظرة أكثر شمولية على العلاقة بين تنشيط طبقة واحدة وتنشيط الطبقة السابقة: نحن ببساطة نطبق مصفوفة الوزن على التنشيط ، ونضيف متجه الإزاحة ، ثم نطبق السيني. بالمناسبة ، هذا السجل هو الذي يتطلب استخدام السجل w l jk . إذا استخدمنا الفهرس j للدلالة على الخلايا العصبية المدخلة ، و k للخلايا العصبية الناتجة ، فسيتعين علينا استبدال مصفوفة الوزن في المعادلة (25) بالمعادلة المنقولة. هذا تغيير صغير ولكنه مزعج ، وسنفقد بساطة البيان (والتفكير) حول "تطبيق مصفوفة الوزن على التنشيط". مثل هذا النهج العالمي هو أبسط وأكثر إيجازًا (ويستخدم فهارس أقل!) من المقياس الوحيد. هذه مجرد طريقة لتجنب مؤشر الجحيم دون فقدان دقة ما يحدث. يعد هذا التعبير مفيدًا أيضًا في الممارسة ، نظرًا لأن معظم مكتبات المصفوفات تقدم طرقًا سريعة لمضاعفة المصفوفات وإضافة المتجهات وتوجهها. استخدم الكود في الفصل الأخير هذا التعبير مباشرة لحساب سلوك الشبكة.

باستخدام المعادلة (25) لحساب l ، نحسب القيمة الوسيطة z l ≡ w l a l - 1 + b l . هذه القيمة مفيدة جدًا للتسمية: نطلق على z l المدخلات الموزونة للخلايا العصبية من الطبقة رقم l. في وقت لاحق سوف نستخدم بنشاط هذه المدخلات المرجحة. تتم كتابة المعادلة (25) في بعض الأحيان من خلال مدخلات مرجحة ، كعلامة l = σ (z l ). تجدر الإشارة أيضًا إلى أن z l بها مكونات zlj= sumkwljkal1k+blj أي أن z l j هي مجرد مدخلات مرجحة لوظيفة التنشيط للخلايا العصبية j في الطبقة l.

افتراضان أساسيان حول وظيفة التكلفة


الهدف من backpropagation هو حساب المشتقات الجزئية ∂C / ∂w و /C / ∂b لدالة التكلفة C لكل وزن ث والتحيز b للشبكة. لكي يعمل backpropagation ، نحتاج إلى افتراض افتراضين رئيسيين حول شكل دالة التكلفة. ومع ذلك ، قبل ذلك سيكون من المفيد تخيل مثال لوظيفة التكلفة. نستخدم الدالة التربيعية من الفصل السابق (المعادلة (6)). في الإدخال من القسم السابق ، سيبدو

C= frac12n sumx||y(x)aL(x)||2 tag26



حيث: n هو العدد الإجمالي لأمثلة التدريب ؛ المبلغ يذهب لجميع الأمثلة س ؛ y = y (x) هو الناتج المطلوب ؛ تشير L إلى عدد الطبقات في الشبكة ؛ L = a L (x) هي متجه الإخراج الخاص بتنشيط الشبكة عندما تكون x عند الإدخال.

حسنًا ، إذن ما نوع الافتراضات التي نحتاجها حول دالة التكلفة C لتطبيق backpropagation؟ أولاً ، يمكن كتابة دالة التكلفة كمتوسط ​​C = 1 / n ∑ x C x من دالة التكلفة C x لأمثلة التدريب الفردية x. يتم ذلك في حالة دالة التكلفة التربيعية ، حيث تكون تكلفة مثال تدريب واحد هي C x = 1/2 || y - a L || 2 . سيكون هذا الافتراض صحيحًا بالنسبة لجميع وظائف التكلفة الأخرى التي سنلتقيها في الكتاب.

نحتاج إلى هذا الافتراض لأن الانتشار الخلفي يسمح لنا في الواقع بحساب المشتقات الجزئية ∂C / ∂w و ∂C / ∂b ، حيث يتم حساب المتوسط ​​على أمثلة التدريب. بقبول هذا الافتراض ، سوف نفترض أن المثال التدريبي x ثابت ، ونتوقف عن تحديد الفهرس x ، ونكتب قيمة C x كـ C. ثم سنرجع x ، لكن من الأفضل الآن أن نعني ذلك ببساطة.

الافتراض الثاني المتعلق بوظيفة التكلفة - يمكن كتابتها كدالة لمخرجات الشبكة العصبية:



على سبيل المثال ، تفي دالة التكلفة التربيعية بهذا المطلب ، حيث يمكن كتابة التكلفة التربيعية لمثال تدريبي واحد على النحو

C=1/2|yaL||2=1/2 sumj(yjaLj)2 tag27



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

عمل هادامارد ست


تعتمد خوارزمية backpropagation على العمليات المعتادة للجبر الخطي - إضافة المتجهات ، وتضاعف المتجه بواسطة مصفوفة ، إلخ. ومع ذلك ، يتم استخدام إحدى العمليات بشكل متكرر أقل. لنفترض أن s و t هما متجهان لهما نفس البعد. بعد ذلك ، فإننا نشير إلى الضرب الأولي لعن طريقتين. ثم المكونات ببساطة (s simplyt) j = s j t j . على سبيل المثال:

 تبدأbmatrix12 endbmatrix odot startbmatrix34 endbmatrix= تبدأbmatrix1324 endbmatrix= تبدأbmatrix38 endbmatrix tag28



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

أربع معادلات أساسية للانتشار الخلفي


يتضمن Backpropagation فهم كيفية تغيير أوزان وتعويضات الشبكة لتغيير وظيفة التكلفة. وهذا يعني في جوهره حساب المشتقات الجزئية ∂C / ∂w l jk و ∂C / ∂b l j . ولكن لحسابهم ، نقوم أولاً بحساب القيمة الوسيطة δ l j ، والتي نسميها الخطأ في الخلية العصبية رقم j في الطبقة رقم l. سوف يعطينا الانتشار الخلفي إجراءً لحساب الخطأ δ l j ، ثم ربط δ l j بـ ∂C / ∂w l jk و ∂C / ∂b l j .

لفهم كيفية تحديد الخطأ ، تخيل أن شيطان قد بدأ في شبكتنا العصبية:



يجلس على الخلايا العصبية رقم ي في الطبقة رقم ل. عند استلام بيانات الإدخال ، يعطل البرنامج الخفي تشغيل الخلية العصبية. ويضيف تغييراً طفيفاً في lz l j إلى المدخلات المرجحة للخلية العصبية ، وبدلاً من أن تسفر عن σ (z l j ) ، ستنتج الخلايا العصبية σ (z l j + Δz l j ). سينتشر هذا التغيير عبر الطبقات التالية للشبكة ، مما سيؤدي في النهاية إلى تغيير التكلفة الإجمالية بمقدار (∂C / ∂z l j ) * Δz l j .

لكن شيطاننا جيد ، وهو يحاول مساعدتك في تحسين التكلفة ، أي العثور على lz l j التي تقلل التكلفة. افترض أن قيمة ∂C / ∂z l j كبيرة (موجبة أو سالبة). بعد ذلك ، يمكن للشيطان أن يقلل التكلفة بشكل خطير باختيار Δz l j مع الإشارة المقابلة لـ ∂C / ∂z l j . ولكن إذا كانت ∂C / ∂z l j قريبة من الصفر ، فلن يتمكن الشيطان من تحسين التكلفة بشكل كبير عن طريق تغيير المدخلات الموزونة z l j . لذلك ، من وجهة نظر الشيطان ، فإن الخلايا العصبية قريبة بالفعل من المستوى الأمثل (وهذا ، بالطبع ، صحيح فقط بالنسبة إلى Δz l j الصغيرة. لنفترض أن هذه هي القيود المفروضة على تصرفات الشيطان). لذلك ، بالمعنى الإرشادي ، ∂C / ∂z l j هو مقياس لخطأ الخلايا العصبية.

تحت الدافع من هذه القصة ، نعرّف الخطأ j l j للخلايا العصبية j في الطبقة l ، على النحو

 deltalj equiv frac جزئيةC جزئيةzlj العلامة29



وفقًا لمعاييرنا المعتادة ، نستخدم δ l للدلالة على متجه الخطأ المرتبط بالطبقة l. ستمنحنا عملية العودة إلى الوراء طريقة لحساب for لتر لأي طبقة ، ثم ربط هذه الأخطاء بالكميات التي تهمنا حقًا ، ∂C / ∂w l jk و ∂C / lb l j .

ربما تتساءل عن سبب تغيير البرنامج الخفي للمدخلات الموزونة z l j . بعد كل شيء ، سيكون من الطبيعي أن نتخيل أن الشيطان يغير تنشيط الخرج a l j بحيث نستخدم ∂C / ∂a l j كمقياس للخطأ. في الواقع ، إذا قمت بذلك ، فسيظهر كل شيء مشابهًا جدًا لما سنناقشه أكثر. ومع ذلك ، في هذه الحالة ، سيكون تمثيل backpropagation أكثر تعقيدًا من الناحية الجبرية. لذلك ، فإننا نتحدث عن البديل δ l j = ∂C / ∂z l j كمقياس للخطأ.

في مشاكل التصنيف ، يعني مصطلح "خطأ" في بعض الأحيان عدد التصنيفات غير الصحيحة. على سبيل المثال ، إذا صنفت الشبكة العصبية بشكل صحيح 96.0٪ من الأرقام ، فسيكون الخطأ 4.0٪. من الواضح ، هذا ليس على الإطلاق ما نعنيه بالنواقل δ. لكن في الممارسة العملية ، يمكنك عادة فهم المعنى المقصود بسهولة.

خطة الهجوم : تستند Backpropagation إلى أربع معادلات أساسية. يعطوننا معًا طريقة لحساب كل من الخطأ وتدرج دالة التكلفة. أنا أعطاهم أدناه. لا حاجة لتوقع تطورهم الفوري. سوف تكون بخيبة أمل. معادلات backpropagation عميقة لدرجة أن الفهم الجيد يتطلب وقتًا ملموسًا وصبرًا ، وتعميقًا تدريجيًا للمسألة. والخبر السار هو أن هذا الصبر سيؤتي ثماره. لذلك ، في هذا القسم ، بدأ تفكيرنا للتو ، مما يساعدك على اتباع مسار الفهم العميق للمعادلات.

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

معادلة خطأ طبقة الخرج ، δ L : مكونات δ L تعتبر

 deltaLj= frac جزئيةC جزئيةaLj sigma(zLj) tagBP1



تعبير طبيعي جدا. يقيس المصطلح الأول على اليمين ، /C / La L j ، مدى سرعة تغير التكلفة كدالة لتنشيط الإخراج رقم j. على سبيل المثال ، إذا كانت C لا تعتمد بشكل خاص على الخلايا العصبية الخاصة بالإخراج j ، فإن δ L j ستكون صغيرة ، كما هو متوقع. المصطلح الثاني على اليمين ، σ '(z L j ) ، يقيس مدى سرعة تغير وظيفة التنشيط in في z L j .

لاحظ أن كل شيء في (BP1) سهل العد. على وجه الخصوص ، نحسب z L j عند حساب سلوك الشبكة ، وسيتطلب حساب more '(z L j ) موارد أكثر قليلاً. بالطبع ، يعتمد الشكل الدقيق ∂C / La L j على شكل دالة التكلفة. ومع ذلك ، إذا كانت دالة التكلفة معروفة ، فلا ينبغي أن تكون هناك مشاكل في حساب ∂C / La L j . على سبيل المثال ، إذا استخدمنا دالة التكلفة التربيعية ، فإن C = 1/2 ∑ j (y j - a L j ) 2 ، وبالتالي ∂C / ∂a L j = (a L j - y j ) ، التي يسهل حسابها.

المعادلة (BP1) هي تعبير منفجر عن δ L. إنه أمر طبيعي تمامًا ، لكن غير مسجل في شكل المصفوفة ، والذي نحتاجه للتوزيع الخلفي. ومع ذلك ، فمن السهل إعادة كتابة في شكل مصفوفة ، كما

 deltaL= nablaaC odot sigma(zL) tagBP1a



يتم تعريف C a C على أنها متجه تكون مكوناته هي المشتقات الجزئية ∂C / ∂a L j . يمكن تمثيله كتعبير عن معدل التغيير لـ C فيما يتعلق بتنشيط الخرج. من السهل أن نرى أن المعادلتين (BP1a) و (BP1) تعادلان ، لذلك سنستخدم (BP1) للإشارة إلى أي منها أدناه. على سبيل المثال ، في حالة القيمة التربيعية ، لدينا = a C = (a L - y) ، وبالتالي فإن نموذج المصفوفة الكامل (BP1) سيكون

 deltaL=(aLy) odot sigma(zL) tag30



كل شيء في هذا التعبير له شكل متجه مناسب ، ومن السهل حسابه باستخدام مكتبة مثل Numpy.

تعبير الخطأ through l خلال الخطأ في الطبقة التالية ، + l + 1 : على وجه الخصوص ،

 deltal=((wl+1)T deltal+1) cdot sigma(zl) tagBP2



حيث (w l + 1 ) T هو تبديل مصفوفة الوزن w l + 1 للطبقة رقم (l + 1). المعادلة تبدو معقدة ، ولكن من السهل تفسير كل عنصر. افترض أننا نعرف الخطأ δ l + 1 للطبقة (l + 1). يمكن تصور تبديل مصفوفة الوزن ، (w l + 1 ) T ، عند تحريك الخطأ للخلف عبر الشبكة ، مما يعطينا قدرًا من الخطأ عند إخراج الطبقة رقم l. ثم نعتبر منتج Hadamard ⊙σ '(z l ). هذا يدفع الخطأ مرة أخرى من خلال وظيفة التنشيط في الطبقة l ، مما يعطينا قيمة الخطأ δl في المدخلات الموزونة للطبقة l.

من خلال الجمع بين (BP2) و (BP1) ، يمكننا حساب الخطأ لأي طبقة شبكة.نبدأ باستخدام (BP1) لحساب δ L ، ثم نستخدم المعادلة (BP2) لحساب δ L-1 ، ثم مرة أخرى لحساب δ L-2 ، وهكذا ، على طول الشبكة الخلفية.

معادلة معدل التغير في التكلفة بالنسبة إلى أي إزاحة في الشبكة : على وجه الخصوص:

جb l j =δ l j



بمعنى أن الخطأ δ l j يساوي تمامًا معدل التغيير ∂C / ∂b l j . هذا ممتاز لأن (BP1) و (BP2) أخبرنا بالفعل عن كيفية حساب δ l j . يمكننا إعادة كتابة (BP3) أقصر

جب =δ



حيث يتم تقدير for لنفس الخلايا العصبية مثل التحيز b.

معادلة معدل تغير القيمة بالنسبة إلى أي وزن في الشبكة : على وجه الخصوص:

جw l j k =a l - 1 k δ l j



من هنا نتعلم كيفية حساب المشتق الجزئي ∂C / ∂w l jk من خلال قيم δ l و l-1 ، طريقة الحساب التي نعرفها بالفعل. يمكن إعادة كتابة هذه المعادلة في شكل أقل تحميل:

جث =وطنδسشر



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



مرضي نتيجة المعادلة (32) أنه عندما تفعيل في الصغيرة، و في ≈ 0، ∂C / ∂w التدرج يميل الأعضاء أيضا إلى إلى الصفر. في هذه الحالة ، نقول أن الوزن يتم تدريبه ببطء ، أي أنه لا يتغير كثيرًا خلال نزول التدرج. بمعنى آخر ، إحدى النتائج (BP4) هي أن الناتج المرجح للخلايا العصبية ذات التنشيط المنخفض يتعلم ببطء.

يمكن استخلاص أفكار أخرى من (BP1) - (BP4). لنبدأ مع طبقة الإخراج. النظر في المصطلح σ '(z L j) في (BP1). استرجع من الرسم البياني للسيغيم من الفصل السابق أنه يصبح مسطحًا عندما تقترب σ (z L j ) من 0 أو 1. في هذه الحالات ، σ '(z L j ) ≈ 0. لذلك ، سيتم تدريب الوزن في الطبقة الأخيرة ببطء إذا تم التنشيط الخلايا العصبية الناتجة صغيرة (≈ 0) أو كبيرة (≈ 1). في هذه الحالة ، يقال عادة أن الخلايا العصبية الناتجة مشبعة ، ونتيجة لذلك ، توقف الوزن عن التدريب (أو يجري تدريبه ببطء). نفس الملاحظات صالحة للتشريد من الخلايا العصبية الإخراج.

يمكن الحصول على أفكار مماثلة فيما يتعلق بالطبقات السابقة. على وجه الخصوص ، ضع في اعتبارك المصطلح σ '(z l ) في (BP2). هذا يعني أن δ ل يعلى الأرجح سيكون صغيراً حيث تقترب الخلايا العصبية من التشبع. وهذا بدوره يعني أن أي أوزان عند إدخال الخلايا العصبية المشبعة سيتم تدريبها ببطء (على الرغم من أن هذا لن ينجح إذا كانت w + 1 T δ l + 1 تحتوي على عناصر كبيرة بما فيه الكفاية تعوض عن القيمة الصغيرة لـ σ '(z L ي )).

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

هذا ليس مستغربا بشكل خاص. ومع ذلك ، تساعد هذه الملاحظات في تحسين فهمنا لما يحدث عندما ندرب الشبكة. علاوة على ذلك ، يمكننا التعامل مع هذه الحجج من الجانب الآخر. المعادلات الأساسية الأربعة صالحة لأي وظيفة تنشيط ، وليس فقط من أجل السيني العادي (حيث ، كما سنرى لاحقًا ، لا تستخدم الخصائص السيني). لذلك ، يمكن استخدام هذه المعادلات لتطوير وظائف التنشيط مع بعض خصائص التعلم اللازمة. على سبيل المثال ، لنفترض أننا اخترنا وظيفة التنشيط σ التي تختلف عن السيني ، بحيث تكون "إيجابية" دائمًا ولا تقترب من الصفر. هذا يمنع تباطؤ التعلم الذي يحدث عندما يتم تشبع الخلايا العصبية السيني الطبيعي. في وقت لاحق من الكتاب ، سنرى أمثلة على تغيير وظيفة التنشيط بطريقة مماثلة.بالنظر إلى المعادلات (BP1) - (BP4) ، يمكننا شرح سبب الحاجة إلى هذه التعديلات ، وكيف يمكن أن تؤثر على الموقف.


:


  • . . , . , , . , (BP1) ,


δL=Σ(zL)aC



حيث Σ '(z L ) عبارة عن مصفوفة مربعة ذات قيم σ' (z L j ) تقع على طول العناصر القطرية والعناصر الأخرى التي تساوي 0. لاحظ أن هذه المصفوفة تتفاعل مع ∇ a C خلال مضاعفة المصفوفة المعتادة.

تبين أنه يمكن إعادة كتابة (BP2) كـ

δ l = Σ ( z l ) ( w l + 1 ) T δ l + 1



مع دمج المهام السابقة ، أظهر ما يلي:

δ l = Σ ( z l ) ( w l + 1 ) T ... Σ ( z L - 1 ) ( w L ) T Σ ( z L ) a C



بالنسبة للقراء المعتادين على ضرب المصفوفة ، سيكون فهم هذه المعادلة أسهل من (BP1) و (BP2). أركز على (BP1) و (BP2) لأن هذا النهج أسرع في التنفيذ العددي. [هنا Σ ليس المجموع (∑) ، ولكن رأس المال σ (سيغما) / تقريبا. العابرة. ]

دليل على المعادلات الأساسية الأربعة (قسم اختياري)


الآن نثبت المعادلات الأساسية الأربعة (BP1) - (BP4). جميعها هي عواقب قاعدة السلسلة (قاعدة التمييز بين دالة معقدة) من تحليل وظائف العديد من المتغيرات. إذا كنت معتادًا على قاعدة السلسلة ، فإنني أوصي بشدة بمحاولة حساب المشتقات بنفسك قبل متابعة القراءة.

دعونا نبدأ مع المعادلة (BP1)، مما يعطينا تعبير عن دلتا الخطأ الناتج من L . لإثبات ذلك ، نتذكر أنه بحكم التعريف:

δ L ي = Cض L ي



بتطبيق قاعدة السلسلة ، نعيد كتابة المشتقات الجزئية من خلال المشتقات الجزئية لتنشيط المخرجات:

δ L ي = Σ ك Cل L كل L كض L ي



حيث يذهب الجمع فوق جميع الخلايا العصبية k في طبقة الخرج. بالطبع ، يعتمد تنشيط الخرج a L k من الخلايا العصبية No. k فقط على المدخلات الموزونة z L j للخلايا العصبية No. j عندما k = j. لذلك ، تختفي ∂a L k / ∂z L j عندما تكون k ≠ j. نتيجة لذلك ، نقوم بتبسيط المعادلة السابقة إلى

δ L ي = Cل L يل L يض L ي



إذ تشير إلى أن L j = σ (z L j ) ، يمكننا إعادة كتابة المصطلح الثاني على اليمين كـ σ '(z L j ) ، وتتحول المعادلة إلى

δ L ي = Cل L ي σ"(ض L ي )



وهذا هو ، في (BP1) في طريقة عرض انفجرت.

ثم يثبت (BP2)، يعطي معادلة الخطأ δ ل من خلال δ خطأ في طبقة المقبل ل + 1 . للقيام بذلك ، نحتاج إلى إعادة كتابة δ l j = ∂C / ∂z l j إلى δ l + 1 k = ∂C / ∂z l + 1 k . يمكن القيام بذلك باستخدام قاعدة السلسلة:

δ l j = Cض ل ي

= k Cض ل + 1 كض ل + 1 كض ل ي

= k z l + 1 kض ل ي δ ل + 1 ك



حيث قمنا في السطر الأخير بتبديل المصطلحين على اليمين ، واستبدلنا تعريف δ l + 1 k . لحساب المصطلح الأول في السطر الأخير ، لاحظ ذلك

z l + 1 k = j w l + 1 k j a l j + b l + 1 k = j w l + 1 k j σ ( z l j ) + b l + 1 k



التفريق ، نحصل عليه

z l + 1 kض ل ي =ث ل + 1 ك ي σ"(ض ل ي ).



استبدال هذا إلى (42) ، نحصل عليها

δ ل ي = Σ ك ث ل + 1 ك ي δ ل + 1 ك σ " ( ض ل ي ) .



وهذا هو ، (BP2) في مدخل انفجرت.

يبقى أن يثبت (BP3) و (BP4). كما أنها تتبع من قاعدة السلسلة ، بنفس الطريقة تقريبًا مثل السابقة. سأتركهم لك كتمرين.

ممارسة


  • إثبات (BP3) و (BP4).


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

خوارزمية Backpropagation


توفر لنا معادلات backpropagation طريقة لحساب تدرج دالة التكلفة. دعنا نكتب هذا بشكل صريح كخوارزمية:
  1. الإدخال x: عيّن التنشيط المناسب a 1 لطبقة الإدخال.
  2. : l = 2,3,…,L z l = w l a l−1 +b l a l = σ(z l ).
  3. δ L : δ L = ∇ a C ⊙ σ'(z L ).
  4. : l = L−1,L−2,…,2 δ l = ((w l+1 ) T δ l+1 ) ⊙ σ'(z l ).
  5. : Cwljk=al1kδlj و Cblj=δlj .


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

تمارين


  • . , , f(∑ j w j x j +b), f – , . ?
  • . , σ(z) = z . .


كما شرحت سابقًا ، فإن خوارزمية backpropagation تحسب تدرج دالة التكلفة لمثال تدريب واحد ، C = C x . في الممارسة العملية ، غالباً ما يتم دمج الانتشار الخلفي مع خوارزمية التعلم ، على سبيل المثال ، مع نزول التدرج العشوائي ، عندما نحسب التدرج للعديد من أمثلة التدريب. على وجه الخصوص ، بالنسبة لحزمة صغيرة من أمثلة التدريب m ، تطبق الخوارزمية التالية نزول التدرج استنادًا إلى هذه الحزمة المصغرة:

  1. المدخل: مجموعة من الأمثلة التدريبية.
  2. لكل مثال تدريب x ، عيّن تنشيط الإدخال المقابل a x ، 1 وقم بالخطوات التالية:
    • l=2,3,…,L z x,l = w l a x,l−1 +b l a x,l = σ(z x,l ).
    • δ x,L : δ x,L = ∇ a C x ⋅ σ'(z x,L ).
    • : l=L−1,L−2,…,2 δ x,l = ((w l+1 ) T δ x,l+1 ) ⋅ σ'(z x,l ).
  3. : l=L,L−1,…,2 wl rightarrowwl frac etam sumx deltax،l(ax،l1)T ، والإزاحة وفقا للقاعدة bl rightarrowbl frac etam sumx deltax،l .


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

رمز للتوزيع الخلفي


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

class Network(object): ... def update_mini_batch(self, mini_batch, eta): """    ,          -. mini_batch –    (x, y),  eta –  .""" nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] for x, y in mini_batch: delta_nabla_b, delta_nabla_w = self.backprop(x, y) nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] self.weights = [w-(eta/len(mini_batch))*nw for w, nw in zip(self.weights, nabla_w)] self.biases = [b-(eta/len(mini_batch))*nb for b, nb in zip(self.biases, nabla_b)] 


يتم معظم العمل بواسطة الخطوط delta_nabla_b و delta_nabla_w = self.backprop (x، y) ، باستخدام طريقة backprop لحساب المشتقات الجزئية ∂C x / ∂b l j و ∂C x / ∂w l jk . تتكرر طريقة backprop تقريبًا خوارزمية القسم السابق. هناك اختلاف صغير واحد - نستخدم طريقة مختلفة قليلاً لفهرسة الطبقة. يتم ذلك للاستفادة من ميزة python ، فهارس الصفيف السلبية التي تسمح لك بحساب العناصر للخلف من النهاية. l [-3] سيكون العنصر الثالث من نهاية المصفوفة l. ويرد رمز backprop أدناه ، إلى جانب الدوال المساعدة المستخدمة لحساب السيني ، ومشتقه ومشتق من دالة التكلفة. معهم ، رمز كاملة ومفهومة. إذا كان هناك شيء غير واضح ، فراجع أول وصف لرمز القائمة الكامل.

 class Network(object): ... def backprop(self, x, y): """  ``(nabla_b, nabla_w)``,      C_x. ``nabla_b``  ``nabla_w`` -    numpy,   ``self.biases`` and ``self.weights``.""" nabla_b = [np.zeros(b.shape) for b in self.biases] nabla_w = [np.zeros(w.shape) for w in self.weights] #   activation = x activations = [x] #      zs = [] #     z- for b, w in zip(self.biases, self.weights): z = np.dot(w, activation)+b zs.append(z) activation = sigmoid(z) activations.append(activation) #   delta = self.cost_derivative(activations[-1], y) * \ sigmoid_prime(zs[-1]) nabla_b[-1] = delta nabla_w[-1] = np.dot(delta, activations[-2].transpose()) """ l      ,      . l = 1    , l = 2 – ,   .    ,   python      .""" for l in xrange(2, self.num_layers): z = zs[-l] sp = sigmoid_prime(z) delta = np.dot(self.weights[-l+1].transpose(), delta) * sp nabla_b[-l] = delta nabla_w[-l] = np.dot(delta, activations[-l-1].transpose()) return (nabla_b, nabla_w) ... def cost_derivative(self, output_activations, y): """    ( C_x /  a)   .""" return (output_activations-y) def sigmoid(z): """.""" return 1.0/(1.0+np.exp(-z)) def sigmoid_prime(z): """ .""" return sigmoid(z)*(1-sigmoid(z)) 


مهمة


  • نهج backpropagation المستندة إلى مصفوفة بالكامل على minipack. يستخدم تطبيقنا لنزول التدرج العشوائي سلسلة من الأمثلة التدريبية من الحزمة المصغرة. يمكن تغيير خوارزمية backpropagation بحيث تحسب التدرجات لجميع أمثلة التدريب على الحزمة المصغرة في نفس الوقت. بدلاً من البدء باستخدام متجه واحد x ، يمكننا أن نبدأ بالمصفوفة X = [x 1 x 2 ... x m ] ، التي تكون أعمدةها هي ناقلات minipack. يتم التوزيع المباشر من خلال نتاج مصفوفات الوزن ، وإضافة مصفوفة مناسبة لعمليات النزوح والاستخدام الواسع النطاق للسمك السيني. انتشار الظهر يتبع نفس النمط. اكتب رمزًا زائفًا لهذا النهج لخوارزمية backpropagation. قم بتعديل network.py بحيث يستخدم أسلوب المصفوفة هذا. ستكون ميزة هذا النهج هي استخدام جميع مزايا المكتبات الحديثة للجبر الخطي. نتيجةً لذلك ، يمكن تشغيله بشكل أسرع من دورة الحزم الصغيرة (على سبيل المثال ، على جهاز الكمبيوتر الخاص بي ، يتسارع البرنامج مرتين تقريبًا في مهام تصنيف MNIST). في الممارسة العملية ، تستخدم جميع المكتبات الخطيرة للتوزيع الخلفي مثل هذا المصفوفة الكاملة أو بعض الإصدارات منه.


بأي معنى ظهر التكاثر خوارزمية سريعة؟


بأي معنى ظهر التكاثر خوارزمية سريعة؟ للإجابة على هذا السؤال ، فكر في طريقة أخرى لحساب التدرج اللوني. تخيل الأيام الأولى لأبحاث الشبكة العصبية. ربما تكون هذه هي الخمسينيات أو الستينيات ، وأنت أول شخص في العالم توصل إلى فكرة استخدام النسب التدرجي للتدريب! ولكن لكي يعمل هذا ، فأنت بحاجة إلى حساب التدرج اللوني لوظيفة التكلفة. تتذكر الجبر وتقرر معرفة ما إذا كان يمكنك استخدام قاعدة السلسلة لحساب التدرج اللوني. بعد أن لعبت قليلاً ، ترى أن الجبر يبدو صعباً وأنت تشعر بخيبة أمل. أنت تحاول أن تجد طريقة مختلفة. عليك أن تقرر اعتبار التكلفة كدالة للأوزان فقط C = C (w) (سنعود إلى عمليات الإزاحة بعد ذلك بقليل). ترقيم الأوزان w 1 ، w 2 ، ... وتريد حساب ∂C / ∂w j للوزن w j . الطريقة الواضحة هي استخدام التقريب

 frac جزئيةC جزئيةwj approx fracC(w+ epsilonej)C(w) epsilon tag46



حيث ε> 0 هو رقم موجب صغير ، و e j هو متجه اتجاه الوحدة j. بمعنى آخر ، يمكننا تقدير approximatelyC / ∂w j تقريبًا عن طريق حساب التكلفة C لقيمتين مختلفتين قليلاً عن w j ، ثم تطبيق المعادلة (46). تتيح لنا نفس الفكرة حساب المشتقات الجزئية لـ ∂C / ∂b فيما يتعلق بالتشريد.

النهج يبدو واعدا. بسيطة من الناحية النظرية ، وسهلة التنفيذ ، ويستخدم فقط بضعة أسطر من التعليمات البرمجية. يبدو أكثر واعدة بكثير من فكرة استخدام قاعدة سلسلة لحساب التدرج!

لسوء الحظ ، على الرغم من أن هذا النهج يبدو واعداً ، إلا أنه عندما يتم تنفيذه في الشفرة ، فقد تبين أنه يعمل ببطء شديد. لفهم السبب ، تخيل أن لدينا مليون أوزان في الشبكة. ثم لكل وزن w j نحتاج إلى حساب C (w + εe j ) لحساب ∂C / ∂w j . وهذا يعني أنه لحساب التدرج اللوني ، نحتاج إلى حساب دالة التكلفة مليون مرة ، مما سيتطلب مليون تمريرة مباشرة عبر الشبكة (لكل مثال تدريب). ونحتاج أيضًا إلى حساب C (w) ، حتى نحصل على مليون وتمرير واحد عبر الشبكة.

تتمثل خدعة backpropagation في أنها تتيح لنا حساب جميع المشتقات الجزئية ∂C / ∂w j في وقت واحد باستخدام ممر واحد مباشر فقط عبر الشبكة ، متبوعًا بتمرير عكسي واحد. وبصورة تقريبية ، فإن التكلفة الحسابية لمرور العودة هي نفسها تقريبًا تكلفة التكلفة المباشرة.

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

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

التوزيع العكسي: بشكل عام


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

لتحسين فهم تشغيل الخوارزمية ، تخيل أننا أجرينا تغييرًا بسيطًا على وزن معيّن مع w:



سيؤدي هذا التغيير في الوزن إلى تغيير في تنشيط إخراج الخلايا العصبية المقابلة:



سيؤدي ذلك إلى تغيير في جميع عمليات تنشيط الطبقة التالية:



ستؤدي هذه التغييرات إلى تغييرات في الطبقة التالية ، وهكذا ، إلى آخر ، ثم إلى تغييرات في دالة التكلفة:



يرتبط التغيير في ΔC بالتغيير في Δw l jk بالمعادلة

 DeltaC approx frac جزئيةC جزئيةwljk Deltawljk tag47



ويترتب على ذلك أن النهج المحتمل لحساب ∂C / ∂w l jk هو مراقبة انتشار تغير صغير بدقة ، مما يؤدي إلى تغيير بسيط في C. إذا كان بإمكاننا القيام بذلك ، فنعبر بعناية على طول الطريق بكل شيء بالكميات التي يسهل حسابها. ، ثم يمكننا حساب ∂C / ∂w l jk .

لنجربها. يؤدي التغيير في Δw l jk إلى حدوث تغيير بسيط في Δa l j في تنشيط الخلايا العصبية j في الطبقة l. تم تعيين هذا التغيير.

 Deltaalj approx frac جزئيalj جزئيةwljk Deltawljk tag48



يؤدي التغيير في التنشيط ja l j إلى حدوث تغييرات في جميع عمليات تنشيط الطبقة التالية (l + 1). سنركز فقط على واحد من هذه التنبيهات التي تم تغييرها ، على سبيل المثال ، l + 1 q ،



سيؤدي هذا إلى التغييرات التالية:

 Deltaal+1q approx frac جزئيal+1q جزئيalj Deltaalj tag49



استبدال المعادلة (48) ، نحصل على:

 Deltaal+1q approx frac جزئيal+1q جزئيalj frac جزئيalj جزئيةwljk Deltawljk tag50



بطبيعة الحال ، فإن تغيير Δa l + 1 q سيؤدي أيضًا إلى تغيير التنشيط في الطبقة التالية. يمكننا حتى تخيل مسار على طول الشبكة بالكامل من w l jk إلى C ، حيث يؤدي كل تغيير في التنشيط إلى تغيير في التنشيط التالي ، وأخيراً إلى تغيير في التكلفة عند الإخراج. إذا كان المسار يمر عبر عمليات التنشيط a l j ، l + 1 q ، ... ، L - 1 n ، L m ، فسيكون التعبير النهائي هو

 DeltaC approx frac جزئيةC جزئيةaLm frac جزئيةaLm جزئيةaL1n frac جزئيةaL1n جزئيةaL2p ldots frac جزئيةal+1q جزئيةalj frac جزئيةalj جزئيةwljk Deltawljk tag51



أي أننا نختار عضوًا من النموذج ∂a / ∂a لكل خلية من الخلايا العصبية التالية التي نعبرها ، وكذلك للمصطلح ∂C / ∂a L m في النهاية. هذا هو تمثيل التغييرات في C بسبب التغييرات في عمليات التنشيط على هذا المسار بالذات عبر الشبكة. بالطبع ، هناك العديد من الطرق التي يمكن من خلالها التغيير في wk jk أن يؤثر على التكلفة ، وقد اعتبرنا واحدة منها فقط. لحساب التغيير الإجمالي في C ، من المنطقي افتراض أننا يجب أن نلخص جميع المسارات الممكنة من الوزن إلى التكلفة النهائية:

 DeltaC approx summnp ldotsq frac جزئيةC جزئيةaLm frac جزئيةaLm جزئيةaL1n frac جزئيةaL1n جزئيةaL2p ldots frac جزئيةal+1q جزئيةalj frac جزئيةalj جزئيةwljk Deltawljk tag52



حيث لخصنا جميع الخيارات الممكنة للخلايا العصبية الوسيطة على طول الطريق. بمقارنة هذا بـ (47) ، نرى ما يلي:

 frac جزئيةC جزئيةwljk= summnp ldotsq frac جزئيةC جزئيةaLm frac جزئيةaLm جزئيةaL1n frac جزئيةaL1n جزئيةaL2p ldots frac جزئيةal+1q جزئيةalj fracجزئيةa l j جزئيةw l j k . العلامة53    



المعادلة (53) تبدو معقدة. ومع ذلك ، فإنه يحتوي على تفسير بديهية لطيفة. نحن نحسب التغيير في C فيما يتعلق بأوزان الشبكة. يخبرنا أن كل حافة بين عصبونين للشبكة ترتبط بعامل النسبة ، وهو فقط مشتق جزئي من تنشيط إحدى الخلايا العصبية فيما يتعلق بتنشيط خلية عصبية أخرى. بالنسبة للضلع من أول وزن إلى أول خلية عصبية ، فإن عامل النسبة هو la l j / ∂w l jk . معامل النسبة للمسار هو ببساطة نتاج المعاملات على طول المسار. والمعامل الكلي للتغيير ∂C / ∂w l jk هو مجموع المعاملات بكل الطرق من الوزن الأولي إلى التكلفة النهائية. يظهر هذا الإجراء أدناه لمسار واحد:



حتى الآن ، لقد قدمنا ​​حجة إرشادية ، طريقة لتمثيل ما يحدث عندما تتغير أوزان الشبكة. واسمحوا لي أن أوضح طريقة أخرى للتفكير في هذا الموضوع لتطوير هذه الحجة. أولاً ، يمكننا استنتاج التعبير الدقيق لجميع المشتقات الجزئية الفردية في المعادلة (53). هذا سهل الاستخدام باستخدام الجبر البسيط. بعد ذلك ، يمكنك محاولة فهم كيفية كتابة جميع المبالغ حسب الأرقام القياسية في شكل منتجات مصفوفة. يبدو أن هذه مهمة شاقة تتطلب الصبر ، ولكنها ليست شيئًا غير عادي. بعد كل هذا والحد الأقصى من التبسيط ، سترى أنه تم الحصول على نفس خوارزمية backpropagation بالضبط! لذلك ، يمكن تخيل خوارزمية backpropagation كوسيلة لحساب مجموع المعاملات لجميع المسارات. أو لإعادة الصياغة ، تعد خوارزمية backpropagation طريقة صعبة لتتبع التغييرات الصغيرة في الأوزان (والإزاحة) عندما تنتشر عبر شبكة ، وتصل إلى مخرجات ، وتؤثر على التكلفة.

هنا لن أفعل كل هذا. هذا العمل غير جذاب ، ويتطلب دراسة دقيقة للتفاصيل. إذا كنت جاهزًا لذلك ، فقد ترغب في القيام بذلك. إذا لم يكن كذلك ، آمل أن تعطيك هذه الأفكار بعض الأفكار فيما يتعلق بأهداف backpropagation.

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

ومع ذلك ، هناك خدعة ذكية واحدة في هذه العملية. في المعادلة (53) ، المتغيرات الوسيطة هي تنشيط من النوع a l + 1 q . الخدعة هي التبديل إلى استخدام المدخلات الموزونة ، مثل z l + 1 q ، كمتغيرات وسيطة. إذا لم تستخدم هذا واستمرت في استخدام التنشيط ، فستكون الأدلة التي تم الحصول عليها أكثر تعقيدًا من تلك التي تم تقديمها مسبقًا في هذا الفصل.

Source: https://habr.com/ru/post/ar457980/


All Articles