رمزگذاری چرخشی (RoPE)
جواب کوتاه
رمزگذاری چرخشی، که سال ۲۰۲۱ معرفی شد، جای کلمه رو به ورودی اضافه نمیکنه؛ به جاش توی هر لایهی توجه، بردار پرسش و کلید هر کلمه رو به اندازهی جاش میچرخونه. عددهای بردار دوتادوتا جفت میشن و هر جفت با تندی خودش میچرخه، با همون بسامدهای رمزگذاری سینوسی. نتیجهی مهمش اینه که امتیاز بین دو کلمه فقط به فاصلهشون بستگی داره، نه به جای دقیقشون؛ دو کلمهای که دو قدم از هم دورن، چه اول جمله باشن چه وسطش، همون زاویه رو با هم دارن. مقدار نمیچرخه. خیلی از مدلهای زبانی بعدی، مثلا یه خانوادهی مدل باز معروف ۲۰۲۳، همین روش رو به کار بردن.
یعنی چی
به جای چسبوندن برچسب جا، پرسش و کلید رو به اندازهی جاشون میچرخونیم.
توی درس رمزگذاری سینوسی دیدیم که یه جفت سینوس و کسینوس مثل یه نقطه روی دایرهست، و جلو رفتن یعنی چرخیدن. یه پژوهش ۲۰۲۱ این ایده رو برداشت و گفت: چرا جا رو جمع کنیم؟ بیاید مستقیم خود پرسش و کلید رو بچرخونیم. اسم کوتاهش RoPE هست، از حرفهای اول Rotary Position Embedding، یعنی «رمزگذاری چرخشی جا».
چرخوندن
فرض کنید پرسش و کلید هر کدوم فقط دو عدد دارن، یعنی یه فلش. حالا هر کلمه، فلشش رو به اندازهی جاش میچرخونه؛ مثلا با عددهای ساختگی، هر قدم ۳۰ درجه. «گربه» توی جای ۱ نشسته، پس کلیدش ۳۰ درجه میچرخه. «نشست» توی جای ۳، پس پرسشش ۹۰ درجه. زاویهی بینشون میشه ۶۰ درجه. حالا همین دو کلمه رو ببرید جای ۱۱ و ۱۳: کلید ۳۳۰ درجه، پرسش ۳۹۰ درجه، که یعنی یه دور کامل و ۳۰ درجه. زاویهی بینشون باز هم ۶۰ درجه.
فقط فاصله
چرا این مهمه؟ یادتون باشه امتیاز توجه از ضرب داخلی پرسش و کلید درمیاد، و ضرب داخلی به زاویهی بین دو فلش بستگی داره. وقتی هر دو فلش به اندازهی جاشون میچرخن، چیزی که از جا توی امتیاز میمونه فقط فرق چرخششونه، یعنی فاصلهی دو کلمه. پژوهش ۲۰۲۱ همین رو با ریاضی نشون داد. پس مدل نمیبینه «این کلمه جای سیزدهمه»؛ میبینه «این کلمه دو قدم قبل منه». این همون جای «نسبی»ه که توی درس رمزگذاری موقعیتی گفتیم.
جفتجفت
پرسش و کلید واقعی دو عدد ندارن، دهها یا صدها عدد دارن. رمزگذاری چرخشی اونها رو دوتادوتا جفت میکنه و هر جفت رو جدا میچرخونه. ولی همه یه اندازه نمیچرخن؛ جفت اول تند، جفتهای بعدی کمکم آرومتر، دقیقا با همون تندیهای رمزگذاری سینوسی. پس جفتهای تند فاصلههای کوتاه رو خوب نشون میدن و جفتهای کند فاصلههای بلند رو. پژوهش ۲۰۲۱ یه نکتهی دیگه هم گفت: با این روش، هر چی دو کلمه دورتر باشن، اثرشون روی هم کمکم کمتر میشه.
با عدد
حرف «زاویه همون میمونه» رو با عدد هم ببینیم، تا خیالمون راحت بشه.
چرخوندن یه فلش دوعددی (x، y) به اندازهی یه زاویه، یه فرمول سادهی دبیرستانی داره: عدد اول میشه x ضرب در کسینوس منهای y ضرب در سینوس، عدد دوم x ضرب در سینوس بهعلاوهی y ضرب در کسینوس. همون مثال بالا رو با این فرمول حساب کردیم، با پرسش و کلید ساختگی (۱، ۰) و هر قدم ۳۰ درجه:
import math
def turn(v, deg):
a = math.radians(deg)
x, y = v
return (x * math.cos(a) - y * math.sin(a),
x * math.sin(a) + y * math.cos(a))
def score(k_pos, q_pos):
k = turn((1, 0), 30 * k_pos)
q = turn((1, 0), 30 * q_pos)
return round(k[0] * q[0] + k[1] * q[1], 2)
print(score(1, 3), score(11, 13))
# 0.5 0.5جای ۱ و ۳ امتیاز ۰٫۵ داد، جای ۱۱ و ۱۳ هم ۰٫۵. خود فلشها کلی فرق دارن، ولی ضرب داخلیشون، که همون امتیاز توجهه، فقط به دو قدم فاصله بستگی داره. توی مدل واقعی همین کار برای هر جفت عدد پرسش و کلید، هر کدوم با تندی خودش، انجام میشه.
کجای مدل
چرخش بعد از ساخته شدن پرسش، کلید و مقدار اتفاق میافته، و فقط روی پرسش و کلید. مقدار نمیچرخه، چون توی امتیاز نیست؛ فقط بعدا وزن میگیره. این کار توی هر لایهی توجه تکرار میشه، نه فقط یه بار اول کار. برای همین اطلاعات جا هیچوقت توی لایههای بالا کمرنگ نمیشه.
با سینوسی
رمزگذاری سینوسی ۲۰۱۷ بردار جا رو یه بار به ورودی جمع میکرد و بعد میرفت؛ لایهها باید خودشون از اون ورودی فاصلهها رو درمیآوردن. رمزگذاری چرخشی هیچی به ورودی اضافه نمیکنه، و توی هر لایه، درست همونجایی که امتیاز حساب میشه، فاصله رو وارد میکنه. هر دو با فرمول ثابت کار میکنن و چیزی یاد نمیگیرن. یه پژوهش ۲۰۲۳، که یه خانوادهی مدل زبانی باز معرفی کرد، رمزگذاری جمعی رو کنار گذاشت و همین چرخشی رو توی همهی لایهها گذاشت؛ بعد از اون خیلی از مدلها همین کار رو کردن.
متن بلندتر از آموزش
مدلی که با چرخش آموزش دیده، تا یه طول مشخص چرخش دیده. اگه متن بلندتر بشه چی؟
اگه همینطوری جلو بریم، کلمههای آخر به زاویههایی میچرخن که مدل هیچوقت ندیده. یه پژوهش ۲۰۲۳ نوشت این کار میتونه امتیازهای توجه رو خیلی بزرگ کنه و کل توجه رو خراب کنه. راه اونا ساده بود: به جای جلو رفتن از خطکش، شمارهی جاها رو کوچیک کردن تا کل متن بلند توی همون طولی که مدل دیده جا بشه. مثلا اگه مدل تا ۲۰۴۸ دیده و متن ۴۰۹۶ هست، هر جا نصف میشه و جای ۴۰۹۶ میشه ۲۰۴۸. قدمها ریزتر میشن، ولی هیچ زاویهی ناآشنایی نیست. با این روش، مدلهای باز معروف رو تا متن ۳۲۷۶۸ توکنی کش دادن، فقط با کمتر از ۱۰۰۰ قدم آموزش اضافه.
چند نکته
- چرخش ضربیه، نه جمعی. چیزی به ورودی اضافه نمیشه.
- پرسش و کلید میچرخن؛ مقدار نه.
- امتیاز فقط به فاصلهی دو کلمه بستگی داره.
- برای متن بلندتر از آموزش، چرخش رو کش میدن؛ درس متن خیلی بلند.
با این درس، ورودی ترنسفورمر کامل شد: توکن، بردار، و جا. حالا وقتشه ببینیم داخل هر لایه چی هست. ایستگاه بعد با این درس شروع میشه: بلوک ترنسفورمر در یک تصویر.
جمعبندی. آنچه از این درس با خودتان میبرید.
- جا اضافه نمیشه؛ پرسش و کلید میچرخن.
- هر چی جا جلوتر، چرخش بیشتر.
- امتیاز فقط به فاصله بستگی داره.
- جفتهای تند و کند، مثل سینوسی.
- توی هر لایه؛ مقدار نمیچرخه.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.