timm documentation

جدولة معدلات التعلم

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.0.31).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

جدولة معدلات التعلم

تحتوي هذه الصفحة على توثيق مرجع واجهة برمجة التطبيقات (API) لمجدولات معدل التعلم المضمنة في timm، بالإضافة إلى نظرة عامة على كيفية إنشائها وتقدمها.

الاستخدام

تُنشأ مجدولات التعلم (Schedulers) بالاسم باستخدام create_scheduler_v2، والتي تُرجع المجدول وعدد الفترات (epochs) الإجمالي للتدريب (بما في ذلك أي بادئة إحماء، ودورات، وتبريد، راجع أدناه). على عكس torch.optim.lr_scheduler، لا تعدّ مجدولات timm الخطوات بنفسها. فهي مصممة لتكون بلا حالة: فمعدل التعلم هو دالة لإعداد الجدولة وعدد الفترات أو التحديثات الصريح، لذا فإن استئناف التشغيل يتطلب فقط رقم الفترة، ولا يتم تخزين حالة المجدول في نقاط الحفظ (checkpoints). يمرر حلقة التدريب رقم الفترة أو عدد التحديثات صراحةً:

  • scheduler.step(epoch) في نهاية كل حقبة، مع فهرس الحقبة التالية (epoch + 1)
  • scheduler.step_update(num_updates) بعد كل تحديث للمحسّن، مع عدد التحديثات حتى الآن

يُخطو المجدول إما لكل حقبة أو لكل تحديث (step_on_epochs)، بينما يكون الاستدعاء الآخر بلا أثر، لذا يمكن لحلقة التدريب إجراء كلا الاستدعائين ودعم أيٍّ منهما.

import timm
from timm.optim import create_optimizer_v2
from timm.scheduler import create_scheduler_v2

model = timm.create_model('resnet50')
optimizer = create_optimizer_v2(model, opt='adamw', lr=1e-3, weight_decay=0.05)
updates_per_epoch = len(loader)  # optimizer updates per epoch

# Cosine decay w/ 5 epochs of linear warmup, stepped per update for a smooth schedule.
scheduler, num_epochs = create_scheduler_v2(
    optimizer,
    sched='cosine',
    num_epochs=100,
    warmup_epochs=5,
    min_lr=1e-6,
    step_on_epochs=False,
    updates_per_epoch=updates_per_epoch,
)

num_updates = 0
for epoch in range(num_epochs):
    for batch in loader:
        ...  # forward, backward, optimizer.step()
        num_updates += 1
        scheduler.step_update(num_updates=num_updates)
    scheduler.step(epoch + 1)  # pass the eval metric too for 'plateau', scheduler.step(epoch + 1, metric)

تُعطى المدد (num_epochs، warmup_epochs، decay_epochs، …) دائمًا بوحدة الحقب (epochs)، حيث يقوم المصنع بتحويلها إلى تحديثات عندما يكون step_on_epochs=False. كما يمكن إنشاء مجدولات الإيقاع (Schedulers) مباشرةً من فئاتها، وفي هذه الحالة تكون المدد بوحدة التقدّم (t_in_epochs).

يُعرّف سكربت التدريب (train.py) على حُجج المصنع من خلال هذه الأعلام:

  • --sched يختار الجدول الزمني.
  • يحدد --epochs طول الجدول الزمني.
  • خطوات لكل تحديث بدلاً من كل حقبة عند استخدام --sched-on-updates.
  • يحدد --warmup-epochs مدة الإحماء.
  • يحدد --warmup-lr معدل التعلم الأولي لمرحلة الإحماء.
  • يضيف --warmup-prefix فترة إحماء قبل الجدول بدلاً من تداخل بدايته.
  • يحدد --min-lr معدل التعلم الأدنى.
  • يحدد --decay-epochs فترة التراجع التدريجي أو مدة التراجع النهائية لخوارزميتي WSD / rsqrt.
  • يحدد --decay-milestones فترات الاضمحلال (epochs) لجدول الخطوات المتعددة.
  • يحدد --decay-rate عامل الاضمحلال، أو الأس الخاص بالجدول الزمني متعدد الحدود.
  • يضيف --cooldown-epochs فترات تدريب عند معدل التعلم الأدنى بعد انتهاء الجدول الزمني.
  • يحدد --patience-epochs قيمة الصبر لمجدول المنحدر.
  • يحدد --lr-noise الجزء من الجدول الزمني الذي يتضمن ضوضاء معدل التعلم.
  • --lr-noise-pct يحدد حدّ حجم الضوضاء.
  • يحدد --lr-noise-std الانحراف المعياري للضوضاء.
  • يحدد --lr-cycle-mul مضاعف طول الدورة.
  • يحدد --lr-cycle-decay مضاعف معدل التعلم الأقصى بين الدورات.
  • يحدد --lr-cycle-limit عدد الدورات.
  • --lr-k-decay يحدد k-decay لجدولة cosine / polynomial.
  • يختار --lr-decay-fn دالة الاضمحلال النهائية لـ WSD / rsqrt.
  • يحدد --lr-stable-timescale مقياس الزمن لمرحلة rsqrt المستقرة.

الجدول

schedفئةالجدول
cosineCosineLRSchedulerالتبريد الجيبية من معدل التعلم الأساسي إلى min_lr (SGDR)، مع إمكانية إعادة التشغيل (الدورات) والتحلل k
tanhTanhLRSchedulerتضاؤل دالة الظل الزائدي (الورقة)، مع إعادة تشغيل اختيارية
polyPolyLRSchedulerتلاشي متعدد الحدود حتى min_lr، حيث يُعطى الأس بواسطة decay_rate، مع إعادة تشغيل اختيارية وتلاشي k
stepStepLRSchedulerمضاعفة decay_rate في decay_epochs
multistepMultiStepLRSchedulerlr مضروباً في decay_rate عند كل من فترات decay_milestones
plateauPlateauLRSchedulerDeprecated. lr multiplied by decay_rate when the eval metric hasn’t improved for patience_epochs, per epoch stepping only
wsdWSDLRSchedulerدافئ-مستقر-متناقص (MiniCPM)، معدل تعلم ثابت ثم تناقص إلى min_lr خلال decay_epochs الأخيرة، مع تناقص 1-sqrt افتراضياً (الورقة)
rsqrtWSDLRSchedulerتضاؤل جذر المقلوب مع فترة تبريد خطية خلال decay_epochs الأخيرة (Big Vision)

خيارات شائعة

  • Warmup. warmup_epochs من warmup_lr إلى معدل التعلم الأساسي، وهو مدعوم من قبل جميع الجداول الزمنية.
    • warmup_prefix: افتراضيًا، يتداخل فترة الإحماء مع بداية الجدول الزمني (حيث يُحسب الجدول الزمني من الحقبة 0، ويستبدل فترة الإحماء حقبه الأولى)، لذا فإن num_epochs هو الطول الكلي. عند استخدام warmup_prefix=True، يبدأ الجدول الزمني بعد فترة الإحماء وتُضاف فترة الإحماء إلى الطول الكلي.
    • بالنسبة إلى wsd وrsqrt، تبدأ مرحلة الاستقرار دائمًا بعد فترة الإحماء، وبدون warmup_prefix تُوزَّع مرحلتا الاستقرار والتلاشي على num_epochs - warmup_epochs بحيث يبقى num_epochs هو العدد الإجمالي.
  • min_lr: معدل التعلم الذي تصل إليه جداول الاضمحلال (cosine، tanh، poly، wsd، rsqrt) في نهايتها، وهو الحد الأدنى لـplateau.

تم إيقاف جدولة plateau وسيتم إزالتها في إصدار مستقبلي. لم تتوافق هذه الجدولة أبدًا مع التصميم غير الحالة المذكور أعلاه: فمعدل التعلم الخاص بها يعتمد على تاريخ مقياس التقييم بدلاً من الاعتماد على الحقبة، وتلك السجلات (أفضل مقياس، وعدادات الصبر والتبريد) لا تُحفظ في نقاط الحفظ، لذا فإن التشغيل المُستأنف يعيد تشغيل منطق المنحدر. لن يتم إضافة دعم لنقاط الحفظ. كما أن منحنى التقييم المنحدر إشارة ضعيفة لتحديد وقت التبريد؛ فجدولة ثابتة مثل cosine أو wsd قابلة لإعادة الإنتاج وتُستأنف بدقة، ومسح WSD (انظر مسح المعلمات الفائضة) يقارن فترات التبريد عند ميزانيات متعددة من تشغيل واحد مستقر.

  • cooldown_epochs: عدد الفترات التي يُحافظ فيها على min_lr بعد انتهاء الجدول (cosine، tanh، poly، wsd، rsqrt)، يُضاف إلى num_epochs المُعاد. وبما أن الجدول يصل إلى min_lr بعد خطوة واحدة من خطوته الأخيرة، فإن فترة التهدئة تُعدّ أيضاً طريقة للتدريب عند min_lr عند اتخاذ خطوة لكل فترة.
  • الدورات (cosine، tanh، poly): يعيد cycle_limit > 1 جدولة الجدول الزمني، حيث تكون كل دورة أطول بمقدار cycle_mul مرات، مع ضرب معدل التعلم الذروي فيها في cycle_decay مقارنةً بالدورة السابقة. تغطي القيمة المُعادة num_epochs جميع الدورات.
  • k_decay (cosine، poly): يغيّر k-decay شكل التلاشي (t ** k)، ويبقي k > 1 معدل التعلم مرتفعًا لفترة أطول.
  • الضوضاء: يضيف noise ضوضاء عشوائية ضربية على معدل التعلم ضمن نطاق من الجدول الزمني، يُعطى على شكل كسور من num_epochs (بداية، أو بداية ونهاية)، ويُقيَّد بواسطة noise_pct.

WSD و rsqrt

يتضمن WSDLRScheduler ثلاث مراحل: إحماء خطي، مرحلة مستقرة، وتراجع إلى min_lr.

  • decay_epochs يحدد مدة الاضمحلال النهائية. القيمة ضمن (0، 1) تمثل نسبة من طول الاستقرار + الاضمحلال، وبنسبة 20% افتراضيًا.
  • يحدد decay_fn (--lr-decay-fn) دالة 1-sqrt (الافتراضية لـ wsd)، أو linear (الافتراضية لـ rsqrt)، أو cosine، أو power، أو exp.
  • يتحكم stable_timescale (--lr-stable-timescale، بوحدة عدد الدورات) في مرحلة rsqrt المستقرة، والتي تتلاشى وفق المعادلة (1 + t / timescale) ** -0.5 بدءًا من نهاية فترة التسخين. القيمة الافتراضية لها هي طول فترة التسخين، ويجب تعيينها عند عدم وجود فترة تسخين.

تدعم الفئة أيضًا طورًا مستقرًا عامًا power ودوال اضمحلال مخصصة.

المرحلة النهائية للتبريد التدريجي هي حيث تحقق جداول WSD معظم فائدتها، لذا استخدم عدد الخطوات لكل تحديث (--sched-on-updates)، أو أضف حقبة تبريد، عندما تكون مرحلة التلاشي قصيرة لا تتجاوز بضع حقب. عند الحساب لكل حقبة، تكون الحقبة الأخيرة من فترة تلاشي قصيرة أعلى بشكل ملحوظ من min_lr (حوالي 10% من معدل التعلم الأساسي للحقبة الأخيرة من أصل 5 حقب تلاشي باستخدام 1-sqrt).

# 300 epochs, 5 epoch warmup, constant lr, then a 1-sqrt decay over the final 20%
scheduler, num_epochs = create_scheduler_v2(
    optimizer, sched='wsd', num_epochs=300, warmup_epochs=5, decay_epochs=0.2,
    step_on_epochs=False, updates_per_epoch=updates_per_epoch,
)

مقاييس معدل التعلم لمجموعات المعلمات

تُضرب المجموعة المُجدولة لمعامل التعلم في المجموعات التي تحتوي على حقل lr_scale (مثل مجموعات تخفيف معامل التعلم على مستوى الطبقات من param_groups_layer_decay) بمقياسها. يُسجَّل معامل التعلم الأساسي لكل مجموعة على أنه initial_lr في المجموعة عند إنشاء المُجدول.

الاستئناف

عند تمرير عدد الخطوات، يتم إعداد مُجدول للتشغيل المُستأنف من خلال إنشائه كما في التشغيل الأصلي ثم تحريكه إلى نقطة الاستئناف، scheduler.step(start_epoch) أو scheduler.step_update(start_epoch * updates_per_epoch). تحفظ state_dict() / load_state_dict() خصائص المُجدول وتُعيد استعادتها.

واجهة برمجة التطبيقات

دوال المصنع

timm.scheduler.create_scheduler

< >

( argsoptimizer: Optimizerupdates_per_epoch: int = 0 )

timm.scheduler.create_scheduler_v2

< >

( optimizer: Optimizersched: str = 'cosine'num_epochs: int = 300decay_epochs: typing.Optional[float] = Nonedecay_milestones: typing.List[int] = (90, 180, 270)cooldown_epochs: int = 0patience_epochs: int = 10decay_rate: float = 0.1min_lr: float = 0.0warmup_lr: float = 1e-05warmup_epochs: int = 0warmup_prefix: bool = Falsenoise: typing.Union[float, typing.List[float]] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42cycle_mul: float = 1.0cycle_decay: float = 0.1cycle_limit: int = 1k_decay: float = 1.0decay_fn: typing.Optional[str] = Nonestable_timescale: typing.Optional[float] = Noneplateau_mode: str = 'max'step_on_epochs: bool = Trueupdates_per_epoch: int = 0 )

المعاملات

  • optimizer — المُحسِّن الذي سيتم جدوله
  • sched — اسم المجدول، وهو أحد ‘cosine’ أو ‘tanh’ أو ‘step’ أو ‘multistep’ أو ‘poly’ أو ‘wsd’ أو ‘rsqrt’ أو ‘constant’ أو ‘plateau’ (مُتقادم) أو ‘none’ لعدم استخدام أي مجدول (يعيد None، ويُترك معدل التعلم للمُحسِّن دون تغيير). يُحافظ ‘constant’ على معدل التعلم بعد فترة الإحماء مع تطبيق معامل lr_scale لمجموعة المعاملات (تلاشي معدل التعلم على مستوى الطبقات).
  • num_epochs — عدد الفترات في الجدول الزمني (باستثناء فترة الإحماء إذا كان warmup_prefix، وباستثناء فترة التبريد)
  • decay_epochs — فترة اضمحلال معدل التعلم (خطوة)، أو طول مرحلة الاضمحلال (wsd / rsqrt) بالدورات، القيمة في (0, 1) هي نسبة من طول الجدول الزمني. None = 90 (خطوة)، 0.2 (wsd / rsqrt)
  • decay_milestones — الفترات التي يتم فيها تخفيض معدل التعلم (multistep)
  • cooldown_epochs — عدد الفترات التي يُبقي فيها معدل التعلم عند min_lr بعد انتهاء الجدول
  • patience_epochs — عدد الفترات دون تحسّن قبل خفض معدل التعلم (منصة، غير مستخدم)
  • decay_rate — معدل تضاؤل معدل التعلم (خطوة، خطوات متعددة، هضبة)، قوة كثير الحدود (poly)
  • min_lr — الحد الأدنى لمعدل التعلم في جدولة البرامج التي تتلاشى حتىه
  • warmup_lr — قيمة معدل التعلم في بداية فترة الإحماء
  • warmup_epochs — عدد الفترات للتسخين الخطي
  • warmup_prefix — exclude the warmup period from num_epochs (added to the total), wsd / rsqrt are always warmup prefixed, with warmup_prefix=False their stable + decay phases fit within num_epochs
  • noise — نقاط تفعيل/تعطيل ضوضاء معدل التعلم كنسب من طول الجدول
  • noise_pct — نسبة حد ضجيج معدل التعلم
  • noise_std — الانحراف المعياري لضوضاء معدل التعلم
  • noise_seed — بذرة ضوضاء معدل التعلم
  • cycle_mul — مضاعف طول الدورة (جيبية، tanh، كثيرة حدود)
  • cycle_decay — تضاؤل معدل التعلم لكل دورة (جيب التمام، الظل الزائد، كثير الحدود)
  • cycle_limit — عدد الدورات (جيب التمام، التانجنت الزائدي، كثير الحدود)
  • k_decay — اضمحلال ك (جيبية، كثيرة حدود)
  • decay_fn — دالة مرحلة الاضمحلال (wsd / rsqrt)، القيمة None تعني ‘1-sqrt’ لـ wsd و ‘linear’ لـ rsqrt
  • stable_timescale — مقياس الزمن rsqrt بالدورات (rsqrt)، القيمة None تعني warmup_epochs
  • plateau_mode — ‘max’ أو ‘min’، اتجاه المقياس (منطقة الاستقرار)
  • step_on_epochs — تحديث الجدول في كل حقبة، وإلا في كل تحديث (يتطلب updates_per_epoch)
  • updates_per_epoch — عدد تحديثات المُحسِّن لكل حقبة (step_on_epochs=False)

أنشئ مجدول معدل تعلّم بالاسم.

فئات المجدول

فئة timm.scheduler.CosineLRScheduler

< >

( optimizer: Optimizert_initial: intlr_min: float = 0.0cycle_mul: float = 1.0cycle_decay: float = 1.0cycle_limit: int = 1warmup_t: int = 0warmup_lr_init: float = 0.0warmup_prefix: bool = Falset_in_epochs: bool = Truenoise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42k_decay: float = 1.0initialize: bool = True )

التلاشي الجيبية مع إعادة التشغيل. يُوصف هذا في الورقة https://arxiv.org/abs/1608.03983.

الإلهام من https://github.com/allenai/allennlp/blob/master/allennlp/training/learning_rate_schedulers/cosine.py

خيار k-decay المستند إلى k-decay: A New Method For Learning Rate Schedule - https://arxiv.org/abs/2004.05909

فئة timm.scheduler.MultiStepLRScheduler

< >

( optimizer: Optimizerdecay_t: typing.List[int]decay_rate: float = 1.0warmup_t: int = 0warmup_lr_init: float = 0.0warmup_prefix: bool = Truet_in_epochs: bool = Truenoise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42initialize: bool = True )

جدول معدل تعلم متعدد الخطوات مع فترة إحماء وضوضاء.

خارج فترة الإحماء، تُقارن معالم التلاشي مع t + 1، حيث يستثني t فترة الإحماء عندما يكون warmup_prefix=True. على سبيل المثال، بدون إحماء، يُطبَّق معلم بقيمة 10 عند فهرس الجدول 9.

تختلف هذه الاتفاقية الراسخة عن MultiStepLR في PyTorch، وقد تم الاحتفاظ بها من أجل التوافق مع جداول التدريب الحالية.

class timm.scheduler.PlateauLRScheduler

< >

( optimizer: Optimizerdecay_rate: float = 0.1patience_t: int = 10threshold: float = 0.0001cooldown_t: int = 0warmup_t: int = 0warmup_lr_init: float = 0.0lr_min: float = 0.0mode: str = 'max'noise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_type: str = 'normal'noise_pct: float = 0.67noise_std: float = 1.0noise_seed: typing.Optional[int] = Noneinitialize: bool = True )

خفّض معدل التعلم بمعامل كل مرة يتوقف فيها خسارة التحقق عن الانخفاض.

غير مدعوم: سيتم إزالة هذا المجدول في إصدار مستقبلي. مصمَّم مجدولو timm ليكونوا دوالاً بلا حالة تعتمد على عدد الحقبات أو عدد التحديثات، وهو ما لم يكن عليه هذا المجدول المعتمد على المقاييس. حالته (أفضل مقياس، وعدّاداه للصبر والتبريد) لا تُحفظ في نقاط الفحص أثناء التدريب، لذا فإن التشغيل المُستأنف يعيد تشغيل منطق المنحدر، ولن يُضاف دعم لنقاط الفحص. يُفضَّل استخدام مجدول ثابت مثل cosine أو wsd، حيث يقارن فرع التبريد في WSD ضمن sweep.py بين التبريد عند ميزانيات متعددة باستخدام مجاديل قابلة للتكرار.

class timm.scheduler.PolyLRScheduler

< >

( optimizer: Optimizert_initial: intpower: float = 0.5lr_min: float = 0.0cycle_mul: float = 1.0cycle_decay: float = 1.0cycle_limit: int = 1warmup_t: int = 0warmup_lr_init: float = 0.0warmup_prefix: bool = Falset_in_epochs: bool = Truenoise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42k_decay: float = 1.0initialize: bool = True )

جدولة معدل التعلم متعدد الحدود مع الإحماء والضوضاء والتحلل k

خيار k-decay المستند إلى k-decay: A New Method For Learning Rate Schedule - https://arxiv.org/abs/2004.05909

فئة timm.scheduler.StepLRScheduler

< >

( optimizer: Optimizerdecay_t: floatdecay_rate: float = 1.0warmup_t: int = 0warmup_lr_init: float = 0.0warmup_prefix: bool = Truet_in_epochs: bool = Truenoise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42initialize: bool = True )

فئة timm.scheduler.TanhLRScheduler

< >

( optimizer: Optimizert_initial: intlb: float = -7.0ub: float = 3.0lr_min: float = 0.0cycle_mul: float = 1.0cycle_decay: float = 1.0cycle_limit: int = 1warmup_t: int = 0warmup_lr_init: float = 0.0warmup_prefix: bool = Falset_in_epochs: bool = Truenoise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42initialize: bool = True )

التلاشي بوظيفة المماس الزائدي مع إعادة التشغيل. يُوصف هذا في الورقة https://arxiv.org/abs/1806.01593

فئة timm.scheduler.WSDLRScheduler

< >

( optimizer: Optimizert_initial: intdecay_t: intlr_min: float = 0.0stable_fn: str = 'constant'stable_timescale: typing.Optional[float] = Nonestable_power: float = 0.5decay_fn: typing.Union[str, typing.Callable[[float], float]] = '1-sqrt'decay_power: float = 0.5decay_ratio: float = 0.1warmup_t: int = 0warmup_lr_init: float = 0.0t_in_epochs: bool = Truenoise_range_t: typing.Union[typing.List[int], typing.Tuple[int, int], int, NoneType] = Nonenoise_pct: float = 0.67noise_std: float = 1.0noise_seed: int = 42initialize: bool = True )

المعاملات

  • optimizer — المُحسِّن الذي سيتم جدوله
  • t_initial — طول مرحلتي الاستقرار والتلاشي (عدد الحقب أو التحديثات، انظر t_in_epochs)
  • decay_t — طول مرحلة الاضمحلال، وهي الخطوات الأخيرة decay_t من t_initial
  • lr_min — قيمة معدل التعلم في نهاية مرحلة التلاشي
  • stable_fn — دالة مرحلة مستقرة، واحدة من ‘constant’، ‘rsqrt’، ‘power’
  • stable_timescale — مقياس الزمن للدوال المستقرة ‘rsqrt’ / ‘power’، القيمة الافتراضية هي warmup_t
  • stable_power — أُسّ دالة «power» المستقرة
  • decay_fn — دالة مرحلة الاضمحلال، واحدة من ‘linear’ أو ‘1-sqrt’ أو ‘cosine’ أو ‘power’ أو ‘exp’ أو دالة قابلة للاستدعاء
  • decay_power — أُس دالة الاضمحلال من نوع “power”
  • decay_ratio — النسبة النهائية (قبل التطبيع) لدالة الاضمحلال ‘exp’
  • warmup_t — طول الإحماء، وهو بادئة لـ t_initial
  • warmup_lr_init — قيمة معدل التعلم في بداية فترة الإحماء
  • t_in_epochs — t هو عدد الحقب (step())، وإلا فهو عدد التحديثات (step_update())
  • noise_range_t — نطاق ضوضاء معدل التعلم، راجع Scheduler
  • noise_pct — نسبة حد ضجيج معدل التعلم
  • noise_std — الانحراف المعياري لضوضاء معدل التعلم
  • noise_seed — بذرة ضوضاء معدل التعلم
  • initialize — تهيئة حقل مجموعة المعاملات initial_lr من قيمة معدل التعلم الحالية

جدول معدل التعلم Warmup-Stable-Decay (WSD) مع إمكانية اختيار دوال الاستقرار والتلاشي.

ثلاث مراحل: إحماء خطي على مدى warmup_t خطوة، ومرحلة مستقرة، وتراجع إلى lr_min على مدى الخطوات الأخيرة decay_t. t_initial هو طول مرحلتي الاستقرار والتراجع، والإحماء يكون دائمًا بادئة، لذا فإن الجدول الزمني له طول إجمالي قدره warmup_t + t_initial (انظر get_cycle_length())، وبعد ذلك يُحافظ على lr_min.

ملاحظة: كما هو الحال مع مجدولات التعلم الأخرى، يُبلغ lr_min عند t = warmup_t + t_initial، أي خطوة واحدة بعد آخر خطوة مجدولة، لذا فإن آخر خطوة مجدولة تقل خطوة تخميد واحدة عن ذلك. مع مرحلة تخميد قصيرة تُنفَّذ لكل حقبة، يكون هذا الأمر ذا أهمية (على سبيل المثال، آخر حقبة من 5 حقب تخميد باستخدام ‘1-sqrt’ تكون عند حوالي 10% من معدل التعلم المستقر). يهم التخميد النهائي في WSD، لذا نفّذ خطوة لكل تحديث (t_in_epochs=False، --sched-on-updates في train.py) أو أضف حقبة تبريد (تُحافظ على lr_min، --cooldown-epochs).

تُقيَّم الدالة المستقرة على المدة منذ نهاية فترة الإحماء (t_s) وتساوي 1 عند t_s = 0، لذا فإن فترة الإحماء تنتقل دائمًا إلى معدل التعلم الأساسي. تُحوِّل دالة التلاشي تقدم التلاشي frac في المجال [0, 1] إلى معامل يتراوح بين 1 و0 وتضرب القيمة المستقرة، لذا فإن الدالة المستقرة المتلاشية تستمر في التلاشي خلال مرحلة التلاشي (كما في جدول Big Vision rsqrt + linear cooldown).

lr(t) = lr_min + (base_lr stable(t_s) - lr_min) decay(frac)

الدوال المستقرة:

  • constant: 1، جدول WSD
  • rsqrt: (1 + t_s / timescale) ** -0.5، جدول الجذر التربيعي المعكوس الخاص بـ Big Vision عندما يكون stable_timescale == warmup_t (القيمة الافتراضية)
  • power: (1 + t_s / timescale) ** -stable_power، تعميم rsqrt (مجدول Power)

دوال الاضمحلال:

  • 1-sqrt: 1 - sqrt(frac)، أفضل أداء لتبريد التعلم في https://arxiv.org/abs/2405.18392 (الافتراضي)
  • linear: 1 - frac، جدول "المشابه" (trapezoidal) وتبريد Big Vision
  • cosine: 0.5 (1 + cos(pi frac))
  • power: 1 - frac ** decay_power، حيث 0.5 == ‘1-sqrt’، و1.0 == ‘linear’، و2.0 هو اضمحلال ‘square’
  • exp: اضمحلال أُسّي إلى نسبة decay_ratio من القيمة المستقرة، مع تطبيعها للوصول إلى lr_min
  • دالة قابلة للاستدعاء fn(frac) -> factor لأي شيء آخر
Update on GitHub