داستان ترنسفورمرها (۲): attention برمی‌خیزد!

به نام خداسلام!در انتشارات اورفیت در یک رشته پست تحت عنوان «داستان ترنسفورمرها»، ماجرای چرایی به وجود آمدن مکانیزم توجه، روند پیشرفتش و درگیری‌های اخیرش رو داریم حکایت می‌کنیم. در تلگرام می‌تونید دنبالمون کنید و اگر هم متن خوبی در حوزه‌ی هوش مصنوعی و پردازش زبان طبیعی داشتید که در انتشارات یا کانال بگذاریم، از همون‌جا ندا بدید.این دومین پست از رشته‌پست‌های مذکوره. در پست قبلی مشکلات شبکه‌های بازگشتی را بررسی کردیم و در این پست می‌خواهیم ببینیم مکانیزم توجه چه راه‌حلی براش ارائه داده. حتما پست قبلی با نام داستان ترنسفورمرها (۱): ناکارآمدی بازگشتی‌ها را بخونید. قسمت سوم این رشته پست هم با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شده.شکل ۱. توجه توجه!برای اینکه این پست را بهتر متوجه بشید نیازه که با این مباحث آشنا باشید:مفاهیم ابتدایی شبکه‌های عصبی مصنوعی مثل تابع فعال‌سازیشبکه‌های بازگشتیشبکه‌های کدگذار-کدگشادر این پست می‌خواهیم این مباحث را با هم بررسی کنیم:ایده‌ی اولیه: مکانیزم توجه باهدانا (Bahdanau)مکانیزم توجه لوآنگ (Luong)خلاصه روابط ریاضی مکانیزم‌هاکاربردهای دیگر مکانیزم توجهدر ضمن قطعا این متن مشکلاتی داره. اگر دیدینشون، بگید بهم لطفا. کاریشون ندارم، فقط می‌خوام درستشون کنم.۱. ایده‌ی اولیه: مکانیزم توجه باهدانا (Bahdanau)شکل ۲. یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.در پست قبل دیدیم مشکل شبکه‌های بازگشتی، مسیر طولانیه که مثلا بردار کلمه‌ی انگلیسی milk در تصویر بالا باید کامل و سالم طی کنه تا برسه به کلمه‌ی فرانسوری lait و همینطور باید گرادیان تمام این مسیر را هم برگرده. اینجاست که «مکانیزم توجه» صحنه را دست می‌گیره. آقای باهدانا (Bahdanau) و شرکا(!) در سال ۲۰۱۴ در یک مقاله‌ی خفن، تکنیکی را معرفی کردند که ساختار کدگشا بتونه در هر قدم فقط روی کلمات مناسب تمرکز و «توجه» کنه. مثلا وقتی می‌خواد کلمه‌ی lait را تولید کنه به کلمه‌ی milk توجه کنه. خب این ایده باعث شد مسیر بین یک کلمه در زبان مرجع و ترجمه‌اش خیلی کوتاه‌تر بشه و مشکل حافظه‌ی کوتاه مدت شبکه‌های بازگشتی خیلی کم‌تر مشکل ساز بشه. این ایده بازی را مخصوصا برای متن‌های طولانی (بیشتر از سی تا کلمه) زیر و رو کرد. در این معماری علاوه بر state سلول کدگذار آخر، تمام خروجی‌های کدگذار را هم به کدگشا می‌فرستیم. چرا؟ تا در هر گام، کدگشا یک جمع وزن‌دار بین این خروجی‌ها حساب کنه و همین وزن‌ها هستند که مفهوم توجه را پیاده می‌کنند؛ یعنی اونی که وزن بیشتری داره، سهم بیشتری را در این بردار حاصل از جمع وزن‌دار داره پس بهش توجه بیشتری می‌شه. به این تصویر توجه کنید:شکل ۳. یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی به همراه مکانیزم توجه! این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.وزن‌های مذکور همان αها در تصویر بالا هستند که همراه شبکه قراره آموزش ببینند. در این تصویر (α(t,i نشان‌دهنده‌ی وزن خروجی کدگذار iام در گام زمانی t است. مثلا اگر (α(3,1 بیشتر از (α(3,0 و (α(3,2 باشه، یعنی در گام سوم کدگشا به کلمه‌ی دوم (طبیعتا ایندکس کلمه‌ی اول صفره) که drink است، بیشتر از دو کلمه‌ی دیگر توجه خواهد کرد. جمع وزن‌دار از خروجی‌های کدگذار به کدگشا داده می‌شن و غیر از این مورد، بقیه‌اش مثل کدگذار-کدگشا معمولی کار می‌کنه؛ یعنی مثل شکل ۱ در هر مرحله، خروجی مرحله قبل (در شکل ۳، مثلا در مرحله‌ی تولید (y'(3، خروجی مرحله‌ی قبل کلمه‌ی du است) و لایه‌های پنهان مرحله قبل (در شکل۳: (2)h) به کدگشا داده می‌شه. دقت کنید در شکل ۳ فقط جمع وزن‌دار خروجی‌های کدگذار و لایه‌های پنهان مرحله قبل مشخص شده و خروجی از مرحله قبل آورده نشده ولی این خروجی در شکل ۲ به صورت (x'(i مشخص شدند. پس امیدوارم مشخص شده باشه که کدگشا در این معماری سه تا ورودی می‌گیره: خروجی مرحله قبل، لایه‌های پنهان مرحله قبل و جمع وزن‌دار از خروجی‌های کدگذار با ضرایب مکانیزم توجه.حالا سوالی که می‌مونه اینه که این αها از کجا میان که لطف کنند و اهمیت را مشخص کنند؟ همون‌طور که در سمت راست شکل ۳ مشخص شده، این وزن‌ها با استفاده از یک شبکه‌ی کوچک به اسم alignment model یا attention model تولید شدند. این شبکه یک لایه‌ی time-distributed Dense و بعد هم یک لایه‌ی softmax داره. لایه‌ی اول به عنوان ورودی تمام خروجی‌های کدگذار (در شکل: (y(i) و لایه‌ی پنهان مرحله قبل کدگشا (در شکل: (h(t-1) را می‌گیره. این دو تا ورودی به هم الحاق (concatenate) و به این شبکه داده می‌شه. خروجی (در شکل: (e(t,i) هم یک امتیاز به ازای هر کدوم از این خروجی‌های کدگذاره. این امتیازها نشون می‌ده که هر کدوم از این خروجی‌های کدگشا و لایه‌ی پنهان مرحله قبل کدگشا چقدر هم‌راستا (aligned) و شبیه به هم هستند. بعد هم این خروجی وارد یک لایه‌ی softmax می‌شه و همون αهای عزیز ساخته می‌شن. طبیعتا جمع این αهای یک هستند. به این نوع مکانیزم توجه می‌گن مکانیزم باهدانو یا بخاطر اینکه y و h را به هم الحاق کردیم، بهش می‌گن مکانیزم الحاقی (catenative attention) یا مکانیزم تجمیعی (additive attention). اگر جمله‌ی ورودی n تا کلمه داشته باشه و فرض کنیم که خروجی هم همین تعداد کلمه داشته باشه، باید n^2 تا وزن حساب بشه که چون جمله‌ها معمولا طولانی نیستند، مشکل خاصی نیست.۲. مکانیزم توجه لوآنگ (Luong)آقای لوآنگ (Luong) و شرکا در سال ۲۰۱۵ در یک مقاله‌ی خفن دیگه، مدل مکانیزم بعدی را معرفی کردند. همونطور که در قسمت قبل گفته شد، هدف والای مکانیزم توجه اینه که شباهت‌های بین خروجی‌های کدگذار (y) و لایه‌ی پنهان مرحله قبل کدگشا (h) را محاسبه کنه؛ پس در این مقاله برای محاسبه‌ی شباهت از ضرب داخلی (فاصله کسینوسی) استفاده کردند که طبیعتا باید ابعاد این دو تا بردار یکسان باشند. بعد نتایج این ضرب‌های داخلی، مثل مدل قبل به یک لایه‌ی softmax داده می‌شن. مورد بعدی که در این مقاله استفاده شد این بود که از لایه‌ی پنهان همین مرحله‌ی کدگشا (یعنی (h(t) به جای مرحله‌ی قبل (یعنی (h(t-1)استفاده کردند. در مدل قبل خروجی مکانیزم توجه در تولید همین (h(tها دخالت داشتند (گفتیم که کدگشا سه تا ورودی می‌گرفت که خروجی مکانیزم هم یکیشون بود) ولی در این یکی مدل، از خروجی‌های مکانیزم توجه مستقیم برای خروجی نهایی کدگشا استفاده می‌شن. به صورت کلی در شبکه‌های عصبی می‌دونیم که لایه‌های نهان به یک تابع فعال‌سازی داده می‌شن تا خروجی تولید شن ولی اینجا این لایه‌های نهان کدگشا را می‌دیم به مکانیزم توجه و از خروجی اون برای ساختن خروجی نهایی کدگشا (در ترجمه، کلمه در زبان مقصد) استفاده می‌کنیم. به این مدل، مکانیزم توجه لوآنگ (Luong) یا مکانیزم توجه ضرب نقطه‌ای (dot) یا مکانیزم توجه ضربی (multiplicative) می‌گن. در این مقاله یک مدل دیگه هم برای محاسبه‌ی ضرب داخلی ارائه شد که روی خروجی کدگذار، اول یک تبدیل خطی (مثل مدل باهدانو با استفاده از یک لایه‌ی time-distributed Dense بدون متغیر bias) زده می‌شد و بعد ضرب داخلی با لایه‌ی پنهان کدگشا. به این یکی مدل، مکانیزم توجه عمومی (general) می‌گن.مکانیزم الحاقی و مکانیزم‌های ضرب داخلی در همین مقاله مقایسه شدند و مشخص شد که مکانیزم‌های ضرب داخلی عملکرد بهتری دارند.۳. خلاصه روابط ریاضی مکانیزم‌هاخروجی مکانیزم توجه به صورت ˜h (حرف h باکلاه!) در شکل ۴ مشخص شده که همون‌طور که گفته شد جمع وزن‌دار خروجی‌های کدگشاست. خود ضریب‌ها از تابع softmax روی امتیازها محاسبه شدند. امتیازها هم در هر کدوم از سه مدل dot و general و concat به طوری که در شکل اومده محاسبه شدند. در ضمن اون W هم که در فرمول‌ها اومده، همون تغییر خطیه که با استفاده از لایه‌ی time-distributed Dense اجرا می‌شه. شکل ۴. خلاصه روابط ریاضی مکانیزم‌های توجه. این تصویر از کتاب فوق‌العاده‌ی hands on machine learning برداشته شده است.اگر دلتون می‌خواد پیاده‌سازی انواع مکانیزم‌هایی که معرفی شد ببینید، این لینک و این لینک خوبه.۴. کاربردهای دیگر مکانیزم توجهمکانیزم توجه فقط در ترجمه ماشینی نیست و خیلی جاها استفاده می‌شه. دو تا از نمونه‌هاش را اینجا آوردیم.۴.۱. مکانیزم توجه دیداری (visual)تولید توضیح تصویر (image captioning) با استفاده از مکانیزم توجه در سال ۲۰۱۶ در یک مقاله ارائه شد. تصویر به یک شبکه‌ی کانولوشنی (CNN) داده می‌شد تا ویژگی‌های خوب را استخراج کنه، بعد این ویژگی‌ها به یک شبکه‌ی کدگشا (شبکه بازگشتی با مکانیزم توجه) داده می‌شد تا در هر مرحله یک کلمه از توضیح عکس را تولید کنه. به این تصاویر دقت کنید:شکل ۵. در هر جفت تصویر، تصویر سمت چپ ورودی به مدل و تصویر سمت راست قسمتی از تصویر است که مدل قبل از تولید کلمه‌ای که زیرش خط کشیده شده، به آن توجه کرده! این تصویر از مقاله‌‌ی مذکور برداشته شده است.کدگشا در هر مرحله که می‌خواد یک کلمه را تولید کنه، از مکانیزم توجه استفاده می‌کنه تا روی قسمت مناسبی از تصویر توجه کنه. در تصاویر بالا می‌تونید ببینید که مدل قبل از تولید کلمه‌ای که زیرش خط کشیده شده، به کدوم قسمت از تصویر توجه بیشتری کرده. معرکه‌ست!! ۴.۲. تفسیرپذیری مدلیکی دیگه از کاربردها یا مزایای مکانیزم توجه اینه که می‌تونیم بفهمیم چجوری مدل این خروجی را تولید کرده. یعنی داخل مغزش چی گذشته؟ به این موضوع می‌گن توضیح‌پذیری (Explainability) یا تفسیرپذیری (interpretability) مدل. سال ۲۰۱۶ یک مقاله ارائه شد و از همین توضیح‌پذیری مدل استفاده کرد. در این مقاله یک مدل برای تشخیص عکس سگ هاسکی و گرگ آموزش دادند که توضیح برای عکس‌ها بنویسه. بعد یک عکس سگ بهش دادند و انتظار داشتند خروجیش «سگ در برف داره راه می‌ره» باشه ولی مدل اشتباه تشخیص داد و گفت: «گرگ در برف داره راه می‌ره.»مشکل چی بود؟ با استفاده از مکانیزم توجه، فهمیدند مدل وقتی کلمه‌ی «گرگ» را داشته تولید می‌کرده، به برف هم داشته توجه می‌کرده؛ پس احتمالا مشکل اینه که مدل اشتباهی فکر کرده هر وقت دور اون جانور کلی برف باشه گرگه وگرنه سگه. بعد اومدند یک سری عکس از گرگ بدون برف و یک سری عکس سگ در برف به داده‌ها اضافه کردند که مشکل حل بشه. عکس پایین را ببینید.شکل ۶. توضیح اینکه چرا مدل هاسکی را گرگ تشخیص داده! این تصویر از مقاله‌ی برداشته شده است. ۵. جمع‌بندیخب اینم از این پست. در این پست ایده‌ی اولیه مکانیزم توجه و انواعش را توضیح دادیم، روابط ریاضی شون را مرور کردیم و دو نمونه از کاربردهای این مکانیزم را بررسی کردیم. امیدوارم مفید بوده باشه. در پست بعدی می‌ریم سراغ مقاله‌ی بازی‌عوض‌کنِ Attention Is All You Need و معماری ترنسفورمرها را توضیح خواهیم داد. به‌به! همانطور که گفتم، حالا قسمت سوم این رشته پست با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شده. ۶. منابعاین متن ترجمه و خلاصه‌ای از بخش‌های مرتبط از فصل ۱۶ کتاب hands-on ml، ویدیو و مقاله‌های زیره. پس اگر دوست دارید خیلی بهتر این مطالب را بفهمید، حتما بهشون مراجعه کنید.Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 2nd Editionhttps://www.youtube.com/watch?v=iDulhoQ2proNeural Machine Translation by Jointly Learning to Align and Translate (https://arxiv.org/abs/1409.0473)Effective Approaches to Attention-based Neural Machine Translation (https://arxiv.org/abs/1508.04025)Show, Attend and Tell: Neural Image Caption Generation with Visual Attention (https://arxiv.org/abs/1502.03044)“Why Should I Trust You?” Explaining the Predictions of Any Classifier (https://arxiv.org/pdf/1602.04938.pdf)لایک و نظر یادتون نره. فعلا!