فهرست مطالب
در هر بخشی از جهان ما الگویی وجود دارد. این تقارن، ظرافت و زیبایی ویژگیهایی هستند که یک هنرمند واقعی میبیند. این الگوهای زیبا را میتوان در گردش فصل ها، مسیرهای شنی کنار ساحل، شاخه و برگ درختان پیدا کرد.
ما سعی میکنیم این الگوها را در زندگی و جامعه خود کپی کنیم و به دنبال ریتمها، رقصها و فرمهایی هستیم که باعث آرامش میشود. با این حال، میتوان خطری را در یافتن کمال نهایی مشاهده کرد. واضح است که الگوی نهایی ثبات خاص خود را دارد. در چنین کمالی همه چیز به سوی مرگ پیش میرود.
Dune -1965
word2vec چیست؟
مفهوم بازنمایی کلمات (مقاله word embeddings چیست را ببینید) یکی از جذابترین ایدهها در یادگیری ماشین است. Siri، Google Assistant، Alexa، Google Translate یا حتی صفحهکلید گوشی هوشمند وقتی کلمه بعدی را پیشنهاد میدهد، از word embeddings که ایدهی اصلی مدلهای پردازش زبان طبیعی (NLP) است، استفاده میکنند.
در طول چند دهه اخیر استفاده از word embeddingها برای مدلهای عصبی (مقاله شبکه عصبی مصنوعی به زبان ساده را بخوانید) پیشرفت زیادی داشته است (این تحولات شامل contextualized word embeddings است که نتیجهی آن مدلهای پیشرفته BERT و GPT2 هستند).
word2vec، روش بسیار مؤثری برای ایجاد word embedding است که اولین بار در سال 2013 مطرح شد. اما علاوه بر کاربرد آن بهعنوان یک روش برای تولید word embedding، برخی از مفاهیم آن در ایجاد سیستمهای توصیهگر در پروژههای تجاری (که دادههای ورودی الزاماً متن نیست) مؤثر هستند. پس بهطور کلی word2vec کمک زیادی به پردازش و تحلیل دادههای sequence میکند.
همچنین شرکتهایی مانند Airbnb، Alibaba، Spotify و Anghami برای ارتقای نسل جدید سیستم توصیهگر خود از مفاهیم کلیدی NLP مثل word2vec استفاده کردند.
معنا و مفهوم word2vec
در واقع کلمه word2vec مخفف word to vector است. در فارسی یعنی تبدیل کلمه به بردار.
در این مقاله، مفهوم embedding و نحوه تولید embedding با word2vec را بررسی خواهیم کرد. با یک مثال شروع میکنیم و با استفاده از بردار، پدیدهها را نشان میدهیم.
آیا میدانستید یک بردار 5تایی میتواند شخصیت شما را نشان دهد؟
یعنی ویژگیهای رفتاری و شخصیتی شما در یک بردار عددی بازنمایی یا تعبیه شود که به آن Personality Embeddings می گوییم.
مفاهیم پردازش زبان طبیعی را در دوره آموزش پردازش زبان طبیعی مقدماتی یاد بگیرید. در این دوره پروژههای کاربردی NLP را به زبان پایتون انجام میدهید.
مثال word2vec
در ادامه با یک مثال تبدیل کلمه به بردار را یاد میگیریم. حتماً با تستهای شخصیت شناسی مانند MBTI یا DISC یا حتی بهتر از آن، تست پنج ویژگی مهم شخصیت آشنا هستید. در این تستها، فهرستی از سؤالات را میپرسند، سپس با امتیازها مشخص میشود چقدر درونگرا و یا برونگرا هستیم. اما این تستها چطور شخصیت درونگرا و برونگرای ما را تشخیص میدهند؟ جالب است بدانید تنها با فهرستی از پنج عدد (یک بردار) میتوان نوع شخصیت را مشخص کرد.
به بیان بهتر در بازه صفر تا 100، هر چه امتیاز به صد نزدیکتر باشد، برونگراتر و هرچه به صفر نزدیک باشد، درونگراتر هستیم.
این تستها واقعاً میتوانند چیزهای زیادی درباره شخصیت ما بگویند. حتی ثابت شدهاست که این تستها توانایی پیشبینی موفقیت تحصیلی، شخصی و حرفهای را دارند.
چگونه میتوان کلمه را به بردار تبدیل کرد؟
برای درک بهتر مثال، حالت زیر را در نظر بگیرید.
تصور کنید پس از انجام تست، امتیاز درونگرایی/ برون گرایی 38 شدهاست. میتوانیم آن را بهصورت زیر نشان دهیم:
بهجای بازه 0 تا 100، بازه را -1 تا 1 قرار میدهیم:انسانها شخصیت پیچیدهای دارند و فقط همین اطلاعات کم کافی نیست. پس بهتر است بعد دیگری را با یک ویژگی جدید به تست اضافه کنیم. پس دومین ویژگی که عدد 0.8 را نشان میدهد، نیز اضافه میکنیم:
بردار عمودی در بازه 1- تا 1 عدد 0.4- را نشانمیدهد و بردار افقی در بازه 1- تا 1 عدد 0.8 را نشان میدهد و بردار آبی، برآیند این دو ویژگی از مبدا است.
برای اینکه مشخص نباشد هر بعد چه چیزی را نشان میدهد و محرمانگی ویژگی شخصیتی حفظ شود، نام ویژگیها حذف شدند.
این بردار تا حدی یک شخصیت را مشخص میکند. مزیت نمایش برداری این است که به راحتی میتوان شخصیت چند نفر را با هم مقایسه کرد.
فرض کنید Jay با اتوبوس تصادف کرده و باید فردی با شخصیت مشابه جایگزین او شود. در شکل زیر کدام یک از این دو نفر به Jay شباهت بیشتری دارند؟
در شکل بالا، بردار فرد اول با رنگ سبز، بردار فرد دوم با رنگ قرمز و بردار Jay با رنگ آبی نشان داده شده است.
معیار شباهت کسینوسی در مثال word2vec
یک روش معمول برای محاسبه امتیاز شباهت، استفاده از معیار شباهت cosine_similarity است:
همانطور که در شکل بالا میبینید شخص شماره 1 از نظر شخصیتی بیشتر شبیه Jay است. بردارهای که به یک جهت اشاره میکنند، امتیاز تشابه کسینوسی بالاتری دارند (البته طول بردار هم مهم است).
برای فهمیدن تفاوت یا شباهت افراد نسبت به همدیگر، تنها دو بعد کافی نیست. دههها تحقیقات روانشناسی، منجر به شناسایی پنج ویژگی اصلی (و بسیاری از ویژگیهای فرعی) شده است. بنابراین بهتر است از هر پنج بعد در مقایسه خود استفاده کنیم:
برای پنج بعد نمیتوان مانند دو بعد، با استفاده از فلشهای کوچک، نمودار ویژگیها را رسم کرد که یکی از چالشهای رایج در یادگیری ماشین همین است. با این حال، خوشبختانه تشابه کسینوسی برای هر تعداد ابعاد کار میکند. امتیازات جدید با پنج بعد بهتر هستند، زیرا مولفههای بیشتری را مقایسه میکنند:
در پایان این بخش، میخواهیم دو ایده اصلی را بیان کنیم:
- افراد (و اشیا) را با یک بردار عددی نشان دهیم (که اینکار برای درک توسط ماشینها عالی است).
- محاسبه میزان شباهت بردارها نسبت به یکدیگر بهراحتی قابل انجام است.
در دوره آموزش متن کاوی فارسی با شبکههای عصبی، با تمرکز روی زبان فارسی، جدیدترین تکنیکهای پردازش زبان طبیعی با کدنویسی فراوان را یاد بگیرید.
مثال Word Embeddings
تا اینجا میتوانیم به نمونههایی از بردار کلمات آموزشدیده (که به آن word embedding کلمه نیز گفته میشود) نگاهی بیندازیم و برخی از ویژگیهای جالب آنها را بررسی کنیم.
در شکل زیر بردار عددی یا word embedding کلمهی “پادشاه” یا همان king را میبینیم:
در این لیست 50 عدد مثبت و منفی داریم. وقتی به این لیست نگاه میکنیم شاید چیز زیادی متوجه نشویم و بهنوعی گیجکننده باشد. پس بهتر است کمی رنگ و لعاب به کار اضافه کنیم تا بهراحتی بتوان بردار کلمات مختلف را با هم مقایسه کرد. ابتدا برای راحتی کار، تمامی اعداد را در یک ردیف قرار میدهیم:
در لیست بالا به هر کدام از اعداد، از صفر تا 49 یک اندیس اختصاص میدهیم.
حال برای هر سلول بر اساس مقدار، یک کد رنگ مشخص میکنیم. اگر عدد نزدیک به 2 بود، رنگ قرمز و اگر نزدیک به صفر بود، رنگ سفید و اگر نزدیک به منفی دو بود، رنگ آبی به آن میدهیم.
هر چه مقدار به آستانه تعیین شده نزدیکتر باشد، رنگ مورد نظر پررنگتر خواهد بود.
بدون توجه به اعداد و فقط با نگاه کردن بهرنگها، میتوان کلمات مختلف را با هم مقایسه کرد. مثلا «king» را در مقابل کلمات دیگر قرار میدهیم:
در تصویر بالا توالی رنگهای هر کلمه را میبینیم. کلمات مورد مقایسه man و woman هستند. طیف رنگی آنها را با کلمه King مقایسه میکنیم. در تصویر بالا طیف رنگی king به کدام یک از دو کلمه man و woman شباهت دارد؟
دو کلمه “man” و “woman” بسیار شبیه به یکدیگر هستند اما شباهت زیادی با کلمه موردنظر یعنی king ندارند. اگر خوب دقت کنید، نمایشهای برداری، برخی از اطلاعات، معنی و ارتباطات این کلمات را نمایش میدهند.
حال از زاویه دیگری به طیف رنگی این سه کلمه نگاه میکنیم. هر سلول کلمه پادشاه را با سلول نظیر کلمه زن و مرد مقایسه میکنیم. (سه طیف رنگی کلمات را بهصورت ستونی بینید)
چند نکته قابل ذکر است:
- یک ستون قرمز در میان همه این کلمات وجود دارد، پس مقدار مشابه دارند (ما نمیدانیم که هر ستون و سلول چه معنی دارند).
- دو کلمه “woman “و girl”” در بسیاری از موارد به یکدیگر شبیه هستند. “man” و “boy” هم همینطور.
- در «boy» و «girl» نیز جاهایی وجود دارد که شبیه یکدیگر هستند، اما با «woman» یا «man» متفاوت هستند. آیا این تفاوت میتواند برای درک مفهوم جوانی، استفاده شود؟ یعنی پسر نسخه جوانتر مرد است.
- همه کلمات (بهجز آخرین کلمه)، نشان دهنده انسان هستند. عمداً یک شیء (آب) اضافه شده تا تفاوت بین بردار کلمات مربوط به انسان و غیرانسان را نشان دهد. برای مثال، میتوانید آن ستون آبی را ببینید که تا انتها پایین میرود و قبل از word embedding برای کلمه «آب» توقف میکند. به فلش مشکی که در تصویر زیر به آن اشاره میشود توجه کنید:
برخی سلولهای مربوط به «king» و «queen» شبیه یکدیگر و متمایز از بقیه هستند. آیا از آن میتوان برای کدگذاری مفهوم king، استفادهکرد؟
در مقاله مسیر پردازش زبان طبیعی، نقشه راه NLP به شما نشان داده میشود. بهترین آموزشها، دورههای آموزش متنکاوی، کتاب و نکاتی که لازم دارید را در این مقاله پیدا میکنید.
شباهتها در word embedding
بهکمک مقایسه بردار کلمات، قدرت باورنکردنی word embeddingها نمایان میشود. میتوانیم بردار کلمات مختلف را با هم جمع یا از هم تفریق کنیم و به نتایج جالبی برسیم.
معروفترین مثال فرمول زیر است:
“king” –”man”+”woman”
با استفاده از کتابخانه Gensim در پایتون (مقاله کتابخانه های پردازش زبان طبیعی را بخوانید)، میتوانیم بردارهای کلمات را اضافه و کم کنیم و شبیهترین کلمات را به بردار بهدست آوریم.
در تصویر زیر همانطور که میبینید شباهت کلمه “queen” به کلمات “king”, “women” بیشتر از سایر کلمات است و عدد آن 0.8 را نشانمیدهد.
شاید دلیل نزدیکی کلمه "ملکه" به کلمات "زن" و "پادشاه" این است که ملکه، بهلحاظ سیاسی قدرت و اختیارات مشابه به یک پادشاه را دارد پس اگر از پادشاه و ملکه قدرت سیاسی آن را کم کنیم بهترتیب به مرد و زن تبدیل میشوند.
حال بردار رنگی “king” –”man”+”woman” را هم بهشکل اضافه میکنیم:
بردار حاصل از «پادشاه-مرد+ زن» دقیقاً برابر با «ملکه» نیست، اما «ملکه» نزدیکترین کلمه به آن از میان 400 هزار کلمه word embedding شده در این مجموعه است.
با مجموعه مقالات پردازش زبان طبیعی مقدماتی، با کتابخانههای مهم متنکاوی آشنا شوید و پردازش متن فارسی را یاد بگیرید.
تاکنون بردار کلمات آموزش دیده را بررسی کردیم، حال به سراغ فرآیند آموزش word2vec، میرویم. هدف این است که متوجه شویم چگونه چنین بردارهای تولید میشوند. اما قبل از اینکه به آموزش word2vec بپردازیم، بهتر است مبحث word2vec مدل زبانی که پایه و اساس است، معرفی شود.
آموزش مدل زبانی (Language model)
بهطور ساده به عمل پیش بینی کلمه بعدی در یک دنباله داده شده، مدل زبانی میگویند.
مزیتی که مدلهای زبانی نسبت به سایر مدلهای یادگیری ماشین دارند، در این است که میتوانیم این مدل را برای متنی که داریم، آموزش دهیم. منابع زیادی برای آموزش مدل زبانی وجود دارند، مثلاً تمام کتابها، مقالهها، محتوای ویکیپدیا و سایر دادههای متنی که وجود دارند، برای این مدل قابل استفاده هستند. اما برای سایر مدلهای یادگیری ماشین لازم است قبل از اجرای مدل، ویژگیهای متن استخراج و به مدل داده شود.
word embedding هر کلمهای، متناسب با کلماتی که بعد از آن کلمه قرار گرفتهاند، ساخته میشود، زیرا معنای یک کلمه با درنظر گرفتن کلمات اطرافش میتواند متفاوت باشد. مثلاً معنی کلمه “شیر” در جمله “من شیر خوردم” و جمله “شیر جنگل غرش کرد” متفاوت است، پس کلمه شیر در این دوجمله word embedding متفاوتی دارد.
مراحل آموزش مدل زبانی
مراحل آموزش یک مدل زبانی بهصورت زیر است:
- ابتدا تعداد زیادی داده متنی مانند مقالات ویکیپدیا را انتخاب میکنیم.
- سپس با یک پنجره (مثلاً سهکلمهای)، متن را بخش بخش میکنیم. (پنجره یا window، حداکثر فاصله بین کلمه فعلی با کلمهای است که باید در یک جمله پیشبینی شود.)
- پنجره، نمونههای آموزشی را برای مدل تولید میکند.
همانطور که پنجره در متن رو به جلو حرکت میکند، یک دیتاست برای آموزش مدل ایجاد میشود.
در واقع مدل زبانی مانند سایر مدلها است و برای آموزش به دادههایی نیاز دارد. بنابراین باید برای آموزش این مدل، دادههایی تولید کنیم. برای ساخت مجموعهداده، یک جمله از متن را انتخاب کرده و پنجرهای تعریف میکنیم. پنجره را روی جمله حرکت میدهیم که با هر حرکت، یک رکورد در دیتاست ایجاد میشود.
این حرکت تا جایی ادامه پیدا میکند که به انتهای جمله برسیم و امکان حرکت بر روی جمله وجود نداشتهباشد، پس به سراغ جمله بعدی میرویم. اینکار برای کل متن انجاممیشود. در نهایت از دیتاست تولید شده در مرحله آموزش مدل استفاده میکنیم. در مثال زیر، نحوه این کار را کامل توضیح میدهیم.
مثال آموزش مدل زبانی
در ابتدا پنجره روی سه کلمه اول جمله است:دو کلمه اول را بهعنوان ورودی (ویژگی) و کلمه سوم را بهعنوان خروجی (برچسب) در نظر میگیریم، زیرا مدل باید با توجه به ورودی، خروجی را پیشبینی کند. پس دیتاستی مانند دیتاست سمت چپ ایجاد میشود:
سپس پنجره بهاندازه یک کلمه به جلو حرکت میکند و نمونه دوم در دیتاست ایجاد میشود:به همین ترتیب اینکار را ادامه میدهیم تا به پایان جمله برسیم و امکان حرکت پنجره وجود نداشتهباشد، سپس به سراغ جمله بعدی میرویم. در نهایت دیتاستی مانند شکل زیر میسازیم که در آن ترتیبی برای قرارگیری کلمه سوم بعد از دو کلمه قبل وجود دارد:زمانی آموزش مدل انجام میشود که پنجره روی جملات و کلمات حرکت کند. اما از لحاظ منطقی واضح است که مرحله تولید دیتاست از مرحله آموزش مدل جدا است. همچنین در مدل زبانی از تکنیکی به نام N-gram برای آموزش مدل استفاده میشود.
پیمایش دو جهته در آموزش مدل زبانی
فرض کنید میخواهیم جای خالی زیر را با کلمه مناسب و با درنظر گرفتن مفهوم جمله پر کنیم:
این جمله از 5 کلمه قبل از جای خالی ساخته شده و نزدیکترین کلمه برای جای خالی به نظر میرسد کلمه “اتوبوس” باشد.
حال اگر اطلاعات بیشتری داشته باشیم و بعد از جای خالی کلمهای آمده باشد، چه کلمه مناسبی برای جای خالی میتوان در نظر گرفت؟
اگر اطلاعات بیشتری داشتهباشیم، قطعاً کلمهای که باید در جای خالی باشد، عوض میشود.
اکنون کلمه “red” بهاحتمالزیاد جای خالی را میتواند پر کند، یعنی کلمهای که بهنوعی در ارتباط با کلمه بعدی است و آن را توضیح میدهد.
آنچه از این موضوع میفهمیم این است که کلمات قبل و بعد از یک کلمه خاص، دارای ارزش اطلاعاتی هستند و پیمایش دو جهته کلمه و توجه به راست و چپ کلمهای که باید پیشبینی شود، منجر به word embedding بهتری میشود.
توضیحات کامل مفاهیم مهم و پایهای متنکاوی به زبان فارسی را در مجموعه مقالات پردازش زبان طبیعی پیشرفته یاد بگیرید.
Skipgram چیست؟
بهجای اینکه فقط به دو کلمه قبل از کلمه هدف (target) نگاه کنیم، میتوانیم دو کلمه بعد را هم درنظر بگیریم. target یا کلمه هدف، کلمهای است که میخواهیم آن را پیش بینی کنیم، مثلاً کلمه هدف در مثال زیر کلمه “red” است.
بنابراین دیتاست زیر را میسازیم. در این دیتاست ورودیها (ویژگیها) دو کلمه قبل و بعد target هستند و خروجی (برچسب) target است و مدل باید بتواند از آموزشهایی که دیده target یعنی (red) را پیش بینی کند.
به این روش، معماری Continuous Bag of Words گفتهمیشود. البته معماری دیگری هم وجود دارد که کمی متفاوتتر عمل کرده و نتایج بسیار خوبی تولید میکند.
روش قبل، یک کلمه را از معنای آن و پیمایش کلمات قبل و بعد از کلمه هدف، حدس میزد، اما معماری جدید سعی میکند کلمات مجاور را با استفاده از کلمه فعلی حدس بزند. یعنی روش جدید کاری برعکس روش قبل انجام میدهد، روش قبل دو ورودی داشت و باید کلمه وسط یعنی target را پیشبینی میکرد، اما در روش جدید مدل کلمه وسط را بهعنوان ورودی گرفته و کلمات مجاور را پیشبینی میکند.
پنجرهای که روی متن آموزشی حرکت میکند را بهشکل زیر در نظر بگیرید:
در این مثال، کلمه ورودی در سلول سبز رنگ قرار میگیرد و هر سلول صورتی هم یک خروجی را نمایش میدهد.
در شکل زیر، سلولهایی با طیفهای مختلف رنگ صورتی وجود دارند، زیرا حرکت پنجره در طول متن، چهار نمونه جداگانه را در دیتاست آموزشی ایجاد میکند:
به این روش، معماری skipgram گفتهمیشود. حرکت پنجره را میتوانیم از ابتدا، بهصورت شکل زیر در نظر بگیریم:
- در شروع کار که پنجره در ابتدای جمله قرار دارد، مقداری در دیتاست آموزش وجود ندارد:
- با حرکت پنجره در طول جملهای که داریم، این چهار نمونه به دیتاست آموزش اضافه میشود:
- سپس پنجره به موقعیت بعدی حرکت دادهشده و بهاندازه یک کلمه جابهجا میشود:
- و چهار نمونه بعدی در دیتاست اضافه میشود:
به همین ترتیب در چند حرکت بعدیِ پنجره، نمونههای بسیار بیشتری در دیتاست قرار میگیرند:
بازنگری در فرایند آموزش مدل زبانی
حال که دیتاست آموزشی skipgram را ساختیم، در مرحله بعد میخواهیم از این دیتاست برای آموزش یک مدل پایه زبان عصبی که کلمه مجاور را پیشبینی میکند، استفاده کنیم.
با اولین نمونه دیتاست شروع میکنیم. ورودی را گرفته و به مدل آموزش ندیده میدهیم و از آن میخواهیم کلمه مجاور مناسب را پیشبینی کند.
مدل، سه مرحله را انجام داده و یک بردار پیشبینی بهعنوان خروجی ایجاد میکند. این بردار شامل احتمالی است که به هر کلمه برای واژگان متن (vocabulary) اختصاص دادهشدهاست (Vocabulary، کل کلمات یکتای متن است). بنابراین، بردار احتمالات، میزان پیشبینی یک کلمه را به عنوان خروجی بیان میکند.
همانطور که در شکل مشخص است، مدل سه مرحله دارد و این سه مرحله عبارتند از:
- جستجوی embeddingها
- محاسبه احتمال پیشبینی هر کلمه
- ثبت احتمال پیشبینی هر یک از کلمات vocabulary بهعنوان خروجی
پیشبینی مدل، بهدلیل اینکه مدل آموزش ندیده، در این مرحله اشتباه است. اما چون میدانیم چه کلمهای را باید حدس میزد، میتوانیم خطای پیشبینی مدل را حساب کنیم.
مثلاً فرض کنید سلول خروجی در سطری که در حال حاضر برای آموزش مدل استفاده میکنیم، سلول صورتی رنگ باشد:
“بردار هدف” سلولی است که در آن کلمه مورد نظر، احتمال یک و همه کلمات دیگر احتمال صفر دارند.
نتیجه پیشبینیشده توسط مدل، چقدر از نتیجه واقعی فاصله داشته است؟
برای بهدست آوردن این فاصله، باید بردار هدف (یعنی کلمه درست که احتمالش یک است و میدانیم کدام کلمه است) و برداری که مدل پیشبینی کرده را از هم کم کنیم تا بردار خطا بهدست آید:
بردار خطا = بردار هدف – بردار پیش بینی شده توسط مدل
اکنون میتوان از این بردار خطا برای بهروزرسانی مدل استفادهکرد، بنابراین دفعه بعد، زمانی که مدل not را بهعنوان ورودی دریافت میکند، احتمال اینکه کلمه “thou” را حدس بزند، کمی بیشتر است.
به این ترتیب مرحله اول آموزش به پایان میرسد. این فرآیند را با نمونههای بعدی دیتاست انجام میدهیم، تا زمانی که تمام نمونههای دیتاست را پوشش داده و بردار احتمالات آپدیت شود. به این ترتیب یک epoch به پایان میرسد. اینکار را دوباره برای چندین epoch تکرار میکنیم. در پایان، مدل آموزشدیدهای خواهیم داشت که میتوان ماتریس embedding را از آن استخراج و از آن برای هر کاربرد دیگری استفادهکرد. بهعبارتی embeddingها همان وزنهایی هستند که با هربار محاسبه خطای احتمالات، آپدیت میشوند.
با وجود درک بیشتر از معماریهای گفتهشده، همچنان نحوه آموزش word2vec واقعاً مشخص نیست. زیرا چند ایده کلیدی را فراموش کردیم.
نمونهبرداری منفی در بازنمایی کلمات با word2vec
دیدیم که نحوه پیشبینی مدل زبان عصبی در سه مرحله انجام میشود:
- جستجوی embeddingها
- محاسبه احتمال پیشبینی هر کلمه
- ثبت احتمال پیشبینی هر یک از کلمات vocabulary بهعنوان خروجی
اما مرحله سوم، یعنی ثبت احتمال پیشبینی هر یک از کلمات vocabulary بهعنوان خروجی، از نظر محاسباتی بسیار پرهزینه است، چون آن را هر بار برای هر نمونه آموزشی در دیتاست انجام میدهیم (بهاحتمالزیاد دهها میلیون بار). بنابراین، بهازای هر کلمه در vocabulary باید احتمال مربوط به آن را حساب و ثبت کنیم و اگر vocabulary بزرگی داشته باشیم، این عملیات بسیار پرهزینه میشود. پس باید عملکرد را بهبود داده و این هزینه را کم کنیم. یک راه این است که هدف خود را به دو مرحله تقسیم کنیم:
- word embeddingهایی تولید کنیم که در اصطلاح باکیفیت (high-quality) هستند. (نگران پیشبینی کلمه بعدی نباشیم).
- از این word embeddingهای باکیفیت، برای آموزش مدل زبان استفاده کنیم. (برای انجام پیشبینی کلمه بعدی)
برای انجام مرحله یک و تولید embeddingهای باکیفیت با استفاده از یک مدل با کارایی بالا، میتوانیم روش کار مدل را (که کلمه مجاور را پیشبینی میکرد)، تغییر دهیم:
و آن را به مدلی تغییر دهیم که هر دو کلمه ورودی و خروجی را میگیرد و یک امتیاز تعیین میکند که این امتیاز، نشانمیدهد دو کلمه با هم مجاور هستند یا نه (صفر برای “کلمهها مجاور نیستند” و یک برای “کلمهها مجاور هستند”).
با این تغییر ساده، مدل از یک شبکه عصبی به یک مدل رگرسیون لجستیک تغییر پیدا میکند. بنابراین محاسبه آن بسیار سادهتر و سریعتر میشود.
برای این تغییر نیاز داریم ساختار دیتاست را عوض کنیم، زیرا اکنون خروجی یک ستون است که مقادیر 0 و 1 دارد. در شکل زیر، ستون خروجی به اسم target اضافه شده و چون همه کلماتی که اضافه کردیم با یکدیگر همسایه هستند، بنابراین تمام مقادیر این ستون جدید مقدار 1 گرفته است.
اکنون میتوان خروجی را با سرعتی فوق العاده محاسبه و میلیونها نمونه را در چند دقیقه پردازش کرد و خروجی ان را بهدستآورد. اما مشکلی وجود دارد که باید آن را حل کنیم. اگر همه نمونهها مثبت باشند (یعنی همه مقادیر ستون target یک باشد)، مدلی خواهیم داشت که دقیق نیست (مدل smartass) و همیشه یک را برمیگرداند (یعنی طبق این مدل همه کلمات با هم همسایه خواهند بود!)، بنابراین بهدقت 100٪ میرسیم پس مدل یاد نمیگیرد و embeddingهای غلط ایجاد میکند.
برای رفع به این موضوع، باید نمونههای منفی را هم به دیتاست اضافه کنیم، یعنی نمونههایی از کلماتی که همسایه نیستند باید به مدل اضافه شوند و مدل باید صفر را برای آن نمونهها برگرداند. مدل برای حل این چالش هم باید سریع عمل کند.
برای هر نمونه در دیتاست، نمونههای منفی را اضافه میکنیم. این نمونهها، کلمه ورودی یکسان و خروجی صفر دارند.
اما در دیتاست، ستونی که مربوط به کلمه خروجی (output word) است را با چه چیزی پر کنیم؟ در اینجا، این کلمهها را بهصورت تصادفی از vocabulary که ساخته بودیم، نمونهبرداری میکنیم.
این روش از ایده تخمین تضاد – نویز (Noise-contrastive estimation) الهام گرفته شدهاست. در این روش، سیگنال واقعی با نویز مقایسه میشود. یعنی نمونههای مثبت مربوط به کلمات همسایه (را که سیگنال واقعی محسوب میشوند) با کلماتی که همسایه نیستند و بهصورت تصادفی انتخاب شدهاند (و نویز محسوب میشوند) مقایسه میشود. این روش، یک تعادل مناسب بین کارایی آماری و محاسباتی ایجاد میکند.
skipgram با نمونه برداری منفی
ترکیب این دو ایده یعنی روش skipgram و روش نمونه برداری منفی، که در بالا شرح داده شد، skipgram با نمونهبرداری منفی نامیده میشود (Skipgram with Negative Sampling (SGNS)).
فرایند آموزش Word2vec
بعد از بیان دو ایده اصلی skipgram و نمونهبرداری منفی، میتوانیم فرایند واقعی آموزش word2vec را دنبال کنیم.
پیش از شروع فرایند آموزش، ابتدا متن مورد نظر که میخواهیم مدل را با آن آموزش دهیم را پیشپردازش میکنیم. در این مرحله، اندازه vocabulary و کلماتی که متعلق به آن هستند را تعیین میکنیم. به این اندازه vocab_size میگوییم، مثلاً فرض کنید vocab_size برابر با 10 هزار باشد.
در شروع مرحله آموزش، دو ماتریس ایجاد میکنیم. یک ماتریس Embedding و یک ماتریس Context. این دو ماتریس برای هر کلمه موجود در vocabulary، یک embedding دارند. بنابراین vocab_size یکی از ابعاد این ماتریسها است.
بعد دوم مقداریست که میخواهیم اندازه و طول هر بردار embedding باشد. به این اندازه embedding_size گفته میشود و مقدار رایج برای آن 300 است اما در مثال embedding_size را برابر با 50 در نظر میگیریم. در شکل زیر این اندازهها مشخص شدهاند:
در ابتدا این ماتریسها مقدار اولیه ندارند. بنابراین آنها را با مقادیر تصادفی مقداردهی و فرایند آموزش را شروع میکنیم. در هر مرحله آموزش، یک نمونه مثبت و نمونههای منفی مرتبط به آن را برمیداریم.
اولین گروه را بهصورت زیر در نظر میگیریم:
چهار کلمه داریم:
کلمه ورودی که not است و کلمات خروجی که thou (همسایه واقعی) و دو کلمه aaron و taco (نمونههای منفی) هستند.
جستجوی embeddingها بهصورت زیر انجام میشود:
برای کلمه ورودی ماتریس Embedding و برای کلمههای context ماتریس Context را درنظر میگیریم.
(البته میدانیم که هر دو ماتریس، embedding یکسانی برای هر کلمه موجود در vocabulary دارند.)
سپس، هر input در ماتریس Embedding را با هر context از ماتریس Context ضرب نقطهای میکنیم. نتیجه هر حاصلضرب، یک عدد است، آن عدد نشاندهنده شباهت embeddingهای input و context است. بنابراین، ماتریس ورودی و خروجی در هم ضرب نقطهای میشوند و حاصل آن، میزان شباهتی است که embeddingهای دو ماتریس، باهم دارند.
حال به روشی نیاز داریم تا امتیازاتی که از ضرب نقطهای مرحله قبل بهدست آمده را به احتمال تبدیل کند. در واقع باید همه امتیازها، مثبت و در بازه بین صفر تا یک باشند. برای اینکار از تابع سیگموید استفاده میکنیم و حاصل بهدست آمده از ضرب نقطهای را به یک تابع سیگموید میدهیم.
خروجی تابع سیگموید، خروجی مدل در این نمونهها است.
همانطور که میبینید، taco بالاترین امتیاز را دارد و aaron هم قبل و هم بعد از اعمال تابع سیگموید کمترین امتیاز را دارد.
برای محاسبه خطای پیشبینی مدل، کافی است ستون امتیازات بهدست آمده از تابع سیگموید را از ستون target کم کنیم.
خطای پیشبینی مدل = امتیازی که تابع سیگموید داده – امتیاز ستون target
در اینجا یادگیری بخشی از فرآیند آموزش است. از این میزان خطا برای تنظیم embeddingهای کلمات not، tou، aaron و taco استفاده میکنیم تا در محاسبات بعدی، نتیجه به امتیازات target نزدیکتر باشد.
امتیازات target مقادیر واقعی هستند که همسایه بودن یا نبودن کلمهها را مشخص میکنند و مدلی بهترین مدل است که مقادیر امتیازاتش به مقادیر target نزدیکتر باشد. بنابراین امتیازات این کلمهها را آپدیت میکنیم.
بعد از آپدیت امتیاز کلمات، embeddingها برای کلمههای not, thou, aaron و taco کمی بهتر میشوند. در مرحله بعدی، با انتخاب نمونه مثبت بعدی و نمونههای منفی مرتبط با آن، فرایندها تکرار میشوند.
هنگامی که فرآیند پردازش را چندینبار تکرار کنیم، embeddingها بهتر میشوند و به نتایج بهتری میرسیم. بعد از رسیدن به کمترین خطاها میتوانیم فرآیند آموزش را متوقف کرده، ماتریس Context را دور انداخته و از ماتریس Embeddings بهعنوان embeddingهای از پیش آموزشدیده برای کارهای بعدی استفاده کنیم.
اندازه پنجره و تعداد نمونههای منفی در آموزش word2vec
دو هایپرپارامتر کلیدی در فرآیند آموزش word2vec، اندازه پنجره و تعداد نمونههای منفی هستند.
کارهای مختلف، با اندازههای مختلف پنجره، بهتر میتواند انجام شود. طبق بررسیها، اگر اندازه پنجره کوچک و بین 2 تا 15 باشد، امتیازات بالای شباهت بین دو embedding، نشاندهنده این است که کلمات قابل تعویض هستند (توجه کنید که اگر فقط به کلمات اطراف آنها نگاه کنیم متضادها اغلب قابل تعویض هستند – بهعنوان مثال خوب و بد، اغلب در شرایط مشابه ظاهر میشوند).
اگر اندازه پنجره بزرگتر باشد (15 تا 50 یا بیشتر)، شباهت بیشتر Embeddingها نشانمیدهد ارتباط دو کلمه بیشتر است.
در نهایت، باید تفسیری ارائه شود که باعث درک شباهتها در فرآیند embedding باشد.
تعداد نمونههای منفی، یکی دیگر از عوامل فرایند آموزش است. مقاله اصلی 5 تا 20 نمونه را بهعنوان تعداد مناسب برای نمونههای منفی توصیه میکند. همچنین بیان میکند که وقتی دیتاست بهاندازه کافی بزرگ است، 2 تا 5 نمونه منفی، کافی است. پیش فرض کتابخانه Gensim پنج نمونه منفی است.
در این مقاله با word embedding کلمات و الگوریتم word2vec آشنا شدیم. همچنین مفهوم skip gram با نمونهبرداری منفی (SGNS) را نیز آموختیم. این مفاهیم به درک بهتر سیستمهای توصیهگر کمک میکند.