GRU & LSTM

Recurrent Neural Networks

جلسات پیش با RNN ها آشنا شدیم و با ساختن یک language مدل توانستیم مدلی طراحی کنیم که یک کلمه را دریافت کند و کلمات بعدی را حدس بزند.

در ادامه به بررسی شبکه های LSTM و GRU میپردازیم.

یادآوری:

شبکه ی RNNشامل تعدادی Hidden نورون است که این Hidden نورون ها تکرار میشوند به طوری که انگار در طول زمان باز و تکرار میشوند.

 

Notations:

X1,X2,….Xn   ورودی های شبکه هستند که به مرور زمان به شبکه میدهیم به طور مثال اگر بخواهیم کلمه کلمه  به شبکه بدهیم ابتدا X1 , … الی آخر پشت هم می آیند. این ورودی ها شامل یک سری وزن هستند که با Wax نمایش میدهیم و یک سری وزن که از state مرحله ی قبلی ورودی میگیرد که همان حافظه ی ما  و خروجی را تشکیل میداد .

a  : خلاصه ای از ورودی های قبلی است که دار ی حافظه است و براسا ورودی هی قبلی و ورودی فعلی تصمبم میگیرد.

Simple syntax RNN:

 

برای ساده تر شدن از این پس تنها یک بردار وزن برای ‌X و a خواهیم داشت که در کنار هم این دو Concatمیشوند.

در نهایت :

مشکل RNNها :

استفاده از این شبکه برای جملات کوتاه مشکلی ایجاد نمی کند.اما اگر جمله ی ما ادامه پیدا کند این شبکه نمیتواند به صورت Long Term جمله را حفظ کند و اصطلاحا مشکل Wanishing Gradiant به وجود میاید .

RNN Unit:

مطابق شکل  یک وزنی داریم که در concat شده ی ورودی و  stateقبلی ضرب میشود و به activation function داده میشوند که y hatما را تشکیل میدهد.

 

GRU:

برای حل مشکل Wanishing Gradiant  برای جملاتی مثل :

The cat, which already ate …, was full.

برای اینکه بدانیم در جای خالی با توجه به ضمیر چه چیزی به کار ببریم نیاز داریم حافظه ی طولانی تری داشته باشیم .

در gru به state که داریم c میگوییم که مخفف cell است .به عبارتی cهمان <a<t قبلی است .

بجای مشخص شدن stateجاری یک stateپیشنهادی داریم~C که کاندیدی برای stateجاری است که هنوز به صورت قطعی قرار نیست  stateجاری باشد.

ورودی جاری و state قبلی در هم concatشده و در وزن Wc ضرب میشوند.

GRU Simplified:

تفاوت با RNNساده :

یک سری گیت اضافه شده برای بررسی پذیرش کاندید state

برای بررسی آپدیت گیت یک activation function sigmoid داریم .(0:بروز نکن ,1:بروز کن)

رای تعیین <C<t اگر  Г آپدیت برابر با 1 بود بروز رسانی صورت میگیرد و اگر 0 باشد , کاندید state را نمیپذیرد و stateمرحله قبل را در نظر میگیرد.

Full Gru:

در Full GRU یک گیت جدید اضافه میکنیم  که بررسی میکند stateمرحله قبل چقدر به context جاری مربوط میشود.

activation function گیت جدید یک sigmoid است که مقدار 0 یا 1 برمیگرداند و تصمیم میگیرد حافظه قبلی چقدر به ورودی جاری مربوط میشود و براساس ورودی میتواند تصمیم بگیرد ,گیت حافظه را برای خروجی دادن این state در نظر بگیرد یا خیر.

LSTM:

شبکه‌های LSTM که خلاصه شده عبارت “Long Short Term Memory” هستند، نوع خاصی از شبکه‌های عصبی بازگشتی هستند که توانائی یادگیری وابستگی‌های بلندمدت را دارند و مشکل ‌wanishing gradiant حل کردند.این شبکه‌ها برای اولین بار توسط Hochreiter و Schmidhuber در سال ۱۹۹۷ معرفی شدند.

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

 

مقایسه بین LSTM و GRU

در lstm گیت Γr نداریم این گیت مشخص میکند چه میزان از حافظه را دخیل کند اگر 0 باشد به طور کلی اثر حافظه  را از بین میبرد,میتوان قرار داد اما ضروری نیست.

lstmدر مقایسه با gru تعداد گیت های بیشتری دارد. در lstm برای فراموش کردن هم یک گیت اضافه شده و مشخص میکند برای برای بازنویسی< C<t چه میزان کاندید state را تاثیر بدهیم به عبارتی چقدر بخاطر بسپرد و چقدر فراموش کند.

 

Bidirectional RNN:

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

 

Deep Rnn:

مطابق شکل state مرحله قبل که رسیده توی کروشه 1 در نظر گرفته شده یعنی برای لایه اول و برای هر لایه عدد کروشه متفاوت است .در هر مرحله state ایجاد میکنند و به مرحله ی بعدی میروند .میتوانیم این state را به یک softmax و یا sigmiodوصل کنیم .این state ها زمانی که شروع میشوند با 0 مقدار دهی میشوند ,لایه ها روی هم stack شده و یک شبکه دیپ ایجاد میکنند .y های خروجی قرار است برای ما چیزی حساب کنند در طول زمان X دریافت کرده اند و یک state خود yهم چند لایه است ,میتوانیم مستقل از دیپ بودن قبلش خروجی لایه را به یک شبکه cnnبدهیم :

 

استفاده از خروجی y :

تولید متن با شبکه بازگشتی LSTM در Keras

در این مثال به پیاده سازی یک شبکه lstm میپردازیم که بر روی کتاب فیلسوف آلمانی نیچه به صورت

character-level پیاده سازی شده.

ابتدا مجموعه داده را بارگذاری میکنیم:

 

توسط maxlen مشخص میکنیم به شبکه چند حرف چند حرف بدیم . در این مثال طول کلمات 60 تایی است و ممکن است  این 60 تا وسط کلمه تمام شود یا بیشنر از طول رشته ی ورودی باشد.

در for زیر کاراکتر 61 ام به عنوان label در نظر گرفته میشود.

توسط setنیز تعداد کاراکتر های یونیک را مشخص میکنیم.

 

ایجاد شبکه (Building the network)

 

این کدی است که ما برای  توزیع احتمالی اصلی خارج از مدل استفاده می کنیم و یک شاخص کاراکتر را از آن به دست می آوریم. میدانیم predict دقیقا 0 و 1 نیست .در این جا نقش temperature این است که براساس احتمالات رندم انتخاب کند.هر چقدر temperature بیشتر باشد احتمال نفر اول را بیشتر نشان میدهد.

 

و در نهایت ایجاد متن 

 

نمونه خروجی متن ایجاد شده :