Adam Optimizer
يجمع Adam بين الزخم وأحجام خطوات لكل معلمة، تُضبط وفق أحجام التدرجات الحديثة. قاعدة التحديث والقيم الافتراضية وAdamW ومقارنة Adam بـ SGD.
محسّن Adam، وهو اختصار لـAdaptive Moment Estimation، خوارزمية تحسين لتدريب الشبكات العصبية، تمنح كل مُعامل حجم خطوة تكيفياً خاصاً به. وقدّمه Kingma وBa في بحث Adam: طريقة للتحسين العشوائي، وهو يطوّر الانحدار المتدرج العشوائي (SGD) باستخدام متوسطات متحركة للتدرجات السابقة ومربعاتها. وجعل التقدم السريع في المراحل الأولى والإعدادات الافتراضية المتساهلة من Adam نقطة البداية الأكثر شيوعاً للتحسين في التعلّم العميق، كما يُعد متغيره AdamW الخيار القياسي لتدريب المحولات ونماذج اللغة الكبيرة.
آلية عمل Adam#
يقلّل التدريب دالة الخسارة بتحديث كل وزن مراراً في الاتجاه المعاكس لـتدرّجه. ويضرب SGD العادي كل تدرج في معدل التعلّم نفسه. أما Adam فيحتفظ بقيمتين إضافيتين لكل مُعامل ويحدّثهما في كل خطوة t استناداً إلى التدرج الحالي g:
- العزم الأول (الزخم):
m = β1·m + (1 − β1)·g، وهو متوسط متناقص أُسّياً للتدرجات يُبقي التحديث متجهاً في اتجاه ثابت. - العزم الثاني:
v = β2·v + (1 − β2)·g²، وهو متوسط متناقص لمربعات التدرجات يتتبع الحجم المعتاد لتدرجات كل مُعامل. - تصحيح الانحياز:
m̂ = m / (1 − β1^t)وv̂ = v / (1 − β2^t)، ويعوضان عن بدء كلا المتوسطين من الصفر. - التحديث:
θ = θ − lr · m̂ / (√v̂ + ε).
القيم الافتراضية في البحث، التي تستخدمها أيضاً torch.optim.Adam في PyTorch، هي lr = 0.001 وβ1 = 0.9 وβ2 = 0.999 وε = 1e-8. وتؤدي القسمة على √v̂ إلى تطبيع كل خطوة بحسب الحجم المعتاد لتدرج المُعامل، فتظل الخطوات قريبة من معدل التعلّم سواء كانت التدرجات صغيرة جداً أم كبيرة، كما تتقلص في الاتجاهات المشوشة التي تلغي فيها التدرجات الموجبة والسالبة بعضها داخل m̂. ويقارن المقتطف أدناه الخطوة الأولى لـSGD وAdam على مُعاملين يختلف حجما تدرجيهما بمقدار 1,000 ضعف:
import torch
# Two parameters whose gradients differ in scale by 1,000x
scale = torch.tensor([1000.0, 1.0])
for name, optimizer_cls in [("SGD", torch.optim.SGD), ("Adam", torch.optim.Adam)]:
w = torch.zeros(2, requires_grad=True)
optimizer = optimizer_cls([w], lr=0.001)
loss = (scale * w).sum() # gradient is [1000, 1]
loss.backward()
optimizer.step()
print(f"{name} first step: {[round(v, 4) for v in w.tolist()]}")يحرّك SGD المُعامل الأول إلى -1.0 والثاني إلى -0.001، أي بفارق 1,000 ضعف يتبع التدرجات. أما Adam فيحرّك كليهما بمقدار معدل التعلّم نفسه تماماً، -0.001، لأن خطوته المطبّعة تعتمد على اتجاه التدرج واتساقه، لا على حجمه الخام.
Adam مقارنةً بـAdamW#
يطبّق Adam وفقاً للتنفيذ الشائع اضمحلال الأوزان، وهو شكل من أشكال التنظيم، على هيئة عقوبة L2 تُضاف إلى التدرج؛ ثم تُقسّم هذه العقوبة، شأنها شأن سائر القيم، على √v̂، لذا لا تخضع الأوزان ذات التدرجات الكبيرة إلا لتنظيم ضئيل. ويعالج اضمحلال الأوزان المنفصل الذي قدّمه Loshchilov وHutter ذلك بتقليص الأوزان مباشرةً في كل خطوة، بصورة مستقلة عن التحديث التكيفي. وقد حسّن AdamW الناتج قدرة Adam على التعميم في تصنيف الصور ضمن تجارب البحث، وهو متاح باسم torch.optim.AdamW.
Adam مقابل SGD#
يستخدم SGD مع الزخم معدل تعلّم عامًّا واحدًا، ويخزّن مخزنًا مؤقتًا واحدًا لكل مُعامِل، بينما يخزّن Adam مخزنين، أي 8 بايتات لكل مُعامِل بدقة 32 بت، ما يعادل 56 GB من حالة المحسّن لنموذج يضم 7 مليارات مُعامِل. يحقق Adam عادةً تقدمًا أسرع في المراحل المبكرة، ويكون أقل حساسية لمعدل التعلّم، ويدرّب المحوّلات بموثوقية أعلى بكثير من SGD. وغالبًا ما يحقق SGD المضبوط جيدًا دقة نهائية مساوية أو أفضل في نماذج الصور الالتفافية، كما وجد ويلسون وآخرون أن الأساليب التكيفية غالبًا ما حققت تعميمًا أسوأ من SGD في مهام تصنيف الصور ومهام اللغة التي اختبروها.
يعكس تدريب Ultralytics YOLO هذه المفاضلة: إذ يختار الإعداد الافتراضي optimizer="auto" AdamW، مع معدل تعلّم أولي محسوب وفق عدد الفئات، للتشغيلات التي تصل إلى 10,000 تكرار، ثم ينتقل إلى MuSGD، وهو مزيج من SGD وMuon، في جداول التدريب الأطول. كما يتطلب تعيين المحسّن صراحةً تعيين معدل التعلّم، لأن القيمة الافتراضية lr0=0.01 ملائمة لـSGD وتبلغ عشرة أضعاف معدل Adam المعتاد.
from ultralytics import YOLO
# حمّل نموذج YOLO26n مدرّبًا مسبقًا
model = YOLO("yolo26n.pt")
# درّب باستخدام AdamW ومعدل تعلّم أولي مناسب لـAdam
results = model.train(data="coco8.yaml", epochs=5, optimizer="AdamW", lr0=0.001)عندما يدرّب YOLO26 باستخدام محسّن من عائلة Adam، تضبط الوسيطة momentum (الافتراضية 0.937) القيمة β1، بينما تبقى β2 ثابتة عند 0.999.
Adam مقارنةً بالمحسّنات ذات الصلة#
- AdaGrad: يقسم كل خطوة على جذر مجموع مربعات جميع التدرجات السابقة، لذا لا تنخفض أحجام الخطوات إلا بمرور الوقت؛ وهذا يناسب السمات المتناثرة ويبطئ جولات التدريب الطويلة.
- RMSProp: يستبدل المجموع المتراكم في AdaGrad بمتوسط متناقص أُسّياً لمربعات التدرجات. وAdam هو أساساً RMSProp مضافاً إليه الزخم وتصحيح الانحياز.
- Muon: محسّن لمصفوفات الأوزان ثنائية الأبعاد في الطبقات المخفية، يجعل كل تحديث للزخم متعامداً باستخدام تكرارات Newton–Schulz، ويحتفظ بمخزن حالة واحد لكل مُعامل، أي نصف حالة المحسّن في Adam.










