با gzip هم میشه مدل زبانی ساخت؟
خلاصهٔ کاملتر
نویسنده (Nathan) یه آزمایش بامزه و آموزنده انجام داده: میشه با gzip — همون فشردهسازی سادهای که تو هر سیستمعاملی هست — مدلسازی زبان (language modeling) کرد؟ بدون شبکهٔ عصبی، بدون وزن، بدون هیچ آموزشی. به گفتهٔ نویسنده، جرقهٔ کار مقالهٔ «Language Modeling is Compression» بوده که یه ایدهٔ کلیدی رو مطرح میکنه: هر مدل پیشبینی ذاتاً یه فشردهسازه و هر الگوریتم فشردهسازی هم یه مدل پیشبینیه.
چرا؟ چون کار یه فشردهساز اینه که برای دادهای که «انتظارش رو داره» بایت کم و برای دادهی غیرمنتظره بایت زیاد خرج کنه. اگه یه فایل فقط حرف A تکرارشده باشه، با یه جمله توصیفشدنیه؛ ولی یه میلیون بایت تصادفی هیچ ساختاری نداره و تقریباً فشرده نمیشه. این هستهٔ نظریهٔ اطلاعاته: تعداد بیت لازم برای کدکردن یه نماد برابر -log2(p) ست، یعنی هر فشردهساز یه مدل احتمال پنهان توی خودش داره.
بهطور مشخص، gzip از الگوریتم DEFLATE استفاده میکنه که بایتهای بعدی رو با پیداکردن تطبیق توی یه پنجرهٔ لغزان ۳۲ کیلوبایتی از متن اخیر فشرده میکنه؛ اگه ادامهٔ متن چیزی رو تکرار کنه که همین الان توی پنجره هست، بهجای بایت خام یه ارجاع ارزون (back-reference) میذاره. همین یه معیار بهمون میده: امتیاز هر کاندیدِ ادامه برابره با len(gzip(context + candidate)) — هرچی طول فشردهشده کوچیکتر باشه، اون ادامه «پیشبینیشدهتر» و محتملتره. برای پرایمکردن مدل هم یه corpus (مثلاً متن شکسپیر) رو توی پنجرهٔ gzip میذاری.
ولی خودِ تولید متن به این سادگی نیست. نویسنده میگه اگه فقط تکبایتِ بعدیای رو انتخاب کنی که بهترین فشردهسازی رو داره، بد جواب میده، چون gzip فقط طول بایتِ صحیح (integer) میده و اضافهکردن یه بایت خیلی وقتها اصلاً طول فشردهشده رو عوض نمیکنه؛ پس کلی کاندید مساوی میشن و سیگنال توی نویزِ کوانتایز شدن گم میشه. راهحل اینه که یه اسپَن کامل رو جلوتر نگاه کنی: پروژهٔ gzipt یه beam search روی دنبالههای بایت اجرا میکنه، در هر قدم beam_width تا از قابلفشردهترین ادامهها رو نگه میداره، هرکدوم رو با بایتهای موجود در corpus گسترش میده، امتیاز میده و دوباره هرس میکنه.
یه جزئیات مهم اینه که فقط tail بایتِ آخرِ خروجیِ تولیدشده توی context امتیازدهی میمونه؛ چون DEFLATE تطبیقهای نزدیک رو ارزونتر کد میکنه، اگه gzip کل تاریخچهش رو ببینه، ارزونترین کار معمولاً افتادن توی حلقههای تکراری و کپیکردن متنِ همینالانتولیدشدهست. نویسنده میگه خروجی روی متن شکسپیر کاملاً منسجم نیست، ولی بهوضوح یه چیزهایی از متن «بلده» — خیلی بیشتر از چیزی که انتظار میرفت. کل پروژه هم یه فایل پایتونِ خالص با کتابخانهٔ استانداردِ zlib ست و روی گیتهاب در دسترسه.
نکات کلیدی:
- ایدهٔ اصلی: همارزی فشردهسازی و پیشبینی — هر فشردهساز یه مدل احتمال پنهان داره
- gzipt یه مدل زبانی فقط با gzip/zlibه، بدون شبکهٔ عصبی و بدون آموزش
- امتیاز هر ادامه برابر طول gzip(context + candidate) ست؛ کوچیکتر یعنی محتملتر
- مدل با گذاشتن یه corpus (مثل متن شکسپیر) توی پنجرهٔ ۳۲ کیلوبایتی DEFLATE پرایم میشه
- تولید متن با beam search انجام میشه چون انتخاب تکبایت بهخاطر نویز کوانتایز خراب میشه
- فقط چند بایت آخر توی context میمونه تا مدل توی حلقهٔ تکرار نیفته




