تیپیکال سمپلینگ، تکه گم‌شده پازل تولید متن توسط ربات‌ها

همون‌طور که می‌دونید چند سالی میشه که مدل‌های generative مانند GPT پا به عرصه وجود گذاشتند و وجود پرخیر و برکت‌شون باعث شده بتونیم در زمینه هوش‌مصنوعی، تولید متن داشته باشیم. اما همیشه یه دغدغه اصلی در تولید متن‌هایی که توسط ماشین میشده وجود داشته و اون هم قرابت اون متن‌ها با متونیه که انسان‌ها تولید می‌کنند. به عبارت دیگه در یه فضای مناسب، آدم نباید بتونه فرق متن تولیدشده توسط ماشین و انسان رو بفهمه که این یکی از آرزوهای بشری از دیرباز تا کنون بوده و به تست تورینگ معروفه. البته قبلا نوشته‌ای در این‌باره منتشر کرده بودم که تست تورینگ تا حد زیادی پاس شده و حالا چالش‌های جدید دیگه‌ای مطرحه. اما هستند افرادی که به کیفیت خوب قانع نیستند و دنبال عالی هستند! خانوم Meister و همکاراش یکی از همون قماش آدمان که دنبال بهتر و بهتر کردن تولید متن توسط ماشین‌ها هستند و در جدیدترین مقاله‌شون[1] به معرفی روشی در این‌باره پرداختند که قصد داریم در ادامه اون رو توضیح بدیم.

نکته کلیدی؛ decoding strategy

همون‌طور که می‌دونید در تولید متون زبان طبیعی دو فاز اصلی داریم که فاز اولیه شامل پیش‌آموزش مدل برای فراگیری توزیع احتمال کلمات به‌شرط وجود کلمات قبلیه و ازش به مدل زبانی یاد میشه و فاز دوم شامل انتخاب کلمه مناسب به‌شرط وجود کلمات قبلی است. این مقاله ادعا می‌کنه که فاز دوم یعنی decoding strategy می‌تونه خیلی خیلی روی کیفیت متن خروجی تاثیرگذار باشه. به‌خاطر همین بر روی همین قسمت تمرکز کرده و مساله رو به صورت out of the box بررسی کرده؛ به این معنی که شما می‌تونید مدل زبانی‌تون رو با هر روشی که دوست دارید (مثل masking language model) آموزش بدید و بعد برای فاز decoding strategy از روش معرفی‌شده استفاده کنید. در روش‌های فعلی معمولا کلمه‌ای رو در فاز decoding انتخاب می‌کنیم که بیشترین احتمال رو به ازای کلمات داده‌شده داشته باشه. به عبارت دیگه اگه چندین کلمه داشته باشیم و بخوایم کلمه بعدی رو حدس بزنیم، رشته ورودی رو به مدل زبانی می‌دیم و بعد کلمه‌ای که بیشترین احتمال رو در بین بقیه داره به عنوان کلمه بعدی انتخاب می‌شه. این مقاله ادعا می‌کنه دقیقا همین موضوعه که بعضی وقت‌ها باعث میشه مدل‌هایی مثل GPT متن‌های توهمی تولید کنند. در واقع با یه سری مطالعات زبان‌شناختی [2] متوجه شدند که این دقیقا کاری نیست که انسان‌ها در مغز خودشون موقع تولید متن یا گفتار انجام میدند. در واقع انسان‌ها موقع تولید متن یه مصالحه‌ای بین کلمات با احتمال بالا و کلماتی که انتقال اطلاعات موردانتظار رو تضمین می‌کنند برقرار می‌کنند. به‌عبارت دیگه ذهن شما وقتی چندین کلمه رو میبینه و میخواد کلمه بعدی رو حدس بزنه هم به مدل زبانی که در خودش شکل گرفته رجوع می‌کنه و هم از طرفی سعی میکنه مطلب پرتی رو بیان نکنه! از همین‌جا شاخک‌های آدم تیز میشه که شاید بهترین استراتژی، انتخاب محتمل‌ترین کلمه نباشه.

گام اول؛ Beam Search و Sampling

الگوریتم beam search روشیه که به شما اجازه میده در هر مرحله لزوما به محتمل‌ترین کلمه برای انجام decoding اتکا نکنید بلکه بتونید مثلا ۵ کلمه محتمل رو نگه دارید و مسیر decoding رو به ازای اون ۵ کلمه برای کلمات بعدی ادامه بدید و در حین سرچ کردن صرفا همون ۵ مسیر پراحتمال نگهداری میشه. در واقع این روش نوعی از Best First Search (BFS) برای پیمایش گرافه که با درنظر گرفتن صرفا k گزینه محتمل، تبدیل به یه الگوریتم حریصانه شده. نکته مهم در beam search، وجود یه تابع شهوده که در روش‌های decoding مرسوم که تا الان داشتیم اون تابع شهود یه تابع likelihood بود که می‌تونیم با استفاده از اون مثلا k مسیر پراحتمال رو همواره نگهداریم و به جلو بریم. در زیر می‌تونید تصویری از نحوه عملکرد beam search رو ببینید.

نحوه کارکرد beam search. مسیرهایی که پررنگ‌تر هستند دارای احتمال بالاتری هستند.
نحوه کارکرد beam search. مسیرهایی که پررنگ‌تر هستند دارای احتمال بالاتری هستند.

در این مقاله ابتدا دو روش decoding معرفی میشه که کمی متفاوت از انتخاب محتمل‌ترین کلمه در هر گامه. روش اول top-k sampling نام داره که به جای اینکه در هر مرحله محتمل‌ترین کلمه رو انتخاب کنیم، میایم و top-k محتمل‌ترین رو نگهداری می‌کنیم و با beam search میریم جلو. در این روش همچنان تابع شهود ما همون likelihood باقی میمونه. روش دوم هم استفاده از متدی به نام nucleus sampling هست. در این روش به جای اینکه در هر گام از beam search اقدام به نگهداری top-k محتمل‌ترین بکنیم، یه حد آستانه‌ی (threshold) احتمال (مثلا ۹۰ درصد) تعریف می‌کنیم و شروع به انتخاب محتمل‌ترین کلمات به صورت نزولی می‌کنیم تا اینکه مجموع احتمالات کلمات کاندید شده به حد آستانه‌ی مورد نظر برسه.

و اینک typical sampling

خب تا اینجا دو روش کاندیدا برای decoding رو معرفی کردیم اما همون‌طور که در قسمت اول هم گفتیم با برخی مطالعات زبان‌شناسی به این نتیجه رسیدند که انسان موقع تکلم و یا نوشتن متن، لزوما محتمل‌ترین کلمات رو انتخاب نمی‌کنه. بلکه سعی می‌کنه ضمن اینکه کلمات محتمل رو انتخاب می‌کنه از طرفی مطلب پرتی رو هم بیان نکنه! ایده اصلی این مقاله اینه که بیایم و اون تابع شهود در beam search رو تغییر بدیم و با یه تابع جدید که بتونه این مصالحه رو برقرار کنه جایگذاری کنیم. طبق نظریه اطلاعات، میزان اطلاعاتی که یه کد میتونه منتقل کنه برابر با منفی لگاریتم احتمال اون کده. حالا برای یه رشته از کلمات هم میتونیم اطلاعات منتقل‌شده رو به صورت زیر تعریف کنیم:

مقدار اطلاعات منتقل‌شده توسط یک رشته از کلمات
مقدار اطلاعات منتقل‌شده توسط یک رشته از کلمات

که در این فرمول طبق نظریه اطلاعات، مقدار I(y_t) برابر با مقدار زیره:

I(y_t) = - log p(y_t|y_<t)

در این فرمول مقدار احتمال p که در فرمول اومده برابر با احتمال وجود کلمه y_t به ازای کلمات قبلیشه. حالا لازمه که اون پرت نبودن جمله رو هم به نوعی وارد محاسبات‌مون کنیم . در این مقاله، این قسمت با استفاده از مفهوم امید ریاضی اطلاعات منتقل‌شده توسط رشته مشخص شده. در واقع توقع داریم کلماتی رو انتخاب کنیم که مقدار مورد انتظار اطلاعات رو خیلی دستخوش تغییر نکنند و از طرفی محتمل هم باشند. این مقدار امید ریاضی طبق تعریف رسمی به صورت زیر تعریف میشه:

همون‌طور که می‌بینید مقدار امید ریاضی اطلاعات منتقل‌شده در واقع همون آنتروپی شرطی p(.|y_<t) است که می‌تونیم با عبارت (H(p(.|y_<t) اون رو نشون بدیم. حالا برای اینکه مطلب ما به ازای یک کلمه جدید خیلی پرت نباشه باید اختلاف اطلاعات منتقل‌شده توسط اون کلمه به ازای کلمات قبلی با میانگین اطلاعات منتقل‌شده توسط کلمات قبلی، کمینه باشه. در واقع امید ریاضی اطلاعات منتقل‌شده توسط کلمات قبلی همون انتظار ما از یک جمله است که با اضافه شدن یک کلمه جدید نباید خیلی تغییر بکنه. از همینجا می‌تونیم یه تابع شهود جدید برای الگوریتم beam search در نظر بگیریم. اسم این تابع رو اپسیلون میذاریم که در زیر تعریف شده:

مقدار تابع اپسیلون که همون تابع شهود جدید برای beam search میتونه باشه
مقدار تابع اپسیلون که همون تابع شهود جدید برای beam search میتونه باشه

در واقع ما در یک متنی که توسط انسان تولید شده، توقع داریم که مقدار اپسیلون نزدیک به صفر باشه. این یه فرضیه است که از مطالعات زبان‌شناسی گرفته شده و برای اینکه بیشتر در موردش مطمئن بشیم در این مقاله توزیع اپسیلون بر روی برخی متونی که انسان‌ها تولید کردند نیز بررسی شده که در نمودار زیر می‌تونید اون رو ببینید:

توزیع تابع اپسیلون بر روی متونی که انسان‌ها تولید کردند. در سمت راست متن‌های ویکی‌پدیا مورد استفاده قرار گرفته و دو تصویر دیگه مربوط به متون داستان‌سرایی توسط انسان‌ها و متون خلاصه‌سازی abstractive توسط انسان‌ها ست.
توزیع تابع اپسیلون بر روی متونی که انسان‌ها تولید کردند. در سمت راست متن‌های ویکی‌پدیا مورد استفاده قرار گرفته و دو تصویر دیگه مربوط به متون داستان‌سرایی توسط انسان‌ها و متون خلاصه‌سازی abstractive توسط انسان‌ها ست.


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

حالا کافیه که برای انجام روش typical sampling تابع اپسیلون رو به صورت یه تابع شهود برای beam search تعریف کنیم. تعریف این تابع رو در زیر می‌تونید ببینید:

در این فرمول در واقع تابع اپسیلون رو ساده‌تر کردند و با باز کردن مقدار I(y_t) به مقدار فعلی رسیدند. شرط این تابع هم در واقع برمیگرده به این موضوع که ما سعی می‌کنیم کلماتی رو انتخاب کنیم که این تابع رو کمینه کنند و همچنین مجموع احتمال اون کلمات هم بزرگتر مساوی حد آستانه مشخصی بشه. این روش سعی می‌کنه کلماتی رو انتخاب کنه که در مدار امید ریاضی اطلاعات کل رشته باشند. در واقع سعی داره کلمات typical رو انتخاب کنه و به‌خاطر همین اسمش رو typical sampling گذاشتند.

گام آخر؛ بررسی و تحلیل نتایج

قبل از بررسی نتایج لازمه به یه نکته شهودی اشاره بشه. با توجه به تابع اپسیلونی که تعریف کردیم این تابع در هر مرحله از decoding سعی می‌کنه کلماتی رو که به امید ریاضی اطلاعات منتقل‌شده نزدیک‌تر هستند انتخاب کنه. حالا اگر توزیع احتمال کلمات کاندیدا رو به صورت یک توزیع نرمال در نظر بگیریم، ممکنه توزیع کلمات کاندیدا برای کلمه بعدی به یکی از صورت‌های زیر باشه:

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

با توجه به اینکه سه روش برای sampling در فاز decoding مطرح کردیم (top-k, nucleus, typical) و هر کدوم یک سری هایپرپارامتر داشتند لازمه که این مقدار هم تیون بشه. با بررسی‌هایی که این مقاله انجام داده به این نتیجه رسیدند که برای روشی مثل top-k sampling بهترین مقدار k عددی حدود ۳۰ هست. یعنی در هر مرحله از decoding باید ۳۰ تا از محتمل‌ترین کلمات رو نگهداری کنیم. برای روش nucleus sampling هم بهترین حد آستانه حدود ۹۵ درصد است. یعنی باید در هر مرحله کلماتی رو نگهداری کنیم که مجموع احتمالشون بزرگتر مساوی ۹۵ درصد بشه. اما برای typical sampling اوضاع کمی فرق می‌کنه. در واقع برای typical sampling، بهترین مقدار حد آستانه (که در شرط تابع کمینه‌سازی ظاهر شده بود) برای تسک‌هایی مثل داستان‌سرایی با تسک‌هایی مثل خلاصه‌سازی مفهومی متفاوته. در واقع برای تسک‌هایی مثل داستان‌سرایی این مقدار بهینه برابر با حدودا ۲۰ درصده در حالیکه برای تسک‌هایی مثل خلاصه‌سازی حدود ۹۵ درصده. همین نکته می‌تونه یکی از نقاط ضعف این روش باشه که برای هر تسک باید این هایپرپارامتر یک بار دیگه تیون بشه. از طرفی طبق تست‌هایی که انجام شده دو روش اول متن‌های توهمی بیشتری رو تولید می‌کنند در حالیکه typical sampling از تولید متن‌های توهمی تا حد زیادی اجتناب می‌کنه و به واقعیت نزدیک‌تره. در پایان چند نمونه از متن‌های تولید شده توسط ماشین با استفاده از روش‌های بالا رو میاریم.

جمع‌بندی

در این پست سعی کردیم یه نگاه جدید به تولید زبان توسط ماشین رو با محوریت توضیح مقاله typical sampling ارائه کنیم. همون‌طور که در ابتدا گفتیم این روش out of the box مساله رو بررسی کرده و مستقل از مدل‌ زبانی است که انتخاب می‌کنید. همچنین در آخر نتایج و نقاط قوت و ضعفش رو مطرح کردیم. امیدواریم مطالب برای شما مفید بوده باشه.

اگه مطلب خوبی دارید که فکر می‌کنید میشه در انتشارات یا کانال اورفیت منتشر کرد تعارف نکنید و برای ما بفرستید. بدرود!

منابع

[1]: Typical Decoding for Natural Language Generation

[2]: Predicting Pragmatic Reasoning in Language Games