رفتن به نوشته‌ها

مکانیزم اتنشن (Attention)

مکانیزم اتنشن در اواسط سال 2014 و در حوزه بینایی کامپیوتر (computer vision) معرفی شد [1]. هدف اصلی مکانیزم اتنشن در بینایی کامپیوتر، تمرکز به قسمت‌هایی از تصویر یا ویدئو است که اهمیت بیشتری دارند. به عنوان مثال، یک تصویر بزرگ 50 مگاپیکسلی را در نظر بگیرید که تنها بخش کوچکی از آن دارای اطلاعات مورد نیاز است. درصورتی‌که بخواهیم فیلترهای شبکه پیچشی (CNN) را روی این تصویر اعمال کنیم باید میلیون‌ها بار فیلتر را از آن عبور دهیم. از آنجایی ‌که تنها بخش کوچکی از تصویر برای ما اهمیت دارد این عملیات پرهزینه و زمان‌گیر خواهد بود. مکانیزم اتنشن به این منظور ارائه شد که تنها روی قسمت‌های مهم تصویر تمرکز داشته باشیم.

 

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

این مکانیزم در پردازش زبان طبیعی، اولین بار برای ترجمه ماشین [۲] و سپس در کارهای دیگر مورد استفاده قرار گرفت و ایده آن تعمیم یافت. در پژوهش‌های قدیمی‌ (کلاسیک) ترجمه ماشین (Machine Translation) معمولا از معماری رمزگشا- رمزنگار (encoder-decoder) یا Seq2Seq استفاده میشد. در این معماری‌ها اینجوری بود که جملات ورودی به یک شبکه حافظه کوتاه-مدت ماندگار (LSTM) فرستاده (رمزنگار-encoder) و یک بردار چگال با ابعاد نسبتاً کم در خروجی حاصل می‌شود. این بردار چگال، خروجی مرحله آخر شبکه بازگشتی است و به نحوی تمام اطلاعات قبلی را در برمی‌گیرد (تنها از خروجی  استفاده می‌شود و خروجی‌های قبلی  نادیده گرفته می‌شوند). این خروجی، به عنوان بازنمایی جمله مبدأ در نظر گرفته می‌شود. این خروجی یا همان بازنمایی که LSTM به ما میدهد را به مرحله بعد میفرستادند. در مرحله بعدی، یک شبکة دیگر بازگشتی با حافظه کوتاه-مدت ماندگار (رمزگشا-decoder) به کمک بردار چگال مرحلة قبل، ترجمه کلمة قبلی و بردار وضعیت قبل، ترجمة کلمة بعد را حدس می‌زند (شکل زیر).

همان‌طور که در شکل بالا مشخص است، در هر مرحله (به ازای ترجمه هر کلمه) تنها از خروجی مرحله آخر (y_n) استفاده می‌شود و اطلاعات خروجی‌های دیگر (y_n-1:y_1 های مراحل قبل) نادیده گرفته می‌شود. روش بالا مانند این است که در هنگام ترجمه، فقط یک‌بار جملة مبدأ را خوانده و سپس بدون نگاه کردن به متن اصلی و تنها با چیزهایی که در ذهنمان باقی مانده است شروع به ترجمه کنیم. در واقعیت اما ما به صورت دیگری عمل می‌کنیم و برای ترجمه (به‌خصوص در متون بلند) چندین بار به متن اولیه رجوع کرده و حول کلمه‌ای که قرار است ترجمة کنیم، توقف می‌کنیم. ایده مکانیزم از همین موضوع نشات گرفته است.

برخلاف معماری قبل (رمزنگار-رمزگشا) که تنها از خروجی مرحلة آخر (y_n) استفاده می‌شود در مکانیزم اتنشن به تک‌تک خروجی‌های جملة مبدأ (y_1:y_n) توجه می‌کنیم و سپس ترجمة عبارت موردنظر را انجام می‌دهیم (شکل ‏زیر). به‌طور دقیق‌تر، در این مکانیزم به ازای هر کلمه‌ای که قصد داریم ترجمه ‌کنیم از تمام کلمات مبدأ به‌صورت وزن‌دار استفاده می‌کنیم. اما به ازای هر ترجمه وزن‌های متفاوتی برای آنها در نظر گرفته می‌شود و کلماتی که برای ترجمه کلمة فعلی اهمیت بیشتری دارند وزن بیشتری دریافت می‌کنند (وزن‌ها در شکل با آلفا نمایش داده شده‌اند).

حال سؤالی که مطرح می‌شود این است که این وزن‌ها چگونه باید انتخاب شوند؟ درواقع ما نمی‌توانیم از یک سری وزن ثابت استفاده کنیم. به عنوان مثال، در زبان فارسی افعال عموماً در انتهای جمله قرار می‌گیرند درحالی‌که در زبان انگلیسی افعال بیشتر در اواسط جمله استفاده می‌شوند. حال اگر وزن‌دهی را مبتنی بر موقعیت کلمات در جمله انجام دهیم در مثال بالا دچار مشکل خواهیم شد. علاوه بر این، طول جمله مبدأ و مقصد به هنگام ترجمه اغلب یکسان نیست. پس می‌توان نتیجه گرفت که شبکه باید این وزن‌ها را به‌صورت خودکار یاد بگیرد. یادگیری وزن‌ها با استفاده از یک شبکة پیشرو انجام می‌شود. این شبکه یاد می‌گیرد که چگونه وزن‌های مختلف را تخصیص دهد تا کلمات مرتبط به کلمة فعلی بیشترین وزن را بگیرند.

برای به دست آوردن وزن‌ها، ابتدا ترجمة کلمه قبلی (کلمه‌ای که در مرحلة i-1 توسط رمزگشا حدس زده شده است) از یک شبکة پیشرو (feedforward) عبور داده می‌شود. سپس تک‌تک خروجی‌های رمزنگار از همان شبکة پیشرو عبور داده می‌شود. با ضرب این دو بازنمایی در یکدیگر بردار وزن‌های مکانیزم اتنشن برای کلمة i-ام مشخص می‌شود.

بعد از اینکه وزن‌های کلمات به دست آورده شد (مقادیر آلفا)، می‌توان با جمع وزن‌دار خروجی‌های رمزنگار (y_0 تا y_n)، بردار موردنظر برای حدس کلمة بعدی را به دست آورد (به شکل بالا دقت کنید). وزن‌هایی که از خروجی شبکه پیشرو (feedforward) به دست آمده است در هریک از مقادیر y_i ضرب میشوند و این مقادیر با یکدیگر جمع میشوند و در کنار ترجمه کلمه قبلی (t_i-1) به عنوان ورودی مرحله بعد داده میشوند.
این تکنیک seq2seq with Attention تقریبا در بسیاری از تسک‌های پردازش زبان طبیعی جواب نسبتا قابل قبولی ارائه میدهد و میتواند به عنوان پایه کار شما مورد استفاده قرار بگیرد. در قسمت بعدی به برخی از توسعه‌یافته‌های این مکانیزم میپردازیم.

 

 

References:
[1] V. Mnih, N. Heess, and A. Graves, “Recurrent Models of Visual Attention,” in Proceedings of NIPS, 2014, pp. 2204–2212

[2] D. Bahdanau, K. Cho, and Y. Bengio, “Neural Machine Translation by Jointly Learning to Align and Translate,” in Proceedings of ICLR, 2015

منتشر شده در آموزشیادگیری عمیقیادگیری ماشین

اولین باشید که نظر می دهید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *