توجه متقابل (Cross-attention)
جواب کوتاه
توجه متقابل، همون فرمول توجهه، فقط پرسش و کلید و مقدارش از دو جای مختلف میان: پرسش از رمزگشا، یعنی چیزی که داره نوشته میشه، و کلید و مقدار از خروجی رمزگذار، یعنی جملهی اصلی. پس هر کلمهای که رمزگشا مینویسه، میتونه به همهی کلمههای ورودی نگاه کنه و از هر کدوم به اندازهی ربطش برداره. ماسک نداره، چون ورودی از اول کامله، و جدول وزنهاش مستطیلیه: تعداد کلمههای خروجی در تعداد کلمههای ورودی. توی ترنسفورمر ۲۰۱۷، وسط هر بلوک رمزگشا بود. بیرون از ترجمه هم به کار میره؛ مثلا یه پژوهش ۲۰۲۲ با همین، عکس در حال ساخت رو به متن وصل کرد.
یعنی چی
رمزگشا از جملهی اصلی میپرسه: الان به کدوم کلمهت نیاز دارم؟
توی درس رمزگذار و رمزگشا دیدیم رمزگشا موقع نوشتن، به خروجی رمزگذار نگاه میکنه. اون نگاه، توجه متقابله. اگه یادتون باشه، توی درس تولد توجه هم رمزگشای شبکهی بازگشتی دقیقا همین کار رو میکرد. ترنسفورمر همون ایده رو نگه داشت، فقط با فرمول توجه خودش.
نقشها از دو جا
توی خودتوجهی، پرسش، کلید و مقدار هر سه از یه جمله میومدن. اینجا فرق میکنه: پرسش از رمزگشا میاد، چون اونه که دنبال چیزیه، و کلید و مقدار از خروجی رمزگذار، چون جواب اونجاست. مقالهی ۲۰۱۷ دقیقا همین رو گفته. بقیهی فرمول هیچ فرقی نداره: ضرب پرسش در کلید، تقسیم، سافتمکس، ضرب در مقدار.
جدول
این جدول برای ترجمهی «گربه روی فرش نشست» به the cat sat on the mat ساختگیه، ولی شکلش واقعیه. هر ردیف یه کلمهی انگلیسیه که رمزگشا نوشته، و هر ستون یه کلمهی فارسی ورودی. cat بیشتر به «گربه» نگاه کرده، sat به «نشست»، on به «روی»، و mat به «فرش». ترتیب دو زبان فرقی نمیکنه، چون هر کلمه آزاده هر جای ورودی رو نگاه کنه. پژوهش ۲۰۱۴ هم جدولهایی مثل همین نشون داده بود.
یه قدم
یه قدمش رو از نزدیک ببینیم. رمزگشا تا اینجا «the cat sat on the» رو نوشته و داره کلمهی ششم رو میسازه. از جایی که هست یه پرسش میسازه و با کلید هر کلمهی ورودی مقایسه میکنه. کلید «فرش» بیشتر از همه جوره، پس وزنش میشه حدود ۰٫۸. بعد میانگین وزندار مقدارها، که بیشترش از «فرش» اومده، میره توی بقیهی بلوک، و آخرش رمزگشا mat رو انتخاب میکنه. عددها ساختگیان.
همون قدم، با عدد
اون «حدود ۰٫۸» رو با عدد دربیاریم، تا ببینیم از کجا میاد.
فرض کنید بردارها فقط دو عدد دارن، همه ساختگی. پرسش رمزگشا برای کلمهی ششم (۱، ۱) هست. کلید «گربه» (۱، ۰)، «روی» (۰، ۱)، «فرش» (۲، ۲) و «نشست» (منفی ۱، ۱). ضرب داخلی پرسش با هر کلید میشه ۱، ۱، ۴ و ۰. اینها رو تقسیم بر رادیکال اندازهی بردار، یعنی رادیکال ۲، میکنیم: ۰٫۷۱، ۰٫۷۱، ۲٫۸۳ و ۰. بعد سافتمکس، و وزنها میشن ۰٫۰۹، ۰٫۰۹، ۰٫۷۷ و ۰٫۰۵. «فرش» حدود ۰٫۸ از توجه رو گرفت. همین حساب توی چند خط پایتون:
import math q = (1, 1) keys = [(1, 0), (0, 1), (2, 2), (-1, 1)] s = [(k[0] * q[0] + k[1] * q[1]) / math.sqrt(2) for k in keys] e = [math.exp(x) for x in s] w = [round(x / sum(e), 2) for x in e] print(w) # [0.09, 0.09, 0.77, 0.05]
تنها فرقش با خودتوجهی اینه که q از رمزگشا اومده و keys از رمزگذار؛ خود حساب مو به مو یکیه.
همهی ورودی
دو نکتهی کوچیک. اول اینکه توجه متقابل ماسک نداره؛ جملهی اصلی از اول کامل دست ماست و چیزی برای پنهون کردن نیست. برای همین جدولش مستطیلیه، نه مثلثی. دوم اینکه کلید و مقدار از خروجی رمزگذار میان، که فقط یه بار حساب میشه؛ پس توی همهی قدمهای رمزگشا همونها استفاده میشن و لازم نیست هر بار از نو ساخته بشن. این ایدهی «یه بار بساز، بارها استفاده کن» توی درس KV کش مهمتر هم میشه.
بیرون از ترجمه
توجه متقابل فقط برای ترجمه نیست؛ هر جا دو چیز باید به هم وصل بشن، به کار میاد. مثلا یه پژوهش ۲۰۲۲ که از متن عکس میساخت، با همین توجه، بخشی که عکس رو میسازه رو به کلمههای متن وصل کرد: عکس در حال ساخت پرسش میپرسید و کلمههای متن کلید و مقدار بودن. پس عکس میتونست بپرسه: «اینجا باید چی بکشم؟» درس ترنسفورمر در ساخت تصویر این رو بیشتر باز میکنه.
چند پرسش برای ورودی خیلی بزرگ
توجه متقابل یه خاصیت بهدردبخور داره: تعداد پرسشها لازم نیست با تعداد ورودیها یکی باشه.
توی خودتوجهی، هر تکه از ورودی پرسش خودش رو داره، پس هزینه با مربع تعداد تکهها بالا میره. یه پژوهش ۲۰۲۱ از توجه متقابل استفاده کرد تا این رو دور بزنه: یه دستهی کوچیک پرسش یادگرفته گذاشت که به کل ورودی نگاه میکنن، و ورودی فقط کلید و مقدار میده. اینطوری ورودیهای خیلی بزرگ، مثلا ۵۰ هزار پیکسل یه عکس، توی چند بردار کم خلاصه میشن و بقیهی کار روی همونها انجام میشه. همون مدل با عکس، صدا، ویدیو و ابرهای نقطه کار کرد و توی دستهبندی، همپای مدلهای مخصوص هر کدوم شد. حساب این کار خطی بالا میره، نه مربعی.
چند نکته
- همون فرمول توجه؛ فقط ورودیها از دو جا.
- پرسش از کسی که دنبال چیزیه.
- بی ماسک؛ جدول مستطیلی.
- کلید و مقدار یه بار ساخته میشن.
حالا ببینیم اگه فقط نیمهی فهمیدن رو نگه داریم چی میشه. درس بعد: فقط رمزگذار: مدلهایی که میفهمن.
جمعبندی. آنچه از این درس با خودتان میبرید.
- پرسش از رمزگشا.
- کلید و مقدار از رمزگذار.
- هر کلمهی خروجی، به همهی ورودی.
- بی ماسک؛ جدول مستطیلی.
- هر جا دو چیز باید به هم وصل بشن.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.