PyTorch / حالة التدريب وواجهات المعمارية / الدرس 12
العشوائية وقابلية الإعادة والاستئناف
حدد الحالة والمقارنة المطلوبتين للإعادة بدلاً من معاملة بذرة واحدة كتجربة كاملة.
في هذه الصفحة
أهداف الدرس
- تمييز البذرة من حالة مولد تقدم في مجراه.
- فصل سلوك الوحدة العشوائي من تسجيل التدرج.
- تعريف حدود الإعادة الدقيقة والعددية والإحصائية.
تحدد البذرة حالة عشوائية ابتدائية واحدة
قد تستهلك التهيئة العشوائية والإسقاط والسحب وتعزيز البيانات وعمليات العمال سحوبات عشوائية في مواضع مختلفة. لا تحفظ البذرة عدد السحوبات المستهلكة أو كل مصدر عشوائي في البرنامج. قد يعطي torch.Generator صريح عملية مدعومة مجرى مقصوداً دون الاعتماد على الحالة العامة فقط. حافظ على اتساق جهازه ودعم العملية لوسيط المولد. يبقى المثال على CPU ويفحص المتابعة عبر get_state وset_state. ولا يدعي تسلسلاً عشوائياً مطبوعاً عاماً عبر الإصدارات أو المنصات أو مكتبات المولدات المختلفة.
تقارن الإعادة انتقالاً تالياً محدداً
بعد أربع سحوبات يحفظ البرنامج حالة المولد ويسحب ثلاثاً إضافية، ثم يسترجع الحالة ويطلب السحوبات الثلاث نفسها مجدداً. يخص التطابق المتوقع إعداد المولد وتسلسل العمليات نفسيهما. قد تحتاج نقطة حفظ تدريب أيضاً المعاملات والمخازن الدائمة وعزوم المحسن وحالة المجدول وموضع المدخلات والتدرجات المتراكمة جزئياً. لا تساوي إعادة البذرة الأصلية عموماً استرجاع مولد في منتصف التشغيل. حدد حد حفظ نظيفاً أو احفظ الحالة الجزئية صراحة، ثم قارن التحديث التالي المقصود بالتنفيذ المستمر.
import torch
from torch import nn
generator = torch.Generator(device="cpu").manual_seed(17)
first = torch.rand(4,generator=generator,dtype=torch.float64,device="cpu")
state = generator.get_state()
next_a = torch.rand(3,generator=generator,dtype=torch.float64,device="cpu")
generator.set_state(state)
next_b = torch.rand(3,generator=generator,dtype=torch.float64,device="cpu")
dropout = nn.Dropout(p=1.0)
values = torch.ones(3,dtype=torch.float64,device="cpu")
dropout.train()
training = dropout(values)
dropout.eval()
evaluation = dropout(values)
print("same next draws", torch.equal(next_a,next_b))
print("first draw count", first.numel())
print("mode outputs", training.tolist(), evaluation.tolist())
same next draws True
first draw count 4
mode outputs [0.0, 0.0, 0.0] [1.0, 1.0, 1.0]
يعرف استرجاع المولد توقع السحب التالي في البيئة نفسها، ويكشف احتمال إسقاط واحد سلوك الوضع دون طباعة قيم عشوائية. لم ينفذ مولد torch أو وحدته.
يتفاعل وضع الوحدة والعشوائية عبر طبقات معينة
يستخدم المثال Dropout باحتمال واحد لإنتاج خرجين حتميين متطرفين للتعليم: أصفار في وضع التدريب وواحدات دون تغيير في التقييم. ليس ذلك إعداد تدريب عاماً مفيداً. تتحكم eval في سلوك الطبقة الموثق، بينما تتحكم no_grad في تسجيل الرسم بصورة مستقلة. قد تبقى مخرجات معاملات مجمدة متغيرة بسبب تدريب عشوائي أو مخازن تطبيع متغيرة. سجل حالة الوحدة المناسبة ضمن عقود الاستدلال والتقييم بدلاً من افتراض أن requires_grad=False يجمد سلوك النموذج كله.
لقابلية الإعادة معان مشروعة متعددة
تختلف هوية البتات والقيم ضمن سماحية مبررة والقرار اللاحق نفسه وتوزيعات متشابهة عبر تشغيلات مستقلة كأهداف. توثق PyTorch حدود الإعادة عبر البيئات والإصدارات؛ وقد يغير اختيار الخوارزميات الحتمية، حيث تكون مدعومة، طريقة التنفيذ أو يرفع خطأ لعملية غير مدعومة. ولا يضبط مصدر البيانات أو المكتبات الخارجية أو التزامن أو صلاحية التقسيم العلمية تلقائياً. يوضح المرافق القياسي متابعة مولده ويصرح بعدم مطابقة Python random لـtorch. سجل البيئة والمكتبات والعتاد والبيانات وقاعدة المقارنة الفعلية عند إجراء تجارب حقيقية.
import random
generator = random.Random(17)
first = [generator.random() for _ in range(4)]
state = generator.getstate()
next_a = [generator.random() for _ in range(3)]
generator.setstate(state)
next_b = [generator.random() for _ in range(3)]
print("same next draws", next_a == next_b)
print("first draw count", len(first))
print("all in unit interval", all(0.0 <= value < 1.0 for value in first))
same next draws True
first draw count 4
all in unit interval True
يفحص مثال مولد Python المنفذ متابعة حالته هو فقط. ولا يفترض أن تسلسله يطابق PyTorch أو أي مولد آخر.
احفظ تاريخ الاختيار عند تكرار التجارب
البذرة المواتية التي تختار بعد فحص نتائج تحقق كثيرة قرار اختيار، لا تقييم نموذجي أو مستقل تلقائياً. اعرض تصميم التكرار المقصود وعدد التشغيلات والتباين المناسب بدلاً من أفضل نتيجة وحدها. قارن سلوك الاستئناف عند حد صغير معلوم قبل تشغيل طويل، مع ترتيب البيانات والوضع. يبقى برنامج الإطار توضيحياً بثوابت مشتقة لغياب torch. نفذ مولد مكتبة Python القياسية وحده؛ ولم يختبر مجرى PyTorch أو الإسقاط أو إعداد نواة حتمية أو متابعة نقطة حفظ أو عامل أو قابلية إعادة تدريب نموذج.
الأخطاء الشائعة وإصلاحها
كرر تشغيل مستأنف بداية مجراه العشوائي
- لماذا يحدث؟
- استُرجعت البذرة الأصلية فقط لا حالة المتابعة المحفوظة.
- كيف تصلحه؟
- استرجع المولد وحالة التنفيذ المناسبة عند الحد المختار.
- كيف تتجنب تكراره؟
- قارن السحوبات والتحديث التاليين بالتنفيذ المستمر.
بقي نموذج يفترض تجميده عشوائي المخرجات
- لماذا يحدث؟
- اختلطت أعلام تدرج المعاملات بوضع الوحدة.
- كيف تصلحه؟
- حدد سياسات المعاملات والمخازن والوضع العشوائي منفصلة.
- كيف تتجنب تكراره؟
- اختبر استدلالاً متكرراً لمدخل ثابت تحت الوضع المقصود.
وُصفت بذرة مكررة واحدة بقابلية إعادة عامة
- لماذا يحدث؟
- أُهملت حدود البيئة والخوارزمية والتجربة.
- كيف تصلحه؟
- حدد المقارنة المدعومة الدقيقة وحدودها.
- كيف تتجنب تكراره؟
- سجل الإصدارات والمدخلات والمولدات والاختبارات المنفذة فعلاً.
اختبر فهمك
1. لماذا لا تستأنف البذرة الأصلية بعد أربع سحوبات عند الخامسة عموماً؟
اعرض الحل المشروح
تعيد البذرة حالة بداية المجرى. دون استهلاك السحوبات الأربع نفسها مجدداً يأتي الخرج التالي من البداية. تصف حالة مولد محفوظة بعد تلك السحوبات حد المتابعة مباشرة. تظل مصادر العشوائية الأخرى وحالة التدريب محتاجة حفظها الخاص.
2. هل يثبت المثال تطابق PyTorch وPython random عند البذرة سبعة عشر؟
اعرض الحل المشروح
لا. يستخدمان مولدين موثقين منفصلين ولا يفترض تسلسل مشترك. يختبر المرافق إعادة حالة Python نفسها، بينما يملك مثال torch ثوابت مشتقة داخل البيئة نفسها فقط. لا تثبت أرقام بذور متطابقة تساوي المكتبات أو المنصات.
أهم ما تعلمته
- للبذرة وحالة المتابعة المحفوظة غرضان مختلفان.
- قد يؤثر الوضع والمخازن وترتيب البيانات والمحسن في الإعادة.
- صرح بهدف الإعادة ودليل التنفيذ الفعلي بدقة.