داستان ترنسفورمرها (۵): سریع و سبک، گلابگیری از برت با دیستیلبرت
به نام خداوند بخشنده مهربان
اگر اینجایید و آماده خوندن این پست، به احتمال ۹۹ درصد اسم برت به گوشتون خورده (اگر هم که نه میتونید به این پست ما درباره برت مراجعه کنید!). برت قوی و قدرتمنده و به وسیله فاین-تیون در مسائل مختلف پردازش زبانی امتیازات بالایی رو میتونه بهدست بیاره. اما بخشی از این قدرت برت به واسطه انعطافپذیری و تعداد بالای پارامتر برته. نسخه Bert-Base با داشتن ۱۲ لایه حدود ۱۱۰ میلیون پارامتر داره. داشتن این تعداد پارامتر یعنی این که شما برای فاین-تیون کردن یا حتی استفاده و خروجی گرفتن از برت نیازمند رم بسیار بالایی باید باشید. حالا اگر امکانات سخت افزاری برای فاین-تیون کردن نداشته باشید یا حتی اگر این رو هم دارید ولی بعد از تنظیم برت، میخواید مدلتون رو به هنگام استفاده روی سختافزارهای سبکی نظیر گوشی همراه اجرا کنید؛ با یک چالش بزرگ مواجه خواهید بود. در این پست میخوایم یک پاسخ به این چالش یعنی تکنیک distillation و حاصل انجام این تکنیک بر مدل برت، یعنی مدل distilbert رو معرفی کنیم.
هر که بامش بیش، برفش بیشتر
با راه افتادن نهضت انتقال یادگیری در پردازش زبان، سلسلهای از مدلهای زبانی ازپیشآموزشدیده مختلف نظیر Bert و GPT و XLNet و ... هم پا به عرصه گذاشتند. این مدلها با این که توانایی بالایی در حل مسائل دارند اما خب به واسطه اندازه غول آسا، گرفتاریهایی رو هم در عمل ایجاد میکنند. اولین مشکل اینه که این مدلها انرژی الکتریکی زیادی رو مصرف میکنند و در نتیجه باعث انتشار گازهای گلخانهای بیشتر و آسیب به محیط زیست میشوند (شاید مسخره به نظر بیاد ولی یک عده دانشمند یادگیری ماشین در دنیا هستند که این براشون مساله است و حتی به صورت مقاله و کارگاه در کنفرانسهای مطرح یادگیری ماشین این موضوع مورد بررسی قرار میگیره. غیرقابل باوره ولی واقعا این چیزها اهمیت زیادی اون ور آبها داره گویا). از محیط زیست که بگذریم مشکلاتی که برای ما ملموستره نیاز به حافظه و انرژی بیشتر این مدلهاست که این نیاز توی مواردی که مجبوریم مدلمون رو روی یک سختافزار سبک مثل موبایل اجرا کنیم حادتر هم میشه. از حافظه و انرژی گرانتر اما زمان است. حتی اگر مشکلات حافظه و انرژی رو حل کنیم برامون خیلی مهمه که بتونیم سریعتر از مدلمون خروجی بگیریم. مدلهای ازپیشآموزشدیده بزرگ به خاطر تعداد لایه و پارامتری که دارند زمان قابل توجهی رو از ما میگیرند. هر چه قدر بتونیم این مدت زمان رو کاهش بدیم نفع بیشتری میبریم. اما چاره چیه؟ در قسمت بعدی میخوایم تکنیکی رو نشون بدیم که مدل ۴۰ درصد کوچکتر میشه ولی همچنان همون عملکرد باکیفیت سابق رو به ما ارائه میده، ضمن این که سرعت جوابدهیاش هم ۶۰ درصد افزایش پیدا میکنه.
عصارهگیری از دانش
قدمت تکنیک عصارهگیری از دانش یا "knowledge distillation" از قدمت ترنسفورمرها بیشتره. تعریف فنی این تکنیک اینه که یک روش فشردهسازیه که یک مدل کوچکتر (که بهش میگیم مدل دانشآموز) طوری آموزش میبینه که بتونه رفتار یک مدل بزرگتر (که بهش میگیم مدل معلم) رو ارائه بده. در حالت عادی یادگیری بانظارت، یک مدل جوری آموزش میبینه که برای هر نمونه ورودی بتونه احتمال تخمینزدهاش از برچسب اون نمونه رو بیشینه کنه. این امر از طریق کمینهسازی تابع هزیه cross-entropy بین توزیع پیشبینی شده مدل و توزیع تک-فعال (همون one hot) برچسب نمونهها بهدست میاد.
حالا با این توضیح در سناریوی distillation یادآوری میکنیم که ما دنبال آموزش مدل دانشآموز بر روی رفتار مدل معلم هستیم یا به قول بهتر دنبال یادگیری نحوه تصمیمگیری مدل معلم هستیم. بر این اساس تابع loss زیر رو در نظر میگیریم:
در فرمول بالا t بیانگر توزیع تخمینزده شده توسط مدل معلم و s هم بیانگر توزیع تخمین زده شده توسط مدل دانشآموز است. ما دنبال آموزش مدل دانشآموز به طریقی هستیم که حاصل تابع هزینه بالا کمتر بشه. (دقت کنید یعنی اون t ثابت فرض میشه و ما در واقع دنبال بهینهسازی s هستیم). اندیس i ای هم که در سیگما میبینید برای مشخص کردن جمع زدن روی تمام نمونههایی هست که براشون تصمیم و توزیع احتمال تولید میشه.
یک نکته جالبی هم این که جا داره اینه که معمولا در موقع آموزش شبکه دانشآموز، یک softmax-temperature روی احتمالات t و s اعمال میکنیم. حالا در واقع این عملیات، توزیع رو نرم میکنه و مانع از اورفیتشدن مدل دانش آموز بر مدل معلم میشه و از طرفی یادگیری رو هم پایدارتر میکنه. حالا به زبان ریاضیتر softmax-temperature برای یک توزیع احتمالی z به صورت زیر تعریف میشه:
در این رابطه هر چه قدر T بیشتر باشه توزیع نرمتر میشه. این T صرفا در هنگام آموزش اعمال میشه و در هنگام تست شبکه مقدارش یک گذاشته میشه تا softmax استاندارد داشته باشیم. در نهایت به هنگام آموزش یک مدل دانشآموز تابع هزینه کلی برابر است با تابع هزینه distillation به علاوه تابع هزینه حالت نظارتی خود مساله اصلی. به بیان بهتر، فرض کنید شما یک مساله دستهبندی تصاویر و یک مدل دستهبند تصاویر معلم دارید و میخواید یک مدل کوچکتر دانشآموز رو برای این مساله با تکنیک distillation بهدست بیارید. شما نمونههای دیتاست تصاویر رو به مدل معلم میدید و احتمالات خروجی از اون دریافت میکنید. حالا مدل دانشآموز رو همزمان هم روی خود مساله دستهبندی تصاویر با تابع loss سوپروایزد آموزش می دهید و هم این که به احتمالات تولید شده توسط مدل معلم هم دقت میکنیم و مدل دانشآموز رو با تابع distillation loss هم آموزش میدهیم. یک تابع loss سومی هم وجود داره که آزمایشات نشون داده کیفیت کار رو بالاتر میبره و اون هم در نظر گرفتن فاصله کسینوسی بین بازنماییهای تولیدشده توسط مدل معلم و مدل دانشآموزه. به این معنا که هر چه قدر فاصله بازنماییهای مدل معلم و دانشآموز بیشتر باشه دانشآموز جریمه میشه و بایستی جوری آموزش ببینه که بازنماییهاش هم شبیه معلم دربیاد. مجموع این سه تابع هزینهای که توضیح دادیم (تابع loss خود تسک + تابع distillation loss + loss فاصله کسینوسی بین بازنماییها ) برای ما چارچوب distillation رو میسازند.
مدل DistilBERT
در قسمت قبل نحوه استفاده از تکنیک distillation برای آموزش یک مدل دانشآموز از مدل معلم رو توضیح دادیم حالا سراغ انجام این تکنیک بر روی برت میریم. طبق تعریف مساله، ما یک مدل Bertآموزشدیدهه داریم که بزرگه (۱۲ لایه یا ۲۴ لایه میتونه باشه) و در نفش مدل معلم میخوایم ازش استفاده کنیم. یک مدلی به نام Distilbert هم قراره داشته باشیم که کوچکتره و در نقش مدل دانشآموز قراره از تجربیات Bert استفاده کنه. طبق توضیحات قسمت قبل، مدل Distilbert رو باید بر روی سه تابع loss مذکور آموزش بدیم. یک دیتاست متنی (مشابه آن چه که برت بر رویش آموزش میبینه) رو در نظر میگیریم و تسک MLM (مدل زبانی ماسکشده) رو هم به عنوان تسک بانظارت انتخاب میکنیم. برای هر نمونه از این دیتاست آموزش، ما اون رو به شبکه های Bert و DistilBert میدیم و بازنماییهای لایه آخر و توزیع احتمالهای تخمینی برای کلمات ماسک شده توسط دو شبکه معلم و دانشآموز رو به دست میاریم. حالا با این اطلاعات، سه تابع lossی که قسمت قبل توضیح دادیم رو حساب میکنیم و مدل رو روی مجموع این سه تابع هزینه سعی میکنیم آموزش بدیم. آموزش که تموم شد تبریک عرض میکنیم. مدل DistilBert شما آماده است! حالا میتونیم از این مدل به عنوان یک مدل ازپیشآموزشدیده مثل برت استفاده کنیم.
حالا برای مقایسه و این که چه قدر این DistilBert خوبه میتونیم جداول زیر رو بررسی کنیم:
دقت کنید دیستیلبرت شش لایه داره و برت هم دوازده لایه. همانطور که مشاهده میکنید، تعداد پارامترهاش به همین علت ۰.۶ برابر تعداد پارامترهای برت هست. این تعداد کمتر لایهها و پارامترها متقابلا باعث میشه زمان پاسخگویی این مدل هم نسبت به برت ۴۰ درصد کمتر باشه. اما علیرغم تمامی این فشردهسازیها همانطور که در جدول اول میبینید، دیستیل برت تونسته به ۹۷ درصد امتیاز و کیفیت برت در تسکهای مختلف دست پیدا کنه (دقت کنید که دیستیلبرت یک شبکه ازپیشآموزشدیده مثل برت هست پس وقتی میخوایم ازش در یک تسک استفاده کنیم مثل برت میایم و اون رو روی دادگان اون تسک فاین-تیون میکنیم)
جمعبندی
در این پست، داستان رو اول از سختیهای فاین-تیون و استفاده کردن از برت شروع کردیم. بعدش تکنیک distillation رو توضیح دادیم که به کمک اون میتونیم دانش یک شبکه بزرگ با عنوان شبکه معلم رو در یک شبکه کوچکتر با عنوان شبکه دانشآموز تزریق کنیم. در آخر هم یکی از مدلهای مورد اقبال پردازش زبان یعنی دیستیلبرت رو که حاصل انجام Distillation بر روی مدل برت هست معرفی کردیم و نشون دادیم که با وجود کاهش حجمش نسبت به برت، اما بالای ۹۵ درصد عملکرد برت رو تونسته حفظ کنه. طبیعتا اگر سخت افزار خوبی ندارید که بتونید باهاش برت رو بر روی مساله موردنظرتون فاین-تیون کنید، گزینه بعدی میتونه استفاده از مدل Distilbert باشه.
در تلگرام میتونید دنبالمون کنید و اگر هم متن خوبی در حوزهی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همونجا ندا بدید.
مطلبی دیگر از این انتشارات
اندر حکایت GPT-4 و چالهچولههای آن!
مطلبی دیگر از این انتشارات
داستان ترنسفورمرها (۱): ناکارآمدی بازگشتیها
مطلبی دیگر از این انتشارات
مدل WebGPT؛ به GPT-3 اینترنت و مرورگر دادند!