شبکهی پیشخور (Feed-forward)
جواب کوتاه
شبکهی پیشخور، بخش دوم هر بلوک ترنسفورمره: یه شبکهی عصبی کوچیک با دو لایه و یه ReLU بینشون. توی مقالهی ۲۰۱۷، لایهی اول بردار ۵۱۲ عددی هر کلمه رو به ۲۰۴۸ عدد باز میکرد، ReLU منفیها رو صفر میکرد، و لایهی دوم دوباره به ۵۱۲ برمیگردوند. این شبکه روی هر کلمه جدا و با وزنهای یکسان اجرا میشه؛ برخلاف توجه، کلمهها اینجا با هم حرف نمیزنن. یه پژوهش ۲۰۲۱ نشون داد این بخش مثل یه حافظه رفتار میکنه: لایهی اول الگوها رو پیدا میکنه و لایهی دوم برای هر الگو چیزی اضافه میکنه. حدود دو سوم وزنهای هر بلوک توی همین بخشه.
یعنی چی
بعد از جلسه، هر کلمه میره پشت میز خودش و فکر میکنه.
توی درس بلوک ترنسفورمر دیدیم هر بلوک دو بخش داره: توجه، که کلمهها با هم حرف میزنن، و پیشخور. این درس مال بخش دومه. اسمش از اینه که عددها فقط رو به جلو میرن، از ورودی به خروجی، بی برگشت. در واقع همون شبکهی عصبی سادهایه که توی مسیر یادگیری ماشین دیدیم، فقط کوچیک و دولایه.
باز و بسته
توی مقالهی ۲۰۱۷، بردار هر کلمه ۵۱۲ عدد بود. لایهی اول اون رو به ۲۰۴۸ عدد باز میکنه، یعنی چهار برابر. بعد یه فیلتر روش میخوره، و لایهی دوم دوباره جمعش میکنه به ۵۱۲. چرا باز کنیم و دوباره ببندیم؟ مقاله دلیلش رو جدا نگفته؛ ولی ۲۰۴۸ خونه یعنی جا برای الگوهای خیلی بیشتر، که پایینتر میبینیم چه کار میکنن. بستن هم لازمه، تا خروجی هماندازهی ورودی بشه و میانبر و بلوک بعدی بتونن باهاش کار کنن.
فیلتر وسط
اون فیلتر وسط اسمش ReLU هست و کارش خیلی سادهست: هر عدد مثبت همون میمونه، هر عدد منفی میشه صفر. توی درس تابع فعالسازی دیدیم چرا این لازمه: اگه نباشه، دو لایهی پشت سر هم با یه لایه هیچ فرقی ندارن و شبکه هیچ چیز پیچیدهای یاد نمیگیره. مدلهای بعدی جای ReLU از تابعهای نرمتری هم استفاده کردن، ولی ایده همونه.
با دست
بیاید یه پیشخور خیلی کوچیک رو با دست حساب کنیم؛ به جای ۵۱۲ و ۲۰۴۸، با ۲ و ۴.
کلمهمون دو عدد داره: ۱ و ۲. لایهی اول چهار تا وزندار داره و هر کدوم یه ترکیب از این دو عدد میسازه؛ با وزنهای ساختگی ما، چهار عدد ۱ و ۱ و منفی ۲ و ۳ درمیاد. یعنی دو عدد شد چهار عدد؛ همون «باز شدن». حالا فیلتر میاد و هر چی منفیه رو صفر میکنه، پس منفی ۲ میشه صفر و بقیه همون میمونن. آخر سر، لایهی دوم این چهار عدد رو دوباره با وزنهای خودش ترکیب میکنه و دو عدد ۲ و منفی ۰٫۵ میده. دو عدد اومد، دو عدد رفت. این دو عدد بعد با میانبر به همون ۱ و ۲ اول اضافه میشن. توی مدل واقعی دقیقا همینه، فقط با عددهای خیلی بیشتر و وزنهایی که توی آموزش یاد گرفته شدن.
هر کلمه تنها
مقالهی ۲۰۱۷ میگه این شبکه روی هر جا جدا و یکسان اجرا میشه. یعنی یه شبکه هست، با یه دسته وزن، و هر کلمه جدا ازش رد میشه؛ «گربه» یه بار، «شیر» یه بار، «خورد» یه بار. هیچکدوم اینجا از بقیه خبر نمیگیرن؛ خبرگیری کار توجه بود. چون کلمهها به هم کاری ندارن، همه همزمان حساب میشن. ولی هر بلوک پیشخور خودش رو داره، با وزنهای خودش.
مثل حافظه
خب این بخش دقیقا چی کار میکنه؟ یه پژوهش ۲۰۲۱ نگاهش کرد و دید مثل یه حافظهی کلید و مقدار رفتار میکنه. هر خونهی لایهی اول، وقتی یه الگوی خاص توی متن ببینه، روشن میشه؛ و لایهی دوم برای اون الگو یه چیزی به بردار کلمه اضافه میکنه. مثلا با یه مثال ساختگی، وقتی الگوی «پایتخت ایران» دیده بشه، یه چیزی اضافه میشه که به سمت اسم یه شهر هل میده. یه پژوهش ۲۰۲۲ هم نشون داد خیلی از دونستههای مدل، مثل اینکه پایتخت یه کشور کجاست، توی همین بخش لایههای میانی ذخیره شدن.
سهم وزنها
یه حساب ساده. لایهی اول پیشخور ۵۱۲ ضرب در ۲۰۴۸ وزن داره، لایهی دوم هم همینقدر؛ با هم حدود ۲ میلیون. توجه چهار تا ماتریس ۵۱۲ در ۵۱۲ داره، برای پرسش و کلید و مقدار و خروجی؛ حدود ۱ میلیون. پس حدود دو سوم وزنهای هر بلوک توی پیشخوره. برای همین بعدها کسانی که میخواستن مدل رو بزرگتر کنن بی اینکه کندتر بشه، سراغ همین بخش رفتن؛ درس ترکیب متخصصها همینه.
پیشخور دروازهدار
پیشخور مقالهی ۲۰۱۷ دو لایه داشت و یه فیلتر وسطش. بعدها یه شکل دیگهش خیلی رایج شد.
ایده از یه پژوهش ۲۰۱۶ اومد به اسم «واحد خطی دروازهدار»: به جای یه لایه، دو لایهی کنار هم. خروجی یکی از یه فیلتر نرم رد میشه و بعد عدد به عدد در خروجی اون یکی ضرب میشه. یعنی یه شاخه مثل یه شیر آب تصمیم میگیره از شاخهی دیگه چقدر رد بشه. یه پژوهش ۲۰۲۰ چند شکل از همین رو جای لایهی اول پیشخور ترنسفورمر گذاشت و دید بعضیاشون از فیلتر معمولی بهتر جواب میدن. پژوهش ۲۰۲۲ مدل خیلی بزرگی که توی درس بلوک دیدیم هم همین رو به کار برد و نوشت که به جای دو ضرب، سه ضرب لازم داره؛ ولی پژوهش ۲۰۲۰ حتی وقتی حساب دو طرف رو برابر کرده بود، باز هم بهتر شده بود. برای همین، پیشخور خیلی از مدلهای امروزی سه ماتریس وزن داره، نه دو.
چند نکته
- لایهی میانی چهار برابر پهنتره.
- بی ReLU، دو لایه مثل یه لایهان.
- کلمهها اینجا با هم حرف نمیزنن.
- بیشتر وزنها اینجان؛ حساب کامل توی درس پارامترها.
حالا بریم سراغ اون خطچینهای دور هر بخش. درس بعد: اتصال باقیمانده (Residual).
جمعبندی. آنچه از این درس با خودتان میبرید.
- دو لایه، یه ReLU وسطشون.
- ۵۱۲ → ۲۰۴۸ → ۵۱۲.
- روی هر کلمه جدا، با یه شبکه.
- مثل حافظه: الگو، بعد اضافه.
- دو سوم وزنهای بلوک.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.