رفتن به نوشته‌ها

شبکه‌های عصبی بازگشتی – قسمت اول

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

به‌طورکلی، شبکه بازگشتی (\(RNN\)) تابعی است که یک ورودی با طول غیرثابت (مثلا جمله) به صورت دنباله‌ای از \(n\) بردار \(d_{in}\) بعدی دریافت می‌کند و یک بردار خروجی \(y\) با ابعاد \(d_{out}\) را بازمی‌گرداند:

فرمول شبکه بازگشتی در حالت کلی

که در عبارت بالا \(x_{1:n}\) جمله ورودی ماست که کلمات آن به بردارهای نهفته (مثلا word2vec) نگاشت و به یکدیگر چسبانده شده‌اند. این بردارها به عنوان ورودی شبکه بازگشتی (\(RNN\)) داده و در نهایت یک خروجی \(y_{n}\) به ما بازگرداننده میشود.

خروجی \(y_{n}\) که گاهی اوقات با \(h_{n}\) هم نمایش داده میشود در کارهای مختلف می‌تواند مورد استفاده قرار گیرد. مثلا فرض کنید یک تسک بانظارت (supervised) مثل طبقه‌بندی اسناد یا تحلیل متن (sentiment) داریم. برای هر سند یک بازنمایی \(y_{n}\) بدست آورده میشود و سپس این \(y_{n}\) به عنوان ورودی classifier داده میشود و شبکه آموزش داده میشود.

در مثال بالا جمله This is Good به شبکه بازگشتی داده میشود و یک خروجی تولید میشود (بردار قرمز رنگ). سپس از این بردار برای تشخیص بار معنایی جمله استفاده شده است (sentiment). در مثال بالا این خروجی به یک دسته‌بندی کننده پیشرو (MLP Classifier) داده شده است و بار معمانی جمله حدس زده شده است (۷۷ درصد جمله مثبت بوده، ۱۳ درصد هیچ بار معنایی نداشته است و به احتمال ۱۰ درصد جمله منفی است).

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

عبارت بالا میگه که: هر تابع بازگشتی از دو قسمت اصلی تشکیل شده است: ۱) بخش بازگشتی یا Recurrent که با \(R\) نشان میدهیم و ۲) بخش خروجی یا Output که با \(O\) نشان میدهیم. که به ترتیب هدف آنها تولید بردار وضعیت \(s_{i}\) و بردار خروجی \(y_{i}\) است. در واقع نحوه تعریف این دو تابع نوع شبکه بازگشتی (SimpleRNN و LSTM و GRU و …) را مشخص می‌سازد.

\(y\) برداری است که معمولا به عنوان فیچر در نظر گرفته می‌شود و بردار وضعیت (\(s\)) رو هم میشه به یک حافظه تشبیه کرد که در داخل آن اطلاعات مراحل قبلی ذخیره می‌شوند.

به طور دقیق‌تر در بالا \(R\) یک تابع بازگشتی است که بردار وضعیت مرحله قبل \(s_{i-1}\) و بردار ورودی \(x_{i}\) را می‌گیرد و بردار وضعیت مرحله بعد \(s_{i}\) را بازمی‌گرداند (حالت اولیه \(s_{i}\) با صفر مقداردهی می‌شود).

خروجی تابع \(R\) (یا همان \(s_{i}\))، با کمک یک تابع دیگر به نام \(O\) به بردار خروجی \(y_{i}\) تبدیل میشود (تابع \(O\) رو فرض کنید یک تابع \(softmax\) است که بردار خروجی رو نرمال میکند این تابع میتواند چیزهای دیگری هم باشد یا گاهی اوقات اصن هیچ چیزی نباشد).

پس در واقع در شکل بالا شبکه بازگشتی در طول زمان باز شده است و در حالت غیرباز شده آن به صورت زیر خواهد بود:
شبکه بازگشتی به صورت غیرباز شده

کلمات یکی ‌یکی به این شبکه داده میشود (در هرلحظه از زمان یک کلمه \(x_{i}\) به عنوان ورودی داده میشود) و یک خروجی \(y_{i}\) و یک بردار وضعیت \(s_{i}\) حاصل میشود.

همانطور که در شکل اول (در حالت باز شده) مشاهده می‌شود در هر لحظه از زمان این تابع میتواند یک خروجی \(y_{i}\) داشته باشد. یعنی ما میتونیم خروجی مرحله دوم (خروجی کلمه is) دسترسی داشته باشیم و مقدار \(y_{1}\) رو در مرحله دوم بدست بیاریم. یا خروجی کلمه Good که معادل \(y_{3}\) است و به طور کلی در هر مرحله از زمان میتوانیم خروجی \(y_{i}\) رو به دست آوریم. اما ما معمولا از خروجی مرحله آخر \(y_{n}\) استفاده میکنند چون به نحوی در بردارنده‌ی تمام اطلاعات قبلی است.

پس به طور خلاصه، شبکه بازگشتی هر کلمه را به یک بردار \(y_{i}\) تبدیل میکند ولی چون بردار مرحله آخر حاوی تمام اطلاعات قبلی است از آن به عنوان بازنمایی جمله استفاده میکنیم.

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

ساختار داخلی شبکه بازگشتی

در داخل هر کدام از این سلول‌‌ها چیز پیچیده‌ای وجود ندارد و دوتا خط هست که بهم وصل شده‌اند و از یک \(tanh\) عبور کرده ‌اند و این روال برای مابقی تکرار شده است. این خط‌ها چین؟

همانطور که در بالا اشاره کردیم یکی از این خط‌ها: ورودی \(x\) و دیگری بردار وضعیت مرحله قبل \(s_{i-1}\) هستند. این دوتا بردار با هم جمع می‌شوند و از یک لایه \(tanh\) عبور داده میشوند و بردار خروجی (\(y_{n}\) یا \(h_{n}\)) رو تولید میکنند.

اگر بخواهیم به طور رسمی‌تر  تعریف کنیم می‌تونیم بگیم:

عبارات بالا را میشه اینجوری تفسیر کرد:

عبارت اول) شبکه RNN از یک توالی از بردارهای \(x_{1:n}\) و بردار وضعیت اولیه \(s_{0}\) تشکیل شده است و خروجی \(y_{1:n}\) را به ما بازمی‌گرداند.
عبارت دوم) خروجی \(y\) یا \(h\) از اعمال تابع softmax روی بردار وضعیت (\(s\)) حاصل می‌شود.
عبارت سوم) بردار وضعیت \(s_{t}\) از اعمال تانژانت هیپربولیک روی جمع بردار وضعیت قبلی \(s_{i-1}\) و بردارهای ورودی \(x_{i}\) حاصل می‌شود.

اگر دقت کرده باشید من گفتم از یک لایه تانژانت هیپربولیک عبور داده میشوند. در واقع بردارهای \(x_{t}\) و \(s_{t-1}\) از دو شبکه feedforward با وزن‌های \(W^s\) و \(W^x\) عبور داده میشوند و با یکدیگر جمع میشوند و سپس توسط تابع تانژانت هیپربولیک مقادیر آنها بین -۱ تا ۱ نرمال میشود. پس یادگیری شبکه توسط همین \(W\)ها انجام میشود.

به شکل زیر نگاه کنید. بردار وضعیت \(s_{i-1}\) و ورودی \(x_{i}\) به یکدیگر چسبانده و در وزن \(W\) ضرب می‌شوند و سپس یک تابع \(tanh\) روی آنها اعمال می‌شود (واضح است در حالت ابتدایی بردار وضعیت \(s_{i}\) با یک مقدار پیش‌فرض پر می‌شود و بردار \(W\) از دو قسمت \(W^s\) و \(W^x\) تشکیل شده است).

پس همانطور که می‌بینید، شبکه بازگشتی تقریبا همان شبکه feedforward است که وزن‌های این شبکه feedforward به ازای تمام ورودی‌های (\(x_{i}\)) در طول زمان مشترک است. معمولا شبکه بازگشتی را به صورت باز شده (unroll) رسم می‌کنند تا فهم آن راحت‌تر باشد!

اگر بخواهیم برای گفته بالا یک تیکه کد بنویسیم می‌تونیم بگیم که:

حالا از این بردار \(y\) در تسک‌های مختلف استفاده میشود. مثلا فرض کنید به ازای هر سند یک بردار \(y\) بدست آوردیم. برچسب سند هم که میدونیم (فرض تسک supervise است) خوب حالا یک بردار و برچسب داریم و classifier امون رو آموزش میدهیم.

مطالب بالا مربوط به ساده‌ترین شبکه بازگشتی یعنی SimpleRNN بود بسته به اینکه چطوری هرکدام از توابع R و O تعریف کنیم نوع شبکه بازگشتی ما تغییر خواهد کرد. در قسمت بعدی ابتدا به پیاده‌سازی مدل بالا میپردازیم و سپس به سراغ شبکه بازگشتی با سلول LSTM خواهیم رفت و تفاوت آنها را با شبکه بازگشتی ساده بررسی میکنیم.

پی‌نوشت: بنظرم شبکه بازگشتی اصطلاح درستی نیست و شبکه خودتکرار شونده معادل بهتری باشد. چون بازگشتی با توجه به چیزی که در ترم ۱ دانشگاه داشتیم معمولا به recursiveها گفته می‌شد ولی ما در اینجا recurrent داریم. ولی به هر حال مرسوم به بازگشتی هستند!

منتشر شده در آموزشپردازش زبان طبیعییادگیری عمیق

نظر

  1. سهیلا سهیلا

    سلام.
    بسیار سپاسگزارم که این پست عالی رو گذاشتید..منتظر پست بعدی شما هستیم.
    همچنین اگر امکان داره درمورد lstm یه منبع معرفی کنید خیلی ممنون میشم.

  2. سهیلا سهیلا

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

    • هادیفر هادیفر

      کتاب اقای Goldberg چندین فصلش به شبکه‌های بازگشتی تخصیص داده شده است (انکدر دیکدر، اتنشن، شبکه بازگشتی، LSTM و GRU) و برای شروع بسیار مناسب است و شدیدا پیشنهاد میکنم مطالعه بفرمایید. اسم کتاب: Neural Network methods for Natural Language Processing و از scihub میتونید گیرش بیارید.

  3. محمدرضا محمدرضا

    آقای هادیفر من تازه با وبلاگتون اشنا شدم ، ای کاش که خیلی زودتر اشنا میشدم ،
    بابت پستهای عالیتون متشکرم

  4. Masoumeh Masoumeh

    سلام .خیلی عالی توضیح دادین . ممنون .
    میشه لطفا در مورد شبکه های عصبی SDN و ESN هم توضییح بدین .
    یا اگه منبعی میشناسین بگین .ممنون.

  5. حامد حامد

    سلام
    ممنون از پست بسیار خوبتون

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

    ممنون میشم برام منابع خوب معرفی کنید.

  6. شبکه های عصبی شبکه های عصبی

    سلام جناب هادیفر
    وقتتون بخیر

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

    با تشکر

    • هادیفر هادیفر

      ممنون
      راحت باشید مشکلی نیست.

  7. سمیه سمیه

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

    • هادیفر هادیفر

      ممنون 🙂

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *