PyTorch / حالة التدريب وواجهات المعمارية / الدرس 7
المحسنات ومجموعات المعاملات والحالة
صرح بعضوية معاملات المحسن وخيارات المجموعات وحالة المتابعة.
في هذه الصفحة
أهداف الدرس
- بناء مجموعات معاملات مستقرة بخيارات مقصودة.
- تمييز التدرج المفقود من تدرج صفري صريح.
- شرح عدم كفاية الأوزان وحدها لإعادة خطوة المحسن التالية.
يملك المحسن مراجع إلى معاملات مختارة
أنشئ المحسن من المعاملات التي ينبغي أن يغيرها التحديث المقصود، بعد تحديد بنية الوحدة واختيارات النوع أو الجهاز المناسبة. يمكن اكتشاف معاملات الوحدة المسجلة، لكن المحسن يتلقى ما قدم إليه فعلاً فقط. لا يدخل Parameter منشأ حديثاً في محسن قائم تلقائياً لأن اسم صفة يبدو مألوفاً. استخدم مجموعات معاملات ذات ترتيب حتمي بدلاً من مجموعات غير مرتبة، وافحص الأسماء والهويات عند الإعداد. تحتاج المعاملات المشتركة عضوية مقصودة كيلا تعامل قيمة رياضية واحدة كنسخ مستقلة عرضاً. لا يقرر المحسن صلاحية الهدف المختار إحصائياً.
تتجاوز مجموعات المعاملات القيم الافتراضية المعلنة
تحتوي المجموعة مجموعة params وخيارات محسن مدعومة كالمعدل أو سياسة الاضمحلال. يملك برنامج SGD التوضيحي مجموعة وزن بمعدل 0.1 ومجموعة انحياز بمعدل 0.01، فتتجاوزان القيمة الافتراضية الخارجية. مشتقتا نصف الخسارة التربيعية سالب أربعة وسالب اثنين، فتنتجان وزن 1.4 وانحياز 0.02. هذا مثال لآلية العمل، لا توصية بأن يحتاج كل انحياز معدلاً أصغر. تعطي الخوارزميات المختلفة خيارات الاضمحلال والتنظيم دلالاتها الموثقة الخاصة؛ فلا تستنتج تكافؤها لمجرد كلمة مفتاح مشتركة.
import torch
from torch import nn
w = nn.Parameter(torch.tensor(1.0,dtype=torch.float64,device="cpu"))
b = nn.Parameter(torch.tensor(0.0,dtype=torch.float64,device="cpu"))
optimizer = torch.optim.SGD([{"params":[w],"lr":0.1},{"params":[b],"lr":0.01}],lr=1.0)
optimizer.zero_grad(set_to_none=True)
loss = 0.5*(2*w+b-4)**2
loss.backward()
optimizer.step()
print(f"weight={w.item():.6f}; bias={b.item():.6f}")
print("group rates", [group["lr"] for group in optimizer.param_groups])
weight=1.400000; bias=0.020000
group rates [0.1, 0.01]
تستهلك مجموعتا المعاملات الصريحتان تدرجين سالب أربعة وسالب اثنين بمعدلين مختلفين. لم ينفذ محسن أو مجموعة معاملات في PyTorch.
التدرجات المفقودة والصفرية مختلفتان
تعيد zero_grad(set_to_none=True) المخازن إلى None. قد يبقى معامل لم يتلق تدرجاً كذلك بعد backward، وتعالجه torch.optim بصورة مختلفة من موتر أصفار كامل. مع مشتقة صفرية قد تؤثر حالة المحسن أو الاضمحلال في التحديث وفق الخوارزمية؛ بينما قد يؤدي التدرج المفقود إلى تجاوز خطوة المعامل. لا تحول كل None إلى صفر لمجرد تشغيل دالة تسجيل. حدد أولاً هل المعامل غير مستخدم أو مجمد عمداً أم انقطع مسار الرسم خطأً. اعرض تلك الحالات بتمييز.
الحالة جزء من إجراء التحديث
قد يغير الزخم والعزوم التكيفية والعدادات وإعداد المجموعات الخطوة التالية رغم تطابق الأوزان والتدرجات الحالية. يقارن المرافق القياسي مخزن زخم مسترجعاً بمخزن غائب وفق قاعدة عددية معلنة. يأخذ المخزن الأول الغائب التدرج الأول، بما يطابق اصطلاح تهيئة SGD العادي الموثق دون المتغيرات الإضافية المستخدمة في مواضع أخرى. تحتاج dampening وNesterov والمحسنات التكيفية معادلاتها الموثقة الدقيقة. قد يلائم أثر أوزان فقط الاستدلال، لكنه لا يكفي لمتابعة مسار التدريب نفسه.
def step(parameter, buffer, gradient):
next_buffer = gradient if buffer is None else 0.9*buffer+gradient
return parameter-0.1*next_buffer, next_buffer
restored, restored_buffer = step(1.0,2.0,-4.0)
weights_only, new_buffer = step(1.0,None,-4.0)
print(f"restored parameter={restored:.6f}; buffer={restored_buffer:.6f}")
print(f"weights-only parameter={weights_only:.6f}; buffer={new_buffer:.6f}")
restored parameter=1.220000; buffer=-2.200000
weights-only parameter=1.400000; buffer=-4.000000
تستخدم القاعدة العددية المنفذة التدرج الأول كمخزن زخم ابتدائي عند غيابه. توضح اعتماد التحديث على الحالة دون التحقق من تنفيذ محسن torch.
افحص العضوية والاسترجاع عند حد معلوم
قارن المعاملات المسماة المتوقعة وخيارات المجموعات ووجود التدرج وتغير المعامل الفعلي في حالة حتمية صغيرة. عند استرجاع حالة المحسن، احفظ بنية مجموعات متوافقة واتبع ترتيب التحميل الموثق مع أي مجدول؛ فالأسماء وحدها ليست آلية عامة لمطابقة الحالة. يحتاج فك التجميد الديناميكي سياسة مجموعات مدعومة صريحة. ميز تحديثاً عددياً مفاهيمياً من عملية إطار مختبرة. لم ينفذ برنامج torch، ويفحص المرافق حسابه وحده؛ ولم ينفذ حفظ محسن أو نقل جهاز أو استرجاع مجدول أو تكييف نموذج.
الأخطاء الشائعة وإصلاحها
لم يتغير معامل جديد قابل للتعلم
- لماذا يحدث؟
- لا يشير المحسن القائم إلى Parameter المستبدل أو المضاف.
- كيف تصلحه؟
- صالح عضوية المحسن مع معاملات الوحدة المقصودة.
- كيف تتجنب تكراره؟
- افحص هويات المعاملات وتحديثاً معلوماً بعد تغيير البنية.
تغير معامل غير مستخدم بعد استبدال None بصفر
- لماذا يحدث؟
- غير ذلك دلالات تجاوز الخطوة وسمح لحالة المحسن أو الاضمحلال بالعمل.
- كيف تصلحه؟
- احفظ سياسة التدرج المفقود الموثقة وشخص سبب الغياب.
- كيف تتجنب تكراره؟
- اختبر التدرجات الغائبة والصفرية الصريحة منفصلة للمحسن المختار.
اتخذ التشغيل المستأنف خطوة مختلفة رغم تساوي الأوزان
- لماذا يحدث؟
- أُهمل الزخم أو العدادات أو خيارات المجموعات أو حالة محسن أخرى.
- كيف تصلحه؟
- استرجع الحالة المتوافقة المناسبة وتحقق من انتقال واحد.
- كيف تتجنب تكراره؟
- احفظ مقارنة التحديث التالي بالتنفيذ المستمر.
اختبر فهمك
1. لماذا يتحرك الانحياز 0.02 بدلاً من 0.2 في مثال الإطار؟
اعرض الحل المشروح
تدرجه سالب اثنين ومعدل مجموعته 0.01. يطرح SGD القيمة 0.01*(-2) من صفر فينتج 0.02. يستخدم الوزن معدل مجموعة آخر هو 0.1. تتجاوز المجموعتان الصريحتان المعدل الافتراضي الخارجي واحداً فلا يستخدم لهذين التحديثين.
2. لماذا تنتهي حالتا المتابعة العدديتان عند 1.22 و1.4؟
اعرض الحل المشروح
يعطي المخزن المسترجع 0.9*2-4=-2.2؛ فينتج طرح 0.1*(-2.2) من واحد 1.22. عند غياب مخزن سابق تستخدم التهيئة المعلنة التدرج سالب أربعة، فتعطي 1.4. لذلك لا يثبت تطابق الأوزان الابتدائية والتدرجات الحالية تطابق متابعة المحسن.
أهم ما تعلمته
- عضوية المحسن وخيارات المجموعات حالة صريحة.
- قد تعني None والتدرجات الصفرية تحديثات مختلفة.
- تحتاج متابعة التدريب حالة المحسن المناسبة لا الأوزان وحدها.