word2vec & glove

word2vec

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

حال به روش های زیرتوجه کنید:

می دانیم که context به nتعدادکلماتی که برای پیش بینی شبکه لازم است واین n تعداد هایپر پارامتر هستند.

مثلا در شکل بالا n = 4قرار داده ایم وبرای پیش بینی juice ،چهار کلمه قبل از آن را انتخاب کرده ایم این روشی است که در سال 2003توسطBengioمطرح گردیدودر حال حاضر روش های بهتری ارایه شده است که به آن ها می پردازیم.

 

بعنوان مثال در شکل بالا هدف این است که juice راپیش بینی کنیم وبراساس contextهای متفاوت که در شکل بالا اورده شده میتوان به این هدف رسید.(همان طورکه در شکل قبل Last 4 wordsرا مشاهده کردیم.)

روش 4words on left & right :در این روش علاوه بر 4کلمه قبل،4کلمه ی بعدی رو هم context در نظر میگیریم.

روش Last 1 word:یک کلمه مونده به targetروcontext در نظرمی گیریم.

روش Nearby 1 word: یک پنجره context را 5 تا کلمه ای یا 10 تایی قبل وبعد targetبرمیداریم وسپس از این پنجره بعنوان رندوم یک کلمه انتخاب می شود،که درمثال بالا glass به عنوان context به صورت رندوم انتخاب شده است.به این روش skip-grams گویندکه همان word2vec راتشکیل می دهد.این ایده خیلی ساده ای است ولی در نهایت embedding خوبی خواهیم داشت.

پس در این روش یکسری context و target داریم که با n تا کلمه قبل وبعد وبا انتخاب یک کلمه ازمیانn تا به صورت رندوم میتوان targetرا تشخیص داد.این ایده در 2013 توسط Micolov مطرح گردید.

در شکل بالا یک Fake Task داریم که اگر یک context را بدهیم target را پیش بینی خواهد کردمثلا در شکل بالا در پنجره های ابی رنگ context ودر سفید رنگ targetرا خواهیم داشت وپنجره اول دو کلمه quick ,brown هم targetهستند.درپنجره های دیگر شکل هایپر پارامتر های متفاوتی را بسته به سلیقه های کد نویسی متفاوت مشاهده می کنیم.دراین شکل چون وزن های شبکه بروز می شوند target هم میتواند دو مقدار داشته باشد وهیچ مشکلی پیش نمی اید چون هدف بدست اوردن بردارembedding بامعنی است.

 

در نهایت شبکه شکل بالا را خواهیم داشت که

input vector: بسته به دیکشنری سایزمتفاوتی دارد که در شکل بالا 10000تایی ست.

hidden layer:به یک لایه embeddingوصل می شودکه مقدارآن هایپرپارامتراست وچون googleاین مقدار را300درنظر گرفته ماهم همان مقدار را درنظر می گیریم.

output layer:بردار one-hotاست که 10000تا مقدار نورون داردکه هر کدام به ازای یک کلمه تنها یکی ازآن ها مقدار یک می شود.

در این taskکه در شکل بالا توضیح داده شد برخلاف لایه های FC های قدیم activation نمی گزاریم و برای هر چه راحت شدن وپیچیدگی کمتر liner استفاده کردیم.

به مدل زیر توجه کنید که

دراین مدل vocab size=10000 است که از context که orange است ودر دیکشنری شماره6257 را دارد،می خواهیم به target  که juice است ودر index=4834 است برسیم که در واقع از X به Y یک Mapping خواهیم داشت.

 Ocبرابر one hot کلمه ی c است که در یک بردار embedding رندوم ضرب می شود وec که embedding کلمه c است سپس از یک لایه softmax عبور می دهیم ودر نهایت کلمه predict شده به دست می اید.

در فرمول softmax عکس می بینیم که مقدار خیلی بزرگی دارد که ممکن است train نشود چون سیگما مخرج یک جمع فوق العاده سنگینی است که علاوه بر آن ضرب وکتورایز هم داخلش داریم وتمام این عملیات های ریاضی فوق العاده باعث کاهش سرعت می شوند.

برای حل  مشکل بالا ایده های زیر ارایه شده است:

استفاذه از softmax باینری یعنی برای رسیدن به 10000 تا داده یک درخت می سازیم وآن را به دو قسمت مساوی تقسیم میکنیم که هر شاخه درخت5000 داده خواهد داشت، برای یافتن داده ابتدا بررسی میکنیم در کدام شاخه درخت باید بگردیم سپس ان شاخه را ادامه ودر مرحله ی بعدی 2500 تا داده ی بعدی را بررسی میکنیم وهمین طوری میگردیم تا به کلمه نهایی برسیم که در شکل با رنگ بنفش نشان داده شده است با این روش سرعت بالا تر می رود.

ایده ی دیگر همانند درخت Decision Tree می توان بر اساس احتمالات درخت را چید وبعنوان مثال کلمات پر تکرار همانند the و a را در ابتدای درخت قرار داد وکلماتی که خیلی پر تکرار نیستند رو درانتهای درخت بگزاریم.

Negative Sampling

بازهم ایده های بالا مشکلاتی دارند وروش بهتری به نام Negative Sampling مطرح شد:

دراین روش کار را ساده تر کردیم چون قبلا برای softmax سختی محاسبه را داشتیم حال ان راتبدیل به sigmoid میکنیم، همانطور که در شکل بالا میبینیم لغت juice به صورت رندوم به عنوان target انتخاب و مقدارش در جدول یک می شود وبقیه ی حروف مقدار صفر را میگیرند.البته لازم به ذکر است که در این روش چون به صورت رندوم target انتخاب می شود ممکن است target اشتباه انتخاب شود وبا مشکل مواجه شویم،ولی چون دیتا ست بزرگی در اختیار داریم این مشکل در مراحل بعدتر حل می شود.

مدل تبدیل به شکل بالا می شود که یکی از کلمات context است وفقط یکی از بقیه کلمات بعنوان target انتخاب میشود ومقدار یک میگیرد پس درواقع یکsigmoid tag خواهیم داشت وبا دادن کلمه ی orange کلمه juiceحاصل می شود.اگر لغت king داده شود همان sigmoid مخصوص این کلمه خطا را برمیگرداند که متوجه میشویم این کلمه sampleنیست وغلط است.درواقع دراین مثال هر بار 5نورون سیگموید دخیل هستند وخطا ها را برمیگردانند.یعنی با دادن کلمه orange در شبکه تمام 10000نورون در شکل یک مقداری میگیرند وبرای انتخاب کلمه juice یا king برای خروجی هرکدام که مقدار بیشتری داشت بامقدارtarget مقایسه ودر نهایت انتخاب میشود و اختلاف این مقدار ها در شبکه backpropagat  میشود.

برای انتخاب کلمات براساس احتمالاتی که درجمله کلمات داشتند بیشترین راانتخاب میکردیم،حال میخواهیم کلماتی که در دیکشنری پرتکرار هستند نسبت به هم نزدیکتر باشند واحتمال بیشتری برای انتخاب داشته باشند.برای این روش مشکلی که داریم این است که کلمات پر تکرار همانند aو the و of همیشه پرتکرارهستند و negative هارا همیشه تشکیل خواهند دادپس کلمات پرتکرار با احتمال (f(Wi، احتمال بیشتری خواهند داشت.روش دیگر این است به تمام کلمات احتمال برابری را نسبت می دهیم ولی مشکل این روش این است که کلمات پرتکرار بهتر یاد گرفته نمی شود.

برای حل دو روش بالا فرمول (P(Wi مطرح شد که نسبت احتمال کلمات را نسبت به کلمات پرتکرار حفظ می کند وکلماتی که بیشترانتخاب می شدند احتمال بیشتری نسبت به کم تکرار ها خواهند گرفت.(برای درک فرمول ونسبت ها میتوانید تابع xبه توان 3/4وxرا باهم ببینید)

GloVe word vectors

gloveروشی برای word embedding درست کردن است دریک task است که بعدها این word embeddingبتواند مورد استفاده قرار بگیرد.این روش درسال 2014 توسط استندفوری ها مطرح شد.

به صورت کامل نمی توان گفت که gloveبهترازword2vecهست.

 

درجمله ای که در شکل بالا می بینیم همانطور که قبلا گفته شد یک context و target انتخاب می کردیم دراین روش الگوریتمی ساخته می شود که embeddingها را باروش ساده تر یاد بگیریم:

Xij=تعداددفعاتی که در کل دیتا ست context iام با context jام دیده شده است.

Xij=Xjiتنها در صورتی این دو باهم برابرندکه پنجره ای که برایcontextدر نظر گرفته می شود n لغت قبل وبعد را شامل شودمثلا یک لغت قبل وبعد یادرمثال های قبل 4لغت قبل وبعد را بعنوان پنجره contextدر نظر گرفته بودیم.

درفرمول بالا

ej= بردارembadding لغت ای که اندیس jدارد.

θi=وزن های پارامترهای یک نورون iهست.

(f(Xij=وزن (اطلاعات بیشتر در کورس deep learning nlp استندفوردجلسه سوم)

هدف به دست اوردن وابستگی بین iوjاست که log آن برابر تعداددفعاتی است که i و j با هم دیده شده اند.

در ابتدا هم i و j به ازای تمام کلمات minimize می شوند.

bi و bj هم بایاس هستند.

کاربرد(f(Xij :

  1. ممکن است دوکلمه ی i و j با هم دیده نشده باشند پس Xij=0 میشود ودر نهایت (log(0 تعریف نشده است ومی دانیم در برنامه نویسی برای محاسبه عبارت ریاضی اگر مقدار ابتدای صفر شود دیگر عبارت محاسبه نمی شود ومقدار صفر خواهد گرفت پس برای حل مشکل تعریف نشده بودن=0 (f(Xij می شود وبرنامه به ارورنمی خورد.
  2. همانند روش negative sampling با وجود (f(Xij برای کلمات پرتکرار وزن بیشتری نسبت میدهیم واحتمال انتخاب شدن ان ها را افزایش میدهیم وکلمات کم تکرار هم احتمال انتخاب شدنشان نیز کنترل میشود.

اگر پنجره context اندازه قبل وبعد از context برابری داشته باشندej و θi هردو یک چیز یکسانی را یادمیگیرندوهردو خواصیتی که می خواستیم را پیدا می کنند پس در فرمول نهایی میانگین این دو را در نظرمیگیریم.

دانلود word embedding از قبل آموزش داده شده توسط Glove

چون با مشکل کوچک بودن دیتا ست مواجه هستیم پس در این قسمت word embedding ازقبل اموزش داده شده ی glove را انتخاب میکنیم.

Pre-process the embeddings

ابتدا دیتا ست را دانلود میکنیم و ان را unzip کرده وسپس وکتورهای 100 بعدی این مجموعه را انتخاب می کنیم دراین مرحله ابتدا هر خط از دیتا ست را با line.split جدا کرده وخود لغت را از دیتاست که [value[0 دارد داخل word می ریزیم و [:values[1 که vectorهای تکرارword را تشکیل میدهندو در اینجا embadding_index را شامل می شوند.درنهایت فایل باز شده را  میبندیم.

در این گام یک ماتریس embedding vector را شامل می شود یعنی از فضای دیکشنری موجود به فضای embedding تبدیل کنیم.از قبل می دانیم max_word=10000 تا لغت پرکاربرد دیکشنری هست وبرای این ها ماتریس embedding vectorرا می سازیم که  (len=10000 , shap=(10000 ,100 است.

Define a model

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

Load the GloVe embeddings in the model

لایه ی embedding_matri را به صورت رندوم با تابع set_weighte وزن هایش را لود میکنیم.

trainable = False قرارمی دهیم چون در ابتدا خطا زیاد است و می خواهیم بردار pre_train را خراب نکند.

Train and evaluate

مدل را compile , fit کرده ودر نهایت مدل را save میکنیم.در نهایت با مشکل overfitting مواجه میشویم چون accuracy دیتای train=1و validation=0.57 میشود چون مدل شبکه به خوبی ساخته نشده وترتیب کلمات را یاد نمی گیرد.

 

دراینده با مباحث RNN ها خواهیم دید که perfomance را بهبود خواهیم داد.

 

 

فوتر سایت

اسلایدر سایدبار

درباره ما

درباره ما

ما گروهی از دانشجویان رشته کامپیوتر دانشگاه شهید رجایی هستیم که به راهنمایی و تدریس استاد علی‌رضا اخوان‌پور به دنیای یادگیری عمیق پا گذاشتیم و دوست داریم چیزهایی که در این مسیر یادمی‌گیریم رو به اشتراک بذاریم.

شبکه های اجتماعی

مطالب اخیر