داستان ترنسفورمرها (۳): توجه و دیگر هیچ!

توجه به کسانی که دوستشان دارید و دوستتان دارند تمام چیزی است که نیاز دارید. این نکته مهم ترین مطلب این پست است :)
توجه به کسانی که دوستشان دارید و دوستتان دارند تمام چیزی است که نیاز دارید. این نکته مهم ترین مطلب این پست است :)


به نام خداوند حکیم

سلام!

در انتشارات اورفیت در یک رشته پست تحت عنوان «داستان ترنسفورمرها»، ماجرای چرایی به وجود آمدن مکانیزم توجه، روند پیشرفتش و درگیری‌های اخیرش رو داریم حکایت می‌کنیم. در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.

این سومین پست از رشته‌پست‌های مذکوره. در پست قبلی مشکلات شبکه‌های بازگشتی را بررسی کردیم و بعد هم نشون دادیم ظهور مکانیزم توجه چه کمکی به شبکه های بازگشتی کرد، حالا در این پست می‌ریم که کار رو برای معرفی ترنسفورمرها تموم کنیم!

برای این که داستان این پست رو بفهمید نیازه که قبلش این داستان‌ها و مفاهیم‌ها رو فهمیده باشین:

  • شبکه های عصبی
  • شبکه های عصبی بازگشتی
  • مکانیزم توجه

آن چه گذشت!

بیاین یک مرور سریع بر آن چه که در دو پست قبلی گذشت داشته باشیم. مشکل از مسائل دنباله به دنباله شروع شد، جایی که اول یک معماری دنباله به دنباله ساده نظیر معماری شکل ۱ پیشنهاد شد. این معماری ایده اولیه خوبی بود ولی عیب و مشکلاتی هم داشت. برای مثال یکی از عیب هاش این بود که کلماتی که اول جمله مبدا بودند اطلاعاتشون به خوبی به قسمت کدگشا منتقل نمی‌شد و موقع آموزش هم گرادیان به خوبی به اون عقب منتقل نمیشد.

شکل ۱: ساختار یک معماری دنباله به دنباله ساده برای مسئله ترجمه ماشینی
شکل ۱: ساختار یک معماری دنباله به دنباله ساده برای مسئله ترجمه ماشینی

این جا یک سری تریک‌ها نظیر برعکس کردن جمله مبدا موقع ورودی دادن به شبکه برای حل مشکلات بالا پیشنهاد شد. منتهی مشکل این بود که باز هم کل اطلاعات جمله مبدا داشت توی بردار آخرین حالت نهان کدگذار ذخیره میشد که یک بردار با طول ثابت بود، یعنی مثلا هر چه قدر که جمله مبدا طولانی تر هم میشد باز هم اطلاعات حاصل از جمله مبدا مجبور بودند توی یک بردار با طول ثابت خلاصه بشن.

این جا بود که ایده مکانیزم توجه خلق و ابداع شد. این ایده این شکلی بود که در قسمت کدگشا برای محاسبه حالت های نهان هر گام، بیایم یک بردار حاصل از جمع وزن‌دار بردارهای حالت نهان قسمت کدگذار محاسبه کنیم که این وزن‌ها هم خودشون تابعی از میزان مشابهت حالت نهان فعلی کدگشا با حالت های نهان کدگشا هستند. نمایی از این ایده در شکل ۲ آمده است.

شکل ۲: ایده مکانیزم توجه
شکل ۲: ایده مکانیزم توجه

مکانیزم توجه تعمیم یافته

فرض کنید یک سری موجودیت وجود دارند و هر موجودیت سه بردار بازنمایی دارد. این سه بردار عبارتند از بردار پرسش (Query) ، بردار کلید (Key) و بردار مقدار (Value) . حال توجه یک موجودیت بر مجموعه موجودیت‌ها می‌شود ترکیب خطی بردارهای مقدار مجموعه موجودیت‌ها که وزن‌های این ترکیب خطی بر حسب میزان مشابهت بردار پرسش موجودیت متوجه با بردارهای کلید هر یک از موجودیت های مورد توجه محاسبه می‌شوند. (جمله سنگینی بود!) برای محاسبه میزان مشابهت هم از ضرب کسینوسی استفاده شده و سپس امتیازات مشابهت‌های به دست آمده به وسیله یک لایه سافتمکس، بین صفر و یک نرمال میشن. حالا اگر تمامی بردارهای پرسش و کلید و مقدار موجودیت‌ها رو کنار هم بذاریم و سه تا ماتریس Q و K و V به دست بیاریم، حاصل مکانیزم توجه از طریق فرمولی که توی شکل ۳ آمده حساب می‌شود. حسن این محاسبات ماتریسی، در موازی سازی بالای اون هستش.

شکل ۳: نحوه محاسبه توجه از طریق محاسبات ماتریسی
شکل ۳: نحوه محاسبه توجه از طریق محاسبات ماتریسی

توجه چندسر

فرض کند بردارهای بازنمایی موجودیت‌هایی که تو بخش قبل راجع بهشون صحبت کردیم اندازه شون ۱۲۸ باشه. در این صورت انجام مکانیزم توجه روی این بردارهای ۱۲۸ تایی میتونه مموری زیادی بگیره. حالا فرض کنید این بردار‌های ۱۲۸ تایی رو با هشت تا شبکه عصبی کم عمق (مثلا یک لایه) تبدیلشون کنیم به ۸ تا بردار با اندازه ۱۶ و حالا بیایم روی این بردارهای ۱۶ تایی عملیات توجه رو انجام بدیم. در نهایت حاصل توجه روی این بردارهای ۱۶ تایی (که خودشون ی سری بردار با اندازه ۱۶ هستن) رو با هم الحاق میکنیم و به بردار با اندازه ۱۲۸ می‌رسیم! (همون برداری که اول می‌خواستیم). به کل این ایده که توش اومدیم یک بردار رو به بردارهای کوچکتر شکوندیم و رو بردارهای کوچکتر عمل توجه رو انجام دادیم و حاصل توجه این بردارهای شکسته شده رو با هم الحاق کردیم، توجه چندسر گفته می‌شه. یک خوبی این توجه چندسر اینه که توش میشه همزمان به چند جنبه اطلاعاتی و چند فضای بازنمایی توجه کرد و خوبی دیگه اش هم اینه که همچنان امکان موازی انجام دادن رو داره. برای فهم بهتر، نمایی از مکانیزم توجه چندسر تو شکل ۴ آمده است.

شکل ۴: مکانیزم توجه چندسر
شکل ۴: مکانیزم توجه چندسر


خب این شد مکانیزم توجه تعمیم یافته که قبل و همه‌چیز مدل ترنسفورمر محسوب میشه حالا از این جا به بعد شروع میکنیم به توضیح دادن خود مدل ترنسفورمر

ساختار کلی ترنسفورمر

ترنسفورمر در واقع یک مدل دنباله به دنباله (کدگذار-کدگشا) است که بدون این که از مکانیزم‌های بازگشتی استفاده کنه سعی داره تا صرفا از مکانیزم توجه استفاده کنه. زیر شبکه کدگذار ترنسفورمر یک دنباله متنی رو تو ورودی می‌گیره و یک بازنمایی از اون رو تولید میکنه. زیر شبکه کدگشا هم بازنمایی حاصل از زیر شبکه کدگذار رو همچنان کلمات تولید شده تا حال حاضر رو (که در قسمت کدگشا تولید شده اند) را میگیره و سعی در تخمین توزیع احتمال کلمه بعد داره. یک نمای کلی از معماری ترنسفورمر تو شکل ۵ آمده است.

شکل۵: نمای کلی از معماری ترنسفورمر
شکل۵: نمای کلی از معماری ترنسفورمر

معماری قسمت‌های کدگذار و کدگشا

قسمت کدگذار از یک پشته از چندین لایه با ساختار یکسان تشکیل شده که هر لایه خروجی خودش رو به عنوان ورودی به لایه بعد تحویل میده. از طرفی هر لایه هم خودش دو بلوک تو خودش داره، بلوک مکانیزم خودتوجهی چندسر و بلوک شبکه عصبی پیشرو تمام متصل. به علاوه تو هر بلوک هم از اتصالات باقی مانده و نرمال کننده لایه استفاده میشه.

قسمت کدگشا دقیقا مانند قسمت کدگذار هستش اما با دو تفاوت. تفاوت اول اینه که هر لایه دارای سه بلوک هستش. بلوک‌های اول و سوم کدگشا دقیقا مثل بلوک های اول و دوم قسمت کدگذار هستند. بلوک میانی ولی نقش اتصال بین کدگذار و کدگشا رو داره و به وسیله یک توجه چند سر عمل توجه رو روی خروجی آخرین لایه کدگذار انجام میده. تفاوت دیگه کدگشا با کدگذار در اینه که در بلوک اول (یعنی توجه به خود) هر توکن تو کدگذار به همه توکن‌های دیگه دنباله ورودی توجه می‌کنه ولی توی بلوک اول کدگشا، هر توکن دنباله مقصد صرفا به توکن‌های قبل از خودش توجه می‌کنه.

علاوه بر بلوک‌های توجه، هر یک از لایه‌های کدگذار و کدگشا تو خودشون یک بلوک شبکه عصبی تمام متصل پیشرو متصل از مکان (اصطلاح دقیق انگلیسی این تیکه میشه Fully Connected Feed Forward Position-Wise Network) هم دارند. خروجی‌های بلوک قبل به عنوان ورودی به این شبکه داده می‌شوند و این شبکه هم به هر برداری تو هر مکانی به صورت جداگانه و البته یکسان اعمال میشه (یعنی این که برای مکان‌های مختلف توی یک لایه پارامتر‌های این شبکه یکسانه) از نظر ساختاری هم این شبکه، یک شبکه با یک لایه مخفیه که اندازه بردارهای ورودی و خروجیش ۵۱۲ و اندازه حالت نهانش هم ۲۰۴۸ هستش. حکمت وجود این شبکه، توانایی استخراج ویژگی از بردارهای حاصل از مکانیزم توجه هست.

مکانیزم تعبیه مکانی

از اونجایی که ساختار شبکه ترنسفورمر بازگشتی نیست، بنابراین لازمه تا مکانیزمی جهت تزریق اطلاعات موقعیت مکانی کلمات دنباله نسبت به یکدیگر به مدل طراحی شود. به منظور حل این چالش در مدل ترنسفورمر برداری به نام بردار تعبیه مکانی درنظر گرفته شده است که بنا به رابطه زیر به دست میاد:

روابط تعبیه مکانی برای مدل ترنسفورمر
روابط تعبیه مکانی برای مدل ترنسفورمر

این بردار تعبیه مکانی با اندازه حالت نهان مدل، به ازای هر توکن با مکان مختلف که متغیر pos هستش، تعریف می‌شه. در نهایت بردار تعبیه مکانی در ابتدای شبکه با بردار تعبیه هر کلمه جمع می‌شه.

شاید براتون سوال بشه که خب چرا sin و cos و چرا اصلا طوری نمیکنن که خود این امبدینگ مکانی قابل یادگیری باشه، پاسخ اینه که سینوسی و کسینوسی در نظر گرفتن این بردارها کمک میکنه تا مدل برت قابل اعمال به هر دنباله‌ای با هر طولی باشه و وابسته به میزان طول رشته‌هایی که روشون آموزش دیده نباشه.

جمع‌بندی

ترنسفورمرها به علت توانایی موازی‌سازی بالاشون نسبت به شبکه های بازگشتی به ذات دیپ لرنینگ نزدیکترن و راحتتر و سریعتر از اونها هم آموزش می‌بینند. از طرفی دیگه وجود مکانیزم توجه به خود چه در قسمت کدگذار و چه در قسمت کدگشا باعث شده تا برای هر کلمه بازنمایی بهتری به دست بیاد. پردازش زبان بعد از به وجود اومدن این معماری دچار تحول بزرگی شد. یکی از این تحولات شبکه‌های از پیش آموزش دیده ترنسفورمری و نهضت انتقال یادگیری در پردازش زبان هستند که بر پایه همین ترنسفورمر بنا شده‌اند. انشالله در آینده ای نه چندان دور به سراغ این ماجراها هم خواهیم رفت ...

نظر یادتون نره

منابع

اسلاید ترنسفورمرز درس یادگیری ژرف دکتر سلیمانی
مقاله Attention Is All You Need


صحنه پس از تیتراژ: