الوحدة 6 — المُحسِّنات وجدولة معدّل التعلّم
معدّل التعلّم يهيمن على كلّ ما سواه، كما ذكرت الدورة السابقة. في هذه الوحدة نتعرّف إلى المُحسِّنات المتاحة في PyTorch، نُبرِّر خيار كلّ واحد، ثم نتناول الجدولة: كيف نغيّر معدّل التعلّم أثناء التدريب كي نستفيد من الحقب الأولى ومن الحقب الأخيرة معًا.
المُحسِّن في PyTorch: واجهة موحّدة
كلّ المُحسِّنات في torch.optim تتلقّى قائمة الأوزان وlr كحدّ أدنى:
import torch.optim as optim
optimiseur = optim.SGD(modele.parameters(), lr=0.1, momentum=0.9)
وكلّها تُستعمل بنفس الأسلوب في الحلقة: optimiseur.zero_grad() ثم
perte.backward() ثم optimiseur.step(). المُختلِف بينها هو
قاعدة التحديث، أي كيف يُترجَم التدرّج إلى تعديل على الأوزان.
SGD مع الاندفاع: البسيط الذي يعمل غالبًا
الانحدار العشوائي بالحزم (SGD) هو الجدّ الأكبر. بحدّ ذاته يعاني من
تذبذب في الوديان الضيّقة، ولذلك يُضاف إليه الاندفاع الذي يمرّر
جزءًا من التدرّج السابق:
opt = optim.SGD(
modele.parameters(),
lr=0.1,
momentum=0.9,
weight_decay=5e-4,
)
قِيَم افتراضية معقولة على مسائل الرؤية: lr=0.1 مع اندفاع 0.9.
weight_decay هو تنظيم L2 مُدمَج، يمنع نموّ الأوزان دون حدّ. SGD
هو الاختيار السائد في التدريبات الطويلة على شبكات ImageNet لأنّه
يُنتج مُدرَّبات أكثر قابلية للتعميم — رأي مدعوم بعدد كبير من
التجارب المنشورة.
Adam وAdamW: تكيّف لكلّ وزن
Adam يحمل ذاكرة لكلّ وزن (اللحظة الأولى والثانية للتدرّج) ويستنبط
منها معدّل تعلّم فعليًا مختلفًا لكلّ معلمة. هذا يُلغي الحاجة إلى
البحث الدقيق عن lr، ويجعل التقارب سريعًا في الحقب الأولى.
عيبه هو أنّ صيغته الأصلية تخلط weight_decay مع اللحظات، فتُدهور
التنظيم. AdamW يفصل الاثنين وهو الاختيار الافتراضي اليوم في
معظم مسائل التعلّم العميق:
opt = optim.AdamW(
modele.parameters(),
lr=3e-4,
betas=(0.9, 0.999),
weight_decay=1e-2,
)
القاعدة العملية: AdamW بمعدّل تعلّم بين و تصلح كنقطة انطلاق لأغلب المسائل، بما فيها Fashion-MNIST.
SGD أم AdamW؟ حكم مختصر
| السياق | اختيار مستحسن |
|---|---|
| تدريب طويل جدًّا على شبكة قياسية (ResNet) | SGD + Momentum + جدولة |
| تدريب متوسّط، أو أوّل نموذج على مسألة جديدة | AdamW |
| محوّلات (BERT، GPT) | AdamW حصريًّا تقريبًا |
موارد محدودة، لا وقت لضبط lr | AdamW |
الفارق ليس كارثيًّا في الاتّجاهين، والمشروع النموذجي يبدأ عادةً بـAdamW لتقييم سريع، ثم يُقارن بـSGD مع جدولة كوسيلة تحسين محتملة.
جدولة معدّل التعلّم: لماذا نحتاجها
معدّل تعلّم ثابت لا يوفّي بالحاجات المتغيّرة: في البداية نريد تقدّمًا
كبيرًا، في النهاية نحتاج ضبطًا دقيقًا. الجدولة تُغيّر lr عبر
الحقب. أربع سياسات شائعة في PyTorch، لكلّ منها استعمال مميّز.
StepLR: التبسيط الأقصى
يخفض lr بمُعامل ثابت كلّ عدد ثابت من الحقب:
plan = optim.lr_scheduler.StepLR(opt, step_size=10, gamma=0.5)
for epoque in range(30):
entrainer_une_epoque()
plan.step() # مرّة واحدة في الحقبة