۱. مقدمه
در تحقیقات انجام شده، از semantic vector space یا فضاهای برداری معنایی برای نمایش تک کلمات استفاده و به عنوان ویژگی در نظر گرفته میشده است. از اشکالات این نحوهی نمایش این است که قابل بسط به ترکیبی از چند semantic (معنا) نبودند. در بسیاری از سیستمها، تنها به تک تک کلمات و مثبت یا منفی بودن هر کلمه توجه میشود و نهایتا با برآیندگیری، بار کلی عبارت یا جمله مشخص میگردد. در این موارد، به ترتیب بیان شدن کلمات اهمیت داده نمیشود که از دقت تشخیص بار عبارت میکاهد. با توجه به این موضوع، مدلهای ترکیبی از فضای بردار معنی کلمات، برای کاربردهای جملات و عبارات بزرگتر مورد توجه قرار گرفت. از مشکلاتی که امروزه در بررسی این مدلها وجود دارد، محدودیت در داشتن منابع بزرگ و برچسبدار دادههای ترکیبی در این حوزه میباشد. در راستای رفع این مشکل، در این مقاله منابع دادهی Stanford Sentiment Treebanks و شبکهی Recursive Neural Tensor Network یا (RNTN) معرفی شده است که موفق به تشخیص معنای یک مجموعهی متن با دقت بالایی شده است.
۲. داده
در این مقاله از دادههای Stanford Sentiment Treebaks استفاده شده است که مجموعهای از ۱۱۸۵۵ تک جمله میباشد که از نظرات کاربران برای فیلمها برداشته شده است و توسط Stanford parser تجزیه شده است. این مجموعه داده شامل ۲۱۵۱۵۴ عبارت یکتا از درختهای پارس اشاره شده میباشد که هر کدام توسط سه نیروی انسانی تفسیر و تایید شده است. Stanford Sentiment Treebank اولین مجموعه دادهایست که شامل درختهای پارس به طور کامل برچسبزده شده میباشد و میتوان از آنها برای تحلیل ترکیبات معانی استفاده کرد. دادههای آموزش هم که بانک درخت میباشند در این آدرس آمده است.
۳. شبکه
در این مقاله مدل یادگیری عمیق نمایش کل جمله را بر اساس ساختار جمله ایجاد میکند و احساس و بار جمله را بر اساس اینکه چگونه کلمات در کنار هم معنی ساختار بزرگتر جمله را تشکیل میدهند تشخیص میدهد.
برای تشخیص بار معنایی ترکیبی یک عبارت، مدل RNTN معرفی شده است. ورودی این شبکه عبارات با طولهای متفاوت است که هر عبارت بوسیلهی بردارهای کلمات تشکیلدهندهی آن و یک درخت پارس ارائه میشود و بردار گرههای بالاتر درخت از روی گرههای برگ و به صورت سلسله مراتبی با استفاده از همان تابع ترکیبی tensor-based بدست میآید. نتایج حاصل از این شبکه را با نتایج بسیاری از مدلهای ترکیبی با ناظر مانند شبکهی عصبی استاندارد (RNN)، شبکهی عصبی مبتنی بر ماتریکس و مدلهایی که ترتیب کلمات را در نظر نمیگیرند، مانند Naive Bayse و SVM، مقایسه کردیم و شبکهی RNTN زمانیکه fined-grained sentiment (تشخیص احساس و بار معنایی جمله در یک سیستم پنج کلاسه شامل خیلی منفی، منفی، تا حدودی منفی، خنثی، تا حدودی مثبت، مثبت، خیلی مثبت که در تصویر ۱ نشان داده شده است.) را برای تمامی گرهها محاسبه میکرد، از تمام مدلهای دیگر با دقت بالاتری به اندازهی 80.7% عمل کرد. با همین سیستم روی دادههای آزمون، کلاسبندی دو کلاس مثبت و منفی انجام شد و بر خلاف مدلهای bag of words با دقت خوبی مثبت و منفی بودن جملات را تشخیص میدهد. این سیستم همچنین این قابلیت را دارد که بار احساسی و معنایی جملاتی که در آنها لغت but به کار برده شده است را تشخیص دهد.
اطلاعات مربوط به پروژه و دادههای آن در این آدرس قرار دارد.
۴. کارهای مرتبط
از کارهای مرتبط با این مقاله میتوان به پنج حوزهی تحقیقاتی NLP اشاره کرد که در ادامه به آنها میپردازیم:
فضاهای بردار معنایی (semantic vector spaces)
روش غالب در این روش استفاده از شباهتهای توزیع شده بین تکتک کلمات است که با استفاده از آمار ظهور همزمان هر کلمه و حوزهی متن، معنی کلمه و بار معنایی آن مشخص میگردد. در این روش در خیلی از مواقع بردارهای توزیعی کلمات نمیتوانند به خوبی تفاوتهای کلمات متناقض را تشخیص دهد و این به این دلیل است که این دسته از کلمات معمولا در متون با مفاهیم یکسانی ظاهر میشوند. از روشهای حل این محدودیتها استفاده از بردارهای عصبی کلمات است که میتوانند به صورت غیر ناظر آموزش داده شوند و شباهتهای توزیعی را تشخیص دهند. از این مدلها برای تشخیص sentiment یا بار احساسی عبارات نیز میتوان استفاده کرد.
ترکیب در فضای برداری (compositionality in vector space)
اکثریت الگوریتمهای ترکیبیاتی و دادههای مربوطه با استفاده از ترکیب دوتایی کلمات، شباهت و معنای آنها را بررسی میکنند و این کار را از طریق عملیات ضرب و جمع بین بردارهای کلمات انجام میدهند. از نمونه روشهای دیگر میتوان به محاسبهی نمایش برداری عبارات بلندتر و تعریف ترکیب با ضرب ماتریسها اشاره کرد. همچنین در روشی دیگر سه تایی فاعل، فعل و مفعول را تعریف کردهاند و با یک مدل مبتنی بر ماتریس آنها را با تفسیرهای انسانی تطبیق دادهاند. در این مقاله به طور خاص شبکه ی RNTN را با مدل های ترکیبی با ناظر شامل شبکه ی عصبی بازگشتی (RNN) و شبکهی عصبی بازگشتی مبتنی بر ماتریس که هر دو روی دادههای bag of words اعمال شدهاند مقایسه کرده است.
فرم منطقی (Logical Form)
این روش یکی از روشهایی است که متفاوت از سایرین عمل میکند و با تطبیق دادن جملات با گزارههای منطقی سعی در تشخیص کلمات و بار معنایی آنها دارد. از مشکلات این روش این است که در عین حال که در حوزههای گسسته و بسته به خوبی عمل میکند، تنها قادر به دریافت توزیع احساسات با استفاده از روشهایی فرای گزارههای منطقی مورد استفاده در حال حاضر است.
یادگیری عمیق (Deep Learning)
مستقل از روشهایی که تا به الان اشاره شد، روشهای ترکیبی بسیار زیادی مرتبط با شبکههای عصبی در این حوزه کاربرد دارند که این مقاله یکی از نمونههای این حوزه میباشد.
تحلیل معنایی (Semantic Analysis)
در کنار تمام مواردی که برای تشخیص و تحلیل احساس و بار معنایی جملات و عبارات استفاده شد، بسیاری از روشها از نمایش bag of words استفاده میکنند.
۵. بانک معنایی احساسی دانشگاه استنفورد (Stanford Sentiment Treebank)
بکارگیری روش bag of words در متون و مستندات بلند، با تاکید بر تعداد کمی کلمات با بار معنایی قوی (مثبت یا منفی) میتواند به خوبی عمل کند، در حالی که تشخیص بار معنایی تکجملات، حتی در دستهبندی دو کلاسهی مثبت و منفی، تاکنون نتوانسته دقتی بیش از ۸۰ درصد داشته باشد. در حالتی که تعداد کلاسها بیشتر هم باشد (برای نمونه شامل برچسب خنثی)، این روش با دقتی حداکثر زیر ۶۰ درصد عمل کرده است. برای تشخیص و تحلیل جملات و نمونههای سختتر نمیتوان ترتیب ظهور کلمات را در نظر نگرفت، این در حالی است که در بعضی از روشها مانند استفاده از bag of words این معیار مهم دخیل نیست. در این مقاله روی دادهی Semantic Treebank تحلیل و بررسی انجام شده است و برای تمام عبارات در مجموعهی جملات پایگاه داده برچسب وجود دارد و به آموزش و ارزیابی کمک کرده است.
پایگاه دادهی مورد استفاده در این مقاله از نظرات کاربران در مورد فیلمها از سایت rottentomatoes.com توسط متخصصان برداشته شده است و شامل ۱۰۶۶۲ جمله، نیمی مثبت و نیمی منفی، میباشد. این جملات از متون بزرگتر و پس از پیشپردازش به صورت مرتب استخراج شدهاند و بار احساسی و معنایی آنها با توجه به بار معنایی متن کلی در نظر گرفته شده است. تمام جملات توسط Stanford Parser تجزیه شده است و برچسبگذاری عبارات استخراج شده از جملات از دستهبندی شامل ۲۵ درجهبندی مانند شکل ۱ استفاده شده است که ۵ مقدار اصلی خیلی منفی، منفی، تا حدودی منفی، خنثی، تا حدودی مثبت، مثبت و خیلی مثبت را شامل میشود. در شکل زیر توزیع نرمالسازی شدهی برچسب جملات بر حسب طول آنها (n-gram) مشاهده میشود.
مواردی که در تحلیل جملات پایگاه داده مشاهده شده است شامل اطلاعات زیر میباشد: بسیاری از جملات می تواند خنثی در نظر گرفته شوند. همچنین جملاتی که بار معنایی قویتر و جهتدهی شدهتری دارند، معمولا از متون تری استخراج شدهاند و بیشتر جملات کوتاه خنثی هستند. برچسب بیشتر جملات از موارد منفی، تا حدودی منفی، خنثی، تا حدودی مثبت و مثبت میباشند و جملات با بار معنایی شدید (خیلی منفی و خیلی مثبت) به ندرت استفاده شدهاند. بنابراین کلاسبندی جملات را به همین ۵ کلاس محدود کردند که میتواند بار معنایی جملات را به خوبی میتواند منتقل کند. به این دستهبندی ۵ کلاسه fine-grained sentiment classification گفته شده است. در این مقاله بررسیها بر اساس این ۵ برچسب روی جملات با طولهای متفاوت انجام و تعریف شده است.
۶. مدلهای عصبی بازگشتی (Recursive Neural Models)
در این مدل، برای عبارات با طولها و بار معنایی و احساسی متفاوت، نمایش برداری ترکیبی محاسبه میگردد و سپس به عنوان ویژگی برای کلاسبندی هر عبارت مورد استفاده قرار میگیرد. هر عبارت با طول n، یا n-gram، به یک مدل ترکیبی درخت باینری داده میشود که هر برگ یک کلمه میباشد، و با نمایش برداری ارائه میگردد. سپس به صورت buttom-up یا از پایین به بالا، گرههای پدر که بالاتر قرار دارند با توابع ترکیبی متفاوت محاسبه میگردند و ویژگیهای این گرهها نیز برای کلاسبندی به classifier داده میشود. نمایشی از مدل ترکیبی درخت باینری برای یک عبارت به طول ۳ در تصویر زیر مشاهده میشود.
عملیاتهایی که در این مدل ترکیبیاتی مشترک میباشند شامل نمایش برداری کلمات و کلاسبندی هستند. هر کلمه یک بردار d تایی است که مقدار اولیهی آن به صورت تصادفی از توزیع یکنواخت
U(-r, r) , r = 0.0001
انتخاب میشود. بردارهای تمام کلمات به صورت پشته مانند، در یک ماتریس L بهطوریکه
قرار میگیرند که |V| تعداد کل کلمات میباشد. مقداردهی ابتدایی رندم است، اما ماتریس L را به عنوان پارامتر با مدل ترکیبی موجود میتوان آموزش داد. همینطور میتوان از بردارهای لغت به عنوان پارامتری برای بهینه سازی و به عنوان ویژگیهای ورودی به ردهبند softmax استفاده کرد.
برای ردهبندی به ۵ کلاس، احتمال شرطی بر حسب برچسبها را از روی بردار کلمه با رابطهی زیر بدست آورده است:
که Ws برداری به ابعاد s X d است که ماتریس ردهبندی معانی میباشد. این احتمال برای تمام کلمات یا برگها در ابتدا محاسبه میشود. برای مثال در نمونهای که برای a,b و c آورده شده است. تفاوت اصلی بین مدلها، محاسبهی بردار زیر به صورت پایین به بالا میباشد.
۷. شبکههای عصبی بازگشتی (RNN: Recursive Neural Network)
سادهترین مدل از شبکههای عصبی، شبکهی عصبی استاندارد است. در ابتدا بردار نمایشی تمام کلمات (که در برگ قرار دارند) را داریم. از پایین به بالا گرههای پدری که تمام فرزندانشان به صورت بردار وجود دارند را در نظر میگیریم و با استفاده از فرمول زیر که برای مثال آورده شده در تصویر میباشد، بردار پدر را محاسبه میکنیم:
تابع f را برابر tanh که یک تابع عنصر به عنصر غیر خطی است در نظر گرفته و W
پارامتر آموزشی اصلی میباشد. بردار گرهی پدر باید در ابعاد بردار فرزند باشد تا این روند پایین به بالا با همان توابع و عملیاتها قابل اجرا باشد. پس از اینکه بردار هر گره به دست آمد، آن را به تابع softmax تصویر x داده تا احتمال تعلق به هر کلاس را محاسبه کند.
۸. شبکههای عصبی بازگشتی مبتنی بر بردار و ماتریس (MV-RNN: Matrix-Vector RNN)
ایدهی این روش این است که کلمات و عبارات با طول بلندتر را در درخت پارس با دو ساختار بردار و ماتریس نمایش دهیم. زمانی که این دو ساختار نمایشی با هم ترکیب میشوند، ماتریس یکی در بردار دیگری ضرب میگردد و بر عکس. به این ترتیب تابع ترکیبی با استفاده از کلمات تشکیل دهندهی هر عبارت ایجاد میشود.
ماتریس اولیهی هر کلمه، یک ماتریس واحد به اندازه ی d X d است که هر عضو آن با مقدار کوچکی از توزیع گوسی جمع شده است. همانند بردار تصادفی کلمات، پارامترهای این ماتریسها نیز آموزش داده میشود تا خطای ردهبندی را برای هر گره کاهش دهد. در این مدل هر عبارت با طول n یا n-gram به صورت لیستی از جفتهای (ماتریس، بردار) همراه با درخت پارس نمایش داده میشود. برای درختی با ساختار زیر:
در شبکهی عصبی بازگشتی ماتریس-بردار، برای گرهی پدر هر گره، یک بردار و یک ماتریس را با استفاده از دو عملیات زیر بدست می آورد.
به طوریکه ، و حاصل یک ماتریس d X d است. این روند تا گرهی ریشه ادامه دارد و برای هر گره توسط فرزندانش محاسبه میگردد. نهایتا از بردار هر گره برای ردهبندی عبارتی که آن گره ریشهی آن است استفاده میشود.
مدل ماتریس-بردار مشکلاتی دارد که از جمله آنها تعداد پارامترهای بسیار زیادش را میتوان نام برد که به تعداد کل کلمات یا همان |V| بستگی دارد. وجود یک تابع ترکیبی که تعداد ثابتی پارامتر داشته باشد میتواند بسیار کمک کننده باشد. شبکهی عصبی بازگشتی استاندارد گزینهی خوبی برای این انتخاب است. اما در این مدل، بردارهای ورودی از طریق توابع غیرخطی با یکدیگر تعاملات ضمنی برقرار میکنند و وجود روابط مستقیمتر، به مدل این امکان را میدهد که بردارهای ورودی تعاملات بیشتری با یکدیگر داشته باشند.
به دنبال چنین تابعی که انتظارات مورد نظر را برآورده کند و معنی ادغام شده از ترکیب اجزای کوچکتر را به طور دقیق تری نسبت به تک تک ورودی ها درک کند، مدل جدید Recursive Neural Tensor Network یا RNTN را در این مقاله پیشنهاد دادهاند. ایدهی اصلی استفاده از تابع ترکیبی مبتنی بر tensor مشابه برای تمام گرههاست. تصویر زیر یک لایهی tensor رانشان میدهد:
خروجی ضرب tensor را به صورت زیر h تعریف میکنیم:
همچنین V در رابطهی زیر یک tensor است:
در مدل RNTN برای محاسبهی بردار گرهی پدر p1 از رابطهی زیر استفاده شده است:
که W همانند مدل قبل تعریف میگردد. همینطور بردار گرهی پدر بعدی در مثال آورده شده، با استفاده از رابطهی زیر و طبق تعریف بدست میآید:
مزیت اصلی این مدل نسبت به مدل قبلی شبکهی عصبی بازگشتی که حالت خاصی از مدل RNTN با V برابر ۰ این است که tensor میتواند ورودیها را به صورت مستقیم به یکدیگر ارتباط دهد. به صورت شهودی هر slice از tensor را میتوانیم به عنوان دریافت نوع مشخصی از ترکیب تفسیر کنیم.
میتوان یک لایه شبکهی عصبی دوم را به مدل RNTN اضافه کنیم تا تابع ترکیبی را قدرتمندتر کنیم. با این حال آزمایشها و تحلیلها نشان داده است که بهینه کردن این مدل و تعاملات بینشان هنوز نسبت به RNTN ضمنیتر است.
9. Tensor Backprop through Structure
در این بخش نحوهی آموزش شبکهی RNTN توضیح داده میشود. همانطور که قبلا هم اشاره شد، هر گره، یک ردهبند softmax دارد که روی نمایش برداری آن گره آموزش داده میشود تا پاسخ درست یا بردار هدف عبارت مربوط به آن گره را پیشبینی کند. فرض میکنیم توزیع بردار هدف هر گره به صورت یک بردار کد شدهی 0 و1 میباشد به طول C، که C تعداد کل کلاس ها و مقدار متناظر کلاس هدف برابر1 و سایر مقادیر 0 است. هدف نهایی بیشینه کردن احتمال درست بودن پیشبینی یا کمینه کردن خطای پیشبینی است که در این مقاله از خطای cross-entropy استفاده شده است و بین توزیع پیشبینی شده ی
و توزیع هدف در گرهی i میباشد. این به معنی کمینه کردن KL_fivergence بین دو توزیع ذکر شده است. خطای پارامترهای شبکهی RNTN شامل از رابطهی زیر بدست میآید:مشتق وزنهای ردهبند softmax استاندارد میباشند. xi را بردار گرهی i در نظر میگیریم (برای مثال در نمونهی ۳ تایی آورده شده برابر میباشد).
خطای هر گره به صورت بازگشتی به عقب توزیع میگردد. اگر بردار خطای softmax در گرهی i باشد خواهیم داشت:
که در آن عملیات ضرب Hadamard بین دو بردار و f' مشتق f میباشد. سایر مشتقها فقط به صورت از بالا به پایین از ریشه به گرههای برگ قابل محاسبه هستند. مشتق کامل V و W از جمع مشتقهای هر گره بدست میآید. خطای هر گره i را به صورت تعریف میکنیم. بالاترین گرهی p2 فقط خطای گرهی softmax را دارد. پس
و ما میتوانیم از آن برای بدست آوردن مشتق استاندارد W استفاده کنیم. برای مشتق هر بخش k = 1, ..., d داریم :
به طوریکه عنصر k ام این بردار است. حال میتوانیم خطای دو فرزند p2 را با روابط زیر بدست آوریم:
هر کدام از فرزندان p2 نیمی از بردار را به خود اختصاص میدهند و خطای softmax خودشان را برای سیگمای کامل اضافه میکنند. داریم :
که نشان میدهد p1 فرزند راست p2 است و نیم دوم خطا را میگیرد و برای بردار نهایی کلمهی مشتق a، برابر
خواهد شد. مشتق کامل برای برای درخت عبارت ۳ تایی برابر با جمع همهی گرههاست:
که به صورت مشابه برای W تعریف میشود.
۱۰. آزمایشهای انجام شده
در این مقاله دو نوع تحلیل انجام شده است. نوع اول شامل تعداد زیاد و حجیمی ارزیابی کمی روی دادههای آزمون میباشد. نوع دوم روی دو پدیدهی زبانی تمرکز میکند که در بار معنایی و احساسی بسیار مهم هستند. بهترین کارایی مدلها برای ابعاد ۲۵ تا ۳۵ بردار کلمات و batch size بین ۲۰ و ۳۰ بدست آمده است. این بدین معناست که RNTN از نظر داشتن پارامترهای بیشتر، خیلی بهتر از RNN استاندار عمل نمیکند. مدل MV-RNN از هر مدل ماتریس کلمات دیگر بیشتر پارامتر دارد.
مدلهای ابتدایی حاکی از آن بود که مدلهای بازگشتی زمانی که از توابع غیرخطی استفاده نکنند به طرز مشهودی بدتر عمل میکنند و به همین دلیل از تابع f = tanh استفاده شده است. نتایج حاصل از کلاسبندی این مدلها را با مدلهایی از روش bag of words در Naive Bayes و SVM، و همینطور مدلی که میانگین بردار کل را در نظر میگیرد و ترتیب کلمات را مد نظر قرار نمیدهد ، مقایسه کرده است.
جملات داخل بانک درخت به ۳ بخش آموزشی شامل ۸۵۴۴ جمله، بخش dev شامل ۱۱۰۱ جمله و بخش آزمون شامل ۲۲۱۰ جمله تقسیم شده است. همینطور، کلاسبندی فقط روی دو کلاس مثبت و منفی بدون در نظر گرفتن کلاس خنثی را نیز انجام دادهاند که بخشی از دادهها را فیلتر میکند.
۱۱. موارد دیگر
بررسیها و نتایج نشان داده است که ردهبندی ۵ کلاسهی fine-grained، بهترین حالت ردهبندی بار معنایی جمله است. تصویر زیر مقایسهی بین کارایی RNTN و MV-RNN و RNN را نشان میدهد:
مدل بازگشتی روی عبارات کوتاهتر خیلی خوب عمل میکند. روش RNTN در اکثر موارد از سایر مدلها بهتر عمل میکند. جدول ۱ دقت کلی برای پیشبینی fine-grained برای تمام طولها و جملات کامل را نشان میدهد.
همچنین این مدل قابلیت آموزش روی دادهها و عبارات با فرمت X but Y را نیز دارد که نمونهای از آن در شکل زیر نشان داده شده است:
که مدل RNTN موفق به کسب دقت 41% شده است، در حالی که مدلهای (MV-RNN(37), RNN(36 و مدل (biNB(27 کسب کردهاند.
از دیگر قابلیتهای برتر این مدل نسبت به سایر مدلها این است که تغییر بار (منفی کردن) جمله را چه در جملات منفی و چه در جملات مثبت با دقت خوبی تشخیص میدهد. تصویر زیر منفی کردن نمونه جملات را نشان میدهد.
همچنین مدل RNTN نسبت به سایر مدلها جملات با برچسب خیلی منفی و خیلی مثبت را در جملات به نسبت شدیدتری تشخیص میدهد.
۱۲. نتیجه
در این مقاله مدل RNTN را روی دادههای بانک درخت Stanford sentiment معرفی کردیم. ترکیب مدل و دادههای جدید باعث افزایش دقت تشخیص احساس و بار جمله به اندازهی 5.4% برای ردهبندی دو کلاسه مثبت و منفی شده است. همینطور بر حسب پایگاه داده که ما را با چالشهای جدیدی روبرو کرد، مدل RNTN دقت کلاسبندی ۵ کلاسهی fine-grained را به 80.7% رساند و قدرت تشخیص منفی سازی جمله را نیز دارد.
۱۳. بررسی کد
کد مدل ارائه شده در این مقاله به زبان متلب و جاوا نوشته شده است و توسط من اجرا و به زبان متلب در تحویل حضوری ارائه داده شد. دادهها شامل سه فایل train.txt، test.txt و dev.txt میباشد و فایل اصلی اجرایی برنامه کد evaluate.m است که در ادامه توضیح داده میشود.
در هر خط از فایل جملهای با نمونه فرمت زیر آورده شده است:
(2 (3 (3 Effective) (2 but)) (1 (1 too-tepid) (2 biopic)))
که هر عبارت شامل یک یا چند کلمه، با یک پرانتز شروع میشود و در ابتدا و بعد از باز شدن پرانتز، برچسب مربوط به عبارت زیردرخت مربوط به آن عبارت نیز قرار داده شده است.
D = unique([ ExtractVocabulary('train.txt')
ExtractVocabulary('dev.txt')
ExtractVocabulary('test.txt') ]);
در بخش ابتدایی که در بالا آمده، کل کلمات موجود در دیکشنری شامل دادههای هر سه فایل به صورت یکتا استخراج میشوند و در متغیر D ریخته شده است.
X_train = LoadDataset(D, 'train.txt');
X_dev = LoadDataset(D, 'dev.txt');
X_test = LoadDataset(D, 'test.txt');
در این بخش از کد نیز دادههای هر کدام از فایلها که برای مراحل آموزش، اعتبارسنجی، و آزمون طراحی شده است در متغیر جدایی ریخته میشود.
d = 30; % dimension of the word-vector
V = InitArray([2*d,2*d,d], 0.0001);
W = InitArray([d,2*d], 0.0001);
Ws = InitArray([5,d], 0.0001);
L = InitArray([d, length(D)], 0.0001);
%% train networklearningRate = 0.001;
lambda = 0.001;
% regularisation strength
K = 500; % number of epochs
M = 32; % minibatch size
error = [];
% training set log-loss error%
accuracy = [];
% validation set accuracy
% AdaGrad: gradient mean-squareMS_V = 0;
MS_W = 0;
MS_Ws = 0;
MS_L = 0;
در بخش بعدی این کد مقادیر پارامترهای مختلف یادگیری و آزمون شبکهی عصبی مورد استفاده، مقداردهی اولیه میشود که توسط کامنتها و نام متغیرها مشخص شده است.
for k=1:K
for i=1:M:8544
idx = i:(i+M-1); % sentences in the batch
[A, E, GV, GW, GWs, GL] = EvaluateBatch(X_train(idx), V, W, Ws, L);
% regularize
E = E + lambda / 2 * (V(:)' * V(:) + W(:)' * W(:) + Ws(:)' * Ws(:) + L(:)' * L(:));
GV = GV + lambda * V;
GW = GW + lambda * W;
GWs = GWs + lambda * Ws;
GL = GL + lambda * L;
% compute running gradient mean-square
MS_V = 0.9 * MS_V + 0.1 * GV .* GV;
MS_W = 0.9 * MS_W + 0.1 * GW .* GW;
MS_Ws = 0.9 * MS_Ws + 0.1 * GWs .* GWs;
MS_L = 0.9 * MS_L + 0.1 * GL .* GL;
% update weights
V = V - learningRate * (GV ./ sqrt(MS_V + 1e-5));
W = W - learningRate * (GW ./ sqrt(MS_W + 1e-5));
Ws = Ws - learningRate * (GWs ./ sqrt(MS_Ws + 1e-5));
L = L - learningRate * (GL ./ sqrt(MS_L + 1e-5));
% draw progress
error(end+1) = E;
plot(error); drawnow;
end
در بخش بعدی کد، به تعداد epoch های در نظر گرفته شده که ۵۰۰ حلقه میباشد، حلقهی دیگری در نظر گرفته شده است که به صورت دستهای دادههای آموزش را train میکند و در تابع EvaluateBatch که پیاده سازی آن را در ادامه مشاهده میکنید الگوریتمهای feedforward و backpropagation را روی گرههای درخت پارس ایجاد شده اجرا میکند.
function [accuracy, error, GV, GW, GWs, GL] = EvaluateBatch(X, V, W, Ws, L)
N = length(X);
function [accuracy, error, GV, GW, GWs, GL] = EvaluateTree(x)
A = FeedForward(x, V, W, Ws, L);
error = Error(A, x);
[~, i] = max(A.y);
accuracy = x.t(i);
[GV, GW, GWs, GL] = BackPropagate(x, A, 0, V, W, Ws, L);
end
function A = SumCell(C)
A = 0;
for i=1:N
A = A + C{i};
end
end
[accuracy, error, GV, GW, GWs, GL] = cellfun(@EvaluateTree, X, 'UniformOutput', false);
accuracy = SumCell(accuracy) / N;
error = SumCell(error) / N;
GV = SumCell(GV) / N;
GW = SumCell(GW) / N;
GWs = SumCell(GWs) / N;
GL = SumCell(GL) / N;
همانطور که مشاهده میکنید در تابع EvaluateTree با در نظر گرفتن پارامترهایی که به آن به عنوان ورودی داده شده است، ابتدا الگوریتم feedforward با دریافت ورودیها اجرا میشود و خروجی الگوریتم بدست میآید. سپس با استفاده از خروجی بدست آمده و پارامترهای شبکه خطای شبکه را با الگوریتم backpropagation در کل شبکه انتشار میدهد و میانگین گرادیان پارامترها و وزنها را نیز محاسبه میکند.
تابع feedforward همانند کد زیر الگوریتم feedforward را برای هر دو فرزند چپ و راست اجرا میکند و در صورتی که گرهی برگ باشد، خود بردار کلمه را برمیگرداند.
function A = FeedForward(x, V, W, Ws, L)
if isfield(x, 'i')
A = struct('p', L(:,x.i));
else
AL = FeedForward(x.L, V, W, Ws, L);
AR = FeedForward(x.R, V, W, Ws, L);
p = tanh(TensorProduct(V, [AL.p; AR.p]) + W * [AL.p; AR.p]);
A = struct('p', p, 'L', AL, 'R', AR);
end
A.y = Softmax(Ws * A.p);
سپس تابع غیرخطی tanh را که مطابق با مدل ارائه شده در مقاله است روی پارامترها و بردارهای شبکه صدا میزند. تابع backpropagation نیز به صورت زیر پیاده سازی شده است:
function [GV, GW, GWs, GL] = BackPropagate(x, a, dEdp, V, W, Ws, L)
[d, n] = size(L);
GWs = (a.y - x.t) * a.p';
dEdp = dEdp + Ws' * (a.y - x.t);
if isfield(x, 'i')
GL = sparse(d, n);
GL(:, x.i) = dEdp;
GV = 0;
GW = 0;
else
delta = dEdp .* (1 - a.p .* a.p);
[GV, GX] = TensorProductDerivative(V, [a.L.p; a.R.p], delta);
DD = W' * delta + GX;
DL = DD((0+1):(0+d));
DR = DD((d+1):(d+d));
GW = delta * [a.L.p; a.R.p]';
[GV_L, GW_L, GWs_L, GL_L] = BackPropagate(x.L, a.L, DL, V, W, Ws, L);
[GV_R, GW_R, GWs_R, GL_R] = BackPropagate(x.R, a.R, DR, V, W, Ws, L);
GV = GV + GV_L + GV_R;
GW = GW + GW_L + GW_R;
GWs = GWs + GWs_L + GWs_R;
GL = GL_L + GL_R;
end
کد و الگوریتم اصلی توضیح داده شده است. سایر توابع که در توابع توضیح داده شده تعریف شده اند در این آدرس آورده شده است . برای اجرا و آموزش مدل و شبکهی ارائه شده کافی است تابع evaluate.m را اجرا کنید.
۱۴. ایدههای جدید
با توجه به بررسی ابعاد و بخشهای متفاوت مدل ارائه شده، می توان در معماری شبکهی مورد استفاده برای آموزش دادهها تجدید نظر کرد. به نظر میرسد پایگاه دادهی مورد استفاده برای آموزش و آزمون شبکه بسیار جامع و کارشناسانه میباشد و از این نظر بهترین است. به دلیل پیچیده بودن روابط و شبکهی استفاده شده پس از تلاشهای انجام شده هنوز درک دقیقی از مدل و روابط به صورت کاملا واضح و با توجیح بدست نیامده و به همین دلیل علی رغم صرف زمان و در نظر گرفتن کاندیدهای متفاوت برای تغییر مدل به مدلی نو و پیشنهاد ایدههای جدید، موفق به ارائهی ایدهای نوین که قابل بیان باشد نشدم.
با تشکر