چطور مدل‌های توصیه‌گر سریع‌تر و راحت‌تر آموزش بدیم؟ (داستان یه ترفند خفن برای دیتاست‌های بزرگ!)

Fall Back

بذارین یه راست برم سر اصل مطلب! احتمالاً شما هم توی اپلیکیشن‌ها یا سایتای مختلف دیدین که هرچی بیشتر استفاده می‌کنید، پیشنهادهاشون هم براتون شخصی‌تر میشه، مثلاً فیلم‌هایی که براتون میاره یا محصولاتی که پیشنهاد می‌ده. خب، اینا همش کار مدل‌های توصیه‌گر دنباله‌ای هست! (Sequential Recommendation یعنی مدل‌هایی که بر اساس رفتار قبلی کاربر بهش چیزای جدید پیشنهاد می‌دن.)

حالا یه چالش بزرگ این وسط هست: این مدل‌ها (که با معماری Transformer ساخته می‌شن) باید هی آموزش ببینن و خودشون رو آپدیت کنن چون سلیقه ما آدما مدام عوض میشه. تا اینجاش مشکلی نیست، ولی مشکل زمانی شروع میشه که تعداد آیتم‌هایی که مدل باید پیشنهاد بده خیلی زیاد میشه. یعنی فرض کن هزاران فیلم یا محصول داریم، آموزش دادن مدل خیلی پرهزینه و کند میشه، چون کامپیوتر یا به‌قول این بچه‌ها GPU (همون کارت گرافیکای مخصوص کارهای سنگین!) باید همه اون آیتم‌ها رو یکی‌یکی بررسی کنه.

اصلاً چرا این‌قدر حافظه می‌خواد؟ خب، اکثر این مدل‌ها از Cross-Entropy Loss استفاده می‌کنن (این یه جور معیار خطا برای آموزش مدل‌هاست، که معلوم می‌کنه مدل چقدر داره خوب یاد می‌گیره!). مشکلش اینه که نیاز به حافظه خیلی زیاد داره و هرچی تعداد آیتم و اندازه دیتاست بیشتر شه، مصرف حافظه حسابی بالا میره.

خیلی از بچه‌هایی که روی این موضوع کار می‌کنن، میان سراغ چیزی به اسم Negative Sampling. یعنی به جای اینکه همه آیتم‌ها رو برای مدل بیاریم، فقط تعداد محدودی آیتم اشتباه (یا منفی) رو نشون می‌دیم. این کار باعث میشه حافظه کمتری نیاز باشه. اما قضیه به این سادگی‌ها هم نیست! چون اگه منفی‌ها رو کم بیارین، مدل ضعیف آموزش می‌بینه؛ اگه بخواین تعداد منفی‌ها یا اندازه بچ رو زیاد کنین (Batch Size یعنی با چند نمونه به مدل آموزش بدیم)، یهو حافظه GPU میزنه سقف و دیگه نمی‌کشه!

خب حالا تیمی که این مقاله رو داده بیرون، یه راه‌حل خفن معرفی کردن به اسم روش CCE- که کارش اینه: آموزش رو تقریباً دو برابر سریع‌تر می‌کنه و مصرف حافظه رو ده برابر کمتر! با این کار، دیگه میشه روی دیتاست‌های بزرگ و تعداد آیتم‌های زیاد، مدل رو خیلی بهتر آموزش داد و نتیجه هم بهتر شد.

خلاصه قضیه این روش چیه؟ اومدن برای پیاده‌سازی Cross-Entropy با Negative Sampling یه ترفند مخصوص روی GPU با یه نرم‌افزار به اسم Triton درست کردن (Triton یه فریم‌ورک خفن برای برنامه‌نویسی GPU هست که بتونی کارای بهینه انجام بدی)، و اینجوری کلی حافظه سیو کردن.

یه نکته خیلی جالب هم اینه که تیم مقاله بررسی کردن دیدن اگه فقط بیخیال یکی از این پارامترها بشیم (یا فقط تعداد منفی‌ها رو زیاد کنیم، یا فقط اندازه بچ رو)، نتیجه خوب نمیشه! ولی اگه جفتِ اینارو باهم متعادل بزرگ کنیم، مدل بهتر یاد می‌گیره. خلاصه باید یه بالانس خوب بین این پارامترهای مرتبط به حافظه باشه.

نکته آخرم اینه که این ترفند یعنی CCE- رو رایگان منتشر کردن و هر کسی می‌خواد، می‌تونه ببره استفاده کنه و مدل‌هاش رو سریع‌تر و بهتر آموزش بده. پس اگه کسی با مدل‌های توصیه‌گر و دیتاست‌های بزرگ سر و کله می‌زنه، این مقاله واقعاً یه خبر خوب براشه!

جمع‌بندی خیلی سریع: اگه می‌خواین مدل پیشنهادی تون رو روی دیتاست‌های گنده با سرعت و حافظه خیلی کمتر آموزش بدین و نتیجه هم عالی باشه، این روش CCE- رو حتماً یه نگاه بندازید!

منبع: +