مدل زبانی یا Language Model چیست؟ | بررسی word2vec و GloVe و fastText

مدل زبانی چیست

فهرست مطالب

مقایسه مدل‌های مختلف Embeddings

در مقاله قبل یاد گرفتیم که word embedding چیست و مزایا و معایب آن را بررسی کردیم. در ادامه انواع آن را بررسی کرده و با مدل زبانی آشنا می‌شویم.

Embeddings به شکل‌های مختلفی وجود دارد. در این مقاله، به بررسی  word2vec ،GloVe و fastText می‌پردازیم و تفاوت‌های آن‌ها را بررسی خواهیم کرد.

Word2vec چیست؟

اگر برایتان جالب است که چطور یک مدل زبانی word2vec ساخته می‌شود، پس جملات زیر را که با دو کلمه cute یا scary پایان می‌یابند، در نظر بگیرید.

Bees are scaryRabbits are cute
Spiders are scaryCats are cute
Worms are scaryPuppies are cute
زنبورها ترسناک هستندخرگوش‌ها ناز هستند
عنکبوت‌ها ترسناک هستندگربه‌ها ناز هستند
کرم‌ها ترسناک هستندگربه‌ها ناز هستند

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

Screenshot 2022 09 30 232842 e1664567995282

چون 6 جمله داریم و داخل هر جمله یک حیوان نام‌ برده‌ شده پس در محاسبه احتمال بالا، 6 ضریب خواهیم داشت.

به طور مشابه، می‌توانیم مدل زبانی دیگری را با رگرسیون خطی دومی، برای محاسبه احتمال پایان یافتن جمله با کلمه scary، آموزش دهیم:

Screenshot 2022 09 30 232928

ضریب (coefficient) کلمۀ rabbits هنگام پیش‌بینی کلمه cute بزرگ‌تر از ضریب آن برای پیش‌بینی کلمه scary است (a1>b1) زیرا خرگوش‌ها (rabbits) بیشتر از اینکه scary باشند، cute هستند. همچنین، ضریب کلمۀ عنکبوت‌ها (spiders) هنگام پیش‌بینی کلمه cute کوچک‌تر از کلمه scary است (a5<b5).

تصور کنید رگرسیون‌های زیادی را بر روی تعداد بسیار زیادی از جملات پیاده‌سازی کنیم و به آن‌ها آموزش دهیم تا کلمه پایانی (ending word یا target word) هر جمله را پیش‌بینی کنند. در این صورت مدل زبانی مختلفی برای هر جمله داریم.

هر target word به ضریب‌های (coefficients) زیادی وابسته است. تعداد ضریب‌ها برابر با تعداد کلماتی است که در کل vocabulary وجود دارند. ضریب هر کلمۀ پیش‌بینی شده، یک word vector است. دقت داشته باشید که در این مثال‌های مدل زبانی، خود رگرسیون خطی برای ما اهمیتی ندارد و ما فقط به ضریب‌های مربوط به target word اهمیت می‌دهیم.

مثال بالا یک نمای بسیار کلی و بدون درنظرگرفتن جزئیات از روند واقعی آموزش و ایجاد مدل زبانی است. اما به فرایند اصلی embedding بسیار شبیه است.

word2vec embeddings با آموزش یک شبکه عصبی (مقاله شبکه عصبی مصنوعی به زبان ساده را ببینید.) بر روی مجموعه بسیار بزرگی از جملات مختلف، ایجاد می‌شوند. وظیفه شبکه، پیش‌بینی target wordهایی است که در وسط یک پنجره با اندازه ثابت (fixed-size window) قرار دارند. دقت کنید که موقعیت این پنجره‌ ثابت نیست و روی هر جمله می‌لغزد (slides over می‌کند). مانند مثال ساده رگرسیون خطی، فارغ از مدل، فقط ضرایب آخرین لایه شبکه عصبی را که می‌توانیم به‌عنوان بردار کلمه هدف استفاده کنیم، اهمیت دارد.

با لغزش پنجره‌ای از n کلمه بر روی یک جمله، نمونه‌های متعددی از کلمات هدف با شرایط و context مختلف ایجاد می‌شود.

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

				
					"It's a warm summer evening in ancient Greec."

				
			

مثلاً در اولین بخش، کلمه هدف، warm است و از دو طرف پنجره‌ای به طول دو خواهیم داشت. البته چون از سمت چپ، فقط یک کلمه داریم، پنجره سمت چپ کوچک‌تر خواهد بود. در دومین بخش یک کلمه به سمت راست حرکت کرده و حالا کلمه هدف، summer است و پنجره به طول دو باعث می‌شود کلمات a warm evening in به‌عنوان context words محسوب شوند.

sliding window of context words

Target words و context words به‌دست‌آمده توسط پنجره لغزان n=2

بنابراین، word2vec برای پیش‌بینی کلمات و ساخت مدل زبانی، بر اساس context آموزش داده می‌شود، زیرا معمولاً کلمات مشابه، context مشابهی نیز دارند.

word2vec دو سناریو مختلف برای آموزش شبکه عصبی و ساخت مدل زبانی ارائه می‌دهد:

  • CBOW یا continuous bag-of-words که یک کلمه را باتوجه‌به یک context خاص پیش‌بینی می‌کند (مانند مثال بالا). این سناریو برای کلمات پرتکرار مناسب است؛ اما برای کلمات کم کاربرد، چندان جالب نیست.
  • Skip-Gram رویکردی بر خلاف CBOW دارد. یعنی context یک کلمه را پیش‌بینی می‌کند. این سناریو برای دیتاست‌های آموزشی کوچک و محدود، مناسب است و کلمات یا عباراتی را کاربرد کمی داشته را به‌درستی نشان می‌دهد.

گوگل تابه‌حال، به طور مستقیم در مورد پارامترهای داخلی (meta parameters) یا استراتژی مورداستفاده برای آموزش مدل word2vec-google-news-300 توضیحی نداده است. بااین‌حال، در بخش 3 مقاله اصلی آن، Distributed Representations of Words and Phrases and their Compositionality، از مدل Skip-Gram نام‌برده‌شده است‌.

بررسی عمیق‌تر مکانیزم و معماری دقیق word2vec فراتر از این مقاله است، اما اگر مایلید اطلاعات بیشتری دراین‌خصوص داشته باشید، می‌توانید این سه مقاله زیر را که از بهترین منابع هستند، بررسی کنید:

پیش‌ازاین به دو مدل embedding دیگر نیز اشاره کردیم: GloVe و fastText. در ادامه بررسی دقیق‌تری روی نحوۀ ساخت آن‌ها خواهیم داشت.

دوست دارید پروژه‌هایی برای پردازش متن یاد بگیرید که در کارهای دنیای واقعی استفاده می‌شوند؟ صفحه آموزش متن کاوی فارسی با شبکه‌های عصبی را ببینید.

GloVe چیست؟

GloVe مخفف عبارت Global Vectors است. پروژه‌ای open source که توسط دانشگاه Stanford برای مدل زبانی ارائه شد.

همان‌طور که می‌دانید از فواید اصلی word2vec توانایی آن در رمزگذاری (encode کردن) معنای کلمات و به طور دقیق‌تر، درنظرگرفتن روابط بین کلمات مانند queen – woman = king – man است.

هدف از ساختن GloVe، رمزگذاری اطلاعات معنایی (encoding semantic information) در بردارها است و همچنین میزان ارتباط هر دوکلمه را با سایر کلمات زمینه‌ای (contextual word) متن اندازه‌گیری می‌کند.

در مدل زبانی، به این کلمات زمینه‌ای، کلمات کاوشگر (probe words) نیز گفته می‌شود. به‌عنوان‌مثال، احتمال اینکه دوکلمه pizza و burgers را با هم در یک متن داشته باشیم، بیشتر از آن است که کلمه pizza و pavement، sword یا factory را داشته باشیم. probe words این امکان را به ما می‌دهند تا انواع context‌هایی را که کلمه اصلی در آن استفاده می‌شود، تعریف کنیم.

حال، proximity دوکلمه ice و steam را نسبت به کلمه solid که probe word آن است، به دست می‌آوریم. اعداد دقیق محاسبه شده که در جدول زیر آمده‌اند، بر روی دیتاست بزرگی با بیش از 6 میلیارد کلمه محاسبه شده‌اند:

				
					p(solid / ice) = 1.9 x 10^{-4}
				
			

تعداد دفعاتی که دوکلمه ice و solid در مجاورت هم هستند/ تعداد دفعاتی که کلمه ice در پیکرۀ متنی به‌کاررفته است:

				
					p(solid / steam)  = 12.2 x 10^{-5}
				
			

تعداد دفعاتی که دوکلمه steam و solid در مجاورت هم هستند/ تعداد دفعاتی که کلمه steam در پیکرۀ متنی به‌کار رفته است.

نسبت این دو معیار (که برابر است با 8.9)، مقدار proximity معنایی دوکلمه steam و ice را به کلمه solid نشان می‌دهد. با مقدار نسبت 8.9 می‌توان نتیجه گرفت که کلمه solid به کلمه ice نزدیک‌تر است تا اینکه به کلمه steam نزدیک باشد که این کاملاً منطقی به نظر می‌رسد.

glove table 1

به طور مشابه، اگر کلمه water را به‌عنوان probe word در نظر بگیریم:

تعداد دفعاتی که دوکلمه ice و water در مجاورت هم هستند/ تعداد دفعاتی که کلمه ice در پیکرۀ متنی به‌کار رفته است:

				
					p(water / ice) = 3.0 x 10^{-3}
				
			
				
					p(water / steam) = 2.2 x 10^{-3}
				
			

تعداد دفعاتی که دوکلمه steam و water در مجاورت هم هستند/ تعداد دفعاتی که کلمه steam در پیکرۀ متنی به‌کاررفته است.

نسبت این دو معیار، مقدار proximity معنایی دوکلمه steam و ice را به water نشان می‌دهد. به‌این‌ترتیب، مقدار 1.36 برای این نسبت به دست می‌آید که اگر آن را گرد کنیم، عدد 1 را خواهیم داشت. این عدد 1 نشان می‌دهد که کلمه water به هر دوکلمه ice و steam به یک اندازه نزدیک است و این نتیجه نیز کاملاً منطقی است.

به‌طورکلی، در مدل زمانی اگر probe word را K و دوکلمه کاندید را A و B در نظر بگیریم:

  • زمانی که K به کلمه A وابسته باشد؛ اما با کلمه B ارتباطی نداشته باشد (ارتباط کمتری داشته باشد)، نسبت بالا است. مانند مثال ice، steam و solid که در جدول ذکر شده است.
  • اما اگر شرایط عکس شود، یعنی K به کلمه B وابسته‌تر باشد، نسبت آن‌ها پایین است. مانند مثال ice، steam و gas که در جدول ذکر شده است.
  • حالت سوم زمانی است که probe word به کلمه A یا B وابسته نباشد یا اینکه به یک اندازه وابسته باشد. مانند مثال‌های ice، steam و water یا ice، steam و fashion که در جدول ذکر شده‌اند.

این روابط را می‌توان با رسم تفاوت برداری بین کلمات اصلی (ice و steam) و probe word مانند: solid، gas، water و fashion نیز نشان داد. می‌بینید که کلمه solid در مقایسه با steam به ice نزدیک‌تر است؛ بنابراین این رابطه برقرار است: d(solid, ice) < d(solid|steam)

word2vec distance between words probe

این تصویر مربوط به مقاله Intuitive Guide to Understanding GloVe Embeddings است.

تصور کنید که همین محاسبات را برای همه جفت واژه‌هایی که در vocabulary خود داریم، تکرار کنیم. (یعنی هر کلمه K و دوکلمه کاندید A و B را برای کل واژگان خود، در نظر بگیریم و محاسبات ذکر شده را انجام دهیم). در نهایت، ما یک معیار بسیار دقیق و بهینه شده از proximity هر جفت واژه در مفاهیم مختلف خواهیم داشت که منجر به تشکیل یک ماتریس بزرگ می‌شود. برای مدیریت آن می‌توانیم contextual words را به پنجره‌ای از n کلمه در سمت چپ و سمت راست کلمات اصلی، محدود کنیم.

گام‌های بعدی محاسبه GloVe embeddings شامل ریاضیاتی است که فراتر از این مقاله است. اما به طور خلاصه، نویسندگان یک تابع ضرر (loss function) تعریف کرده‌اند که عملیات تفریق این نسبت‌ها را با log گرفتن از آن نسبت، حفظ می‌کند. این loss function را می‌توان به کمک یکی از معروف‌ترین الگوریتم بهینه‌سازی کلاسیک به نام stochastic gradient descent (SGD)، به حداقل رساند.

برای آشنایی کامل و پروژه محور با مفاهیم پردازش زبان طبیعی دوره آموزش پردازش زبان طبیعی مقدماتی را ببینید.

مقایسه GloVe و Word2vec

مقاله‌ای با عنوان An overview of word embeddings and their connection to distributional semantic models توسط Aylien منتشر شده است که تفاوت بین GloVe و word2vec را توضیح می‌دهد:

برخلاف word2vec که تولید بردارهای معنایی در آن یک حرکت جانبی و حاشیه‌ای است (زیرا در word2vec یک مدل زبانی train می‌کنیم تا کلمه بعدی را پیش‌بینی کند؛ ولی این یک تسک کاذب است و هدف استخراج بردار کلمات از لایه یکی مانده به آخر word2vec است)، اما هدف اصلی GloVe تولید همین بردارها است.

در عمل، GloVe در حین آموزش مدل زبانی، فارغ از اندازه پیکرۀ متنی (کوچک یا بزرگ)، از یک الگوریتم بهینه‌سازی قوی به نام (SGD) استفاده می‌شود که GloVe را در مقایسه با word2vec صاحب چنین مزایایی می‌کند:

  • آموزش سریع‌تر مدل زبانی
  • کارایی بیشتر RAM/CPU (می‌توان داکیومنت‌های بزرگ‌تر را مدیریت کرد)
  • استفاده کارآمدتر از داده‌ها (مخصوصاً برای دیتاست‌های کوچک‌تر)
  • عملکرد دقیق‌تر مدل زبانی با داشتن دیتاست یکسان

FastText چیست؟

برای حل مشکل OOV، روش fastText از یک استراتژی توکن‌سازی مبتنی بر کاراکتر n-gram برای ساخت مدل زبانی استفاده می‌کند. یک کاراکتر n-gram در واقع دنباله‌ای از n حرف است.

به‌عنوان‌مثال، اگر کلمه window را در نظر بگیریم، علاوه بر داشتن یک بردار برای خود کلمه window، برای تمام bigramsهای آن یعنی: wi، in، nd، do و ow و تمام trigramsهای: win، ind، ndo و dow بردارهایی تشکیل می‌شود. برای کلمه table نیز بردارهایی برای ta، ab، bl، le، و tab، abl، و ble داریم.

هرگاه fastText با یک کلمه جدید و ناشناخته‌ای که پیش‌ازاین در vocabulary خود نداشته، روبرو شود، کلمه را به n-gram آن تجزیه کرده و بردارهای مربوطۀ آن‌ها را جمع می‌کند تا بردار کلمه اصلی را به دست آورد. به‌این‌ترتیب در مدل زبانی ایجاد شده، مشکل OOV، کلمات جدید و ناشناخته یا حتی کلمات با غلط املایی (misspellings) نیز حل می‌شود.

علاوه بر داشتن استراتژی توکن‌سازی انعطاف‌پذیر و مبتنی بر کاراکتر n-gram، fastText می‌تواند سریع و ساده word2vec را با هر دو سناریو CBOW یا skip-gram پیاده‌سازی کند.

برخی از دیگر ویژگی‌های کلیدی fastText عبارت‌اند از:

  • حدوداً 300 زبان را پشتیبانی می‌کند (می‌توانید لیست این زبان‌ها را در این صفحه fastText documentation ببینید).
  • قابل‌استفاده در زبان برنامه‌نویسی پایتون
  • ساده‌سازی train مدل‌های text classifier
  • دارای یک مدل خاص برای تشخیص زبان (language detection) (برای اطلاعات بیشتر در مورد تشخیص زبان، به fastText documentation مراجعه کنید). این ویژگی برای فیلتر دیتای مربوط به شبکه‌های اجتماعی که به چندین زبان هستند، مفید است.

نکته مهم: تنها fastText به‌صورت رسمی نسخه مخصوص به زبان فارسی ارائه داده است.

در این مقاله، سه تکنیک word embeddings یعنی word2vec، GloVe و fastText را به طور دقیق‌تر بررسی کردیم:

  • در Word2vec به کمک شبکه عصبی، کلمات در نظر گرفته نشده و miss شده در جملات، پیش‌بینی می‌شود و سپس ضرایب آخرین لایه شبکه عصبی به‌عنوان بردار کلمات در نظر گرفته می‌شود.
  • GloVe برای به‌دست‌آوردن شباهت در context، بین کلمات تمرکز می‌کند پس سبک‌تر و کارآمدتر از word2vec است.
  • FastText بر اساس توکن‌سازی کاراکتر n-gram کار می‌کند و در نتیجه می‌تواند کلمات جدید و خارج از مجموعه vocabulary را مدیریت کند.

در این مقاله با عملکرد داخلی word2vec، GloVe و fastText بیشتر آشنا شدیم. در مقاله پیاده سازی الگوریتم Word2vec و GloVe، با ایجاد embeddings بر روی یک پیکرۀ متنی خاص، این مدل‌ها را بررسی می‌کنیم.

مطالب بیشتر

2 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

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