PyTorch / دليل حلول تحريري
شخص التدرجات المفقودة والمعاملات التي لا تتغير
افصل التسجيل ومشاركة الرسم وتراكم التدرج وعضوية المحسن قبل تغيير معدل التعلم.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
تبقى قيمة مسماة دون تغير، أو يكون حقل .grad لها None، أو لا يملك وسيط معروض تدرجاً، أو تتغير الخسارة ولا تحدث طبقة مقصودة أبداً. احفظ مدخلاً وهدفاً ثابتين على CPU وحالة الوحدة ووضع التدرج والهدف وإعداد المحسن قبل إضافة دورات تدريب.
افهم الأسباب المحتملة
- تشمل الأسباب طبقات غير مسجلة ومحسناً يشير إلى Parameter قديم وتجميداً مقصوداً وتعبيراً مفصولاً وإعادة إنشاء عبر torch.tensor وسياق no-grad وفروعاً غير مستخدمة أو فحص موتر غير ورقي لم يحتفظ بتدرجه. تحتاج الأسباب فحوصاً مختلفة؛ فلا يصل معدل تعلم أكبر أو أصغر مسار رسم مفقوداً.
1. أعد بناء مشتقة وتحديث متوقعين
اختر حالة اصطناعية صغيرة يمكن حساب هدفها ومشتقة معامل واحد على الأقل بصورة مستقلة. حدد اختزال الخسارة والعدد الصالح والنوع العددي وجهاز CPU ووضع الوحدة وسياق التدرج. احفظ لقطة سابقة للتحديث تلائم عقد التخزين. حدد المعاملات التي ينبغي أن تستقبل مشتقات وتلك التي تبقى مجمدة. لا تحدد قيمة خسارة مفردة المسار المفقود. افحص في البيئة المدعومة تعبير الموتر الفعلي الممرر إلى backward لا عدد Python المسجل فقط. يقدم الدليل خطة تحقيق؛ ولا ينفذ ذلك الفحص داخل الإطار.
2. قارن التسجيل وعضوية المحسن والتدرجات
افحص named_parameters والحاويات المسجلة، ثم قارن هويات Parameter الفعلية المقدمة إلى المحسن. قد يترك تبديل صفة بعد إنشاء المحسن المحسن مشيراً إلى كائن آخر. يملك الوزن المخفي الاصطناعي في المرافق مشتقة لكنه بلا عضوية محسن، وينتمي انحياز الرأس للمحسن لكنه بلا إسهام مشتقة. لا يفسر أحدهما الآخر وحده. تختلف قائمة طبقات عادية وصفة موتر عادية أيضاً في التسجيل عن ModuleList وParameter ومخزن مسجل. اختبر الدور المطلوب فعلاً ولا تفترض أن اسماً مألوفاً يضمنه.
parameters = {"hidden.weight":{"registered":True,"requires_grad":True,"in_optimizer":False,"gradient":-4.0},
"head.bias":{"registered":True,"requires_grad":True,"in_optimizer":True,"gradient":None}}
for name,state in parameters.items():
findings = []
if not state["registered"]: findings.append("unregistered")
if not state["in_optimizer"]: findings.append("missing optimizer membership")
if state["gradient"] is None: findings.append("no gradient contribution")
print(name, findings)
hidden.weight ['missing optimizer membership']
head.bias ['no gradient contribution']
تميز سجلات اصطناعية عضوية المحسن من وجود التدرج. لا يفحص البرنامج Parameters أو رسوم autograd أو وحدات أو حالة محسن حقيقية.
3. تتبع مسار المعامل إلى الهدف والوضع
افحص requires_grad للمعاملات الورقية المقصودة، وهل قطع no_grad أو inference_mode أو detach أو item أو باني موتر اعتماداً مطلوباً. module.eval مفتاح سلوك مستقل ولا يعطل autograd بذاته. قد يؤدي وسيط غير ورقي دوراً عكسياً صحيحاً دون تجميع .grad معروض إلا بطلب احتفاظ مناسب؛ فلا تشخص كل مخزن وسيط مفقود كنموذج مفصول. قارن None بمشتقة صفرية صريحة وفق المحسن المختار، لأن تجاوز معامل وتحديثه بتدرج صفر قد يتفاعلان بصورة مختلفة مع الحالة أو الاضمحلال.
4. تحقق من انتقال مصحح قبل التوسع
نظف التدرجات عند حد التراكم المقصود، واحسب هدفاً جديداً واشتقه، وافحص تغير المعامل الفعلي بعد خطوة المحسن المقصودة. لا تعِد رسماً محرراً عرضاً أو تطبع خسارة ما قبل التحديث القديمة كقياس جديد. افحص سياسات المعاملات والمخازن والوضع منفصلة إذا تغير نموذج يفترض تجميده. احفظ مثال تراجع للعيب المحدد ومساراً صحيحاً غير متعلق. أضف الدفعات والعشوائية تدريجياً بعد مطابقة الخطوة للتوقع المستقل؛ ويظل نجاح ملاءمة محلية مختلفاً عن دليل جودة محجوز.
تحقق من نجاح الإصلاح
يحدد التحقق حد التسجيل أو العضوية أو الاشتقاق أو التحديث الفاشل ويطابق انتقالاً مضبوطاً بتوقع مستقل. نُفذ مصنف سجلات المكتبة القياسية المعطى فقط. ولم يختبر محلل PyTorch أو فحص Parameter أو رسم عكسي أو خطوة محسن أو نموذج أو بيئة وضع تدرج.
امنع تكرار المشكلة
- احفظ فحوص الحالة المسماة وعضوية المحسن مع مثال مشتقة صغير، وميز None من الصفر، وراجع التغيير البنيوي قبل إعادة استخدام محسن. سجل بيئة التنفيذ الفعلية وميز التجميد المقصود من الانفصال العرضي في التشخيص.