داستان ترنسفورمرها (۱): ناکارآمدی بازگشتی‌ها

توجه توجه!
توجه توجه!


سلام!

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

در ضمن قطعا این متن مشکلاتی داره. اگر دیدینشون بگید بهم لطفا. کاریشون ندارم، فقط می‌خوام درستشون کنم.

حالا قسمت دوم این رشته پست با نام داستان ترنسفورمرها (۲): attention برمی‌خیزد! و قسمت سومش هم با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شدند.

ضعف شبکه‌های RNN و ظهور LSTM, GRU

همونطور که احتمالا می‌دونید، از شبکه‌های بازگشتی برای پیش‌بینی سری‌ها استفاده می‌شه. مثلا متن یک «سری» از کلماته یا مثلا پیش‌بینی قیمت در بورس با توجه به قیمت‌های قبلی. حالا مشکل از اونجا شروع می‌شه که این سری طولانی بشه. اینجاست که RNN دیگه پاسخ‌گو نیست چون ممکنه مشکل ناپایداری گرادیان‌ها (unstable gradients) اذیتش کنه و البته مشکل بزرگ‌تر اینه که شبکه، ورودی‌های اولی را فراموش می‌کنه. راه‌حل‌های این دو تا مشکل را خیلی سریع مرور کنیم (اگر دوست داشتید عمیق‌تر نگاه کنید، لینک مقاله‌ها را گذاشتم که مطالعه کنید):

اول. نبرد با گرادیان‌های ناپایدار

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

تصویری از قسمت «نبرد حرامزاده‌ها» از سریال «بازی تاج و تخت»
تصویری از قسمت «نبرد حرامزاده‌ها» از سریال «بازی تاج و تخت»


خب این مشکل برای هر شبکه‌ای ممکنه پیش بیاد پس بیاید قضاوتش را فقط به خدا بسپریم و RNN رو هم مثل شبکه‌ی خودمون بدونیم. یک سری راه‌حل‌ها که برای بقیه شبکه‌ها کار می‌کنه برای RNN هم استفاده می‌شه. بعضی‌هاش هم دیگه حناشون برای RNN رنگی نداره. مثلا اینجا هم می‌تونیم از مقداردهی‌های اولیه‌ی خوب برای وزن‌ها، الگوریتم‌های بهینه‌سازی سریع‌تر، dropout و کوچک کردن learning rate استفاده کنیم. ولی خب مثلا تابع فعال‌سازی ReLU دیگه خیلی کارساز نیست و ممکنه حتی اوضاع را بدتر کنه واسه همین به صورت پیش فرض تابع فعال‌سازی تانژانت هایپربولیکه. و همچنین در این مقاله مشخص شد Batch Normalization روی RNN مثل بقیه‌ی شبکه‌های feed forward نیست و اینجا خوب کار نمی‌کنه چون با گذاشتنش بین گام‌های زمانی نتایج خوبی نمی‌ده و فقط می‌تونیم بین دو لایه‌ی بازگشتی بگذاریم و نه داخلش و در این حالت هم فقط از هیچی بهتره. به جاش در این یکی مقاله یه روش دیگه به اسم Layer Normalization معرفی کردند که به جای اینکه نرمالایز کردن را روی بعد batch انجام بده، روی بعد ویژگی‌های داده‌ (features) انجام می‌ده و خب نتایجش خیلی خوبه.

دوم. نبرد با آلزایمر

کاراکتر dory (طبیعتا سمت راستی) در کارتون «در جستجوی نمو» که حافظه‌ی کوتاه مدتش مشکل داشت!
کاراکتر dory (طبیعتا سمت راستی) در کارتون «در جستجوی نمو» که حافظه‌ی کوتاه مدتش مشکل داشت!


داستان اینه که شبکه‌های RNN ما یک جمله طولانی را شروع می‌کنه به خوندن، به آخرش که می‌رسه اولش یادش می‌ره! دلیلش هم در ساختار RNN مشخصه دیگه. واسه حل این مشکل اومدند انواع و اقسام long-term memory ارائه دادند. یعنی حافظه‌هایی که به صورت طولانی مدت اطلاعات را نگه دارند. قطعا LSTM یا همون حافظه‌ی کوتاه‌مدت طولانی (Long Short-Term Memory) یکی از معروف‌ترین‌‌هاست و در این مقاله ارائه شده! اونم سال ۱۹۹۷! این معماری را ساده‌تر کردند و GRU را در این مقاله ارائه دادند. معماری‌های این شبکه‌ها خودش یک پست دیگه می‌تونه باشه و سعی می‌کنیم در آتی بنویسیم. ولی به صورت خلاصه این معماری‌ها یک سلول حافظه دیگه هم دارند که در اونجا اطلاعات طولانی‌مدت‌تر نگه‌داری میشه. در تصویر زیر c حافظه‌ی طولانی‌مدت ماست و h حافظه کوتاه‌مدت. جلوی c هیچ تبدیلی نیست گرادیان وزن‌ها تقریبا دچار مشکل محوشدگی یا انفجار نمی‌شود. البته خواهیم دید که این اوضاع را بهتر کرد ولی باز هم مشکلات داره. یعنی باز هم اگر سری خیلی طولانی بشه، پاسخ‌گو نیست.

یک سلول LSTM. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.
یک سلول LSTM. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.


ناکارآمدی زیربنایی شبکه‌های بازگشتی

بعد از مدتی مشخص شد که شبکه‌های بازگشتی مشکلات زیربنایی دارند و اگر بخواهیم روی سری‌های طولانی‌تری کار کنیم باید از این معماری‌ها عبور کنیم. در ادامه یکی از کاربردهای شبکه‌های کدگذار-کدگشا به نام ترجمه ماشینی عصبی (Neural Machine Translation) را بررسی می‌کنیم و با این کاربرد بررسی می‌کنیم که این ناکارآمدی چطور مشکل‌ساز می‌شه.

استفاده از شبکه‌های کدگذار-کدگشا برای ترجمه ماشینی

معماری و نکات این شبکه‌ها هم خودش یه داستان مجزاست. اما به صورت خلاصه این شبکه‌ها از دو بخش کدگذار (encoder) و کدگشا (decoder) تشکیل شدند. بخش کدگذار یک سری می‌گیره و یک بردار می‌ده و بخش کدگشا برعکس؛ یک بردار می‌گیره و یک سری پس می‌ده. مثلا در ترجمه ماشینی، این شبکه یک جمله از یک زبان می‌گیره و یک جمله از زبان دیگه پس می‌ده. قسمت کدگذار این جمله از زبان مبدا را به یک بردار تبدیل می‌کنه و قسمت کدگشا این بردار را می‌گیره و تبدیل به جمله در زبان مقصد می‌کنه. همونطور که در تصویر زیر مشخصه اول کار encoder تموم می‌شه و بعد کار decoder شروع می‌شه.

یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.
یک شبکه‌ی کدگذار-کدگشا برای ترجمه ماشینی. این تصویر از کتاب فوق‌العاده‌ی hands-on machine learning برداشته شده است.


برای آموزش این شبکه جمله‌ی زبان مبدا به encoder داده می‌شه و جمله مقصد به decoder داده می‌شه البته با یک شیفت زمانی. یعنی در هر مرحله کلمه‌ای را به decoder می‌دهیم که باید در مرحله قبل خروجی می‌داد و به عنوان اولین ورودی (قبل از اولین کلمه جمله) بهش یک توکن به اسم SOS (توکنی برای start-of-sequence) می‌دهیم و جمله مبدا را هم برعکس می‌کنیم که اولین کلمه‌ی جمله آخرین ورودی به encoder باشه. چرا؟ به صورت معمول این برعکس کردن انجام نمی‌شه و پس از مدتی عملکرد ضعیف این شبکه‌ها، این ایده به ذهن محققین رسید که جمله ورودی را برعکس به encoder بدن. این باعث می‌شه که کلمات اول جمله‌ی اول فاصله کم‌تری با کلمات اول جمله‌ی دوم داشته باشه. حالا این ریسک «فاصله کم‌تر» می‌تونه باعث تولیدشدن بهتر کلمات اول جمله مقصد بشه و این امید هست که در ادامه هم جمله مقصد بهتر تولید بشه.

مشکل

مشکل مسیر طولانیه. مسیری که مثلا کلمه‌ی انگلیسی milk در تصویر بالا باید طی کنه تا برسه به کلمه‌ی فرانسوری lait. یعنی از اولین encoder تا آخرین decoder. خب مشکل چیه؟ مشکل اینه که بردار ساخته شده برای کلمه milk تمام این مسیر باید کامل و سالم منتقل شه بدون اینکه احتمالا استفاده‌ای ازش بشه و همینطور باید گرادیان تمام این مسیر را هم برگرده. خب نمیشه این مسیر را کوتاه‌تر بکنیم؟ چرا می‌شه. اینجاست که «مکانیزم توجه» برمی‌خیزد و همه چیز را شخم می‌زند. ایده‌ی اصلی «مکانیزم توجه» را در پست بعدی می‌نویسیم.

همونطور که گفتم، حالا قسمت دوم این رشته پست با نام داستان ترنسفورمرها (۲): attention برمی‌خیزد! و قسمت سوم این رشته پست با نام داستان ترنسفورمرها (۳): توجه و دیگر هیچ! منتشر شدند.

منابع

این متن خلاصه‌ای از بخش‌های مرتبط در کتاب (فصل ۱۵ و ۱۶) و ویدیوی زیره. پس اگر دوست دارید خیلی خوب این مطالب را بفهمید حتما به این دوتا منبع هم مراجعه کنید.

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 2nd Edition
  • https://www.youtube.com/watch?v=iDulhoQ2pro

لایک و نظر یادتون نره. فعلا!