الانتشار الأمامي: من المدخل إلى التنبؤ

2 دقيقة

الهدف: تتبّع حساب الشبكة والتمييز بين التدريب والاستدلال.

يُطبّق الانتشار الأمامي (Forward pass) كل طبقة بترتيبها. يُنتج الـ Logits ثم الخسارة إن توفّرت الأهداف. لا يُعدّل أي وزن.

python
logits = model(x)          # الانتشار الأمامي
loss = criterion(logits, y)

من أجل دُفعة x بشكل (32, 20)، تُنتج الطبقة Linear(20, 64) شكل (32, 64). طبقة ثانية Linear(64, 4) تُنتج (32, 4). يبقى محور الدُّفعة كما هو؛ ويتغيّر المحور الأخير بحسب الطبقة.

التدريب والاستدلال

في وضع التدريب، تحتفظ الشبكة بالمعلومات اللازمة لحساب التدرجات. أما في وضع الاستدلال، فنُعطّل هذه المتابعة ونضع النموذج في وضع التقييم:

python
model.eval()
with torch.inference_mode():
    logits = model(x)
    predictions = logits.argmax(dim=1)

يضبط model.eval() سلوك Dropout وBatchNorm. ويُجنِّب inference_mode() بناء رسم بياني للتدرج. العمليتان متكاملتان.

حساب قابل للتتبّع

الشبكة رسم بياني من العمليات. يُخزّن PyTorch العمليات التي أنتجت كل موتّر عند requires_grad=True. تُقرأ هذه الآثار في الاتجاه المعاكس أثناء الانتشار العكسي.

المزالق

  • استخدام argmax قبل دالة الخسارة: تلك العملية تُتلف المعلومة اللازمة للتدرج.
  • نسيان model.eval() أثناء التحقّق.
  • إجراء التحقّق مع متابعة التدرجات وإهدار الذاكرة.

تحقّق سريع

هل يتعلّم الانتشار الأمامي؟ لماذا نستدعي كلاًّ من eval() وinference_mode()؟

الأجوبة

لا، يقوم بالحساب فقط. eval() يُغيّر بعض الطبقات؛ وinference_mode() يُعطّل رسم التدرج.

نشاط الإتقان — عقد الاستدلال

اكتب اختباراً افتراضياً يستدعي النموذج نفسه المتضمّن Dropout مرتين، أولاً في وضع التدريب ثم في وضع التقييم. توقّع أيّ النتائج ينبغي أن تكون متطابقة، واشرح الدور المتمايز بين eval() وinference_mode(). المخرَج النهائي: الاختبار والتشخيص.

التدريب والاستدلال: مساران متمايزان

القراءة: يحسب الانتشار الأمامي المخارج في كلتا الحالتين، لكن مسار التدريب وحده يحتفظ بما يلزم لحساب التدرجات. في وضع الاستدلال، اجمع model.eval() مع torch.inference_mode(). المزلق هو الاعتقاد بأن أحدهما يُغني عن الآخر: إنهما يتحكّمان بآليتَين مختلفتين.