Epoch یک گذر روی مجموعه آموزش است؛ Batch گروهی از نمونهها در یک بار پردازش، و Step واژهای است که باید در گزارش تعریف شود. بعضی گزارشها هر پردازش دسته را step مینامند و بعضی هر بهروزرسانی بهینهساز را. وقتی انباشت گرادیان داریم، این دو تعداد میتوانند متفاوت باشند.
برای ۱۰۳ نمونه چند گام داریم؟
فرض کنیم مجموعهای ثابت با ۱۰۳ نمونه داریم، batch size برابر ۳۲ است، دسته آخر نگه داشته میشود و بعد از هر دسته دقیقاً یک گام بهینهساز داریم. در هر گذر، اندازه دستهها ۳۲، ۳۲، ۳۲ و ۷ است. پس تعداد دسته و بهروزرسانی در هر epoch برابر سقف ۱۰۳÷۳۲ یعنی ۴ است؛ نه ۳ و نه عدد اعشاری ۳٫۲۱۸۷۵.
در سه epoch، تعداد بهروزرسانی ۱۲ و مجموع دفعات دیدهشدن نمونهها ۳۰۹ است. ۳۰۹ تعداد نمونه یکتای تازه نیست؛ همان مجموعه در چند گذر استفاده شده است. این مثال فقط شمارش حلقه را نشان میدهد و هیچ مدلی در آن آموزش داده نمیشود.
اگر دسته آخر حذف شود چه؟
با قرارداد drop_last=True در این مسئله تکفرایندی، دسته ناقص ۷تایی حذف میشود. در هر گذر ۳ دسته و در سه گذر ۹ گام داریم؛ مجموع دفعات حضور نمونه ۹۶×۳=۲۸۸ میشود. اگر ترتیب در هر گذر ثابت بماند، همان هفت ردیف آخر همواره حذف میشوند. با جابهجایی ترتیب، هویت نمونههای حذفشده ممکن است عوض شود.
| قرارداد سه گذر | پردازش دسته | بهروزرسانی بهینهساز | دفعات حضور نمونه |
|---|---|---|---|
| نگهداشتن دسته آخر | 12 | 12 | 309 |
| حذف دسته آخر | 9 | 9 | 288 |
| نگهداشتن آخر و انباشت هر دو دسته | 12 | 6 | 309 |
انباشت گرادیان چه چیزی را تغییر میدهد؟
اگر بعد از هر دو دسته یک بار بهینهساز را اجرا کنیم، در هر گذر چهار پردازش دسته اما دو بهروزرسانی داریم. اینجا فرض کردهایم در پایان هر epoch، گروه انباشت ناقص هم اجرا و بافر برای گذر بعد پاک میشود. اگر تعداد دسته فرد باشد یا انباشت از مرز epoch عبور کند، فرمول و قرارداد شمارش باید صریح نوشته شود.
جمع دو گرادیان، بدون تنظیم مقیاس لزوماً همان گرادیان میانگین دسته بزرگ نیست. بهویژه دسته آخر این مثال فقط ۷ نمونه دارد. اگر هدف میانگین روی همه نمونههای یک گروه انباشت است، وزن هر دسته و نرمالسازی باید تعداد واقعی نمونههای آن را در نظر بگیرد؛ تقسیم کورکورانه بر تعداد دسته، همیشه آن میانگین را نمیسازد.
کد شمارش، مستقل از کتابخانه مدل
import math
def batch_sizes(n, batch_size, drop_last=False):
if n <= 0 or batch_size <= 0:
raise ValueError('positive sample count and batch size required')
sizes = [min(batch_size, n-start) for start in range(0, n, batch_size)]
return [s for s in sizes if not drop_last or s == batch_size]
def count(n, b, epochs, accumulation=1, drop_last=False):
if epochs <= 0 or accumulation <= 0:
raise ValueError('positive epochs and accumulation required')
sizes = batch_sizes(n, b, drop_last)
# Flush each incomplete accumulation group at every epoch end.
updates_per_epoch = math.ceil(len(sizes)/accumulation)
return {'sizes': sizes, 'microsteps': len(sizes)*epochs,
'optimizer_updates': updates_per_epoch*epochs,
'sample_visits': sum(sizes)*epochs}
normal = count(103, 32, 3)
dropped = count(103, 32, 3, drop_last=True)
accumulated = count(103, 32, 3, accumulation=2)
print('normal', normal)
print('drop_last', dropped)
print('accumulate 2', accumulated)
assert normal == {'sizes':[32, 32, 32, 7], 'microsteps':12,
'optimizer_updates':12, 'sample_visits':309}
assert dropped['optimizer_updates'] == 9 and dropped['sample_visits'] == 288
assert accumulated['optimizer_updates'] == 6 and accumulated['microsteps'] == 12
assert batch_sizes(3, 32, True) == []خروجیهای این قطعه شمارش شبیهسازیشده حلقهاند؛ forward، backward یا optimizer واقعی اجرا نمیشود. برای داده کمتر از اندازه دسته و drop_last=True، تعداد دسته میتواند صفر شود؛ مثال پایانی همین حالت را کنترل میکند. این کد برای مجموعه محدود تکفرایندی است و شمارنده آموزش توزیعشده یا جریان داده نامتناهی نیست.
چه چیزی در گزارش آموزش ثبت کنیم؟
- تعداد نمونه و قاعده ساخت مجموعه در هر گذر.
- اندازه دسته واقعی و رفتار دسته آخر.
- تعداد پردازش دسته و تعداد گام بهینهساز با نام جدا.
- تعداد انباشت و رفتار پایان گذر یا توقف زودهنگام.
تعداد epoch بیشتر، تضمین کیفیت بیشتر نیست؛ ارزیابی مستقل همچنان لازم است. برای این مرز، بیشبرازش و برای منابع موردنیاز آموزش در برابر اجرای مدل را بخوانید.
برای بررسی یک پیشنهاد پاسخگویی هوشمند، از تیم درباره داده آزمون و خروجی قابل قبول بپرسید؛ عدد epoch بهتنهایی معیار خرید نیست. در مسیر خدمات اپرا میتوانید نیاز و نمونه موردانتظار را مطرح کنید. این راهنما تعداد epoch یا روش آموزش محصولات اپرا را اعلام نمیکند.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.
ادامه مسیر یادگیری
محاسبه یک گام پسانتشار — این راهنما تعداد رویدادها را شمرد؛ برای دیدن محاسبه گرادیان در یک رویداد، مثال پسانتشار را بخوانید.