پس از یک وقفهی نسبتاً طولانی، در جلسهی پنجم از دورهی «مقدمهای بر شبکههای عصبی بازگشتی (RNN)»، محوشدگی و انفجار گرادیان دو مشکل اصلی شبکههای عصبی بازگشتی ساده (Simple RNN) را بررسی میکنیم.
تطبیق با دوره ویدئوی
قسمت ششم (۱۹ دقیقه) – محوشدگی و انفجار گرادیانها در شبکههای بازگشتی
در جلسهی چهارم دوره، خاصیت اشتراک وزنها (Weight Sharing [یا Parameter Sharing]) شبکههای RNN را بررسی کردیم و دیدیم که چگونه میتوانیم شبکه را برای دادههایی با گامهای زمانی (Timestep) مختلف اجرا کنیم.
در این جلسه، به بررسی محوشدگی گرادیان (Vanishing Gradient) و انفجار گرادیان (Exploding Gradient)، دو مشکل رایج شبکههای عصبی پرداخته و بررسی میکنیم که چه عاملی باعث ایجاد آنها میشود و چرا در شبکههای بازگشتی شدت بیشتری دارند. لازم به ذکر است، در جلسات آینده به معرفی و بررسی شبکههای GRU و LSTM میپردازیم که راهحلهایی برای مشکلات فوق هستند.
پیش از بررسی مشکلات شبکهی عصبی بازگشتی ساده، لازم است توجه کنیم که شبکههای RNN ساده با وجود مشکلاتی که اشاره خواهیم کرد، بهدلیل داشتن تعداد پارامترهای بسیار کم (به نسبت شبکههای GRU و LSTM که در جلسات آینده با آنها آشنا خواهیم شد) و همچنین دقت قابل قبول در مسائل نسبتاً ساده و سریهای زمانی کوتاه، همچنان گزینهی مناسبی هستند.
مشکل اصلی شبکههای عصبی بازگشتی ساده (Simple RNN) کمحافظه بودن آنهاست. این بدین معنی است که اگر یک دنباله (سریزمانی) به اندازهی کافی طولانی باشد، این شبکهها نمیتوانند اطلاعات چندانی را از مراحل زمانی قبلتر انتقال دهند. به مثال زیر توجه کنید:
فرض میکنیم میخواهیم متن «What time is it» را به یک شبکهی عصبی بازگشتی بدهیم تا پاسخ آن را بدهد. همچنین فرض میکنیم که در هر گام زمانی، یک کلمه خوراک میشود. در این صورت، هدف شبکه این خواهد بود که بفهمد اصل سوال چیست و آن را کد کند. میدانیم که در هر گام زمانی، پارامترهای شبکه متشکل از ورودی آن گام و حافظهی نهان (Hidden State) گام قبلی خواهد بود. بنابراین همانطور که در نمودار فرضی زیر مشخص است، تاثیر هر کلمه با پیشرفت شبکه در طول سریزمانی کاهش مییابد:
این اتفاق باعث میشود تا اطلاعات موجود در دادههای ابتداییِ دنبالهی ورودی با پیشروی شبکه در دادهها بهتدریج از بین رفته و از دسترس خارج شود. این مشکل کمحافظهبودنِ شبکههای عصبی بازگشتی ساده (Simple RNN)، بهدلیل پدیدهی محوشدگی گرادیان (Vanishing Gradient) اتفاق میافتد. محوشدگی گرادیان و انفجار گرادیان (Exploding Gradient) دو مشکل اصلی در شبکههای عصبی بازگشتی هستند که باعث میشوند این شبکهها در فهم دنبالههای طولانی عملکرد مناسبی نداشته باشند.
مشکل محوشدگی گرادیان که در شبکههای پیشخور (Feed Forward) نیز رایج است، ناشی از کمشدن میزان گرادیانِ محاسبهشده در الگوریتم گرادیان کاهشی (Gradient descent) بهدلیل ضربهای متعدد وزنها در اعداد بین ۰ و ۱ است که باعث کوچکترشدنِ میزانِ خطا شده و با حرکت به سمت لایههای نزدیک به ابتدای شبکه شدیدتر میشود. نتیجهی این کم شدن گرادیان، عدم بروزرسانی وزنها و درواقع اتفاق نیفتادن «یادگیری» در لایههای ابتداییست.
یادآوری
فرمول کلی محاسبه وزنها برابر بود با:
new Weight = Weight - Learning rate * Gradient
نکته: نحوهی Backpropagation در شبکههای عصبی بازگشتی
بهعنوانمثال تصور کنید که یک دنباله به طول ۱۰ به یک شبکه عصبی بازگشتی خوراک شود. در این صورت، سلول بازگشتی به تعداد ۱۰ بار، باز شده و به ازای هر ورودی یک خروجی محاسبه میکند. میزان خطا در انتهای هر تکرار محاسبه شده و در انتهای دنباله، خطای تجمعی و یا میانگین در طول سلول پخش شده و وزنها را بروزرسانی میکند.
در شبکههای عصبی بازگشتی، از آنجاییکه طول دنبالههای ورودی میتوانند به مراتب طولانی باشد و یک سلول بازگشتی (RNN Cell) یکسان در تمامی گامهای زمانی استفاده و وزنهای آن بروزرسانی میشود، این مشکل شدیدتر بروز پیدا میکند؛ چرا که وزنهای سلول در هر بار تکرار یکسان بوده و مدام در خود ضرب میشوند.
نکته
در شبکههای پیشخور وزنها عموما تصادفی بوده و احتمال خنثیکردن یکدیگر وجود دارد. بنابراین محوشدگی گرادیان عموما کمتر اتفاق میافتد.
به نمودار زیر دقت کنید:
در باز (unroll)شدن یک شبکهی عصبی بازگشتی، ورودی هر مرحله در وزنها ضرب شده و نتیجه بهعنوان خروجی، در کنار ورودی مرحلهی بعدی در وزنها ضرب میشود. بنابراین باتوجهبه اینکه وزنها در هر بار تکرار یکسان است میتوانیم داشته باشیم:
x(n) = W^n * x(0)
بنابراین درصورتیکه گرادیان کوچک (بین ۰ تا ۱) ایجاد شود این مقدار به تعداد گامهای زمانی در خود ضرب شده و بهسرعت کوچک میشود که منجر به محوشدگی گرادیان میشود.
در قسمت قبل دیدیم که ضرب مکرر وزنهای یکسان در شبکههای بازگشتی ساده منجر به کوچکشدن گرادیان شده و یادگیری شبکه را مختل میکند. حال اگر مقداری بزرگ (بزرگتر از ۱) برای وزنها ایجاد شود، گرادیان به سرعت (نمایی) بزرگ شده و در نتیجه انفجار گرادیان اتفاق میافتد:
W^n * x(0) { w > 1 ? infinite; w < 1 ? 0; }
پیشگیری از پدیدهی انفجار گرادیان به مراتب سادهتر از پیشگیری از محوشدگی گرادیان است. برای مثال با استفاده از قرار دادن شرط حد برای محدود کردن گرادیانها (Gradient Clipping) و یا استفاده از توابع فعالسازی که از ایجاد مقادیر غیرنرمال جلوگیری میکنند (مانند تابع tanh) میتوان این مشکل را تا حد خوبی کنترل کرد.
در شبکههای پیشخور، یکی از راهحلها برای عمیق کردن شبکهها ایجاد اتصالات پرشی بود تا دادههای لایههای اولیه شبکه تاثیر خود را از دست ندهند. در شبکههای پیشخور لایهها با یکدیگر متفاوت بوده و ایجاد اتصالات پرشی ممکن بود. اما در شبکههای عصبی بازگشتی ایجاد چنین اتصالاتی به راحتی ممکن نیست؛ چرا که اگر بهصورت امری اتصالاتی بین دو لایه ایجاد کنیم، ساختار شبکه را ثابت کردهایم و بنابراین قابلیت اشتراک وزن (weight sharing) و اجرا روی دنبالههای با طول متفاوت را از دست خواهیم داد.
در چند جلسه بعد با شبکههای LSTM و GRU آشنا خواهیم شد که با ایدههایی مشابه ایده اتصالات پرشی مشکلات شبکههای عصبی بازگشتی را رفع کردهاند.
در این جلسه به بررسی دو مشکل رایج شبکههای عصبی بازگشتی یعنی محوشدگی و انفجار گرادیانها (Exploding and Vanishing Gradients) در شبکههای بازگشتی پرداختیم و بررسی کردیم که چه عاملی باعث ایجاد آنها شده و چرا در شبکههای بازگشتی شدت بیشتری دارند.
در جلسهی بعدی به معرفی و بررسی شبکههای بازگشتی GRU و LSTM میپردازیم که راهحلهایی برای مشکلات گفته شده هستند.
میتوانید لیست جلسات دوره را در این پست مشاهده کنید.
این دوره به کوشش علیرضا اخوانپور بهصورت ویدئویی تهیه شده و به قلم محمدحسن ستاریان با نظارت ایشان بهصورت متنی نگارش و توسط بهار برادران افتخاری ویرایش شدهست.
در صورت تمایل به خرید دوره بهصورت ویدئویی میتوانید با استفاده از کد تخفیف rnn5 از ۲۰ درصد تخفیف بهرهمند شوید.