التعلم العميق / أسس الموترات والتعلم / الدرس 4
قاعدة السلسلة والتراكم العكسي
تتبع رسماً حسابياً عددياً واجمع المسارات التي تسهم في تدرج المعامل.
في هذه الصفحة
أهداف الدرس
- اشتقاق المشتقات المحلية والكلية.
- جمع التدرجات عند عقدة مشتركة.
- تمييز قابلية التفاضل عن نجاح التعلم.
يسجل الرسم كيف حُسبت القيمة
يمثل الرسم الحسابي العمليات واعتماد بعضها على بعض. في التنبؤ p = w*x + b ثم الخسارة L = (p-y)^2/2 يحسب المرور الأمامي p والباقي ثم الخسارة. يطبق المرور العكسي قاعدة السلسلة بعكس ترتيب الاعتماد، ويحتاج قيماً وسيطة مناسبة من الحساب الأمامي، لا الخسارة النهائية وحدها. يطبق التفاضل التلقائي قواعد المشتقات المحلية على الحساب المنفذ؛ ولا يقدرها بتجريب اضطرابات عشوائية، ولا يحل التحسين، ولا يتحقق من مطابقة الهدف المبرمج للمهمة المطلوبة.
اشتق تدرجاً قبل أتمتته
مشتقة نصف الخطأ التربيعي بالنسبة إلى p هي p-y، ومشتقة p بالنسبة إلى w هي x، لذلك dL/dw = (p-y)*x وdL/db = p-y. يظهر البرنامج هذه الخطوات ثم ينفذ تحديثاً واحداً للنزول المتدرج. يصف التدرج حساسية محلية مع ثبات المدخلات الأخرى، وتعتمد إشارته وحجمه على مقياس الخسارة ووحدات السمات والمعاملات الحالية. لا يكفي كبره لإثبات عيب في التنفيذ، ولا يثبت انعدامه وحده أن المهمة كلها حُلّت.
x, y = 2.0, 5.0
w, b = 1.0, 0.0
prediction = w * x + b
residual = prediction - y
gw, gb = residual * x, residual
w -= 0.1 * gw
b -= 0.1 * gb
print(f"loss={0.5 * residual**2:.2f}, dw={gw:.2f}, db={gb:.2f}")
print(f"w={w:.2f}, b={b:.2f}")
loss=4.50, dw=-6.00, db=-3.00
w=1.60, b=0.30
يستخدم الباقي الأمامي في مشتقتي المعاملين؛ والتحديث عملية مستقلة عن التفاضل.
يسهم كل استخدام لاحق في المشتقة
إذا أثرت قيمة وسيطة في الخسارة عبر فرعين، كانت مشتقتها الكلية مجموع الإسهامين. عندما a=w*x وL=a*a+a يكون dL/da=2a+1. يسهم كل ظهور داخل a*a بقيمة a، ويسهم الفرع المباشر بواحد. يوضح البرنامج التراكم دون إطار عمل. استبدال الجمع بالإسناد أثناء معالجة فرع يحذف إسهامات أخرى بصمت. تخضع الأوزان المشتركة في الشبكات المتكررة والتضمينات المربوطة للمبدأ نفسه: يزيد تكرار الاستخدام عدد الإسهامات، ولا ينشئ معاملاً جديداً.
w, x = 2.0, 3.0
a = w * x
branch_square = 2 * a
branch_direct = 1.0
da = branch_square + branch_direct
dw = da * x
print(f"a={a:.1f}, loss={a*a+a:.1f}")
print(f"da={da:.1f}, dw={dw:.1f}")
a=6.0, loss=42.0
da=13.0, dw=39.0
يجتمع إسهاما الفرعين قبل الضرب في المشتقة المحلية x.
يتبع التفاضل المسار المنفذ
قد يحتوي البرنامج تحكماً في التدفق وانتقاءات غير قابلة للتفاضل وفهارس صحيحة وقيماً مفصولة وعمليات مشتقتها غير معرفة. يتتبع التفاضل التلقائي الاعتمادات التي يدعمها النظام المختار فقط. لا تعطي العتبة الحادة عادة مشتقة مفيدة لتعلم درجة المصنف. قد يكون إيقاف التدرج مقصوداً، لكن تحويل قيمة متتبعة إلى عدد عادي عرضاً قد يقطع مساراً ضرورياً. حدد هل المطلوب الاشتقاق عبر تحويل البيانات أو بالنسبة إلى معامل نموذج أو عبر إجراء تحسين مستقل؛ فهذه مسائل رياضية مختلفة ولو تطابقت القيم الأمامية.
افصل عمر الرسم والتخزين والتحديث
قد يحرر الحساب العكسي القيم الوسيطة لتوفير الذاكرة، فتحتاج المشتقات المتكررة إلى الاحتفاظ بالرسم أو بنائه مجدداً وفق الإطار. وقد تتراكم مخازن التدرج بين استدعاءات المرور العكسي، بينما لا تتغير المعاملات إلا بالتحديث. هذه دورات حياة مستقلة. صمم فحص مشتقة صغيراً قبل الدفعات والطبقات العشوائية والوحدات ذات الحالة. احتفظ بقيمة المعامل التي حُسبت عندها المشتقة حتى اكتمال جميع الإسهامات. توضح البرامج حساب قاعدة السلسلة فقط، ولا تحاكي محرك تفاضل كاملاً أو مشتقات عليا أو سياسة تخزين إطار معين.
الأخطاء الشائعة وإصلاحها
تدرج المعامل المشترك أصغر من المتوقع
- لماذا يحدث؟
- استبدل أحد إسهامات الفروع إسهاماً آخر.
- كيف تصلحه؟
- اجمع جميع الإسهامات قبل التحديث.
- كيف تتجنب تكراره؟
- اختبر رسماً يصل فيه مساران إلى المعامل نفسه.
تتغير الخسارة لكن أحد المعاملات بلا تدرج
- لماذا يحدث؟
- انقطع المسار الحسابي أو استُخدم قرار غير قابل للتفاضل.
- كيف تصلحه؟
- تتبع المعامل حتى الخسارة وأبق عمليات الدرجات قابلة للتفاضل.
- كيف تتجنب تكراره؟
- افحص وجود التدرجات المتوقعة في رسم معلوم صغير.
تتغير المعاملات أثناء تتبع الانتشار العكسي
- لماذا يحدث؟
- حدث التحديث قبل استخدام جميع التدرجات للقيم الأمامية الأصلية.
- كيف تصلحه؟
- أكمل الاشتقاق قبل تعديل المعاملات.
- كيف تتجنب تكراره؟
- افصل خطوات الاشتقاق والمحسن بوضوح.
اختبر فهمك
1. احسب التدرجين عندما x=3 وy=4 وw=1 وb=0 مع نصف الخطأ التربيعي.
اعرض الحل المشروح
التنبؤ ثلاثة والباقي سالب واحد، لذلك dL/dw=-3 وdL/db=-1، والخسارة نصف. تصف المشتقات المعاملات الأصلية؛ فلا تعِد حساب بعضها من حالة أمامية تغيرت بعد تحديث جزئي.
2. لماذا لا نحدث الوزن المشترك عند زيارة كل فرع؟
اعرض الحل المشروح
تنتمي الإسهامات إلى مشتقة هدف واحد عند حالة معاملات واحدة. يغير التحديث بعد الفرع الأول الحالة التي تستخدمها الحسابات اللاحقة. اجمع الإسهامات ثم طبق تحديث المحسن المقصود. أما خوارزمية آنية مختلفة عمداً فتحتاج تعريفاً مستقلاً صريحاً.
أهم ما تعلمته
- يطبق الانتشار العكسي المشتقات المحلية بالترتيب المعاكس.
- تحتاج المسارات المشتركة إلى جمع التدرجات.
- الاشتقاق وتحديث المحسن عمليتان مختلفتان.