شبکه عصبی GRU
در این آموزش میخواهم درباره شبکه عصبی GRU صحبت کنم. شبکه عصبی GRU یک شبکه بازگشتی است که از دو شبکه عصبی RNN و LSTM جدیدتر هست. نسبتا محبوب هم هست. برای آشنایی با ساختار این شبکه با آکادمی هوش مصنوعی هوسم همراه باشید…
آشنایی با شبکه عصبی GRU
شبکه GRU در سال 2014 توسط Kyunghyun Cho و همکارانش ارائه شد. لازم به ذکر هست که همکارانش آدمهای بزرگی بودند. 😅 آقای Bengio یکی از بزرگان هوش مصنوعی، نامشان در این مقاله هست. حتما نام ایشان را در اینترنت سرچ کنید.
شبکه عصبی GRU شبکهای از جنس خانواده شبکه بازگشتی هست که محبوبیت و کارآیی بالایی دارد. اگر آموزش شبکه عصبی LSTM را مطالعه کرده باشید، میدانید که LSTM یک شبکه بازگشتی مبتنی بر گیت هست. ساختار شبکه عصبی GRU هم مبتنی بر گیت هست. اتفاقا از اسم این شبکه هم مشخص است که یک شبکه گیتی هست: Gated Recurrent Network حتما الان میگید اون که یه نیسان گیت داشت، احتمالا این یه کامیون گیت داره! 😫 اتفاقا نه!
شبکه عصبی GRU ساده شده شبکه LSTM
بله، GRU سادهتر است و پارامترها و گیتهای کمتری دارد. در شبکه عصبی LSTM سه گیتِ ورودی، خروجی و فراموشی وجود دارد. اما شبکه عصبی GRU از دو گیتِ ریست و آپدیت تشکیل شده است. پس از همین جا خاطرتان باشد:
شبکه GRU شامل دو گیت ریست و آپدیت
البته، تحقیقات مختلف و آماروارقام نشان میدهد که عملکرد شبکه LSTM نسبت به GRU بهتر هست. نمودار زیر از سایت paperswithcode نشان میدهد که میزان استفاده از LSTM نسبت به GRU در مقالات بیشتر است. اما اینطور نباشد که به کل GRU را کنار بگذارید. شبکه GRU قدرتمند است و درعین حال پارامترهای کمتری نسبت به LSTM دارد. ممکن هست، در مسالهای GRU همسطح LSTM کار کند؛ در این شرایط، استفاده از GRU بهتر است.
پیشنهاد این آموزش وابسته به دو شبکه عصبی بازگشتی و شبکه عصبی LSTM هست. پیشنهاد میکنم، پیش از مطالعه شبکه GRU این دو آموزش را مطالعه کنید. اگر زمان کمی دارید، حداقل شبکه RNN را بخوانید.
بسیارخب، مقدمات کافی است. کم کم گرم کنیم برای بخشهای جدیتر شبکه GRU! 😬
ورودی و خروجی در شبکه عصبی GRU
ابتدا بیایید همچون گذشته نگاهی به ورودی و خروجی در GRU و مقایسه آن با LSTM و RNN بپردازیم. واضح است که این شبکه از لحاظ ورودی-خروجی به شبکه RNN شبیه هست.
اگر با شبکه LSTM آشنا باشید، میدانید که ct یا Cell State نقش حافظه بلندمدت را دارد. پس در شبکه GRU خبری از Cell State نیست! حال این سوالها پیش میآید:
- اگر Cell State نداریم، یعنی حافظه بلندمدت هم نداریم؟!
- یعنی فراموشی در دنباله طولانی بازهم اتفاق خواهد افتاد؟!
- قابلیت ذخیره در Cell State یا حذف اطلاعاتی از آن، ایده کلیدی در LSTM بود. اینها را در GRU نداریم؟!
عجیب است! حافظه بلندمدت واقعا خوب بود، نه؟ جواب سوالات بالا این است که ما بازهم حفظ اطلاعات برای طولانیمدت و حذف اطلاعات را در شبکه GRU داریم. اما همه این کارها با دو گیت آپدیت و ریست انجام میشود.
درادامه، درباره ساختار داخلی شبکه GRU و گیتهای آن توضیح خواهم داد.
ساختار داخلی شبکه GRU
در شکل زیر، ساختار داخلی شبکه GRU نشان داده شده است. بخشی از ساختار داخلی را پررنگ و بخشی را کمرنگ کردهام. بخش پررنگ، قلب تپنده شبکه GRU است. همانطور که بالاتر گفتم، ساختار داخلی شبکه GRU از دو گیت Update و Reset تشکیل شده است.
تا اینجا فهمیدیم که دو گیت آپدیت و ریست قلب تپنده شبکه GRU هستند و همچنین بر پایه همین دو گیت هست که سایر محاسبات (بخشهای کمرنگ) انجام میشود. بنابراین، در وهله اول شناخت دقیق این دو گیت ضروری است.
اما، یک کلمه مشترک بنام گیت (Gate) داریم که هم در گیت آپدیت و هم گیت ریست وجود دارد. اتفاقا، کلمه بسیار مهمی است و باید این کلمه را دقیق درک کنیم. اگرچه ما در آموزش شبکه عصبی LSTM درباره مفهوم گیت توضیح دادیم، اما ممکن هست شما آن را نخوانده باشید. پس روال کاری ما در ادامه به اینصورت است:
- ابتدا، مفهوم گیت را به شما توضیح میدهم.
- سپس، گیت ریست را تشریح میکنم.
- نهایتا، گیت آپدیت را زیر تیغ جراحی میبرم!
بزن بریم…
گیت یا Gate در شبکه عصبی GRU
اگر کلمه Gate را در بخش Image گوگل کنید، با یک عالمه تصویر دروازه مواجه میشوید! من یکی از آنها را که خیلی قشنگ بود، برای شما آوردم! واقعیت این هست که در شبکه عصبی GRU/LSTM هم، گیت معنای همین دروازه را دارد.
بیایید مرور کنیم که یک دروازه چه خاصیتی دارد:
- در حالت بسته، موجب مسدود شدن مسیر میشود.
- در حالت باز، مسیر باز و هوار هست.
- در حالت نیمهباز، بسته به میزان باز بودن، امکان رد شدن وجود دارد/ندارد!
شبیه به شیر آبهای قدیمی که یک پیچ داشتند و بین مینیموم و ماکزیموم میتوانستیم مقدار آب را تنظیم کنیم. اما این گیتها در شبکه عصبی GRU به چه شکلی هستند؟ شبیه به ساختار داخلی شبکه RNN هستند! به شکل زیر نگاه کنید؛ این شکل، معماری گیت را نشان میدهد که بهصورت زیر کار میکند:
- دو ورودی xt و ht-1 وارد لایههای فولی کانکتد (همان MLP) میشوند. تعداد نورونهای این دو لایه باهم برابر است.
- سپس، بردارهای خروجی باهم درایه به درایه جمع میشوند.
- درنهایت، این بردار از تابع فعالساز سیگموید عبور میکند تا همه درایهها عددی بین 0 تا 1 داشته باشند.
معماری گیت را میتوان بهصورت فرمول زیر بیان کرد:
البته، باتوجه به اینکه این گیت از لحاظ نمایش بسیار بزرگ و جاگیر هست، در شبکههای بازگشتی معمولا گیت را به شکل نمادین نشان میدهند. نمادی که معمولا برای گیت بهکار برده میشود، به شکل زیر هست. مشاهده میکنید که دو ورودی xt و ht-1 وارد یک بلوک مستطیلی شدهاند. این بلوک معادل با لایههای فولی کانکتد است. یعنی، ورودی xt به لایه متناظر خود (Wx) میرود و ht-1 هم به لایه متناظر خود (Wh) میرود. اما بهصورت یکجا و با یک بلوک نشان داده شده است. سپس، خروجیهای این دو لایه باهم جمع میشوند. نهایتا، وارد دایره آبی (تابع فعالساز سیگموید) میشوند و خروجی نهایی ساخته میشود.
خب، دو سوال مهم از شما بپرسم! جواب سوالهای زیر را کامنت کنید:
سوال 1 چرا تعداد نورونهای دو لایه فولی کانکتد x و h باهم برابر است؟
سوال 2 چرا از تابع فعالساز سیگموید استفاده شده است؟
قبل از اینکه وارد بحث گیت ریست و آپدیت شویم، یک جمله مهم باید بگویم:
ساختار گیت ریست و آپدیت برمبنای همان ساختار گیت بالا هست.
پس حالا ما دیگر نگران ساختار گیت ریست و آپدیت نیستیم؛ آن چیزی که باید یاد بگیریم این هست که وظیفه این گیتها در شبکه GRU چیست.
گیت ریست در شبکه GRU
همانطور که گفته شد، یکی از ارکان شبکه GRU همین گیت ریست هست. گیت ریست مسئول تعیین این هست که:
چه مقدار از اطلاعات گذشته باید فراموش یا ریست شود.
خروجی گیت ریست را با rt نشان میدهیم و طبق رابطه آشنای زیر بدست میآید:
گفتیم مسئول تعیین مقدار اطلاعات فراموش یا ریست شده است. این فراموشی یا ریست شدن اطلاعات گذشته چگونه رخ میدهد؟ فکر کنید و بعد ادامه متن را بخوانید! طبق شکل زیر، باید خروجی گیت ریست (rt) را در اطلاعات گذشته (ht-1) ضرب هادامارد کنیم. یعنی درایه به درایه در هم ضرب کنیم. این دو بردار همسایز هستند و بنابراین نگرانی عدمهماهنگی در سایز را نداریم.
پس حاصلضرب rt و ht-1 میزان فراموشی یا ریست شدن اطلاعات گذشته را تعیین میکند. چگونه؟ دقت کنید که تمامی درایههای rt عددی بین 0 تا 1 هستند. اگر یک درایه از rt در درایه متناظر از ht-1 ضرب شود، آنگاه اطلاعات ht-1 ممکن هست حفظ یا ریست شود:
- اگر یک درایه از rt عدد 1 باشد، درایه متناظر از ht-1 فراموش نمیشود.
- اگر یک درایه از rt عدد 0 باشد، درایه متناظر از ht-1 فراموش میشود.
- اگر یک درایه از rt عددی بین 0 تا 1 باشد (0.5)، کمی فراموشی خواهیم داشت!
تا اینجا من مدام از دو گیت ریست و آپدیت صحبت کردم؛ اما واقعیت این هست که در شبکه GRU یک گیت دیگر هم داریم! گیتی که ht کاندیدا را میسازد. در ادامه، این گیت را معرفی میکنم.
گیت کاندیدا در GRU
در شکل زیر، گیت کاندیدا در GRU نشان داده شده است. ساختاری مشابه با گیت ریست، با این تفاوت که بجای تابع فعالساز سیگموید از tanh استفاده شده است. این گیت دو ورودی دارد:
- ورودی xt
- حاصلضرب ht-1 و rt
طبق توضیحات بالا، فرمول گیت کاندیدا بهصورت زیر است:
خروجی این مرحله ht کاندیدا یا Candidate Hidden State هست. درواقع، نامزد پُست ht شده، ولی هنوز این پُست را تصاحب نکرده است. کِی این پست را تصاحب میکند؟ ht کاندیدا منتظر گیت آپدیت هست. گیت آپدیت باید بیاید و تعیین تکلیف کند! پس برویم سراغ گیت آپدیت…
سوال چرا از تابع فعالساز tanh استفاده شده است؟ (جواب را کامنت کنید)
گیت آپدیت در GRU
گیت آپدیت ساختار مشابهی با گیت ریست دارد؛ یعنی، دو ورودی xt و ht-1 دریافت و پس از عبور از لایههای فولی کانکتد، باهم جمع میشوند و نهایتا تابع فعالساز سیگموید اعمال میشود تا خروجی zt بدست آید.
وظیفه گیت آپدیت در GRU این هست که:
چه مقدار از اطلاعات گذشته (ht-1) باید حفظ شود.
و همچنین:
چه مقدار از اطلاعات لحظه جاری (xt) باید در حافظه (ht-1) ذخیره شود.
بنابراین، دو وظیفه مهم دارد. در شکل زیر، نحوه اتصال خروجی گیت آپدیت به دو بخش مختلف نشان داده شده است. این دو اتصال، نشاندهنده دو وظیفه ذکر شده در بالا هستند. بهصورت خلاصه:
- زمانی که zt در ضرب ht-1 میشود، وظیفه اول (تعیین میزان حفظ اطلاعات گذشته) انجام میشود.
- زمانی که معکوس zt در ht کاندیدا ضرب میشود، وظیفه دوم (تعیین میزان حفظ اطلاعات جاری) انجام میشود.
- درنهایت، نتیجه این دو وظیفه باید باهم جمع شوند تا ht نهایی ساخته شود.
خب، این هم از گیت آپدیت… حالا دیگر تمامی اجزای داخلی شبکه GRU را پوشش دادهایم. بد نیست، یک بار بهصورت کامل شبکه GRU را ببینیم…
معماری شبکه GRU
در شکل زیر، معماری داخلی شبکه GRU نشان داده شده است. دو گیت آپدیت و ریست نقش مهمی را در این شبکه عصبی ایفا میکنند. در کنار این دو گیت، یک گیت دیگر بنام گیت کاندیدا هم داریم که ht کاندیدا را تولید میکند. از ترکیب این ht کاندیدا با zt و ht-1، نهایتا ht ساخته میشود.
همچنین، تمامی روابط شبکه GRU که در این آموزش توضیح دادیم:
تـــمــــام! شبکه GRU هم تمام شد و من خوشحالم. البته، مثل همیشه چند بار این متن را میخوانم و اصلاحش میکنم. چطور بود؟ لطفا نظرتان را برای ما کامنت کنید. ما تک تک کامنتها را میخوانیم. ممنون 🌹🙏
مطالب زیر را حتما مطالعه کنید
شبکه عصبی mlp
شبکه ترنسفورمر
مدل MobileLLM
یادگیری عمیق چیست
آموزش یادگیری عمیق رایگان
شبکه عصبی کانولوشن
3 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
و بالاخره GRU.
یادمه یه روزایی خیلی منتظر این پست بودم . میدونستم مثل بقیه مقاله هاتون عالی در میاد. بخاطر پایان نامم به شدت به GRU نیاز داشتم. والبته با وکمک خودتون این نیاز براورده شد و GRu رو پیاده سازی کردم. با اینکه الان دفاع کردم ولی کماکان مشتاقم ادامه پست رو بخونم.😄 امیدوارم به زودی منتشر بشه
سلام منم الان واقعا به توضیحات GRU نیاز دارم میشه کمکم کنید؟
سلام
در دوره یادگیری عمیق 2022، درمورد GRU توضیح داده شده. لینک دوره:
https://howsam.org/downloads/deep-learning-2022/