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

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

خطوة تدريب وتقييم مضبوطة

اجعل ترتيب وحالة تحديث PyTorch كامل واحد ظاهرين قبل بناء حلقة تدريب أكبر.

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

أهداف الدرس

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

ابدأ بحساب يعرف جوابه

يلائم المثال وحدة خطية بمدخل واحد لزوجين مقدّمين باستخدام متوسط الخطأ التربيعي. يملأ الوزن والانحياز بصفر صراحة قبل التدريب؛ فلا يحدد الإنشاء العشوائي النتيجة المتوقعة. يبقى شكل المدخل والهدف (2,1)، فيمنع بث مقارنة الأزواج غير المقصودة. يستخدم النموذج والمدخل والهدف float64 على CPU، ولـSGD معدل ثابت دون زخم أو اضمحلال. تعرف الاختيارات عقد تحديث ضيقاً عمداً. وليست معاملات ضبط موصى بها أو ادعاءً بأن نقطتين تثبتان تنبؤاً خارجياً مفيداً.

يتضمن التحديث عمليات مختلفة

ادخل وضع تدريب الوحدة المقصود، ونظف مخازن التدرج عند الحد المختار، واحسب التنبؤات والخسارة المفردة، واستدع backward ثم optimizer.step. يحسب التفاضل مشتقات، ويستهلكها المحسن لتغيير المعاملات. ليست zero_grad تحديثاً للمحسن، ولا تشغل step مروراً جديداً لتحديث الخسارة تلقائياً. يحفظ البرنامج التوضيحي الخسارة المفردة السابقة، ثم يعيد حساب الهدف بعد التحديث منفصلاً. صرح بالترتيب كيلا يعرض سجل اسمه after كائن الخسارة القديم عرضاً.

python برنامج توضيحي للمعالج المركزي وفق وثائق PyTorch 2.14؛ لم تتوفر torch والخرج المتوقع مشتق
import torch
from torch import nn
x = torch.tensor([[1.0],[2.0]],dtype=torch.float64,device="cpu")
y = torch.tensor([[2.0],[4.0]],dtype=torch.float64,device="cpu")
model = nn.Linear(1,1,dtype=torch.float64,device="cpu")
with torch.no_grad():
    model.weight.fill_(0.0)
    model.bias.fill_(0.0)
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
model.train()
optimizer.zero_grad(set_to_none=True)
loss = nn.MSELoss()(model(x),y)
loss.backward()
optimizer.step()
model.eval()
with torch.no_grad():
    after = nn.MSELoss()(model(x),y)
print(f"before={loss.item():.6f}; after={after.item():.6f}")
print(f"weight={model.weight.item():.6f}; bias={model.bias.item():.6f}")
الناتج المتوقع
before=10.000000; after=1.060000
weight=1.000000; bias=0.600000

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

يحتاج التقييم اختيار الوضع والتسجيل معاً

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

اشتق التحديث الأول بصورة مستقلة

يحسب المرافق القياسي باقيين سالب اثنين وسالب أربعة، ومتوسط خسارة عشرة، ومشتقة وزن سالب عشرة، ومشتقة انحياز سالب ستة. يعطي معدل 0.1 وزناً واحداً وانحيازاً 0.6. تصبح التنبؤات 1.6 و2.6، ومربعا الخطأ 0.16 و1.96 ومتوسطهما 1.06. هذا تفسير رياضي دقيق مع تقريب العرض في المثال، وليس دليلاً على تقارب SGD للأهداف الاعتباطية. طابق اختزال المتوسط وعامل المشتقة اثنين قبل مقارنة مرجع يدوي بنتيجة إطار.

python مثال مرافق حتمي بالمكتبة القياسية نُفذ فعلياً
x, y = [1.0,2.0], [2.0,4.0]
w, b, rate = 0.0, 0.0, 0.1
residuals = [w*a+b-target for a,target in zip(x,y)]
before = sum(r*r for r in residuals)/len(x)
gw = 2*sum(r*a for r,a in zip(residuals,x))/len(x)
gb = 2*sum(residuals)/len(x)
w -= rate*gw
b -= rate*gb
after = sum((w*a+b-target)**2 for a,target in zip(x,y))/len(x)
print(f"dw={gw:.1f}; db={gb:.1f}")
print(f"before={before:.6f}; after={after:.6f}")
الناتج المتوقع
dw=-10.0; db=-6.0
before=10.000000; after=1.060000

يوفر حساب المشتقة والتحديث المنفذ توقعاً مستقلاً للمثال؛ ولا يتحقق من تنفيذ محسن torch أو تقارب التدريب عموماً.

وسع فقط بعد فهم حد الخطوة الواحدة

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

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

بقيت الخسارة المعروضة بعد التحديث دون تغير غير متوقع

لماذا يحدث؟
طُبعت خسارة المرور القديم بدلاً من إعادة حسابها.
كيف تصلحه؟
نفذ مروراً جديداً وفق حد التقييم المقصود بعد step.
كيف تتجنب تكراره؟
سم القياسين السابق واللاحق للتحديث صراحة.

حدثت حلقة التدريب دون تدرجات حالية متوقعة

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

غير التحقق معاملات النموذج بصمت

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

اختبر فهمك

1. كيف نستخرج تحديث الوزن والانحياز من الباقيين الأوليين؟

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

لمتوسط الخطأ التربيعي مشتقة 2*r/B لكل تنبؤ. عند B=2 تكون مشتقة الوزن (-2)*1+(-4)*2=-10 ومشتقة الانحياز -2-4=-6. نطرح 0.1 مضروباً فيهما من صفر فنحصل على واحد و0.6. ثم أعد حساب التنبؤات قبل قياس الخسارة الجديدة.

2. هل يثبت خفض الخسارة من عشرة إلى 1.06 أن الوحدة المتعلمة تعمم؟

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

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

أهم ما تعلمته

  • التصفير والاشتقاق والتعديل والقياس حدود مستقلة.
  • قد تكشف خطوة أولى يدوية أخطاء الشكل والاختزال.
  • ليس نجاح مثال تدريب دليلاً لتقييم خارجي.

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