<aside> ℹ️ מידע על העמוד

https://www.youtube.com/watch?v=rmVRLeJRkl4

ייצוג משמעות של מילים

ב-NLP מסורתי, מתייחסים למילים בתור סימבולים דיסקרטיים (לדוגמא "מלון", "אכסניה"), וזוהי למעשה התייחסות לוקליסטית localist לבעיית ייצוג המשמעות semantic representation של מילים. הדרך הנפוצה לייצג מילים / סימבולים היא באמצעות One-hot Vector, שהם וקטורים שבהם כל הכניסות הם 0 למעט כניסה אחת (המייצגת את המילה הספציפית):

Untitled

הבעיה עם ייצוג שכזה היא שהוקטורים חייבים להיות ממימד עצום ששקול לכמות המילים היחודיות בקורפוס (מאות אלפים). בנוסף, בהגדרה כל שתי מילים יהיו אורתוגונליות זו לזו, ולכן אי אפשר להפיק מהוקטורים האלו מידע על כמה שתי מילים "קרובות" במשמעות שלהן. בעיה נוספת עם ייצוג לוקליסטי של מילים היא שהוא לא משתמש בהקשר שהמילה מופיעה בו, שיכול לתת הרבה מידע חשוב על משמעות המילה.

הבעיה עם ייצוג שכזה היא שהוקטורים חייבים להיות ממימד עצום ששקול לכמות המילים היחודיות בקורפוס (מאות אלפים). בנוסף, בהגדרה כל שתי מילים יהיו אורתוגונליות זו לזו, ולכן אי אפשר להפיק מהוקטורים האלו מידע על כמה שתי מילים "קרובות" במשמעות שלהן. בעיה נוספת עם ייצוג לוקליסטי של מילים היא שהוא לא משתמש בהקשר שהמילה מופיעה בו, שיכול לתת הרבה מידע חשוב על משמעות המילה.

דרך אחרת לגשת לבעיה היא Distributional Semantics – שיטה בה מתייחסים למשמעות של המילה בתור התדירות שבה היא מופיעה בהקשר מסוים (כלומר ביחד עם מילים אחרות). כלומר, כשמילה מופיעה בתוך טקסט, ההקשר שלה הוא קבוצת המילים שמופיעות בסביבתה (בתוך חלון בגודל של מספר מילים כלשהו שנקבע מראש).

Untitled

זה היה רעיון שהראה תוצאות טובות יחסית ומשתמשים בו עד היום במגוון מודלים סטטיסטיים. דרך נפוצה להשתמש בייצוג ההתפלגותי של מילים היא ליצור Word Vectors / Embeddings – לכל מילה נייצר וקטור דחוס (כמה מאות כניסות), שייצג את המשמעות של המילה בכך שהוא יבנה כך שהוא יהיה קרוב לוקטורים של מילים אחרות שמופיעות בהקשרים דומים. הסיבה שהוקטורים האלו מכונים Embeddings היא שכאשר יוצרים לכל מילה וקטור שכזה, אפשר לחשוב על השפה כולה בתור מרחב וקטורי רב מימדי, כאשר הוקטור של מילה ספציפית "משכן" אותה למקום מסוים במרחב הזה. הרעיון הוא שמילים שקרובות זו לזו במשמעות, יהיו קרובות זו לזו במרחב.

Untitled

מבוא ל-Word2Vec

פריימוורק Word2Vec היא framework שהוצגה ב-2013 ליצירת Word Vectors באמצעות למידה. הרעיון הוא לקחת קורפוס מאוד גדול, וליצור וקטור לכל מילה באופן הבא – עוברים על כל הטקסט בקורפוס, ולכל מילה c (center) מסתכלים על מילות ההקשר o (outside) שנמצאות בחלון ההקשר שלה. משתמשים בדמיון בין וקטורים של מילות c ובין וקטורים של מילות o כדי לחשב את ההסתברות של מילה o בהנתן מילה c (או להפך). ממשיכים להתאים את הוקטורים כדי למקסם את ההסתברות הזו.

Untitled

לכל מיקום בטקסט t=1,…,T (כאשר T הוא מספר המילים בקורפוס), נחזה את מילות ההקשר בתוך חלון בגודל קבוע m, בהנתן מילת מרכז ((center המסומנת $w_j$ ע"י לסכום את ההסתברות L שמילה מסוימת מופיעה בהנתן מילה אחרת בתוך חלון המילים שסביבה, עבור כל המילים בקורפוס וכל המילים בחלון של כל אחת מהן, באופן הבא (כאשר θ הם כל המשתנים שרוצים לאפטם):

$$ L(\theta)=\prod_{t=1}^T \prod_{\substack{-m \leq j \leq m \\ j \neq 0}} P\left(w_{t+j} \mid w_t ; \theta\right) $$

ה-Objective Function (שלעתים נקראת פונקציית Cost / פונקציית Loss) המסומנת  היא ה-Average negative log likelihood (המעבר לשימוש ב-log הוא דרך סטמדרטית לעבור ממכפלה לסכום תוך שמירה על יחס הסדר). למזער את ה-objective function שקול ללמקסם את הדיוק accuracy של חיזוי מילות ההקשר. הפונקציה בנויה באופן הבא:

$$ J(\theta)=-\frac{1}{T} \log L(\theta)=-\frac{1}{T} \sum_{t=1}^T \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} \log P\left(w_{t+j} \mid w_t ; \theta\right) $$

איך מחשבים את $P\left(w_{t+j} \mid w_t, \theta\right)$   משתמשים בשני וקטורים לכל מילה w – הוקטור  $v_w$$v_c$

Untitled