رفتن به نوشته‌ها

مرتب‌سازی و باکت‌بندی Batchها در یادگیری ماشین

چند وقتیه که دارم روی چالش kaggle تشخیص سوالات تکراری در کوئرا کار میکنم مطالب مختلفی بهش برخوردم  و یکی از این مسائل این است که طول جملات در دیتاست‌ها متفاوت است و ما معمولا طول جمله را در هنگام آموزش ثابت درنظر میگیریم که این مساله از نظر حافظه و زمان اجرا چندان جالب‌انگیز نیست! مثلا در هنگام استفاده از شبکه‌های مختلف عصبی (بازگشتی، کانوولوشن و…) اینجوری هست که طول جمله رو مقدار ثابت ۳۰ یا ۴۰در نظر میگریم (بستگی به تسک هم دارد مثلا برای کار با سند این عدد رو ۱۰۰۰ میگیرند) و اونوقت اون رو به عنوان ورودی به شبکه میدهند. مثلا برای پیاده‌سازی Embedding Layer در اکثر کتابخانه‌ها باید حداکثر طول جمله (max_sequence_length) به سازنده (کانستراکتور) بدیم:

که خب شاید فرض چندان معقولی نباشد. از اونجایی که در دیتاست کوئرا طول جملات بسیار متفاوت است (کوتاه‌ترین جمله از یک کلمه تشکیل شده و بلندترین جمله از ۲۳۷ کلمه) در جایی خوندم که بهتر است، نمونه‌های ورودی را قبل از آموزش (train) مرتب‌سازی (sort) و باکت‌بندی (bucketing) کنیم و اونوقت به الگوریتم یادگیری‌مون بدیم. امروز به طور اتفاقی مقاله‌اش رو پیدا کردم که در این پست نکات مهم اش رو میگم شاید به درد شما هم بخوره…
An Empirical Study of Mini-Batch Creation Strategies for Neural Machine Translation

قبل از اینکه شروع کنید به خواندن مقاله ابتدا مطمئن باشید که مفاهیم بچ و مینی بچ (Batch و Mini-batch) رو میدونید.

همانطور که از عنوان مقاله معلوم است این مقاله برای ترجمه ماشین نوشته شده و شاید به درد تسک شما نخورد ولی ارزش خوندش رو داره و نتایجی که آورده میتونه در میزان دقت الگوریتم شما تاثیر گذار باشد.

اگر به عکس زیر نگاه کنید یک فریم انکدر دیکدر یا seq2seq رو مشاهده میکنید (اگر از نوع شبکه سر در نمیارید هیچ اشکالی نداره) قسمت اصلی و مهم همان ورودی شبکه است که دو جمله است (در این مثال فرض شده است که اندازه هر دسته (batch) دو است). اگر به ورودی نگاه کنید متوجه میشید که طول دو جمله با یکدیگر یکسان نیست و در جمله اول یک توکن مخصوص (<\s>) به انتها اضافه شده است. اگر طول جمله خیلی بیشتر بود در این صورت باید صفر اضافه میکردیم که اصلاحا به این کار padding میگن.
فریم ورک انکدر دیکدر

که این کار شاید خوب نباشه مثلا در مثال کوئرا کمترین طول ۱ و بیشترین طول ۲۳۷ است و در صورتی که ما طول را برای هر دسته ثابت و برابر ۲۳۷ در نظر بگیریم، از نظر زمان اجرا و حافظه اتلاف خواهیم داشت و از طرفی اگر در حد ۳۰ یا ۴۰ بگیریم ممکن است در جملات بلند اطلاعات مهم را دور بریزیم.

نکته‌ای که این مقاله میخواد بگه این است که بیاییم نمونه‌های ورودی رو مرتب کنیم (مرتب سازی میتونه بر اساس طول جمله باشه یا براساس میانگین لغات در هر batch صورت بگیرد) و اونوقت به عنوان ورودی شبکه بدهیم و این کار رو با shuffle کردن مقایسه کردند (همانطور که میدونید در اکثر مدل‌های یادگیری ماشین در هر ابتدای هر epoch داده‌هامون رو شافل میکنیم تا از بایاس شدن مدل و حساس شدن روی ترتیب داده‌ها جلوگیری کنیم). همانطور که در مقاله مشاهده میکنید تاثیر خطا در حالتی که مرتب کنیم و در حالتی که داده‌ها شافل باشند میتونه در تسک موردنظر اهمیت داشته باشد.

به طور خلاصه: اندازه و نوع دسته‌بندی (batching) یک هایپر-پارامتر مهم است و در هنگام آموزش مدل باید به آن توجه کنیم.

منتشر شده در یادگیری عمیقیادگیری ماشین

اولین باشید که نظر می دهید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *