مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNNs) - جلسهٔ دوم

در جلسه دوم از دوره‌ی «مقدمه‌ای بر شبکه‌های عصبی بازگشتی (RNN)» به بررسی دقیق‌تر اجزای تشکیل دهنده این شبکه‌ها یعنی واحد‌های بازگشتی و معادلات آن‌ها می‌پردازیم.تطبیق با دوره ویدئوییقسمت دوم (۲۱ دقیقه) – یک سلول (واحد) بازگشتی ساده و شبکه بازگشتیمروردر جلسه اول دوره، با ماهیت و انواع شبکه‌های عصبی بازگشتی آشنا شده و فهمیدیم شبکه‌های RNN برای پردازش توالی‌ها و الگوهای متشکل از چندین مرحله استفاده می‌شوند. همچنین با استفاده از یک مثال ساده چراغ راهنمایی تفاوت این شبکه‌ها با شبکه‌های غیر بازگشتی را بررسی کردیم.یک سلول/واحد بازگشتیشمایی کلی از یک واحد بازگشتی و ورودی‌ها، خروجی و تابع فعال‌سازدر شبکه‌های عصبی بازگشتی ورودی هر مرحله متشکل از دو قسمت است، یک ورودی مستقل از داده جاری همانند دیگر شبکه‌ها (عموما یک داده ترتیبی یا سری زمانی) و یک ورودی از خروجی مرحله‌ی قبل به‌عنوان حافظه‌ی نهان (Hidden State) که انتظار می‌رود مدل در این حافظه نهان، ویژگی‌هایی از داده‌های پردازش شده تا این مرحله را کد کرده و همانند یک حافظه نگه‌داری کند.برای مثال در پروسه پردازش یک ویدیو، ورودی‌های هر مرحله، فریم جاری ویدیو و Hidden State (خروجی) مرحله قبل بوده و خروجی هر مرحله یک بردار Hidden State است که در واقع انتظار می‌رود اینکه تا این مرحله از ویدیو چه چیزی را دیده‌است کد کرده و نگه‌داری کند.توجه به این نکته حائز اهمیت است که با وجود اینکه در این جلسات اولیه آموزش و در توضیح شبکه‌های عصبی بازگشتی و پردازش توالی داده‌ها تنها به این مورد اشاره می‌کنیم که شبکه از نتایج پردازش داده‌های قبلی برای تولید حافظه موقت خود استفاده می‌کند، اما شبکه‌های عصبی بازگشتی لزوما منحصر به این شرط نبوده و می‌توانند با روش‌های مختلفی از داده‌های بعدی (داده‌هایی که در آینده پردازش خواهند شد) نیز برای تولید حافظه استفاده کنند. این ویژگی به‌خصوص در پردازش‌های زبان طبیعی و ترجمه‌های ماشینی اهمیت داشته و استفاده می‌شوند.پردازش واحدبه‌صورت کامل‌تر، سلول‌ها یا واحدهای بازگشتی اجزای تشکیل‌دهنده‌ای هستند که با تکرار آن‌ها (در طول دنباله‌‌ی داده‌های در حال پردازش) تشکیل یک شبکه عصبی بازگشتی می‌دهند. هر واحد بازگشتی متشکل از دو ورودی و یک خروجی به‌همراه وزن‌ها (Weights) و بایاس‌های (Biases) هرکدام است.هر کدام از ورودی‌ها در وزن مربوطه خود ضرب شده و سپس به یکدیگر الحاق (Concatenate) شده (در کنار هم قرار گرفته) و به تابع فعال‌ساز (Activation Function) داده می‌شوند؛ نتیجه‌ی اعمال این تابع فعال‌ساز، خروجی واحدی خواهد بود که به‌عنوان حافظه‌ی نهان (Hidden State) شناخته شده و در مرحله بعد به‌همراه ورودی استفاده می‌شود.ورودی‌ها می‌توانند ابتدا به هم الحاق شده و سپس در یک وزن ضرب شوند. در ادامه در این مورد بحث خواهیم کرد.اینکه تابع فعال‌ساز چه تابعی‌ست و چگونه اعمال می‌شود را نیز بحث می‌کنیم.جابه‌جایی مقادیر بین مراحل اجرای سلول بازگشتیابعاد حافظه نهان (Hidden State)طول بردار حافظه نهان (Hidden State) ثابت نبوده و خود یک ابر پارامتر (Hyper Parameter) است و همانند باقی ابر پارامترها با یک بردار مقادیر تصادفی (Random) و یا بردار صفر (برداری که تمام المان‌هایش صفر هستند) مقداردهی اولیه می‌شود.مدل ذهنیبرای درک درست نحوه‌ی کار شبکه‌های عصبی بازگشتی، نیاز است تا ساختار و مدل ذهنی (Mental Model) درستی از واحد‌های بازگشتی و نحوه قرارگیری و استفاده آن‌ها داشته باشیم که البته در طول دوره و با یادگیری جزئیات بیشتر این مدل ذهنی را توسعه می‌دهیم.توجه کنید که هرچند که به این اجزای سازنده‌ی شبکه‌های بازگشتی، سلول نیز گفته می‌شود، تصور و برداشت از آن‌ها نباید محدود به یک واحد پردازش ساده باشد؛ برای مثال، در تصویر زیر مقایسه‌ای از یک شبکه‌ی تمام-متصل و یک شبکه‌ی بازگشتی معادل را مشاهده می‌کنید که در آن گره‌ها در لایه‌های مختلف یک شبکه‌ی عصبی، فشرده شده و تشکیل یک واحد عصبی بازگشتی می‌دهند [۱]:یک شبکه عصبی تمام-متصل در مقابل یک شبکه عصبی بازگشتیتوالی و باز کردن واحدهادر نمایش، شبکه‌های بازگشتی معمولاً به‌صورت یک واحد بازگشتی که Hidden State خروجی آن به Hidden State ورودی متصل است، مصور می‌شود. در مقابل می‌توان این شبکه را در طول زمان باز کرده (unroll) و آن را به‌صورت دفعات اجرای مختلف نمایش داد که در هر مرحله، ورودی مربوط به Hidden State آن مرحله، از Hidden State خروجی مرحله‌ی قبل استفاده شده است [۲].شمایی از شبکه عصبی بازگشتی باز (Unroll) شدهمشخص است در هر مرحله از اجرای شبکه، یک واحد یکسان (یک شبکه یکسان) استفاده می‌شود. این بدین معنی است که وزن‌ها و بایاس‌های مورد استفاده واحد بازگشتی در هر بار اجرا بروزرسانی می‌شوند.خروجی واحدخروجی گرفتن از واحد بازگشتیبرای خروجی گرفتن از شبکه، یک انشعاب از Hidden State خروجی هر سلول جدا می‌کنیم. این انشعاب در ادامه بسته به‌نوع مسئله به یک شبکه دیگر متصل می‌شود. برای مثال، برای یک وظیفه (Task) طبقه‌بندی چند-کلاسه خروجی هر واحد به یک شبکه تمام-متصل با تابع فعال‌ساز بیشینه هموار (Softmax) متصل خواهد شد.تابع فعال‌سازدر شبکه‌های ساده عصبی بازگشتی معمولا از تابع tanh (تانژانت هذلولی) به‌عنوان تابع فعال‌ساز استفاده می‌شود. tanh تابعی سیگموئید (Sigmoid) بوده تمامی مقادیر ورودی را بین -۱ تا ۱ نگاشت می‌کند. این تابع به‌صورت زیر تعریف می‌شود و نمودار آن قابل رسم است [۲]:نمودار و فرمول تابع tanhویژگی این تابع این است که تمامی ورودی‌ها در بازه ثابتی نگاشت شده و این امکان را می‌دهد تا ورودی‌های بزرگ خیلی پراهمیت و ورودی‌های کوچک خیلی کم‌اهمیت نشوند. در واقع نسبت تاثیر ورودی‌ها را متعادل کرده و باعث بهبود عملکرد مدل می‌شود.همچنین دلیل دیگر استفاده از این تابع، پشتیبانی فریم‌ورک‌های یادگیری ماشین و امکان اجرای این تابع روی GPU برای بهبود سرعت و بازدهی‌ست. استفاده از تابع‌های دیگر ممکن است باعث شوند که اجرای شبکه بازگشتی روی CPU انجام شده و با کندی سرعت مواجه شویم.نشانه‌گذاری و معادلاتقواعد نشانه‌گذاری معادلات واحد بازگشتی می‌توانیم روابط ریاضی میان ورودی و خروجی‌های یک سلول بازگشتی را به‌صورت ضرب‌های ماتریسی فرمول‌بندی کنیم. در این آموزش برای راحتی و سازگاری از قواعد نشانه‌گذاری (notation) پروفسور Andrew Ng استفاده می‌کنیم. در این نشانه‌گذاری علائم به‌صورت زیر تعریف می‌شوند:‏x بردار ورودی واحد‏^y بردار خروجی واحد‏a بردار حافظه نهان یا Hidden State‏w ماتریس وزنبرای مثال، شبکه عصبی بازگشتی ساده‌ای به‌صورت باز (unroll) شده زیر در نظر بگیرید:نمایشی از شبکه عصبی بازگشتی باز (Unroll) شده به همراه ورودی/خروجی‌ها و وزن‌هادر این شبکه، ورودی سلول در هر مرحله (<x<t) در وزن Wax (وزن تولیدکننده a و ضرب‌شونده در x) و Hidden State هر مرحله (<a<t) نیز در وزن Waa (وزن تولیدکننده a و ضرب شونده در a) ضرب می‌شوند. سپس از الحاق نتایج این دو ضرب و اعمال تابع فعال‌سازی (G1 [tanh]) بر آن، Hidden State جدید تولید می‌شود. در ادامه، می‌توان برای گرفتن خروجی، Hidden State به‌دست آمده را در یک وزن Wya (وزن تولیدکننده y و ضرب‌شونده در a) ضرب کرد.معادلات اولیهبا توجه به توضیحات بالا، می‌توان این ضرب‌های ماتریسی را به‌صورت معادلات زیر خلاصه کرد:معادله حافظه نهان (Hidden State) هر مرحلهمعادله حافظه نهان (Hidden State) واحد بازگشتیمطابق این معادله، Hidden State در هر مرحله برابر است با اعمال یک تابع فعال‌ساز مانند G1 بر حاصل جمع، ضرب ورودی و Hidden State مرحله قبل، بر وزن‌هایشان و باباس.معادله خروجی هر مرحلهمعادله خروجی واحد بازگشتیخروجی نیز برابر اعمال تابع فعال‌ساز دیگری (G2) بر حاصل‌جمع، ضرب Hidden State محاسبه‌شده مرحله جاری در وزن مربوطه و بایاس خواهد بود.برای تعیین خروجی، تابع فعال‌ساز انتخاب شده بسته به مسئله متفاوت خواهد بود. برای مثال می‌توانیم برای مسائل دو کلاسه یک نورون و یک تابع سیگموید، برای مسائل چند کلاسه، تابع بیشینه هموار (Softmax) و برای مسائل رگرسیون (Regression) از یک تابع خطی (Linear) استفاده کنیم.لازم به توجه است، در تمامی مراحل اجرای این شبکه بازگشتی، وزن‌هایی که به‌روزرسانی می‌شوند یکسان هستند. یعنی Wax استفاده شده در تمام مراحل استفاده و به‌روزرسانی می‌شود و بایاس‌های مورد استفاده در تمامی مراحل یکسان است.معادلات ساده‌شدهبرای ساده‌ترکردن محاسبات و قواعد نشانه‌گذاری، می‌توان بردارهای ورودی و Hidden State را الحاق کرده و تنها از یک وزن با نام Wa برای آن استفاده کنیم. طبیعی است دراین‌صورت ابعاد این ماتریس وزن تغییر کرده و برابر با [طول ورودی, طول حافظه نهان] خواهد بود. همچنین برای وزن تشکیل دهنده خروجی نیز از نام Wy استفاده می‌کنیم.این معادلات ساده‌ شده، همگام با مطالب آینده‌ی دوره و شبکه‌های LSTM و GRU که در ادامه بررسی خواهیم کرد بوده و باعث سازگاری بهتر خواهند شد.معادلات ساده شده واحد بازگشتینحوه انجام الحاق‌هابرای بررسی ابعاد بردارها و ماتریس‌های هر واحد، مثال زیر را در نظر بگیرید:فرض‌کنید می‌خواهیم مدلی برای پردازش کلمات بسازیم؛ می‌دانیم که طول حافظه نهان (Hidden State) ما یک ابر پارامتر بوده و اختیاری‌ست، در این مثال برای آن مقدار ۱۰۰ المان را در نظر می‌گیریم. اما، بردار ورودی‌ها به مسئله وابسته بوده و در این مثال یک بردار وان هات (One Hot) مثلا یک دیکشنری از کلمات و برداری به طول ۱۰۰۰۰ المان را در اختیار داریم.از آنجایی که خروجی هر مرحله یک بردار ۱۰۰تایی خواهد بود (چون طول بردارِ Hidden State را برابر ۱۰۰ در نظر گرفتیم)، در این صورت طول ماتریس‌های وزن‌ Waa و Wax به‌صورت زیر خواهند بود:الحاق بردارهای a و xبردارهای ورودی هر مرحله و حافظه نهان (Hidden State) را به‌صورت عمودی به یکدیگر الحاق می‌کنیم تا در نهایت یک بردار از مجموعه طول‌های آن‌ها (در مثال ما ۱۰۱۰۰ المان) داشته باشیم:الحاق ماتریس‌های Wax و Waaهمچنین، ماتریس‌های وزن‌های مربوط به ورودی هر مرحله و حافظه نهان (Hidden State)، یعنی به‌ترتیب Wax و Waa را به‌صورت افقی به یکدیگر الحاق می‌کنیم تا در نهایت یک ماتریس به ابعادِ [طول ورودی, طول حافظه نهان] (در مثال ما [۱۰۱۰۰, ۱۰۰]) داشته باشیم:در این جلسه در ادامه مباحث جلسه‌ی قبل، به بررسی دقیق‌تری از واحدهای بازگشتی، اجزای اصلی تشکیل‌دهنده شبکه‌های عصبی بازگشتی پرداختیم و فهمیدیم ورودی‌ها و خروجی‌های هر واحد چیست و چگونه تشکیل می‌شود، به‌علاوه با معادلات ماتریسی آن‌ها آشنا شده و قواعد نشانه‌گذاری استاندارد آن را مرور کردیم.در جلسه‌ی بعدی یک شبکه عصبی بازگشتی ساده برای تخمین یک تابع سینوسی پیاده‌سازی می‌کنیم.در جلسات آینده برای پیاده‌سازی‌ها از زبان پایتون و کتابخانه‌ی Keras استفاده می‌کنیم. اگر با این کتابخانه یا کتابخانه‌‌های دیگری مثل numpy یا Matplotlib آشنایی ندارید، تا جلسه‌ی آینده فرصت خوبیست مرور کلی‌ای بر آن‌ها داشته باشید.می‌توانید لیست جلسات دوره را در این پست مشاهده کنید.جلسه‌ی قبلیجلسه‌ی بعدیاین دوره به کوشش علی‌رضا اخوان‌پور به‌صورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان به‌صورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شده‌ست.در صورت تمایل به خرید دوره به صورت ویدئویی می‌توانید با استفاده از کد تخفیف shenasablog_rnn2 از ۲۰ درصد تخفیف بهره‌مند شوید.منابعدر انتهای هر پاراگراف این پست شماره‌ی منبع یا منابعی که در نگارش آن قسمت از آن‌ها کمک گرفته شده ذکر شده، در لیست زیر می‌توانید هر کدام از این منابع را مشاهده و مطالعه کنید:[۱] آموزش‌های simplilearn[۲] آموزش‌های IBM Cloud