روش جفتهای پرتکرار (BPE)
جواب کوتاه
روش جفتهای پرتکرار، یا BPE (Byte Pair Encoding)، راهیه که خیلی از توکنسازها واژهنامهشون رو باهاش میسازن. از حرفها شروع میکنه: هر حرف یه تکه. بعد توی کل متن میشمره کدوم دو تکه بیشتر از همه کنار هم اومدن، و اون دو تا رو یکی میکنه؛ یه تکهی تازه. همین کار رو بارها تکرار میکنه تا واژهنامه به اندازهای که میخواد برسه، مثلا صد هزار تکه. نتیجه اینه که تکههای پرکاربرد بلند میشن و تکههای کمکاربرد کوتاه میمونن. وقتی واژهنامه ساخته شد، هر متن تازهای با همون ادغامها، به همون ترتیب، بریده میشه. اسمش از یه روش فشردهسازی در سال ۱۹۹۴ اومده.
یه قاعده
توی درس توکنسازی یه واژهنامه رو دستی ساختیم. ولی واژهنامهی واقعی صد هزار تکه داره؛ کسی دستی نمینویسدش. از روی خود متن ساخته میشه، با یه قاعدهی یه خطی:
هر بار، دو تکهای که بیشتر از همه کنار هم اومدن رو یکی کن.
همین. اسم این روش BPE هست، کوتاهشدهی Byte Pair Encoding، یعنی «رمزگذاری جفت بایت»؛ ما بهش میگیم روش جفتهای پرتکرار. این درس اون رو واقعا، قدم به قدم، روی دوازده کلمهی فارسی اجرا میکنه؛ همهی عددهایی که میبینید، خروجی خود اجراست.
از فشردهسازی
این روش اول برای هوش مصنوعی ساخته نشد. سال ۱۹۹۴ برای فشرده کردن فایل معرفی شد: پرتکرارترین جفت رو با یه نشونهی تازه عوض کن و یه جدول نگه دار که هر نشونه یعنی چی.
توی «aaabdaaabac» جفت «aa» از همه بیشتر تکرار شده؛ پس میشه Z. بعد «ab» میشه Y، و بعد «ZY» میشه X. یازده حرف شد پنج تا. برای برگردوندن هم کافیه جدول رو از آخر به اول بخونی.
توکنسازهای مدلهای زبانی یه نسخهی تغییریافته از همین رو به کار میبرن. هدفشون دیگه فشردهسازی حداکثری نیست؛ ساختن تکههاییه که از یه حرف تا یه کلمهی کامل اندازه دارن، و هر کدوم یه شماره.
از فشردهسازی به ترجمه
پلی که این روش رو از فشرده کردن فایل به مدلهای زبانی آورد، یه پژوهش ۲۰۱۵ دربارهی ترجمهی ماشینی بود. مشکلش کلمههای کمیاب و ناشناخته بود: مدل ترجمه یه واژهنامهی محدود داشت و هر کلمهای که توش نبود، ترجمه نمیشد. اون پژوهش کلمههای کمیاب رو به تکههای کوچیکتر شکست، یه بار با تکههای چندحرفی ساده و یه بار با همین روش جفتهای پرتکرار، تا مدل با یه واژهنامهی ثابت، هر کلمهای رو بتونه ترجمه کنه. توی ترجمهی انگلیسی به آلمانی و روسی، از روش قبلی بهتر شد. از اون به بعد، این ایده به همهی مدلهای زبانی رسید.
شروع با حرفها
متن ما این دوازده کلمهست: «من میخورم، تو میخوری، او میخوره، ما میخوریم، من میرم، تو میری». اول، هر کلمه حرف به حرف شکسته میشه، و اولش نشونهی ▁ میاد که یعنی «اینجا یه کلمه شروع شد»:
الان واژهنامهی ما فقط حرفهاست، بهعلاوهی ▁ و نیمفاصله. با همین واژهنامه هر کلمهای رو میشه نوشت، ولی دنبالهها بلندن: «میخوریم» نه تکهست. حالا شروع میکنیم به یکی کردن.
شمردن جفتها
قدم اول: توی هر دوازده کلمه، هر دو تکهای که کنار هم اومدن رو میشمریم:
«▁» و «م» نه بار کنار هم اومدن: دو بار توی «من»، شش بار اول «می»ها و یه بار توی «ما». این بیشترینه، پس این دو تا یکی میشن و یه تکهی تازه به اسم «▁م» به واژهنامه اضافه میشه. هر جا ▁ و م کنار هم بودن، حالا یه تکهان.
بعد دوباره میشمریم؛ چون حالا تکهها عوض شدن و جفتهای تازه پیدا شدن. هر دور: بشمر، بیشترین رو یکی کن، و از نو.
هشت ادغام
اگه این کار رو هشت بار تکرار کنیم، اینها پشت هم یکی میشن:
اول «▁م»، بعد «▁می»، بعد نیمفاصله بهش میچسبه و «▁می» میشه. بعد سه بار پشت هم: «▁میخ»، «▁میخو»، «▁میخور»؛ هر کدوم چهار بار، چون چهار تا از کلمهها با «میخور» شروع میشن. بعد «▁میخوری» دو بار، و «▁میر» دو بار.
یه نکتهی کوچیک: از قدم هفتم چند تا جفت همتعداد بودن. وقتی اینجوری میشه، توکنساز با یه قاعدهی ثابت یکی رو انتخاب میکنه، تا هر بار همون نتیجه دربیاد. هر ادغام هم به ترتیب توی یه فهرست نوشته میشه؛ این فهرست، بهعلاوهی واژهنامه، همهی چیزیه که توکنساز لازم داره.
چی پیدا شد
حالا به نتیجه نگاه کنید: «میخورم» شده «▁میخور» و «م». «میخوره» شده «▁میخور» و «ه». «میرم» شده «▁میر» و «م». یعنی BPE، فقط با شمردن، ریشهی فعل رو از شناسهها جدا کرده؛ بی اینکه کسی بهش گفته باشه فعل چیه یا شناسه چیه.
این دقیقا همون چیزیه که تکهها رو مفید میکنه. تکههایی که توی متن زیاد تکرار میشن، بلند و کامل میشن؛ تکههایی که کم میان، کوتاه میمونن. توی یه متن واقعی، که میلیونها کلمه داره، کلمههای پرکاربرد کامل یه تکه میشن و کلمههای کمکاربرد از تکههای آشنا ساخته میشن.
کار کی تموم میشه؟ وقتی واژهنامه به اندازهای که از اول تعیین کردیم برسه. ما بعد از هشت ادغام وایسادیم؛ یه توکنساز معروف ۱۰۰ هزار تکه از همین روش ساخته و ۲۵۸ توکن ویژه هم بهش اضافه کرده.
شروع با بایت، نه حرف
توی مثال درس، از حرفها شروع کردیم. ولی زبانهای دنیا هزاران حرف و علامت دارن؛ اگه یه حرف توی متن آموزش نبوده باشه، چی؟
جواب، شروع از بایتهاست. توی درس توکنسازی دیدیم هر حرفی آخرش چند بایته. راهنمای توکنسازها میگه بعضی توکنسازهای مشهور، بهجای حرف، از ۲۵۶ بایت ممکن شروع میکنن؛ پس واژهنامهی اولشون فقط ۲۵۶ تکه داره، ولی هر حرفی از هر زبانی رو میتونن نشون بدن و هیچوقت به «ناشناخته» نمیرسن. بقیهی کار عین همونیه که دیدیم: شمردن جفتها و ادغام. به این روش، BPE روی بایت (Byte-level BPE) میگن.
برای متن تازه
واژهنامه ساخته شد. حالا یه کلمهی تازه، که توی دوازده کلمه نبود، چطوری بریده میشه؟ کلمه رو حرف به حرف میکنیم و بعد همون هشت ادغام روبه همون ترتیب روش اجرا میکنیم:
«میخورید» هیچوقت دیده نشده بود، ولی میشه «▁میخوری» و «د»؛ فقط دو تکه. «میخوردم» میشه «▁میخور» و «د» و «م». ولی «نون»، که هیچ تکهی ساختهشدهای نداره، حرف به حرف میمونه: ▁، ن، و، ن.
این همون چیزیه که توی درس قبل دیدیم: هیچ کلمهای ناشناخته نیست، ولی کلمههایی که شبیه متن آموزش توکنساز نیستن، تکههای بیشتری میشن. حالا دلیلش رو میدونید: تکههای بلند فقط برای چیزهایی ساخته شدن که توی متن آموزش زیاد بودن.
یه راه دیگه برای انتخاب
روش جفتهای پرتکرار همیشه پرتکرارترین جفت رو ادغام میکنه. یه روش نزدیک بهش، WordPiece، یه کم زیرکانهتر انتخاب میکنه.
WordPiece برای هر جفت یه امتیاز حساب میکنه: تعداد دفعههایی که با هم اومدن، تقسیم بر ضرب تعداد دفعههایی که هر کدوم تنها اومدن. یعنی جفتی رو ترجیح میده که تیکههاش جدا جدا کمیابن ولی کنار هم زیاد میان. توی مثال ساختگی، «می» و «خور» بیست بار با هم اومدن، ولی «می» خودش چهارصد بار اومده؛ پس با هم بودنشون چیز خاصی نیست. «گ» و «ربه» هم بیست بار با هم اومدن، ولی هر کدوم تنها کم اومدن؛ پس این جفت واقعا با همه و زودتر ادغام میشه.
یه فرق دیگه هم هست: روش جفتهای پرتکرار فهرست ادغامها رو به ترتیب نگه میداره و متن تازه رو با همون ترتیب میبره، ولی WordPiece فقط واژهنامهی آخر رو نگه میداره و هر کلمه رو با بلندترین تکهای که از اولش پیدا میکنه میبره؛ همون قانونی که توی درس توکنسازی دیدیم. اگه هیچ تکهای جور نشه، کل کلمه «ناشناخته» میشه.
جا انداختن عمدی
یه ترفند جالب هم برای آموزش هست: گاهی عمدا بعضی ادغامها رو انجام ندیم.
یه پژوهش ۲۰۱۹ به اسم BPE-dropout پیشنهاد داد موقع آموزش مدل، هر ادغام رو با یه احتمال کوچیک جا بندازیم. اینطوری یه کلمه هر بار یه کم متفاوت بریده میشه، و مدل یاد میگیره تکههای مختلف یه کلمه رو بشناسه؛ همون ایدهی «یه کلمه، چند برش» که توی درس توکنسازی دیدیم. موقع استفاده دوباره همهی ادغامها انجام میشه. اون پژوهش گفت این کار کیفیت ترجمه رو تا ۳ امتیاز BLEU بهتر کرد.
چند نکته
- واژهنامه آینهی متن آموزشه. هر زبانی که توی اون متن بیشتر بوده، تکههای بلندتری گرفته.
- ادغامها ترتیب دارن. متن تازه با همون ترتیب بریده میشه.
- BPE دستور زبان بلد نیست. فقط میشمره؛ ولی شمردن گاهی همون ریشه و پسوند رو پیدا میکنه.
- اندازهی واژهنامه یه انتخابه. بزرگتر یعنی متن کوتاهتر، ولی واژهنامهی سنگینتر.
درس بعد خود واژهنامه رو از نزدیک نگاه میکنه، و توکنهای ویژهای که کنار تکهها هستن: واژهنامهی مدل و توکنهای ویژه.
جمعبندی. آنچه از این درس با خودتان میبرید.
- از حرفها شروع کن.
- پرتکرارترین جفت کنار هم رو یکی کن.
- تکرار کن تا واژهنامه به اندازه برسه.
- پرکاربردها بلند میشن، کمکاربردها کوتاه.
- متن تازه با همون ادغامها بریده میشه.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.