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

ورد۲وک کجا، چطور و چگونه – قسمت دوم

در قسمت قبلی ورد۲وک کجا چطور و چگونه باهم مفاهیم اولیه ورد۲وک را بررسی کردیم و سپس به توضیح مدل CBOW پرداختیم. و در آموزش ورد۲وک در جنسیم و تنسورفلو با نحوه آموزش و پیاده‌سازی آشنا شدیم. در این قسمت میخواهیم مدل Skip-gram را بهتر بشناسیم و برخی از تکنیک‌های به کار رفته در ورد۲وک آشنا شویم.

همانطور که در قسمت اول گفته شد مدل CBOW تا حدود بسیار شبیه مدل آقای Bengio است و اگر مدل CBOW را درک کرده باشید، فهم Skip-gram بسیار ساده و راحت خواهد بود. همانطور که قبلا گفتیم، یکی از تفاوت‌های مدل CBOW با مدل آقای Bengio این بود که علاوه بر کلمات قبلی، از کلمات بعدی برای حدس کلمه هدف (target) استفاده می‌شود. ولی مدل Skip-gram دقیقا برعکس CBOW عمل می‌کند. در Skip-gram به جای حدس یک کلمه قرار است چندین کلمه را حدس بزنیم.

word2vec CBOW Skipgram

اگر به شکل بالا دقت کنید در معماری Skip-gram یک کلمه به عنوان ورودی داده شده است و دو کلمه قبل و دو کلمه بعد آن حدس زده می‌شود. در واقع در این مدل قرار است حدس بزنیم موقعی که یک کلمه در ورودی آمد، چه کلماتی ممکن است در کنار آن قرار بگیرند یا اصلاحا Context کلمه ورودی چه کلماتی می‌تواند باشد. در اینجا هم دقیقا مثل CBOW ورودی به صورت one-hot داده می‌شود و در ماتریس C یا W ضرب می‌شود و سپس با کمک یک بردار حاصل (مثلا ۳۰۰ بعدی) حدس میزنیم که چه کلماتی محتمل هستند که در Context کلمه ورودی قرار بگیرند. همانطور که می‌دانید این حدس دقیقا مانند مدل CBOW، با استفاده از Softmax انجام می‌گیرد.

در مقاله دوم بیشتر به بهینه‌سازی مقاله اول پرداختند و مواردی مانند Negative Sampling و Hierarchical Softmax را مطرح نمودند که در ادامه به طور خلاصه به آنها می‌پردازیم.

در مقاله دوم تابع هدف زیر را برای آموزش Skip-gram درنظر گرفته‌اند:

تابع هدف در word2vec

سیگما اول (از یک تا T) در واقع روی تمام کلمات پیکره پیمایش میکند و سیگمای دوم روی context کلمه هدف (target) حرکت میکند (در skip-gram هدف ما، حدس زدن کلمات context با توجه به کلمه target بود). احتمال P هم واضح است احتمال کلمات Context به شرط داشتن کلمه target یا W-t.

برای اینکه احتمال P به ازای کلمه W-t و هرکدام از W-t+jها حساب کنیم میتوانیم از تابع Softmax استفاده کنیم یعنی:احتمال لاگ یا سافتمکس

که در مقاله اسم W-t را W-I یا W-inside و W-t+j را W-O یا W-outside گذاشته‌اند. از طرفی همانطور که در فرمول بالا مشاهده میکنید،‌ در مخرج کسر باید روی تمام کلمات پیکره جمع (sigma) بزنیم و با توجه به اینکه اینکار باید به تعداد توکن‌های پیکره تکرار شود بسیار هزینه‌بر و غیرعملی است. پس در مقاله دوم،‌  دو روش بسیار کارآمد برای محاسبه Softmax در لایه آخر معرفی کردند که یکی از آنها Hierarchical Softmax و دیگری Negative Sampling نام دارد.

به طور کلی برای محاسبه Softmax دو خانواده کلی وجود دارد:

  1. روش‌های مبتنی بر Softmax مانند: Hierarchical softmax (سافتمکس سلسله مراتبی)
  2. روش‌های مبتنی بر Sampling مانند: Negative Sampling (نمونه برداری منفی)

روش‌های مبتنی بر Softmax (روشهای اول)، عموما به این صورت هستند که یک معماری جدید ارائه می‌دهند که از نظر محاسباتی هزینه را کمتر می‌کنند. مثلا در روش Hierarchical softmax از یک درخت استفاده می‌شود که در برگ‌های آن احتمال کلمه به شرط context آن ذخیره شده است (همون P در فرمول بالا) و چون پیمایش درخت می‌تواند در زمان O(logV) صورت بگیرد پس از نظر محاسباتی نسبت به Softmax معمولی که باید برای محاسبه احتمال O(V) هزینه میکردیم بسیار بهینه‌تر عمل می‌کند. اینکه درخت رو چطوری درست میکنند و احتمال P رو چطوری در برگها ذخیره میکنند اندکی پیچیده است و ویدئو زیر آن را توضیح داده است:

 

روش‌های Sampling به طور کلی Softmax را دور ریخته و از یک تابع دیگر استفاده می‌کنند که با تقریب بسیار خوبی شبیه Softmax عمل کند و چون در Word2vec هدف اصلی آموزش کلمات است و نه محاسبه دقیق Softmax به همین دلیل این روش یک روش منطقی و قابل قبول و در عین حال بسیار سریع محسوب می‌شود.

خب حالا منظور از اینکه Softmax را دور میریزند یعنی چی؟ اگر تابع هدف رو نگاه کنید ما قرار است که log P را حساب کنیم پس میتوانیم  log اشو باز کنیم و به صورت زیر بنویسم:

باز کردن فرمول

اگر بیاییم یکم از فرمول بالا گرادیان، دیفرانسیل و تقریب .. بگیریم به پایین میرسیم (اگر دوست دارید ببینید چه میشود اینجا را بخوانید):

فرمول نهایی و تبدیل شده negative sampling

که فرمول بالا یک binary classification است. پس ما Softmax رو به یک مساله classification تبدیل کردیم. همانطور که میدونید برای binary classification دو label لازم دارد (y=0 و y=1). خب حالا سوال اینجاست که دیتا label خورده چطوری بدست بیاریم!!! همانطور که در بالا گفتیم ما یک context به نام c تعریف میکنیم (مثلا گفتیم دو کلمه قبل و دو کلمه بعد) این کلمات را به عنوان کلمات مشابه یا y=1 در نظر میگیرند. همچنین k تا کلمه (k عددی حدود ۲۰) به صورت تصادفی از پیکره انتخاب میکنند و اینها با تقریب مناسبی میتونیم فرض کنیم y=0 است یعنی کلمه targetمون باهاشون ارتباط معنایی ندارند. به این ترتیب تابع هدف رو بهینه میکنیم یعنی اینقدر وزنهای شبکه امون رو تغییر میدهیم تا بتواند این classification را بخوبی انجام دهد و مقدار تابع هدف را بهینه کند.

و باز مشابه CBOW وزنهایی W یا C که در لایه اول باقی میماند را به عنوان بازیابی کلماتمان در نظر میگیریم و به آن ماتریس word2vec میگوییم.

همچنین در مقاله بخشی به نام Subsampling of Frequent Words عنوان شده است. این بخش برای انتخاب k کلمه تصادفی از پیکره را عنوان کرده است (همان کلماتی که گفتیم y=0). به طور خلاصه میتوان گفت که برای انتخاب کلمات باید تصادفی باشد و از توزیع احتمالاتی زیر استفاده میکند:

نمونه برداری در ورد۲وکتوزیع بالا خاصیت جالبی دارد و به کلمات Stop word احتمال پایینی میدهد.

در انتهای مقاله اول نحوه ارزیابی را معرفی کرده است که اصلاحا به آن گوگل آنالوژی میگویند. گوگل آنالوژی یک معیار ارزیابی برای اینکه آیا بردارهای ما خوب آموزش داده شده‌اند یا خیر. ارزیابی به این صورت انجام می‌شود که A, B, C, D وجود دارند و مدل ما باید به نحوی آموزش داده شود که با A, B, C بتواند کلمه D را حدس بزند. معیارهای ارزیابی دیگری هم وجود دارند مثل wordsim353 یا… (به طور کلی ارزیابی خوبی برای word embeddingها وجود ندارد و بهترین راه برای ارزیابی آنها استفاده در تسک مورد نظرتون است).

در قسمت بعدی به سراغ برخی از کارهایی که میشه با word2vec و سایر بازنمایی‌ها انجام داد میپردازیم.

 

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

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

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

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