Attention Relationship
اینجا توضیح میدم که Attention relationship چیه، چرا مدل بین Tokenها ارتباط برقرار میکنه و چرا بزرگ شدن Context باعث میشه پیدا کردن ارتباطهای مهم سختتر بشه.
هر بار که Model میخواد یه Token جدید تولید کنه، فقط به چند کلمه قبلش نگاه نمیکنه بلکه کل Context رو یه بار مرور میکنه و بررسی میکنه هر Token چه ارتباطی با بقیه داره.
به این ارتباط بین دو تا Token میگن Attention relationship .
مثلاً توی این جمله:
Sarah said she would call later.
مدل باید بفهمه she به کی اشاره میکنه. اینجا بین she و Sarah یه ارتباط قوی شکل میگیره، برای همین مدل متوجه میشه منظور از she همون Sarah هست.
یا فرض کن یه جای کد اینو داری:
getUser(id)
و چند صد خط بالاتر این تابع تعریف شده:
function getUser(id: number) { ... }
مدل بین محل استفاده ( getUser(id) ) و تعریف تابع ( function getUser ) یه ارتباط برقرار میکنه، برای همین میفهمه این تابع چیکار میکنه یا چه آرگومانهایی انتظار داره.
نکته مهم اینه که این ارتباطها از قبل جایی ذخیره نشدن. هر بار که یه درخواست برای Model میفرستی، همهشون از صفر دوباره محاسبه میشن.
حالا یه مشکل بزرگ وجود داره.
اگه Context شامل N تا Token باشه، مدل باید تقریباً N² تا ارتباط رو بررسی کنه.
یعنی:
| تعداد Token | تعداد ارتباطها |
|---|---|
| 1,000 | حدود 1 میلیون |
| 10,000 | حدود 100 میلیون |
| 100,000 | حدود 10 میلیارد |
و تازه این فقط یه بار نیست.
داخل Transformer چندین تا Attention Head وجود داره که هر کدوم همین محاسبات رو جداگانه انجام میدن. تعداد دقیقشون معلوم نیست، ولی معمولاً میشه حدس زد بین ۵۰ تا ۱۰۰ تا باشه.
یعنی اون ۱۰ میلیارد ارتباط ممکنه دهها بار دوباره محاسبه بشه.
اما خبر خوب اینه که مدل واقعاً به همه این ارتباطها اهمیت نمیده.
فرض کن داری از مدل میخوای یه باگ رو داخل یه فایل پیدا کنه. چیزی که واقعاً مهمه، ارتباط بین دستور تو و همون چند خط کدیه که به اون دستور مربوط میشن. بقیه هزاران یا میلیونها ارتباط، فقط نویز هستن.
مشکل اینجاست که هرچی Context بزرگتر میشه، تعداد ارتباطهای مهم تقریباً همونه، ولی تعداد کل ارتباطها با سرعت خیلی بیشتری زیاد میشه (به صورت N²).
در نتیجه اون ارتباطهای مهم وسط یه اقیانوس از ارتباطهای بیربط گم میشن.
همین اتفاق باعث میشه کیفیت توجه مدل کمکم افت کنه، چیزی که بهش Attention degradation میگن. این همون دلیلیه که مدل گاهی وسط Contextهای خیلی بزرگ، چیزهای واضح رو فراموش میکنه یا بین دو تا تابع یا متغیر مشابه قاطی میکنه.