شبکه عصبی بازگشتی (Recurrent Neural Network) دستهای دیگر از شبکه های عصبی است. بهصورت خلاصه به این خانواده از شبکهها، شبکه RNN نیز گفته میشود. شبکه عصبی بازگشتی برای پردازش داده سری زمانی (Time Series) و داده ترتیبی (Sequential) مناسب است. سهام در بورس و دادههای متنی (جمله و پاراگراف) بهترتیب مثالهایی از داده سری زمانی و ترتیبی هستند (شکل 1 و 2). برای شبکه بازگشتی مولفه زمان اهمیت زیادی دارد. درحالیکه در شبکه MLP و شبکه CNN توجه به مولفه زمانی دیده نمیشود.
ساختار شبکه بازگشتی بسیار به شبکه عصبی MLP شبیه هست. بهتر بگویم RNN توسعه یافته MLP است. شبکه RNN، شبکه LSTM و شبکه GRU سه سلبریتی از خانواده شبکه بازگشتی هستند. در این پست میخواهم به تشریح عملکرد سادهترین آنها، شبکه RNN بپردازم. درک کارآیی شبکه RNN به شما کمک میکند که بهتر LSTM و GRU را بفهمید.
پس درمورد شبکه عصبی بازگشتی دو نکته مهم زیر را به یاد داشته باشید:
- شبکه بازگشتی به مولفه زمانی اهمیت میدهد و مناسب دادههای مبتنی بر زمان هست.
- سه شبکه RNN LSTM GRU گل سرسبد خانواده شبکه های بازگشتی هستند.
خب تا اینجا دیدید rnn چیست. در بخش بعدی چند مثال آوردم که با کارکرد rnn آشنا خواهید شد…
آشنایی با شبکه عصبی بازگشتی
در این بخش میخواهم با چند مثال ساده شما را با کارکرد شبکه عصبی بازگشتی آشنا کنم. این مثال از من نیست، اما بعد از کلی جستجو و بررسی منابع مختلف این مثال خوب را پیدا کردم (لینک). همانطور که در بخشهای قبل گفتم، RNN توسعهیافتهای از MLP است. پس با مثال MLP شروع میکنم و به RNN میرسم. برویم سراغ مثالها…
مثال 1- شبکه عصبی MLP: انتخاب نوع غذا براساس نوع هوا
یک آشپز داریم سه نوع غذا درست میکند. در هر روز نوع غذا را بسته به هوای همان روز تعیین میکند. روزهای آفتابی مرغ درست میکند و روزهای ابری پیتزا میپزد. غذای سوم ساندویچ است که فعلا در برنامه نیست! پس خروجیِ ما نوع غذا و ورودی هم نوع هوا است. بهنظر میرسد مساله سادهای است. با یک تابع یا شبکه عصبی MLP ساده میتوان تعیین کرد که هر روز چه غذایی خواهیم داشت. به شکل زیر نگاه کنید؛ مشاهده میکنید که به یک شبکه عصبی ورودی هوا را دادهام و در خروجی انتظار دارم که نوع غذا را بدهد. این مساله برای شبکه MLP شوخی هست!
این شبکه ساده باید وزنهای نشان داده شده در شکل زیر را داشته باشد. حالا کافی است ورودی را در ماتریس وزن ضرب کنیم تا خروجی نوع غذا را نشان دهد. سه نوع غذا داشتیم و من یک بردار به طول 3 برای غذاها درنظر میگیرم. برای نوع هوا هم چون دو نوع هوا داریم یک بردار به طول 2 تعریف کردم. این بردارها را بهصورت بردار one-hot نشان دادهام. حالا هر بردار هوا در ماتریس MLP ضرب میشود و بهراحتی خروجی نوع غذا را مطابق قانون آشپز تعیین میکند. خب این مثال چه ربطی به شبکه عصبی بازگشتی دارد؟! در مثال بعدی خواهید دید…
مثال 2- شبکه عصبی بازگشتی: انتخاب نوع غذا براساس غذای دیروز
حالا، آشپز تصمیم میگیرد قوانین را تغییر دهد! آشپز میگوید از این به بعد من ترتیبی غذا درست میکنم. یک روز پیتزا، یک روز مرغ و یک روز هم ساندویچ و این روند همینطور ادامه مییابد… نکته اینجاست که غذای امروز به غذای دیروز وابسته است. یعنی اگر دیروز پیتزا داشتیم، امروز حتما مرغ داریم. بنابراین، باید شبکهای داشته باشیم که غذای دیروز را بهعنوان ورودی بگیرد و در خروجی غذای امروز را بدهد. پس شبکهای خواهیم داشت که خروجی به ورودی وصل است. شکل زیر را ببینید.
حالا مشابه مثال 1، این مثال را هم میخواهم بهصورت عددی حل کنم. بردار غذاها را مشابه مثال 1 درنظر گرفتهام. حالا بجای شبکه عصبی R در شکل بالا، یک ماتریس بهصورت زیر قرار میدهم. بهراحتی انتخاب غذای هر روز، براساس غذای دیروز انجام میشود. در هر مرحله خروجی برمیگردد و وارد شبکه R میشود و درنهایت غذای خروجی پیشبینی میگردد. دراینجا اهمیت مولفه زمانی کاملا مشهود است (تاثیر غذای دیروز در انتخاب غذای امروز). به شبکه عصبی بازگشتی نزدیک و نزدیکتر میشویم! برویم مثال سوم…
مثال 3- شبکه عصبی بازگشتی: انتخاب نوع غذا براساس غذای دیروز و هوای امروز
خب نشانههایی از اهمیت شبکه بازگشتی در مثال 2 مشهود است. اما میخواهم مثال را کمی پیچیدهتر کنم. آشپز بازهم قوانین را تغییر میدهد. میخواهد هم براساس نوع غذای و هم هوای امروز عمل کند. یعنی ترکیبی از دو مثال قبل… بهصورت خلاصه قوانین آشپز اینگونه است:
- اگر هوا آفتابی باشد، همان غذای دیروز را درست میکند.
- اگر هوا بارانی باشد، براساس همان روند ترتیبی عمل میکند که در مثال دوم دیدیم.
در انیمیشن بالا نحوه انتخاب غذای امروز را نشان دادهام. به دو نکته مهم دقت کنید. نکته اول اینکه، بازهم باید خروجی را به ورودی وصل کنیم، چون باید بدانیم غذای دیروز چه بوده است. نکته دوم، علاوهبر اتصال خروجی به ورودی، باید یک ورودی بهنام نوع هوا داشته باشیم. براساس این ورودی مشخص میشود که غذای امروز چیست. شکل زیر نمایی از شبکه معادل با این مثال را نشان میدهد.
شکل بالا، یک شماتیک ساده از شبکه عصبی بازگشتی است. دراینجا ما داده سری زمانی نداریم، اما داده ترتیبی داریم که هربار خروجی حاضر به خروجی قبلی خود وابسته است. پس بهصورت کلی، شبکه عصبی بازگشتی، خروجی مرحله قبل (t-1) را بهعنوان ورودی مرحله (t) اثر میدهد.
نکته در این مثال دیدید که غذای دیروز و نوع هوا با استفاده از شبکه بازگشتی، غذای امروز را مشخص میکند. اما یک سوال؛ موافقید که وقتی صحبت از نام غذای دیروز میکنیم، در واقع درحال استفاده از حافظهمان هستیم؟ بله، واقعا اینطور است که شبکه بازگشتی حافظه دارد. شبکه عصبی بازگشتی سینه به سینه یکسری اطلاعات را در طول زمان انتقال میدهد!
در دل شبکه عصبی RNN چه خبر است؟
طبق مثال 3، غذای خروجی باید براساس نوع هوا و غذای دیروز تعیین میشود. اما سوال اینجاست که داخل این شبکه RNN چه میگذرد؟ این دو ورودی در داخل چه کاری میکنند که خروجی نهایی تولید میشود؟ خیلی ساده بخواهیم فکر کنیم، طبیعتا خروجی مرحله قبل (غذای دیروز) و ورودی جدید در داخل شبکه RNN باید باهم فعل و انفعالاتی داشته باشند. بریم ببینیم زیرکاپوت چه خبر است…
جزئیات شبکه عصبی بازگشتی
طبیعی است که ما دو ورودی شبکه بازگشتی را به شکلی باید باهم ترکیب کنیم. اما مساله اینجاست که این ورودیها اندازههایشان باهم برابر نیست. غذاها یک بردار به طول 3 و هوا یک بردار به طول 2 است. راه مناسب قرار دادن لایه فولی کانکتد یا همان لایه MLP بر سر راه دو ورودی حافظه و اصلی هست. یعنی یک لایه برای ورودی حافظه و یک لایه برای ورودی اصلی درنظر گرفته شود. حالا اگر این دو لایه تعداد نورون مساوی داشته باشند، خروجی این دو لایه باهم برابر میشود. مثلا بیایید برای لایههایمان 3 نورون درنظر بگیریم. پس خروجی هرکدام برابر با یک بردار به طول 3 خواهد بود. حالا علاوه بر نگاشت به یک فضای جدید، ابعاد این دو بردار باهم برابر شده است. حالا میتوانیم این دو بردار را باهم جمع کنیم.
باید دو بردار به طول 3 را با هم درایه به درایه جمع کنیم. یعنی، خروجی جمع باید یک بردار به طول 3 باشد. پس از جمع کردن، طبق روال معمول در شبکه MLP از تابع فعالساز غیرخطی استفاده میکنیم. خروجی یک بردار به طول 3 است. در شکل زیر، نحوه جمع و عبور از تابع غیرخطی نشان داده شده است.
خروجی یک بردار بهطول 3 است. اما به یک نکته باید دقت داشته باشید، این خروجی، فقط غذای امروز را مشخص نمیکند. بلکه، ورودی غذای فردا هم هست. شکل زیر، یک فیدبک را نشان میدهد که از خروجی به ورودی نوع غذا متصل شده است.
شما ساختار داخلی شبکه عصبی بازگشتی RNN را در شکل بالا میبینید.
کمی ریاضیات چاشنی پست شبکه عصبی بازگشتی کنیم!
من سعی کردم که با چند مثال ساده کارکرد شبکه بازگشتی را به شما توضیح دهم. شبکهای که در شکل 13 دیدید، ساختار شبکه RNN است. سادهترین مدل از خانواده شبکه بازگشتی… حالا در بخش بعدی کمی علمیتر و برمبنای ریاضیات به توضیح شبکه عصبی بازگشتی RNN میپردازم.
تمرین من در مثال 1 و 2، با قرار دادن ماتریسهایی، بهصورت عددی کارکرد شبکه ها را به شما نشان دادم. آیا میتوانید بجای دو لایه 3 نورونی بالا، ماتریس اعداد قرار دهید و خروجی مطلوب را تولید کنید؟ بجای دو لایه، دو ماتریس 2×3 و 3×3 قرار دهید. دو ماتریس را در کامنت بنویسید…
شبکه عصبی بازگشتی RNN
در این قسمت میخواهم روابط ریاضی یک شبکه عصبی بازگشتی را برای شما بیان کنم. انتظار دارم، باتوجه به مثالهای بخش قبل، این بخش را به آسانی متوجه شوید. شبکه عصبی بازگشتی شامل دو ورودی حافظه و ورودی اصلی است. به ورودی حافظه hidden state گفته میشود و معمولا با نماد h نشان داده میشود. ورودی اصلی هم با x… در شکل زیر نمایی از شبکه RNN نشان داده شده است.
در مثال 3 دیدیم که هریک از دو ورودی به یک لایه MLP متصل شده است. دو لایه whh و wxh را بهترتیب برای ورودی h و x درنظر گرفتم. حالا باید ht-1 و xt بهعنوان ورودی وارد RNN شده و در دو ماتریس وزن whh و wxh ضرب شوند. طبق رابطه زیر، پس از ضربها، جمع انجام میشود. یک بایاس هم گذاشتهام. درنهایت، خروجی از تابع تحریک غیرخطی مانند tanh عبور داده میشود. خروجی تابع تحریک، همان ht است. در رابطه و شکل زیر ساختار RNN نشان داده شده است. در شکل سمت راست، جزئیات شبکه بازگشتی نشان داده شده است.
خروجی بالا معادل Hidden state بعدی (ht) و خروجی شبکه RNN در زمان t است. حالا از اتصال زنجیرهای این یک شبکه بههم، شکل زیر بهوجود میآید.
شبکه عصبی بازگشتی با دو نمایش مختلف
ممکن است برای شما این سوال پیش بیاید که چرا برای شبکه بازگشتی گاهی شکل 14 و گاهی هم شکل 15 را میبینیم. تفاوت این دو چیست؟ جواب کوتاه این است که هیچ تفاوتی ندارند. نمایش شکل 14 بازشده (unfold) نمایش شکل 15 است. اگر بخواهیم شبکه شکل 15 را در راستای زمان باز کنیم، یک ساختار زنجیرهای از شبکهها حاصل میشود. اما نکتهای را که باید به آن دقت کنید، این است که ما چندین و چند شبکه نداریم، بلکه فقط یک شبکه داریم. من فقط در راستای زمان این شبکه را باز کردهام.
پس ممکن است در مقالات و کتابها ببینید که شبکه بازگشتی به شکل 15 نشان داده شده است. حواستان باشد که این نوع نمایش صرفا برای انتقال بهتر مطالب به شماست. چون میخواهند نشان دهند که شبکه در راستای زمان ورودی میگیرد و حرکت میکند. همه این شبکههای RNN یکی هستند و تمام پارامترهای آنها یکی است. بازهم تاکید میکنم که صرفا نمایش آن به اینصورت است و نه چیز اضافهای…
چند مثال ساده با شبکه RNN
سلام دوباره! 😀 در تاریخ 21 شهریور 1401 این پست آپدیت شد و مطالب این بخش را به آن اضافه کردم! میخواهم با چند مثال ساده به شما نشان دهم که شبکه RNN چگونه با دادههای متنی یا سری زمانی کار میکند.
شبکه RNN و داده متنی
تصور کنید من یک دیتاست متنی دارم. در این دیتاست یک عالمه جمله وجود دارد و هر جملهای هم یک برچسب دارد. مثلا یک نمونه دادهاش این است:
خب به این نوع دادهها، دادههای ترتیبی میگوییم. یعنی این کلمات به ترتیب و پشت سر هم آمدهاند. البته داده دنبالهای یا Sequential Data هم گفته میشود. همانطور که در این جلسه گفته شد، شبکه بازگشتی مخصوص این نوع دادههاست. حالا چطور این جمله را باید به شبکه بدهم؟ کافی است به انیمیشن زیر نگاه کنید…
تذکر: شاید برای شما این سوال پیش آمده باشد که شبکه بازگشتی ورودی متن میگیرد؟ متن که صرفا استرینگ هست. درحالیکه در شبکه بازگشتی هرچه داشتیم لایه فولی کانکتد و حساب کتاب ریاضیاتی بود! چطور متن میتواند داخل چنین شبکهای پردازش شود؟ ببینید، من به صورت کلی و ساده نحوه دادن داده متنی به شبکه بازگشتی را نشان دادم. در پردازش متن، روشهای متعددی برای تبدیل متن به بردار وجود دارد که اینجا جایش نیست مطرح کنم. شما تصور کنید هریک از این کلمات بردارهایی معنیدار در عالم جبرخطی و ریاضیات هستند.
حالا اینجا نگفتم به متن بودن اعداد توجه نکنید؟ یکسریها تو کلاسها دقیقا همین جا شروع میکنن به سوال پرسیدن! مثلا این: یعنی این بردار چطور ساخته شده؟ بعد آخرش مجبور میشم اون روش تبدیل متن به بردار رو بهشون بگم. به نظرم حین یاد گرفتن یک مطلبی، باید یکسری از قسمتهای کم اهمیت رو نادیده بگیریم و به هسته مطلب توجه کنیم. وقتی هسته مطلب رو یاد گرفتیم، میتونیم به اون قسمتهای فرعی فکر کنیم. اینجا تبدیل متن به بردار یک مساله فرعی هست و میتونیم بگیم خب این مهم نیست. هر کلمه یه برداره دیگه. حالا بعدا میفهمم این بردار چطوری ساخته شده…
شبکه RNN و سری زمانی
سری زمانی هم یک داده ترتیبی یا دنبالهای است. دنبالهای از اعداد که همینطور پشت هم با نظم و ترتیب که یک سری زمانی ساختهاند. مثلا در شکل زیر یک سری زمانی کوتاه آوردهایم:
این داده فقط یک بردار است. همین! برداری به شکل زیر:
خب، طبیعتا ترتیب در این داده بسیار مهم است. من نمیتوانم جای اینها را عوض کنم. همچنین، همیشه هر لحظه به دادههای قبلی وابسته است. بورس را تصور کنید؛ برای پیشبینی آینده، همیشه به روزها و ماههای گذشته نگاه میکنیم. الان یکسری از دوستان میگن: آخ آخ گفتی بورس، کردی کبابم!
حالا اگر بخواهم بازهم این داده را به شبکه RNN بدهم باید چه کار کنم؟ فکر کنم دیگر برای شما جا افتاده و اصل مطلب را گرفتید. به انیمیشن زیر نگاه کنید: