آموزش شبکه عصبی بازگشتی بخش چهارم : معرفی GRU

1 520

بسم الله الرحمن الرحیم

در بخش قبل با چگونگی پیاده سازی یک شبکه عصبی بازگشتی معمولی آشنا شدیم. سپس در ادامه با مشکل محوشدگی گرادیان آشنا شدیم و دیدیم که این نوع شبکه ها با چه مشکلاتی مواجه اند و چگونه میتوان با این مشکلات مقابله کرد. در این بخش ما به معرفی و توضیح شبکه عصبی بازگشتی GRU میپردازیم که مشکلات شبکه عصبی بازگشتی معمولی را ندارند.

GRU – Gated Recurrent Unit

معماری GRU یا همان Gated Recurrent Unit در سال ۲۰۱۴ توسط Cho و همکاران معرفی شد.(لینک ۲) این معماری به منظور برطرف سازی کاستی های شبکه عصبی بازگشتی سنتی نظیر مشکل محو شدگی گرادیان و همچنین و همچنین کاهش سربار موجود در معماری LSTM ارائه شده است. GRU عموما به عنوان نسخه ای تغییر یافته از LSTM در نظر گرفته میشود چرا که هر دو این معماری ها از طراحی مشابه ای بهره میبرند و در بعضی از موارد بصورت یکسان نتایج عالی بدست میدهند.

GRU چگونه عمل میکند؟

همانطور که در بالا عنوان شد GRU همان نسخه بهبود یافته شبکه عصبی بازگشتی است اما چه چیزی در این معماری تغییر کرده است و چرا؟

پیشتر اشاره کردیم که برای حل مشکل محو شدگی گرادیان در شبکه عصبی سنتی یکی از راه حل ها استفاده از GRU است. این نوع معماری از مفهوم هایی بنام دروازه بروزرسانی و دروازه بازنشانی (Update gate و Reset gate) استفاده میکند. این دو اصطلاحا دروازه یا gate در اصل دو بردار اند که با استفاده از آنها تصمیم گرفته میشود چه اطلاعاتی به خروجی منتقل شده و چه اطلاعاتی منتقل نشود. نکته خاص در باره این دروازه ها این است که این دروازه ها را میتوان آموزش داد تا اینطور اطلاعات مربوط به گام های زمانی بسیار قبل را بدون آنکه در حین گذر زمان (طی گام های زمانی مختلف) دستخوش تغییر شوند حفظ کند.

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

و حالا یک سلول GRU  :

 

نکته

در تصویر بالا برای سادگی بیشتر همه اتصالات نمایش داده نشد و فقط مسیر کلی رسم شد. در این تصویر جزییات بیشتری مشخص است تا سردرگمی احتمالی مرتفع شود.

 

یادآوری نمادهای یونانی:

اگر اسامی این نمادها را فراموش کردید این اسامی بصورت زیر تلفظ میشوند :

آلفا \alpha بتا \beta گاما \gamma دلتا \delta
اِپسیلون \epsilon اِپسیلون \varepsilon زتا \zeta ایتا \eta
تتا \theta تتا \vartheta یوتا \iota کاپا \kappa
لامبدا \lambda مو/میو \mu نو \nu خی \xi
پی \pi پی \varpi رو \rho رو \varrho
سیگما \sigma سیگما \varsigma تاو \tau آپسیلون \upsilon
فی \phi فی \varphi کای \chi سای \psi
اومگا \omega

حروف بزرگ

گاما \Gamma دلتا \Delta تتا \Theta لامبدا \Lambda
خی \Xi پی \Pi سیگما \Sigma آپسیلون \Upsilon
فی \Phi سای \Psi اومگا \Omega اِپسیلون \mathcal{E}

 

تصویری که در بالا مشاهده کردید شکل ساده شده یک سلول GRU است.(در ادامه نسخه کامل آنرا میبینیم!) اجازه دهید ببینیم در این تصویر چه چیزی در حال رخ دادن است . برای اینکار اجازه دهید روابط نوشته شده را با هم مرور کنیم :

\hat{C}_{t} = tanh(W_1 . [ C_{t-1}, X_{t} ] + b_c)

\Gamma_u = \sigma(W_2 . [ C_{t-1}, X_{t} ] + b_u)

 {C}_{t} = \Gamma_u . \hat{C}_{t} + (1 - \Gamma_u) .  C_{t-1}

ما قبلا گفته بودیم که یک سلول GRU بسیار شبیه یک سلول RNN سنتی است! اما روابط بالا اصلا شبیه چیزی که ما در رابطه با شبکه عصبی RNN سنتی دیدیم نیست! مشکل کجاست؟

همانطور که قبلا گفتیم واقعا عملیات صورت گرفته در GRU شبیه آنچه قبلا دیده ایم است منتها روابط اینجا کمی مختصر تر نوشته شده اند و عبارات تازه ای نیز اضافه شده است. اگر بخواهیم این روابط را باز کنیم میتوانیم آنها را بصورت زیر بنویسیم :

\hat{C}_{t} = tanh(W_1 . C_{t-1} + W_2 . X_{t}  + b_c)

\Gamma_u = \sigma(W_3 . C_{t-1} + W_4 . X_{t}  + b_u)

 {C}_{t} = \Gamma_u * \hat{C}_{t} + (1 - \Gamma_u) *  C_{t-1}

 

حالا اگر دقت کنید میبینید که در اینجا C_t (یا همان سلول حافظه یا اصطلاحا memory Cell) در اصل همان h_t است که در شبکه عصبی بازگشتی RNN ما با آن آشنا شدیم و اگر خیلی راحت این عبارات را با هم جایگزین کنیم به عبارت اول در شبکه عصبی بازگشتی سنتی میرسیم. پس میبینید که عملیات اصلی یکی است اما دو عملیات دیگر نیز در اینجا داریم که در شبکه عصبی بازگشتی سنتی نداریم. قبل از اینکه به توضیح این دو عملیات جدید بپردازیم اجازه دهید ابهامات موجود را برطرف کنیم. ممکن است برای شما این سوال بوجود آمده باشد که چطور قبلا یک ماتریس وزن داشتیم (در عبارت اول) اما زمانی که این عبارات را ساده سازی کردیم تعداد ماتریس های وزن افزایش پیدا کرد در حالت اول چطور یک ماتریس وزن برای ضرب با دو بردار(X_t و C_{t-1}) که ابعاد متفاوتی دارند استفاده میشود؟ آیا نتایج این دو واقعا با هم برابر است؟

هر دو این روشها یک نتیجه را در بر دارند. در روش اول هر دو ماتریس وزن در قالب یک ماتریس وزن قرار داده شده است و به همین صورت نیز ورودی ها در قالب یک ورودی در محاسبات شرکت داده میشوند. برای انجام اینکار ما خیلی راحت آرایه ها را در راستای یک محور مشترک بهم متصل میکنیم. اجازه بدهید با هم یک مثال جزئی را ببینیم :

 

و خروجی بصورت زیر خواهد بود :

توابع vstack و hstack که ما استفاده کردیم در اصل چیزی جز همان تابع concat در محورهای مختلف نیست. و عملا کاری که ما اینجا انجام دادیم چیزی جز متصل کردن یک ارایه به آرایه دیگر (در راستای یک محور) نیست و همینطور که در خروجی مشخص است نتایج عملیات تفکیک شده با عملیاتی که در آن وزنها و ورودی ها در یک قالب در محاسبه شرکت داده شده اند یکی است.

درمحاسبات بالا دیدیم که در یک سلول GRU ما با عملیات جدیدی مواجه هستیم که از آن با \Gamma_u یاد میشود اما این عملیات جدید چه نقشی را ایفا میکند؟

در قسمت های قبل دیدیم که یکی از مشکلات شبکه های عصبی بازگشتی سنتی عدم توانایی آنها در بهره وری از دنباله های طولانی است. به عنوان مثال در جمله ” دانش آموزان منتخب ایران به مرحله نهایی المپیاد ریاضی رسیده و به مقام نخست دست پیدا کردند

شبکه برای اینکه بتواند تشخیص صحیحی در انتخاب فعل انتهایی جمله داشته باشد نیازمند به خاطر سپردن “دانش آموزان” در ابتدای جمله است. و همانطور که قبلا دیدیم مکانیزم مناسبی در شبکه عصبی بازگشتی برای این مهم وجود ندارد و در بهترین حالت در یک شبکه عصبی بازگشتی سنتی چند گام محدود محلی دارای قدرت تاثیرگذاری در انتخابهای شبکه اند.(چرا که یکی از مشکلات اصلی در RNN سنتی این است که در این شبکه ها محتویات گام زمانی فعلی همیشه با یک مقدار جدید از ورودی و حالت قبلی جایگزین میشوند و اینطور اساسا قابلیت حفظ یک ویژگی از چندین گام زمانی خیلی عقب تر ممکن نیست) در شبکه عصبی بازگشتی GRU برای رفع این معضل از یک مفهوم تازه بنام دروازه بروزرسانی استفاده شده است.

بطور خیلی ساده دروازه بروزرسانی یا اصطلاحا Update Gate که با Gama_{u} نمایش داده میشود اصطلاحا سویچی است که مشخص میکند در یک گام زمانی حالت قبلی مورد استفاده قرار گیرد یا ورودی (و یا ترکیبی از هر دو). با استفاده از این قابلیت جدید شبکه قادر است در دنباله های طولانی براحتی یک حالت از چندین گام زمانی قبل را در چند گام زمانی بعدی اثر دهد بعبارت دیگر شبکه قادر خواهد بود تا المانهایی را از گذشته دور در حافظه خود نگهداشته و از آن بهره برداری کند.

این مهم از طریق عبارت :

 {C}_{t} = \Gamma_u . \hat{C}_{t} + (1 - \Gamma_u) .  C_{t-1}

ایده کلی در اینجا به این صورت است که در یک گام زمانی میتوان با ۱ یا ۰ کردن گاما مشخص کرد از حالت مربوط به گام زمانی قبل استفاده شود یا حالت جدید با توجه به ورودی تازه و حالت قبلی محاسبه شود. بطور دقیقتر در اینجا شبکه میتواند با میل دادن W_2 به سمت صفر نتیجه عبارت \Gamma_u را به سمت صفر برده و اینطور بخش ابتدای عبارت را بی اثر و در نتیجه حالت قبلی مورد استفاده قرار گیرد و به گام زمانی بعدی منتقل میگردد. به همین صورت شبکه میتواند به حالت مابینی و حتی به عکس این مهم دست پیدا کند(با فاصله گرفتن از صفر و گرایش به سمت ۱).

پس دروازه بروزرسانی در اینجا حکم سویچی را دارد که به شبکه این امکان را میدهد تا مشخص کند چه مقدار اطلاعات از گام های زمانی قبلی برای گام زمانی فعلی مورد نیاز است.

این قابلیت اضافه شده در GRU نسبت به همتای سنتی خود دارای ۲ فایده است:

  • اول اینکه هر واحد میتواند وجود یک ویژگی خاص در جریان ورودی را برای گام های زمانی طولانی بعدی بیاد داشته باشد. هر ویژگی ای که توسط دروازه بروزرسانی GRU مهم تشخیص داده شود میتواند بدون اینکه رونویسی شده و از دست رود حفظ شود.
  • نکته دوم و شاید مهمتر اینکه این قابلیت جدید در عمل مسیرهای میانبری ایجاد میکند که چندین گام زمانی را ندید گرفته و پشت سر میگذارد (از روی چندین گام زمانی میپرند) این میانبرها به همین صورت به خطای تولیدی اجازه میدهد تا بدون آنکه خیلی سریع محو شود براحتی در فاز پس انتشار منتقل گردد و اینطور معضلات مرتبط با گرادیان های محو شونده کاهش میابد.

GRU کامل! :

در توضیحات اولیه که مطرح کردیم صحبت از دو دروازه کردیم اما تا به اینجا تنها در باره یک دروازه صحبت کردیم! دروازه دوم چیست و چه کاربردی دارد؟

دروازه بازنشانی یا اصطلاحا Reset Gate :

قبل از آنکه به توضیح دروازه بازنشانی بپردازیم اجازه دهید شمایل اصلی یک سلول GRU را با هم ببینیم :

 

نکته

در تصویر بالا برای سادگی بیشتر همه اتصالات نمایش داده نشد و فقط مسیر کلی رسم شد. در این تصویر جزییات بیشتری مشخص است تا سردرگمی احتمالی مرتفع شود.

همانطور که مشاهده میکنید ما با عبارات زیر مواجه هستیم و تنها تفاوت با توضیحات قبلی اضافه شدن عبارت جدیدی بنام \Gamma_r و نقش آن در محاسبه \hat{C}_{t} است :

\hat{C}_{t} = tanh(W_1 . [ \Gamma_r . C_{t-1}, X_{t} ] + b_c)

\Gamma_u = \sigma(W_2 . [ C_{t-1}, X_{t} ] + b_u)

\Gamma_r = \sigma(W_3 . [ C_{t-1}, X_{t} ] + b_r)

 {C}_{t} = \Gamma_u . \hat{C}_{t} + (1 - \Gamma_u) .  C_{t-1}

اما این تغییرات دقیقا بدنبال رسیدن به چه چیزی هستند؟ مشکلی که در شرایط قبلی(وجود تنها یک دروازه) با آن مواجه بودیم این است که شبکه مکانیزمی جهت کنترل میزان اطلاعات منتقل شده از گام قبل را ندارد و همیشه حالت قبلی را بصورت کامل مورد استفاده قرار میدهد. این مساله با ارائه دروازه جدید که منحصرا نقش این مکانیزم را ایفا میکند مرتفع میشود. دروازه بازنشانی یا همان Reset Gate در اصل همانند سویچی عمل میکند که شبکه با کمک آن میتواند مشخص کند چه میزان از اطلاعات گذشته در گام فعلی مورد نیاز نیست (فراموش شود) و در گام فعلی از چه میزان از اطلاعات گام قبل استفاده شود. بطور دقیق تر با صفر بودن این سویچ این دروازه در عمل شبکه را وادار میکند بگونه ای عمل کند که گویا در حال خواندن اولین بخش از دنباله ورودی است و اینطور شبکه را قادر به فراموشی حالت محاسبه شده قبلی میکند و به همین صورت میتواند با فاصله گرفتن از صفر حالت مابینی را فراهم آورد.

با کمک این دو قابلیت جدید شبکه عصبی GRU براحتی میتواند نسبت به ذخیره سازی و یا فیلتر کردن اطلاعات از گام های زمانی قبلی اقدام کرده و از دنباله های طولانی که شبکه عصبی بازگشتی سنتی در مواجه با آن با مشکلات عدیده ای مواجه بود بهره برداری کند و کاستی های شبکه عصبی بازگشتی سنتی را مرتفع سازد. این نوع شبکه ها بسیار قدرتمند بوده و بواسطه سربار کمتر آنها نسبت به LSTM و قدرت بیشتر آنها نسبت به RNN های سنتی مورد استفاده گسترده قرار گرفته اند.

نکته:

در برخی آموزشها یا مقالات ممکن است با تصاویر زیر جهت آموزش مفاهیم مرتبط با GRU مواجه شوید :

در اینجا منظور از عملیات Hadamard product ضرب نقطه ای است. مابقی عملیات ها نیز مشخص بوده و در مورد آنها توضیحات مورد نیاز داده شده است. ما از این تصاویر در اموزش استفاده نکردیم چرا که بیم آن میرفت که پیچیدگی بیش از حد باعث سردرگمی خوانندگان شود و صرفا بدنبال معرفی مفاهیم در ساده ترین شکل آن بودیم. به هر روی الان این تصاویر نیز باید برای شما براحتی قابل تفسیر بوده و مشکلی در درک و بررسی آنها نداشته باشید.

در بخش بعدی انشاءالله به معرفی شبکه عصبی LSTM میپردازیم و با قابلیت ها و ویژگی های این شبکه آشنا خواهیم شد.

1 نظر
  1. […] آموزش شبکه عصبی بازگشتی بخش چهارم : معرفی GRU […]

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.