نوشته‌ها

شبکه عصبی بازگشتی (Recurrent Neural Network) دسته‌ای دیگر از شبکه های عصبی است. به‌صورت خلاصه به این خانواده از شبکه‌ها، شبکه RNN نیز گفته می‌شود. شبکه عصبی بازگشتی برای پردازش داده سری زمانی (Time Series) و داده ترتیبی (Sequential) مناسب است. سهام در بورس و داده‌های متنی (جمله و پاراگراف) به‌ترتیب مثال‌هایی از داده سری زمانی و ترتیبی هستند (شکل 1 و 2). برای شبکه بازگشتی مولفه زمان اهمیت زیادی دارد. درحالی‌که در شبکه MLP و شبکه CNN توجه به مولفه زمانی دیده نمی‌شود.

مثالی از یک داده سری زمانی
شکل 1: مثالی از داده سری زمانی برای شبکه عصبی بازگشتی (نمودار ارزش سهام شرکت تسلا)

 

شکل 2: مثالی از داده ترتیبی در شبکه بازگشتی (پردازش متن NLP)

ساختار شبکه بازگشتی بسیار به شبکه عصبی MLP شبیه هست. بهتر بگویم RNN توسعه یافته MLP است. شبکه RNN، شبکه LSTM و شبکه GRU سه سلبریتی از خانواده شبکه بازگشتی هستند. در این پست می‌خواهم به تشریح عملکرد ساده‌ترین آنها، شبکه RNN بپردازم. درک کارآیی شبکه RNN به شما کمک می‌کند که بهتر LSTM و GRU را بفهمید.

پس درمورد شبکه عصبی بازگشتی دو نکته مهم زیر را به یاد داشته باشید:

  • شبکه بازگشتی به مولفه زمانی اهمیت می‌دهد و مناسب داده‌های مبتنی بر زمان هست.
  • سه شبکه RNN LSTM GRU گل سرسبد خانواده شبکه های بازگشتی هستند.

خب تا اینجا دیدید rnn چیست. در بخش بعدی چند مثال آوردم که با کارکرد rnn آشنا خواهید شد…

آشنایی با شبکه عصبی بازگشتی

در این بخش می‌خواهم با چند مثال ساده شما را با کارکرد شبکه عصبی بازگشتی آشنا کنم. این مثال از من نیست، اما بعد از کلی جستجو و بررسی منابع مختلف این مثال خوب را پیدا کردم (لینک). همان‌طور که در بخش‌های قبل گفتم، RNN توسعه‌یافته‌ای از MLP است. پس با مثال MLP شروع می‌کنم و به RNN می‌رسم. برویم سراغ مثال‌ها…

مثال 1- شبکه عصبی MLP: انتخاب نوع غذا براساس نوع هوا

شکل 3: مثال 1: انتخاب نوع غذا براساس نوع هوا

یک آشپز داریم سه نوع غذا درست می‌کند. در هر روز نوع غذا را بسته به هوای همان روز تعیین می‌کند. روزهای آفتابی مرغ درست می‌کند و روزهای ابری پیتزا می‌پزد. غذای سوم ساندویچ است که فعلا در برنامه نیست! پس خروجیِ ما نوع غذا و ورودی هم نوع هوا است. به‌نظر می‌رسد مساله ساده‌ای است. با یک تابع یا شبکه عصبی MLP ساده می‌توان تعیین کرد که هر روز چه غذایی خواهیم داشت. به شکل زیر نگاه کنید؛ مشاهده می‌کنید که به یک شبکه عصبی ورودی هوا را داده‌ام و در خروجی انتظار دارم که نوع غذا را بدهد. این مساله برای شبکه MLP شوخی هست!

شکل 4: حل مثال 1 با استفاده از شبکه MLP

این شبکه ساده باید وزن‌های نشان داده شده در شکل زیر را داشته باشد. حالا کافی است ورودی را در ماتریس وزن ضرب کنیم تا خروجی نوع غذا را نشان دهد. سه نوع غذا داشتیم و من یک بردار به طول 3 برای غذاها درنظر می‌گیرم. برای نوع هوا هم چون دو نوع هوا داریم یک بردار به طول 2 تعریف کردم. این بردارها را به‌صورت بردار one-hot نشان داده‌ام. حالا هر بردار هوا در ماتریس MLP ضرب می‌شود و به‌راحتی خروجی نوع غذا را مطابق قانون آشپز تعیین می‌کند. خب این مثال چه ربطی به شبکه عصبی بازگشتی دارد؟! در مثال بعدی خواهید دید…

شکل 5: ماتریس وزن معادل با شبکه عصبی MLP

مثال 2- شبکه عصبی بازگشتی: انتخاب نوع غذا براساس غذای دیروز

چرا شبکه عصبی بازگشتی
شکل 6: مثال 2: انتخاب نوع غذا براساس غذای دیروز

حالا، آشپز تصمیم می‌گیرد قوانین را تغییر دهد! آشپز می‌گوید از این به بعد من ترتیبی غذا درست می‌کنم. یک روز پیتزا، یک روز مرغ و یک روز هم ساندویچ و این روند همین‌طور ادامه می‌یابد… نکته اینجاست که غذای امروز به غذای دیروز وابسته است. یعنی اگر دیروز پیتزا داشتیم، امروز حتما مرغ داریم. بنابراین، باید شبکه‌ای داشته باشیم که غذای دیروز را به‌عنوان ورودی بگیرد و در خروجی غذای امروز را بدهد. پس شبکه‌ای خواهیم داشت که خروجی به ورودی وصل است. شکل زیر را ببینید.

شبکه عصبی RNN
شکل 7: تاثیر خروجی بر ورودی در مثال دوم (رگه‌هایی از اهمیت مولفه زمان)

حالا مشابه مثال 1، این مثال را هم می‌خواهم به‌صورت عددی حل کنم. بردار غذاها را مشابه مثال 1 درنظر گرفته‌ام. حالا بجای شبکه عصبی R در شکل بالا، یک ماتریس به‌صورت زیر قرار می‌دهم. به‌راحتی انتخاب غذای هر روز، براساس غذای دیروز انجام می‌شود. در هر مرحله خروجی برمی‌گردد و وارد شبکه R می‌شود و درنهایت غذای خروجی پیش‌بینی می‌گردد. دراینجا اهمیت مولفه زمانی کاملا مشهود است (تاثیر غذای دیروز در انتخاب غذای امروز). به شبکه عصبی بازگشتی نزدیک و نزدیک‌تر می‌شویم! برویم مثال سوم…

شبکه بازگشتی recurrent neural network
شکل 8: یک ماتریس وزن شامل اعداد 0 و 1 معادل با شبکه R

مثال 3- شبکه عصبی بازگشتی: انتخاب نوع غذا براساس غذای دیروز و هوای امروز

مثال شبکه عصبی بازگشتی
شکل 9: مثال 3: انتخاب نوع غذا براساس غذای دیروز و هوای امروز

خب نشانه‌هایی از اهمیت شبکه بازگشتی در مثال 2 مشهود است. اما می‌خواهم مثال را کمی پیچیده‌تر کنم. آشپز بازهم قوانین را تغییر می‌دهد. می‌خواهد هم براساس نوع غذای و هم هوای امروز عمل کند. یعنی ترکیبی از دو مثال قبل… به‌صورت خلاصه قوانین آشپز این‌گونه است:

  • اگر هوا آفتابی باشد، همان غذای دیروز را درست می‌کند.
  • اگر هوا بارانی باشد، براساس همان روند ترتیبی عمل می‌کند که در مثال دوم دیدیم.

در انیمیشن بالا نحوه انتخاب غذای امروز را نشان داده‌ام. به دو نکته مهم دقت کنید. نکته اول اینکه، بازهم باید خروجی را به ورودی وصل کنیم، چون باید بدانیم غذای دیروز چه بوده است. نکته دوم، علاوه‌بر اتصال خروجی به ورودی، باید یک ورودی به‌نام نوع هوا داشته باشیم. براساس این ورودی مشخص می‌شود که غذای امروز چیست. شکل زیر نمایی از شبکه معادل با این مثال را نشان می‌دهد.

شبکه عصبی بازگشتی RNN
شکل 10: نمایی از شبکه پیشنهادی برای حل مثال سوم

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

نکته در این مثال دیدید که غذای دیروز و نوع هوا با استفاده از شبکه بازگشتی، غذای امروز را مشخص می‌کند. اما یک سوال؛ موافقید که وقتی صحبت از نام غذای دیروز می‌کنیم، در واقع درحال استفاده از حافظه‌مان هستیم؟ بله، واقعا اینطور است که شبکه بازگشتی حافظه دارد. شبکه عصبی بازگشتی سینه به سینه یک‌سری اطلاعات را در طول زمان انتقال می‌دهد!

در دل شبکه عصبی RNN چه خبر است؟

طبق مثال 3، غذای خروجی باید براساس نوع هوا و غذای دیروز تعیین می‌شود. اما سوال اینجاست که داخل این شبکه RNN چه می‌گذرد؟ این دو ورودی در داخل چه کاری می‌کنند که خروجی نهایی تولید می‌شود؟ خیلی ساده بخواهیم فکر کنیم، طبیعتا خروجی مرحله قبل (غذای دیروز) و ورودی جدید در داخل شبکه RNN باید باهم فعل و انفعالاتی داشته باشند. بریم ببینیم زیرکاپوت چه خبر است…

جزئیات شبکه عصبی بازگشتی

طبیعی است که ما دو ورودی شبکه بازگشتی را به شکلی باید باهم ترکیب کنیم. اما مساله اینجاست که این ورودی‌ها اندازه‌هایشان باهم برابر نیست. غذاها یک بردار به طول 3 و هوا یک بردار به طول 2 است. راه مناسب قرار دادن لایه فولی کانکتد یا همان لایه MLP بر سر راه دو ورودی حافظه و اصلی هست. یعنی یک لایه برای ورودی حافظه و یک لایه برای ورودی اصلی درنظر گرفته شود. حالا اگر این دو لایه تعداد نورون مساوی داشته باشند، خروجی این دو لایه باهم برابر می‌شود. مثلا بیایید برای لایه‌های‌مان 3 نورون درنظر بگیریم. پس خروجی هرکدام برابر با یک بردار به طول 3 خواهد بود. حالا علاوه بر نگاشت به یک فضای جدید، ابعاد این دو بردار باهم برابر شده است. حالا می‌توانیم این دو بردار را باهم جمع کنیم.

تشریح اجزای داخل شبکه عصبی بازگشتی
شکل 11: قرار دادن لایه فولی کانکتد بر سر راه ورودی حافظه و ورودی اصلی

باید دو بردار به طول 3 را با هم درایه به درایه جمع کنیم. یعنی، خروجی جمع باید یک بردار به طول 3 باشد. پس از جمع کردن، طبق روال معمول در شبکه MLP از تابع فعالساز غیرخطی استفاده می‌کنیم. خروجی یک بردار به طول 3 است. در شکل زیر، نحوه جمع و عبور از تابع غیرخطی نشان داده شده است.

تشریح اجزای داخل شبکه بازگشتی
شکل 12: اعمال تابع تحریم غیرخطی بر مجموعه دو خروجی غذا و هوا

خروجی یک بردار به‌طول 3 است. اما به یک نکته  باید دقت داشته باشید، این خروجی، فقط غذای امروز را مشخص نمی‌کند. بلکه، ورودی غذای فردا هم هست. شکل زیر، یک فیدبک را نشان می‌دهد که از خروجی به ورودی نوع غذا متصل شده است.

تشریح اجزای داخل شبکه RNN
شکل 13: شبکه عصبی بازگشتی با اضافه کردن مولفه زمانی (فیدبک)

شما ساختار داخلی شبکه عصبی بازگشتی 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 نشان داده شده است. در شکل سمت راست، جزئیات شبکه بازگشتی نشان داده شده است.

ساختار شبکه عصبی بازگشتی RNN
شکل 13: ساختار شبکه عصبی بازگشتی RNN (جزئیات در شکل سمت راست)

خروجی بالا معادل Hidden state بعدی (ht) و خروجی شبکه RNN در زمان t است. حالا از اتصال زنجیره‌ای این یک شبکه به‌هم، شکل زیر به‌وجود می‌آید.

شبکه RNN
شکل 14: نمایش زنجیره‌ای از شبکه عصبی بازگشتی در طول زمان

شبکه عصبی بازگشتی با دو نمایش مختلف

ممکن است برای شما این سوال پیش بیاید که چرا برای شبکه بازگشتی گاهی شکل 14 و گاهی هم شکل 15 را می‌بینیم. تفاوت این دو چیست؟ جواب کوتاه این است که هیچ تفاوتی ندارند. نمایش شکل 14 بازشده (unfold) نمایش شکل 15 است. اگر بخواهیم شبکه شکل 15 را در راستای زمان باز کنیم، یک ساختار زنجیره‌ای از شبکه‌ها حاصل می‌شود. اما نکته‌ای را که باید به آن دقت کنید، این است که ما چندین و چند شبکه نداریم، بلکه فقط یک شبکه داریم. من فقط در راستای زمان این شبکه را باز کرده‌ام.

پس ممکن است در مقالات و کتاب‌ها ببینید که شبکه بازگشتی به شکل 15 نشان داده شده است. حواستان باشد که این نوع نمایش صرفا برای انتقال بهتر مطالب به شماست. چون می‌خواهند نشان دهند که شبکه در راستای زمان ورودی می‌گیرد و حرکت می‌کند. همه این شبکه‌های RNN یکی هستند و تمام پارامترهای آنها یکی است. بازهم تاکید می‌کنم که صرفا نمایش آن به اینصورت است و نه چیز اضافه‌ای…

نمایش شبکه عصبی بازگشتی
شکل 15: نمایشی دیگر از شبکه عصبی بازگشتی

چند مثال ساده با شبکه RNN

سلام دوباره! 😀 در تاریخ 21 شهریور 1401 این پست آپدیت شد و مطالب این بخش را به آن اضافه کردم! می‌خواهم با چند مثال ساده به شما نشان دهم که شبکه RNN چگونه با داده‌های متنی یا سری زمانی کار می‌کند.

شبکه RNN و داده متنی

تصور کنید من یک دیتاست متنی دارم. در این دیتاست یک عالمه جمله وجود دارد و هر جمله‌ای هم یک برچسب دارد. مثلا یک نمونه داده‌اش این است:

خب به این نوع داده‌ها، داده‌های ترتیبی می‌گوییم. یعنی این کلمات به ترتیب و پشت سر هم آمده‌اند. البته داده دنباله‌ای یا Sequential Data هم گفته می‌شود. همانطور که در این جلسه گفته شد، شبکه بازگشتی مخصوص این نوع داده‌هاست. حالا چطور این جمله را باید به شبکه بدهم؟ کافی است به انیمیشن زیر نگاه کنید…

شکل 16: نحوه پردازش متن در شبکه عصبی RNN

تذکر: شاید برای شما این سوال پیش آمده باشد که شبکه بازگشتی ورودی متن می‌گیرد؟ متن که صرفا استرینگ هست. درحالیکه در شبکه بازگشتی هرچه داشتیم لایه فولی کانکتد و حساب کتاب ریاضیاتی بود! چطور متن می‌تواند داخل چنین شبکه‌ای پردازش شود؟ ببینید، من به صورت کلی و ساده نحوه دادن داده متنی به شبکه بازگشتی را نشان دادم. در پردازش متن، روش‌های متعددی برای تبدیل متن به بردار وجود دارد که اینجا جایش نیست مطرح کنم. شما تصور کنید هریک از این کلمات بردارهایی معنی‌دار در عالم جبرخطی و ریاضیات هستند.

حالا اینجا نگفتم به متن بودن اعداد توجه نکنید؟ یکسری‌ها تو کلاس‌ها دقیقا همین جا شروع میکنن به سوال پرسیدن! مثلا این: یعنی این بردار چطور ساخته شده؟ بعد آخرش مجبور میشم اون روش تبدیل متن به بردار رو بهشون بگم. به نظرم حین یاد گرفتن یک مطلبی، باید یکسری از قسمت‌های کم اهمیت رو نادیده بگیریم و به هسته مطلب توجه کنیم. وقتی هسته مطلب رو یاد گرفتیم، می‌تونیم به اون قسمت‌های فرعی فکر کنیم. اینجا تبدیل متن به بردار یک مساله فرعی هست و می‌تونیم بگیم خب این مهم نیست. هر کلمه یه برداره دیگه. حالا بعدا میفهمم این بردار چطوری ساخته شده…

شبکه RNN و سری زمانی

سری زمانی هم یک داده ترتیبی یا دنباله‌ای است. دنباله‌ای از اعداد که همینطور پشت هم با نظم و ترتیب که یک سری زمانی ساخته‌اند. مثلا در شکل زیر یک سری زمانی کوتاه آورده‌ایم:

سری زمانی time series
شکل 17: یک نمونه داده سری زمانی خیلی خیلی کوتاه

این داده فقط یک بردار است. همین! برداری به شکل زیر:

شکل 18: سری زمانی همان بردار خودمان

خب، طبیعتا ترتیب در این داده بسیار مهم است. من نمی‌توانم جای اینها را عوض کنم. همچنین، همیشه هر لحظه به داده‌های قبلی وابسته است. بورس را تصور کنید؛ برای پیش‌بینی آینده، همیشه به روزها و ماه‌های گذشته نگاه می‌کنیم. الان یکسری از دوستان میگن: آخ آخ گفتی بورس، کردی کبابم!

حالا اگر بخواهم بازهم این داده را به شبکه RNN بدهم باید چه کار کنم؟ فکر کنم دیگر برای شما جا افتاده و اصل مطلب را گرفتید. به انیمیشن زیر نگاه کنید:

سری زمانی و شبکه بازگشتی
شکل 19: سری زمانی و شبکه بازگشتی

شبکه عصبی LSTM اولین بار توسط Hochreiter و Schmidhuber در سال 1997 معرفی شد. البته، در سال‌های بعد این کار توسط بسیاری از افراد بهبود داده شد. شبکه LSTM یک شبکه نسبتا قدیمی است. اما در طیف وسیعی از مسائل استفاده می‌شود و هنوز از محبوبیت بالایی برخودار است. به این نمودار که از سایت paperswithcode برداشتم، نگاه کنید؛ می‌بینید که با گذشت زمان، میزان استفاده از LSTM به‌شدت رشد داشته است.

شبکه LSTM
شکل 1: میزان رشد شبکه LSTM در گذر زمان.
  • میزان استفاده از شبکه LSTM در تسک‌های مختلف

همچنین، بازهم از سایت paperswithcode، نمودار زیر را آوردم که به میزان استفاده LSTM در کاربردهای مختلف اشاره دارد. Other اشاره به تسک‌های مختلف و کمتر شناخته‌شده دارد. Other را کنار بگذاریم، می‌بینیم که بیشترین میزان استفاده از LSTM در داده‌های سری زمانی است.

شبکه LSTM در سری زمانی
شکل 2: میزان استفاده از شبکه عصبی LSTM در تسک‌های مختلف.
  • ساختار کلی شبکه عصبی LSTM

شبکه عصبی LSTM هم مانند شبکه RNN به صورت زنجیره‌ای پشت سرهم قرار می‌گیرد. شکل زیر این ساختار زنجیره‌ای را نشان می‌دهد. درادامه این ساختار را بیشتر بررسی می‌کنیم.

شبکه عصبی LSTM
شکل 3: ساختار زنجیره‌ای در شبکه LSTM.
  • یک داستان جالب از شبکه عصبی LSTM

شبکه LSTM در سال 1995 توسط آقای Schmidhuber و همکارش برای کنفرانس NIPS ارسال شد. اما مقاله ریجکت شد. مقاله جلوتر از زمان خودش بود! یک شبکه پیچیده که به راحتی نمی‌شود به عملکرد آن پی برد. در زیر، توئیتی از آقای Schmidhuber مشاهده می‌کنید که گفته 25 سال از ریجکت مقاله LSTM در کنفرانس NIPS می‌گذرد. نگران ریجکت شدن مقالات نباشید…

شبکه LSTM در مقاله NeurIPS 1995
شکل 4: جشن تولد 25 سالگی ریجکت شدن مقاله LSTM!

چند نکته ساده هم بگویم:

  • کنفرانس NIPS همچنان یکی از معتبرترین کنفرانس‌های هوش مصنوعی دنیاست. چند سال پیش نامش اندکی تغییر پیدا کرد و الان با NeuroIPS شناخته می‌شود. بخوانید نوریپس…
  • داستان ردن شدن مقاله LSTM، برای بسیاری از افراد الهام‌بخش هست. چون به این فکر می‌کنند که ریجکت شدن مقاله پایان راه نیست و نباید ناامید شد. البته، به‌نظرم بعضی‌ها زیاده‌روی می‌کنند. بعد از اینکه نتیجه داوری مقالات در یک کنفرانس می‌آید، باید نگاهی به توئیتر بیندازید!
  • طبق این صفحه، آقای Schmidhuber چندان میانه خوبی با LBH (Lecun Bengio Hinton) ندارد! او می‌گوید این افراد جامعه هوش مصنوعی را گمراه کرده‌اند! توضیحات کامل را خودتان بخوانید…

اهمیت شبکه عصبی LSTM

در جلسه قبل درباره شبکه عصبی بازگشتی RNN صحبت کردیم. لزوم وجود شبکه بازگشتی را توضیح دادیم و سپس شبکه RNN ساده را بررسی کردیم. آیا شبکه عصبی LSTM نقطه قوتی نسبت به شبکه RNN دارد یا اینکه صرفا یک نوع شبکه بازگشتی است؟ واقعیت این است که شبکه RNN ضعف‌هایی دارد و LSTM برای حل ضعف RNN پیشنهاد شده است. ضعف‌های قابل توجهی که نمی‌توان آنها را نادیده گرفت. بیایید یک مورد از این ضعف‌ها را بررسی کنیم.

  • شبکه عصبی RNN و وابستگی بلندمدت

شبکه عصبی RNN مشکل وابستگی بلندمدت یا Long Term Dependency دارد. یعنی اینکه، نمی‌تواند در جمله‌ها، پاراگراف‌ها و تمامی دنباله‌های طولانی از داده‌ها عملکرد خوبی از خود نشان دهد. بگذارید یک مثال برای شما بزنم. به این جمله دقت کنید:

من در ایران به دنیا آمدم، کم و بیش بلد هستم که … صحبت کنم.

در چنین جمله‌ای اگر به ما بگویند جای خالی را پر کن، چه می‌کنیم؟ طبیعتا، نیازی نداریم که همه داده‌های قبل از جای خالی را بررسی کنیم. به کلمه “ایران” و “صحبت” نگاه می‌کنیم و سپس می‌گوییم جای خالی کلمه “فارسی” است. برای پی بردن به کلمه جای خالی نیازی نبود که به کلمات همسایه قبل از جاخالی نگاه کنیم. کلماتی مثل: که، هستم، کم و بیش، آمدم و غیره. اتفاقا نگاه کردیم فایده‌ای هم نداشت! پس آنقدر عقب رفتیم تا به مقصود رسیدیم. این مساله چندان عجیب نیست که در یک جمله، فاصله زیادی بین کلمات مرتبط وجود داشته باشد.

متاسفانه، شبکه RNN ساده نمی‌تواند چنین ارتباط فاصله‌داری را یاد بگیرد. این یک نقطه ضعف بزرگ است. اگرچه به ساختار شبکه RNN که نگاه می‌کنیم، به نظر می‌رسد که می‌تواند حتی اطلاعات اولین کلمات را هم به آخرین کلمات انتقال دهد. اما در عمل چنین اتفاقی نمی‌افتد و شبکه RNN ضعف وابستگی بلندمدت دارد.

آیا درست است بگوییم که شبکه RNN حافظه بلندمدتش خوب کار نمی‌کند؟ بله، ای‌کاش شبکه RNN یک سبد حافظه داشت. همین‌طور که کلمه به کلمه در متن جلو می‌رویم، بعضی از کلمات خیلی مهم و کلیدی را در آن سبد بگذاریم. بعدا، هرجایی که خواستیم از آنها استفاده می‌کنیم. مثلا، شبیه شکل زیر، ایران و دنیا را درون سبد حافظه بلندمدت می‌گذاشتیم تا در قسمت ? استفاده کنیم.

شکل 5: یک شبکه RNN با یک سبد حافظه بلندمدت

شبکه LSTM آن سبد بالا را دارد. یعنی می‌تواند یکسری از اطلاعات مهم در هرلحظه در را حافظه بلندمدتش بریزد. برویم بیشتر با LSTM آشنا شویم…

  • شبکه عصبی LSTM و وابستگی بلندمدت

شبکه LSTM مخفف عبارت Long Short Term Memory است. احتمالا حالا برای شما معنی Long Term Memory مشخص شده است. یعنی حافظه بلندمدت دارد و دقیقا نقطه مقابل شبکه RNN است که از این مشکل رنج می‌برد.

شبکه LSTM قادر به یادگیری وابستگی بلندمدت هست.

اما چگونه وابستگی بلندمدت را یاد می‌گیرد؟ باید وارد معماری و جزئیات شبکه عصبی LSTM شویم تا بتوانیم به جواب این سوال برسیم. پس دیگر مقدمات کافی است، برویم سراغ بحث اصلی یعنی، معماری شبکه عصبی LSTM…

معماری شبکه LSTM

شبکه عصبی RNN را به یاد دارید؟ این شبکه یک ورودی و خروجی داشت (شکل زیر سمت چپ). درواقع یک مسیر بین ورودی و خروجی شبکه RNN شکل می‌گیرد. اما شبکه LSTM متفاوت است. این شبکه دو ورودی و خروجی دارد (شکل زیر سمت راست).

شکل 6: مقایسه تعداد ورودی و خروجی در شبکه RNN و LSTM

بین این ورودی و خروجی‌ها، یکی از ورودی‌ها مستقیم به خروجی متصل شده است! به شکل زیر نگاه کنید؛ ورودی Ct-1 مستقیما به خروجی Ct متصل شده است. این اتصال همین‌طور ساده از اول تا آخر دنباله ادامه دارد. C مخفف Cell State هست و یک مولفه کلیدی در LSTM است. به Cell State، حافظه بلندمدت یا Long Term Memory هم گفته می‌شود. بله، عملکردی شبیه همان سبد شکل 5 دارد.

شبکه عصبی LSTM و گیت فراموشی
شکل 7: نگاهی به خط Cell State. به المان و بخش‌های کم‌رنگ توجه نکنید. رفته‌رفته در طول آموزش درموردشون توضیح میدم و در شکل روشنشون ‌میکنم.

این خط ورودی-خروجی از ازل تا ابد، همه بلوک‌های LSTM در استپ‌های زمانی مختلف را به‌هم متصل می‌کند. در گذر زمان، در این حافظه بلندمدت ما (C) اطلاعاتی ذخیره یا از آن حذف می‌شود. این حافظه بلندمدت دو خاصیت مهم و جالب دارد:

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

آن علامت‌های x و + را روی خط Ct-1Ct می‌بینید؟ آنها به ترتیب مربوط به فراموش کردن و به‌خاطرسپردن هستند. درادامه، می‌خواهم در دو بخش جداگانه به شما بگویم که چگونه این فراموشی/به‌خاطرسپردن اتفاق می‌افتد.

  • فراموشی در شبکه LSTM

به علامت × روی خط حافظه بلندمدت در شکل زیر نگاه کنید. این عملگر دو ورودی دارد که یکی همان Ct-1 است. دومی هم یک ورودی است که نمی‌دانیم از کجا آمده است. ولی طبق شکل زیر ورودی قبل از اعمال از یک تابع سیگموید می‌گذرد. این تابع سیگموید باعث می‌شود که خروجی عددی بین 0 تا 1 شود.

تابع سیگموید در شبکه عصبی
شکل 8: ضرب بین دو بردار ft و Ct-1. دقت کنید که هردو ورودی بردار هست و ضرب بین این دو هم درایه به درایه هست. سعی کردیم رنگ‌ها رو معنی‌دار بگذاریم که بتونید ورودی و خروجی رو مقایسه کنید.

توجه توجه داشته باشید که هر دو ورودی از جنس بردار با طول یکسان هستند که به‌صورت درایه به درایه درهم ضرب می‌شوند و به عنوان خروجی یک بردار ایجاد می‌کنند.

حالا به نظر شما خروجی عملگر x چه خاصیتی دارد؟ قبول دارید خروجی همان Ct-1 است با اندک تغییراتی که ورودی ft روی آن ایجاد می‌کند؟ این تغییرات ممکن است به شکل زیر باشد:

  • هر درایه‌ای از fاگر 0 باشد، یعنی به درایه متناظرش در Ct-1 اجازه نمی‌دهد به خروجی برود. یعنی می‌گوید بریز دور!
  • هر درایه‌ای از fاگر 1 باشد، یعنی تمام ورودی Ct-1 به خروجی می‌رود و دست‌نخورده باقی می‌ماند.
  • اگر هم عددی بین 0 تا 1 باشد، طبیعتا تا حدی روی ورودی تاثیر می‌گذارد. پس این‌گونه می‌توانیم اطلاعاتی را از داخل Ct-1 حذف کنیم!

اما ورودی fچگونه تشکیل می‌شود؟ مطابق شکل زیر، این ورودی را یک شبکه عصبی کوچک با دو ورودی xt و ht-1 تشکیل می‌دهد. این شبکه عصبی کوچک، وظیفه فراموشی بخشی از اطلاعات موجود در حافظه بلندمدت را دارد. به این شبکه عصبی گیت فراموشی (forget gate) گفته می‌شود.

شبکه عصبی RNN
شکل 9: گیت فراموشی یک شبکه عصبی کوچک هست که کمی جلوتر ساختار داخلیش رو توضیح میدم. فعلا همین اندازه بگم که شبیه به شبکه عصبی RNN هست.

احتمالا با کلمه فراموشی مشکلی ندارید، چون وظیفه‌اش همین است. اما چرا گفته شده گیت؟ منظور از گیت، یک دریچه یا پیچ قابل تنظیم هست که به ما امکان کنترل می‌دهد. به شکل زیر نگاه کنید؛ این شکل، یک ورودی و خروجی دارد. اما یک پیچ یا تنظیم‌کننده هم وجود دارد که میزان جریان ورودی به خروجی را می‌تواند کنترل کند (کم/زیاد کند). منظور ما از گیت فراموشی هم همین است؛ گیتی که به شبکه LSTM این قابلیت را می‌دهد که بعضی از مولفه‌های موجود در Ct-1 فراموش شوند.

شبکه LSTM و گیت فراموشی
شکل 10: گیت فراموشی شبیه به یک شیر کنترل‌کننده جربان آب هست. با گیت فراموشی، شبکه LSTM میتونه تنظیم کنه که چه چیزی رو فراموش کنه. البته، چه چیزی رو هم همچنان در حافظه نگه داره.

گیت فراموشی یکی از ارکان مهم شبکه LSTM هست. بیایید دقیق‌تر آنرا بررسی کنیم.

  • گیت فراموشی در شبکه LSTM

ساختار گیت فراموشی به ساختار داخلی شبکه عصبی بازگشتی خیلی شبیه هست. آنهایی که پست آموزش شبکه عصبی بازگشتی را خوانده‌اند، درادامه این تشابه را خواهند دید. این شبکه دو ورودی xt و ht-1 دارد. این دو ورودی با هم ترکیب می‌شوند و سپس از یک لایه سیگموید می‌گذرند. لایه سیگموید عددی بین 0 تا 1 ایجاد می‌کند که در بردار ورودی Ct-1 ضرب درایه به درایه می‌شود. تکرار می‌کنم، ft یک بردار است نه یک عدد اسکالر تنها. این بردار به اندازه Ct-1 است. تعیین می‌کند که هر درایه Ct-1 باید در چه عددی از 0 تا 1 ضرب شود. هر درایه از ft اگر به عدد 1 نزدیک باشد، معنایش اینست که این درایه از Ct-1 باید حفظ شود. اگر به 0 نزدیک باشد، یعنی این درایه از Ct-1 را دور بریز.

اما دو بردار ورودی xt و ht-1 چگونه باهم ترکیب می‌شوند؟ بسیار ساده و با بهره گیری از شبکه عصبی mlp. همان‌طور که در شبکه بازگشتی گفتم، کافی است این دو بردار را به دو لایه فولی‌کانکتد بدهیم. سپس این دو را باهم جمع کنیم. فرمول و شکل گیت فراموشی به صورت زیر هست:

شبکه عصبی بازگشتی
شکل 11: فرمول و شکل گیت فراموشی.

در شکل بالا، دو لایه فولی‌کانکتد با وزن‌های whf و wif داریم. این دولایه به‌ترتیب برای ورودی ht-1 و xt هستند. اندیس hf مخفف عبارت hidden و forget هست. اندیس if مخفف عبارت input و forget هست. چرا درباره اندیس‌ها توضیح می‌دهم؟ جلوتر این اندیس‌ها زیاد می‌شوند. این را یادتان باشد که دومین اندیس به نام گیت اشاره می‌کند.

بسیارخب؛ بیایید بخش مربوط به فراموشی را در شبکه LSTM روشن کنیم:

گیت فراموشی در شبکه LSTM
شکل 12: گیت فراموشی در شبکه عصبی LSTM. دو وزن wh و wi وزن‌های مربوط به مسیر ht-1 و xt هستند. اندیس f را در دو وزن حذف کردم. کمی جلوتر دلیلش را متوجه می‌شوید.

در شکل بالا، دو ورودی ft و Ct-1 به‌صورت زیر باهم ترکیب شده‌اند. علامت بین دو متغیر در شکل زیر، اشاره به ضرب درایه به درایه دو بردار ورودی دارد.

گیت فراموشی در کارش بسیار سخت‌گیر است و به درایه‌های Ct-1 به‌راحتی اجازه عبور نمی‌دهد. گیت فراموشی، یک نگهبان امنیتی ویژه است!

شکل 13: تصویری کمتر دیده‌شده از گیت فراموشی اندکی قبل از بازنشستگی!

درمورد گیت فراموشی و وظیفه آن در حفظ یا پاک کردن اطلاعات موجود در Ct-1 صحبت کردیم. احتمالا انتظار دارید که درمورد نحوه ذخیره اطلاعات در Ct-1 (همان به خاطر سپردن) صحبت کنیم.

  • به خاطر سپردن در شبکه عصبی LSTM

بعد از گذر از عملگر x، به عملگر + روی مسیر Ct-1Ct می‌رسیم (شکل 7). اینجا قرار است با ورودی C چیزی جمع شود. یعنی اطلاعات جدیدی به آن اضافه خواهد شد. همان به خاطر سپردن اتفاق می‌افتد. دو ورودی داریم که یکی Ct است. ورودی دوم را فعلا نمی‌دانیم چیست. اما هرچه هست، برداری هم‌اندازه ورودی C است. ببینید، در استپ زمانی جاری (t) پردازش‌هایی انجام داده‌ایم و حالا می‌خواهیم اینها را به سلول حافظه بسپاریم که برای ما نگه دارد.

می‌خواهیم چه اطلاعاتی از حال حاضر (t) را در حافظه بلندمدت ذخیره کنیم؟ به شکل زیر نگاه کنید؛ این اطلاعات با استفاده از یک شبکه عصبی محاسبه می‌شود. این شبکه عصبی همانند گیت ورودی شامل دو ورودی xt و ht-1 است. بازهم این ورودی‌ها باید از دو لایه فولی‌کانکتد (wig و whg) عبور کنند و بعد باهم جمع شوند. حالا این ورودی از یک تابع تانژانت هایپربولیک باید عبور داده شود. خروجی gبین 1- تا 1 خواهد بود. چرا بین 1- تا 1 نیاز داریم؟ ساده هست، برای اینکه ممکن است بخواهیم اثر تعدادی از درایه‌ها یا مولفه‌های موجود در C را کاهش دهیم. یعنی با مقادیر بین 1- تا 1 می‌توانیم اثر بعضی مولفه‌ها را زیاد یا کم کنیم. این هم فرمول تشکیل خروجی:

شبکه عصبی RNN
شکل 14: خروجی gt که اطلاعات استپ زمانی جاری را در دارد. این خروجی هم با یک شبکه عصبی بدست آمده است.

توجه دقت کنید، وزن‌های شبکه جدید wig و whg را در شکل بالا نشان نداده‌ام. دلیلش این هست که می‌خواستم شکل را مثل بقیه شکل‌های موجود از LSTM در اینترنت خلاصه کنم! تا اینجا فهمیدیم که هم گیت فراموشی و هم این شبکه جدید (پردازش اطلاعات فریم جاری)، هردو ساختار مشابهی تا قبل از اعمال تابع تحریک دارند. یعنی هردو شبکه، دو ورودی دارند. هریک از این دو ورودی، به‌صورت جداگانه یک فولی‌کانکتد دارند. درنهایت هم باهم جمع می‌شوند. پس بجای اینکه مدام از ورودی سیم به لایه‌های فولی‌کانکتد متعدد بکشم و شلوغ کنم، آن بخش مشترک را خلاصه کرده‌ام و یک بار کشیده‌ام. اما اصلا منظورم این نیست که وزن‌های این دو شبکه یکی است. نه اصلا! دو شبکه با پارامترهای کاملا جدا هستند. تنها در شکل خلاصه کرده‌ام. دوباره به تصویر نگاه کنید؛ بیرون باکس LSTM دو پارامتر wi و wh را نوشتم. مشخص کرده‌ام که هرنماد تا الان شامل دو لایه فولی‌کانکتد هست. البته تا الان!

اما یک مشکل وجود دارد؛ ما در خروجی gt یک مقداری اطلاعات داریم. اما شاید این ورودی آنقدر ارزش نداشته باشد که بخواهیم Ct-1 را آپدیت کنیم. بله، می‌دانیم که این ورودی هم شامل اطلاعاتی است، اما شاید آنقدر ارزش نداشته باشد که بخواهیم به حافظه بلندمدت بسپاریم! فرض کنید الان در لحظه t در موقعیت کلمه “را” در جمله زیر هستیم:

دو تیم رئال مادرید و بارسلونا برای جلوگیری از همه‌گیری کرونا، درخواست تعویق بازی را دارند.

این کلمه هم برای خودش اطلاعاتی دارد و یک خروجی برای gt تولید کرده است. اما واقعا به خاطر سپردن این کلمه چقدر برای کلمات بعدی مفید است؟ بسیار کم! پس بهتر است همین جا در لحظه قیدش را بزنیم و به حافظه بلندمدت انتقال ندهیم. ما انسان‌ها هم در لحظه گاهی اتفاقی برایمان می‌افتد که تلاش زیادی می‌کنیم که آنرا فراموش کنیم. ارزشش را ندارد بایت‌های ذهن‌مان را اشغال کنیم!

بسیار خب، چطور می‌توانیم این خروجی را بررسی کنیم که ارزش دارد یا نه؟ کافی است نگاهی به گیت فراموشی بیندازیم. اگر از یک گیتی مشابه با ساختار گیت فراموشی استفاده کنیم و آنرا بر سر راه خروجی gt قرار دهیم، می‌توانیم به راحتی تنظیم کنیم که این خروجی چقدر ارزش دارد. پس بازهم یک گیت یا دریچه مشابه شکل 11 نیاز داریم. به این گیت جدید، گیت ورودی (input gate) گفته می‌شود. برویم با گیت ورودی بیشتر آشنا شویم.

  • گیت ورودی در شبکه عصبی LSTM

گیت ورودی، ارزیاب میزان ارزش اطلاعات موجود در gاست. ساده بگویم، گیت ورودی، ورود یکسری اطلاعات جدید به حافظه بلندمدت را بررسی می‌کند. به‌همین خاطر نامش را گیت ورودی گذاشته‌اند. مشابه گیت فراموشی، ممکن است مقادیر موجود در بردار it نزدیک به صفر باشد، بنابراین اثر gt را کم می‌کند. برعکس، ممکن است مقادیر بردار it نزدیک به 1 باشد، دراین‌صورت gt می‌رود تا در حافظه بلندمدت ذخیره شود. اما ساختار این گیت به شکلی است؟ دقیقا مشابه با گیت فراموشی… به شکل زیر دقت کنید؛ گیت ورودی، دو ورودی xt و ht-1 را وارد دو لایه فولی‌کانکتد می‌کند و سپس اینها را باهم جمع می‌کند و درنهایت از تابع سیگموید عبور می‌دهد. این هم رابطه گیت ورودی، رابطه نحوه تشکیل خروجی نهایی (g’t) و البته آپدیت Ct:

گیت ورودی در شبکه LSTM
شکل 15: اضافه شدن گیت ورودی به ساختار داخلی شبکه LSTM. دقت کنید، بازهم چون بخشی از فرآیند این گیت مشابه قبل بوده، در شکل خلاصه شده.

یک فرآیند موثر به‌نام گیت با ساختاری کاملا شبیه به RNN بارها در LSTM تکرار شده است. 

این هم از بخش ذخیره اطلاعات که با استفاده از گیت ورودی انجام شد. تا الان به این پرداختیم که چگونه اطلاعاتی از گذشته را فراموش کنیم و چگونه اطلاعاتی در Ct-1 ذخیره کنیم. اما هنوز کار داریم! هنوز هیچ مسیری بین ht-1 و ht نساخته‌ایم. بالاخره چه اطلاعاتی را به عنوان خروجی این استپ زمانی خواهیم داشت؟ برویم سراغ ادامه کار… خسته شدید؟ طاقت بیار رفیق ما داریم می‌رسیم!

  • ساخت خروجی ht در شبکه LSTM

شبکه بازگشتی LSTM برای ساختن خروجی ht به چه چیزی نیاز دارد؟ چطور است که همان Ct که تازه آپدیت شده را به خروجی متصل کنیم؟ چه چیزی بهتر از حافظه بلندمدت با اینهمه زحمتی که برایش کشیدیم! پس خروجی Ct را از یک تانژانت هایپربولیک عبور می‌دهیم، سپس آماده می‌شویم که آنرا به خروجی ht متصل کنیم. در شکل زیر نشان داده شده است.

شکل 16: گرفتن یک انشعاب از حافظه بلندمدت Ct برای اتصال به ht.

اما یک سوال! تصور کنید، از فردی می‌پرسید تا حالا دو تیم استقلال و پرسپولیس چندبار باهم بازی کردند؟ بعد مخاطب بگوید: “سلام، دو تیم استقلال و پرسپولیس اولین بار در سال فلان باهم بازی کردند که حاصل آن مساوی بود. در بازی دوم، … در بازی سوم و …” همین‌طور بگوید و بگوید تا اینکه برسد به آخرین بازی و درنهایت بگوید بنابراین، تابحال 80 بار باهم بازی کرده‌اند. درحالی‌که، جواب این سوال یک کلمه بود، آن‌هم 80! حالا اگر ما اینهمه اطلاعات موجود در Ct را به ht منتقل کنیم، دقیقا مشابه با همان جواب طولانی است. بهتر است آنقدری که نیاز است را برداریم و به خروجی ht منتقل کنیم. این کار چگونه انجام می‌شود؟ ساده هست، حدس بزنید! یک گیت دیگر به‌نام گیت خروجی (output gate).

  • گیت خروجی در شبکه LSTM

گیت خروجی تعیین می‌کند چقدر از حافظه بلندمدت باید به خروجی منتقل شود. در دل گیت خروجی چه می‌گذرد؟ ساده هست و تکراری، همه باهم یک‌صدا:

گیت خروجی، دو ورودی xt و ht-1 را وارد دو لایه فولی‌کانکتد می‌کند(1)

و اینها را باهم جمع می‌کند(2)

و درنهایت از تابع سیگموید عبور می‌دهد(3).

درنهایت، خروجی تولیدشده از گیت خروجی ot باید در خروجی تابع سیگموید ضرب می‌شود تا آنقدری که نیاز است به خروجی ht منتقل شود. این هم از فرمول‌ها و شکل‌های این بخش:

گیت خروجی در شبکه LSTM
شکل 17: اضافه شدن گیت خروجی به شبکه LSTM

اما، این پایان کار نیست، دو گیت دیگر هم داریم! نه شوخی کردم 😃 معماری شبکه LSTM تمام شد. در شکل زیر، یک نسخه کامل از شبکه عصبی LSTM همراه با تمامی فرمول‌ها را گذاشتم:

lstm
شکل 18: شبکه عصبی LSTM.

بسیارخب،  بیایید مروری کنیم که چه المان‌هایی دیدیم.

شبکه LSTM در یک نگاه

دیدید که شبکه LSTM با این ظاهر پیچیده، شامل چند ایده جذاب و ساده هست. بیایید مباحث این جلسه را مرور کنیم:

  • حافظه بلندمدت داریم و هم اطلاعاتی را فراموش می‌کنیم و هم به خاطر می‌سپاریم.
  • گیت‌هایی داریم که شبیه شیر قابل تنظیم، جریان ورودی به خروجی را کنترل می‌کنند.
  • سه گیت با نام‌های گیت فراموشی، گیت ورودی و گیت خروجی داشتیم.
  • گیت فراموشی برای این بود که اطلاعات غیرضروری گذشته را فراموش کنیم.
  • گیت ورودی برای این بود که بررسی کنیم اطلاعات به‌دست آمده از لحظه جاری (t) ارزش ذخیره در حافظه بلندمدت را دارند یا خیر.
  • گیت خروجی برای این بود که همه اطلاعات موجود در Ct را به خروجی ht منتقل نکنیم. آنقدری را که نیاز داریم به خروجی ht ببریم.
  • گیت‌ها همواره خروجی‌شان بین 0 و 1 هست.
  • گیت‌ها همیشه در یک ورودی دیگر درایه به درایه ضرب می‌شوند.
  • هر گیت دو ورودی دارد: xt و ht-1. دو ورودی در دو لایه فولی‌کانکتد ضرب می‌شوند و بعد باهم جمع می‌شوند و درنهایت از تابع سیگموید عبور می‌کنند.
  • با استفاده از تانژانت هایپربولیک، اطلاعات همواره بین بازه 1- و 1 قرار دارند.
  • شبکه LSTM، چهار برابر شبکه RNN پارامتر و هزینه محاسبات دارد. سه تا گیت دارد و یک شبکه هم برای محاسبه ورودی حافظه (Ct) دارد.
  • شبکه LSTM یک شبکه بازگشتی مبتنی بر گیت هست.
  • نسخه‌های مختلفی از شبکه LSTM در بازار وجود دارد! 😃 حواستان باشد که با شکل‌ها و فرمول‌های مختلف گمراه نشوید. همه آنها شامل ایده گیت‌های (فراموشی، ورودی و خروجی) می‌شوند.
  • یک شکل معروف برای شبکه LSTM وجود دارد که در زیر نشان دادم. این شکل خلاصه نشان داده شده و هیچ‌یک از لایه‌های فولی‌کانکتد را نشان نداده. همان شکل خودمان هست، فقط خلاصه‌اش کردند.
نمایش رایج شبکه LSTM
شکل 19: نمایش رایج شبکه LSTM.