محتويات الدورة

PyTorch / أسس الموتر والتدرج والوحدة / الدرس 3

الوحدات والمعاملات والمخازن

استخدم تسجيل nn.Module لإظهار القيم المتعلمة والحالة الدائمة وتركيب المكونات صراحة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تسجيل الوحدات الفرعية وParameters والمخازن بأسماء واضحة.
  • فصل حفظ الحالة عن المشاركة في حساب التدرج.
  • استدعاء واجهة الوحدة وفحص الحالة المسماة عمداً.

الوحدة حد حساب مسجل

اشتق صنفاً من nn.Module، واستدع super().__init__، وسجل مكونات النموذج، وعرّف forward لحساب المدخل إلى الخرج. يستخدم model(x) مسار استدعاء الوحدة، بما فيه سلوك خطافات الاستدعاء المدعوم، بدلاً من استدعاء دالة رياضية مجردة فقط. قد يتجاوز استدعاء forward مباشرة هذه الآليات المحيطة. يمكن للوحدة أن تحتوي وحدات أخرى، فتمنح تسلسلاً هرمياً أسماء واجتيازاً. يفيد التسجيل في اكتشاف المعاملات وقواميس الحالة ونقل النوع أو الجهاز وتغيير الوضع؛ لكنه لا يتحقق بذاته من معنى السمات أو يثبت الفائدة الإحصائية للنموذج.

للمعاملات والمخازن وظيفتان مختلفتان

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

افحص وحدة مسجلة صغيرة وكاملة

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

python برنامج توضيحي للمعالج المركزي وفق وثائق PyTorch 2.14؛ لم تتوفر torch والخرج المتوقع مشتق
import torch
from torch import nn
class CenteredScale(nn.Module):
    def __init__(self):
        super().__init__()
        self.weight = nn.Parameter(torch.tensor(3.0, dtype=torch.float64, device="cpu"))
        self.register_buffer("center", torch.tensor(2.0, dtype=torch.float64, device="cpu"))
    def forward(self, x):
        return self.weight*(x-self.center)
model = CenteredScale()
x = torch.tensor([3.0,4.0], dtype=torch.float64, device="cpu")
print("output", model(x).tolist())
print("parameters", sorted(dict(model.named_parameters())))
print("buffers", sorted(dict(model.named_buffers())))
print("state keys", sorted(model.state_dict()))
الناتج المتوقع
output [3.0, 6.0]
parameters ['weight']
buffers ['center']
state keys ['center', 'weight']

يسجل Parameter ومخزن دائم بدورين مختلفين ويدخلان state_dict معاً. اشتُقت نتائج التسجيل والموترات المتوقعة ولم تنفذ.

احسب الحالة المتعلمة منفصلة عن الحالة الكاملة

يحسب المرافق القياسي النتيجة التآلفية نفسها بقواميس صريحة للمعاملات والمخازن. يحتوي عدداً متعلماً واحداً ومدخلي حالة. هذا توثيق أدوار فقط؛ ولا تعيد قواميس Python سلوك Module. افحص named_parameters وnamed_buffers وstate_dict في وحدة فعلية وفق نطاقها الموثق بدلاً من افتراض أن كل موتر محفوظ يخضع للتحسين. قد تؤثر مشاركة المعاملات وإزالة المكررات في الاجتياز؛ فلا تستنتج أعداد معاملات مستقلة من أسماء الصفات وحدها. احفظ خريطة واضحة من أسماء الحالة إلى معناها الرياضي والتشغيلي.

python مثال مرافق حتمي بالمكتبة القياسية نُفذ فعلياً
state = {"parameters":{"weight":3.0}, "buffers":{"center":2.0}}
values = [3.0,4.0]
outputs = [state["parameters"]["weight"]*(x-state["buffers"]["center"]) for x in values]
parameter_count = len(state["parameters"])
print("output", outputs)
print("trainable scalar count", parameter_count)
print("state entries", parameter_count+len(state["buffers"]))
الناتج المتوقع
output [3.0, 6.0]
trainable scalar count 1
state entries 2

يفحص المرافق حساباً عددياً يراعي الأدوار؛ ولا تنفذ القواميس العادية تسجيل الوحدات أو نقل حالتها أو خطافاتها أو تحسينها.

اجعل التركيب وتغييرات الحالة قابلين للمراجعة

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

الأخطاء الشائعة وإصلاحها

أغفل المحسن طبقة محفوظة في قائمة عادية

لماذا يحدث؟
لم تسجل الوحدات الفرعية المقصودة بحاوية مدعومة.
كيف تصلحه؟
استخدم ModuleList أو Sequential أو صفات مسجلة صريحة وفق الحاجة.
كيف تتجنب تكراره؟
افحص المعاملات المسماة المتوقعة قبل إنشاء المحسن.

غاب موتر ثابت عن الحالة المحفوظة

لماذا يحدث؟
كان صفة عادية أو مخزناً غير دائم عمداً.
كيف تصلحه؟
سجل حالة النموذج الدائمة بسياسة المخزن الموثقة.
كيف تتجنب تكراره؟
اختبر مفاتيح الحالة وسلوك المدخل المعلوم معاً.

ظل نموذج مجمد يغير سلوكه

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

اختبر فهمك

1. لماذا يظهر center في state_dict دون named_parameters؟

اعرض الحل المشروح

سُجل كمخزن دائم. تحتاج الدالة قيمته لإعادة السلوك، لكنه غير معلن كمعامل للمحسن. أما weight فهو Parameter وينتمي للدور المتعلم. يجيب حفظ الحالة والمشاركة في التدرج عن سؤالين مختلفين.

2. هل يثبت الحصول على [3,6] تسجيل center بصورة صحيحة؟

اعرض الحل المشروح

لا. قد تنتج صفة موتر غير مسجلة الحساب نفسه مع غيابها عن معالجة الحالة المتوقعة. افحص أسماء المخازن ومفاتيح state_dict مع الخرج. هذه توقعات إطار مشتقة في المساق؛ ولم ينفذ إلا حساب القواميس المنفصل.

أهم ما تعلمته

  • يضبط التسجيل بنية النموذج وحالته اللتين يمكن اكتشافهما.
  • الحالة الدائمة أوسع من المعاملات المتعلمة.
  • افحص الأسماء والسلوك وسياسات الوضع معاً.

المراجع الرسمية