bar madar

מה זה Attention Mechanism ואיך זה עובד?

מיועד ל- מטיבי לכת (כתבה מאוד טכנית)

נכתב על ידי bar madar

קונספט הAttention צובר תאוצה גדולה בעולם הML בשנים האחרונות ושילובו נהיה פופולרי בתחומים רבים ושונים.

על מנת להבין טוב יותר מהו Attention, בכתבה זאת נענה על השאלות הבאות:

  • מהו Attention בעולם הביולוגי, ואיך הוא מיושם בעולם ה AI?
  • כיצד מוגדר מנגנון Attention כללי ומהם מרכיביו?
  • דוגמא פרקטית לAttention  במכונת תרגום
  • מנגנון הScaled Dot-Product Attention ב Transformers

בואו נתחיל!

Attention  בעולם הביולוגי

Attention, או בעברית – “קשב”, הוא תחום רחב מאוד, שבעולם הביולוגי נחקר לעיתים קרובות בשילוב עם “עוררות”, “עירנות” ו”מעורבות סביבתית”.

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

קשב שמיעתי וקשב חזותי, הם הענפים הנלמדים ביותר מנקודת מבט משותפת של נוירו-מדע ופסיכולוגיה. 

לדוגמא, ניקח משימה יומיומית של ניהול שיחת טלפון בסלון. מלבד סיגנלי השמע שמועברים לנו ע”י הטלפון, יש גם סיגנלים ויזואליים וקוליים שמועברים למוחנו מהטלוויזיה, סיגנלי דיבור שהנקלטים מהאנשים שאיתנו בסלון ומדברים ביניהם, סיגנלי קול של רעשים מבחוץ, ועוד…

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

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

(עכשיו אחריי שהסתכלתם על התמונה וזיהיתם את הפרי, תוכלו בלי להסתכל שוב, להגיד כמה אנשים יש בחוף? 🙂

דרך אגב, תכונת “חלוקת קשב” , משמעותה, שהמוח יודע להדגיש ולעבד סיגנלי מידע שנקלטים במקביל, לטובת ביצוע של מספר משימות אשר שונות אחת מהשנייה.

Attention בעולם ה AI

במודלים של רשתות נוירונים מלאכותיות, יישום מנגנון ה Attention מתבטא בהדגשה דינאמית של המידע הרלוונטי ביותר מתוך כלל המידע הנתון, ושימוש בחלקים הבולטים ממנו.

הדמיון לתהליך הטבעי שקורה במוח האנושי והיכולת ליישם את התהליך בצורה דינאמית עבור כל פיסת דאטה חדשה שנכנסת למערכת, הם שהפכו את קונספט ה Attention לכלכך פופולארי בעולם למידת המכונה.

מאיפה זה התחיל?

מנגנון ה Attention בלמידת מכונה,הוצג לראשונה במאמר של Bahdanau et al.(2014) בו הכותבים מנסים לפתור את בעיית צוואר הבקבוק במודלים של seq2seq מבוססים Encoder-Decoder. במודלים אלו, המידע מכל סדרת הקלט, נאסף לווקטור בעל מימד קבוע במוצא ה Encoder(hidden vector). ככל שהסדרה יותר ארוכה או מורכבת, ככה היכולת של אותו ווקטור “לתפוס” את המידע הרלוונטי מכל הקלט פוחתת. כתוצאה מכך, כאשר הקלט הוא ארוך ומורכב, הביצועים של מודלים אלו פוחתים, מכיוון שמידע רלוונטי “נשכח” ולא מתבטא ב hidden vector שהופך להיות צוואר הבקבוק של המודל.

במאמר, הכותבים הציגו את מנגנון ה Attention עבור מודל Encoder-Decoder, אשר מומש ע”י ארכיטקטורת RNN לכל אחד מהצדדים.

כאן בכתבה, נציג תחילה את האלגוריתם הכללי למימוש מנגנון ה Attention, ולאחר מכן נראה כיצד הוא בא לידי ביטוי במודלי ה Transformers הנפוצים היום בעולם ה NLP וה VISION.

אז איך זה עובד?

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

במנגנון ה Attention הכללי, משתמשים ב3 מרכיבים עיקריים שמחושבים על בסיס הדאטה הקיים:

  • Q – queries
  • K – keys
  • V – values

לכל איבר i בסדרה (word embedding – במקרה שלנו), יחושבו 3 ייצוגים וקטוריים נלמדים (Qi, Ki, Vi). ייצוג הקלט (נניח של מילים) כווקטור מספרים זו בעיה מורכבת, ולכן נותנים לרשת כמה אפשריות בלתי תלויות ללמוד אותם.

(Q, K, V) מייצגים את הייצוגים של כלל האיברים בדאטה (אפשר להסתכל עליהם כאל מטריצות שמורכבות משרשור הווקטורים).

בדרך כלל, את הפרמטרים הווקטוריים של ה Attention, נחשב בעזרת טרנספורמציה לינארית (מטריצה\רשת FC) משותפת לכל האיברים בדאטה, אשר תאותחל בצורה רנדומאלית, ותתעדכן במהלך האימון:

\( q_i=W^q \cdot x_i \)

עבור קלט של T מילים {wt}, מנגנון ה Attention מורכב מהשלבים הבאים:

  1. עבור כל מילה, מחשבים scores אל מול שאר המילים. ה scores מחושבים ע”י מכפלה סקלרית בין ווקטור q של המילה עם ווקטורי k של שאר המילים (כולל זה ששייך לאותה מילה).

לדוגמא ה score של מילה i אל מול מילה j 

\( e_{i,j}=q_i \cdot k_j \) חשוב לשים לב \( e_{i,j} \neq e_{j,i} \)

2. ה scores ששייכים לכל מילה, מועברים דרך טרנספורמציית Softmax , על מנת לייצר משקל יחסי לכל מילה בדאטה.ככל שהמשקל גבוהה יותר ככה כמות ה”קשב” שלנו צריכה להיות גבוהה יותר למילה הספציפית.

לדוגמא זהו ווקטור המשקלים של מילה i:

\( α_i = softmax({e_{i,t}})_{t=1..T} \)

3. עבור כל מילה, ה attention מחושב ע”י סכום משוקלל של כל ווקטורי ה value בדאטה vt=1..T יחד עם המשקלים היחסיים שחישבנו בשלב הקודם

לדוגמא:

\(attention(w_i)=\sum_{t=1}^{T} \alpha_{i,t}v_t \)

ווקטור ה attention שמייצג את מילה wi

כאשר vt הוא הווקטור התואם ל kt , שעל בסיסו חישבנו את המשקל αt.

דוגמא פרקטית – מכונת תרגום (Machine Translation)

נניח שיש לנו מודל מתרגם מבוסס Encoder-Decoder – הקלט ל Encoder זה טקסט בצרפתית, ומוצא ה Decoder – הטקסט באנגלית.

כל מילה בטקסט הנקלט מיוצגת ע”י 3 ווקטורים שנשמרים בזיכרון המודל (qi, ki, vi) ,אשר מחושבים ע”י מכפלה של ווקטור המוצא ב Encoder(xi) עם 3 המטריצות המשותפות לדאטה שנלמדות תוך כדיי האימון (Wq, Wk, Wv).

עבור כל מילה חדשה שנכנסת למכונת התרגום, לאחר חישוב הווקטורים המייצגים, מחשבים scoresשל ווקטור ה query אל מול ווקטורי ה keys של המילים שקדמו לה (וכבר נכנסו למערכת), שבהמשך יהפכו למשקלים בעזרת פונקציית ה Softmax.

בשלב האחרון, סכום ווקטורי משוקלל של המשקלים עם ווקטורי ה value התואמים ייתן את ייצוג ה attention שמכיל מידע רלוונטי מכל היסטוריית המיליםשיהיה הקלט ל Decoder  (ככל שהמשקל עבור מילה מסוימת גדול יותר, ככה אנחנו נותנים לו יותר “קשב” בייצוג הסופי לפניי פעולת ה decoding)

ווקטור ה attention  שחישבנו ייכנס ל decoder ובמוצא תיפלט לנו המילה המתורגמת.

עבור המילה הבאה בתור (xt+1), נבצע את אותו תהליך, כאשר הפעם נשתמש רק בווקטור ה query שלה (qt+1), והמשקלים יחושבו בעזרת צמדי ווקטורי key, value של כל המילים שהמודל ראה עד נקודת הזמן הנוכחית – {vt , kt ; t=1..i+1}

*חשוב לציין – בשונה מהדוגמא הקלאסית, בהרבה מקרים ומודלים, מנגנון ה Attention ממומש באופן Bi-directional, כלומר ה attention של כל איבר ברצף (מילה לדוגמא) מחושב לפי המילים שהיו לפניה ואחריה במשפט. לצורת ה Bi-directional יש יתרון עצום בהבנת קונטקסט הרצף בצורה טובה יותר.

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

דוגמא למודל Bi-directional נפוץ שעושה שימוש ב Attention–BERT.

מנגנון ה Scaled Dot-Product Attention ב Transformers

ככל הנראה, רובכם נחשפתם לראשונה למנגנון ה Attention בהקשר של מודלי ה Transformers שפרצו את תקרת הזכוכית בעולם ה NLP ולאחרונה נהיו גם שם חם בעולם ה VISION.

ה Transformer, הוצג לראשונה במאמר Attention is all you need (2017),ובבסיסו, הוא מודל seq2seq, מבוסס ארכיטקטורות של encoder-decoder שהחידוש העיקרי בו, זה השימוש הייחודי במנגנון ה Attention, לטובת מיקוד ה”קשב” בין כל איבר בסדרה לשאר האיברים.

זהו המודל הראשון, שהסתמך על מנגנון ה Attention בלבד לחישוב ייצוגים של הקלט בהסתמך על היסטוריית קלטים מבלי לעשות שימוש בRNN או קונבולוציות

בחלק זה של הכתבה, נבין כיצד מנגנון ה Attention ממומש במודל ה Transformer ובנגזרותיו. זהו מקרה פרטי של מנגנון ה Attention הכללי שתיארנו בחלק הקודם של הכתבה.

המרכיבים העיקריים של מנגנון ה Attention ב Transformers הם:

  • q, k – ווקטורים בגודל dk, מכילים את ה query,key  לכל איבר ברצף.
  • v – ווקטור בגודל dv , מכיל את ה value לכל איבר ברצף.
  • Q, K, V – מטריצות שמאחדות סט של ווקטוריqueries, keys, values בהתאמה.
  • Wq, Wk, Wv – מטריצות הטלהממרחב הדאטה הנקלט (word embedding  למשל) אל תתי המרחבים של ה queries, keys, values
  • Wo – מטריצת הטלה למוצא ה Multi-Head (נפרט בהמשך)

במאמר, הכותבים מציגים גרסה שונה מעט ממנגנון ה Attention הכללי, וקוראים לה Scaled Dot-Product Attention, ועליה בונים את קונספט ה Multi-head Attention.

כפי שתיארנו במנגנון ה Attention הכללי, גם כאן ווקטורי ה q, k, v  (הטלות שונות של האיברים ברצף) הם האינפוטים למנגנון ה Scaled Dot-Product Attention.

כשמו הוא, מנגנון ה Scaled Dot-Product Attention, מחשב תחילה מכפלה סקלרית לכל ווקטור q עם כל ווקטורי הk, לאחר מכן ה scale על התוצאה מתבטא בחילוק של המכפלה ב

\( \sqrt{d_k} \)

לקבלת הscore.

בהמשך, כמו במנגנון הAttention הכללי, הscores עוברים בפונקציית Softmax לקבלת המשקלים שמשמשים למשקול ווקטורי ה values.

מטרת הscaling היא למנוע מערכי תוצאות המכפלה הסקלרית להיות מאוד גדולים, ובכךלחלק מערכי הSoftmax להיות קטנים מאוד מה שגורם לתופעת הVanishing Gradient הבעייתית.

לפיכך, החילוק ב scaling factor שבמקרה שלנו הוא

\( \sqrt{d_k} \)

“מושך” את תוצאות המכפלה הסקלרית למטה, ובכך מונע את התופעה.

ובהמשך המשקלים שיוצאים מה softmax

בפועל, החישובים שמבצע מנגנון ה Scaled Dot-Product Attention יכולים להתבצע באופן יעיל בכך שנבצע אותם על סט של ווקטורים בבת אחת.

לכן, נגדיר את Q, K, V להיות המטריצות שמהוות את הקלט למנגנון (נבצע חישוב מקדים של ווקטורי הq, k, v  לכל איבר ברצף ע”י מטריצות ה (Wq,Wk,Wv), ולאחר מכן נשרשר אותם לקבלת מטריצות Q, K, V).

ונקבל את נוסחת ה Scaled Dot-Product Attention:

\( Attention(Q,K,V)=softmax( \dfrac{QK^t}{\sqrt{d_k}}) \)

כעת, נציג את תהליך חישוב ה Scaled Dot-Product Attention, שלב אחריי שלב:

  • m – כמות האיברים ברצף שנרצה לחשב עבורם את ייצוג הScaled Dot-Product Attention
  • n – כמות האיברים ברצף שנרצה להתחשב בהם כקונטקסט שעל בסיסו נחשב לכל ווקטור את ייצוג הScaled Dot-Product Attention
  1. חישוב ה scores, ע”י מכפלה סקלרית של סט ווקטורי הquery (שורות של מטריצה Q), עם סט ווקטורי ה keys (שורות של מטריצה K).

אם מטריצה Q בגודל nxdk,  ומטריצה K בגודל mxdk, תוצאת המכפלה תיהיה בגודל mxn

\( QK^T=\begin{pmatrix} e_{11} e_{12} … e_{1n} \\ e_{21} e_{22} … e_{2n} \\ … … … … \\ e_{m1} e_{m2} … e_{mn} \\ \end{pmatrix} \)

2. נבצע scaling לכל score ע”י חילוק בפקטור

\( \sqrt{d_k} \)
\( \dfrac{QK^t}{\sqrt{d_k}}=\begin{pmatrix} \dfrac{e_{11}}{\sqrt{d_k}} \dfrac{e_{12}}{\sqrt{d_k}} … \dfrac{e_{1n}}{\sqrt{d_k}} \\ \dfrac{e_{21}}{\sqrt{d_k}} \dfrac{e_{22}}{\sqrt{d_k}} … \dfrac{e_{2n}}{\sqrt{d_k}} \\ … … … … \\ \dfrac{e_{m1}}{\sqrt{d_k}} \dfrac{e_{m2}}{\sqrt{d_k}} … \dfrac{e_{mn}}{\sqrt{d_k}} \\ \end{pmatrix} \)

3. הפעלת Softmax על מנת לקבל סט משקלים עבור כל איבר

\( softmax(\dfrac{QK^t}{\sqrt{d_k}})=\begin{pmatrix} softmax(\dfrac{e_{11}}{\sqrt{d_k}}) softmax(\dfrac{e_{12}}{\sqrt{d_k}}) … softmax( \dfrac{e_{1n}}{\sqrt{d_k})} \\ softmax(\dfrac{e_{21}}{\sqrt{d_k}}) softmax(\dfrac{e_{22}}{\sqrt{d_k}}) … softmax(\dfrac{e_{2n}}{\sqrt{d_k}}) \\ … … … … \\ softmax(\dfrac{e_{m1}}{\sqrt{d_k}}) softmax(\dfrac{e_{m2}}{\sqrt{d_k}}) … softmax(\dfrac{e_{mn}}{\sqrt{d_k}}) \\ \end{pmatrix} \)

4. חישוב סכום משוקלל של סט ווקטורי ה value (שורות של מטריצה V), לקבלת ייצוג ה Scaled Dot-Product Attention

מטריצת V בגודל nxdv, ולכן התוצאה תהיה מטריצה בגודל mxdv כשכל שורה היא ווקטור ייצוג ה Scaled Dot-Product Attention עבור האיבר התואם במטריצת Qdv ובגודל של

\( softmax(\dfrac{QK^t}{\sqrt{d_k}}) \cdot V=\begin{pmatrix} softmax(\dfrac{e_{11}}{\sqrt{d_k}}) softmax(\dfrac{e_{12}}{\sqrt{d_k}}) … softmax( \dfrac{e_{1n}}{\sqrt{d_k})} \\ softmax(\dfrac{e_{21}}{\sqrt{d_k}}) softmax(\dfrac{e_{22}}{\sqrt{d_k}}) … softmax(\dfrac{e_{2n}}{\sqrt{d_k}}) \\ … … … … \\ softmax(\dfrac{e_{m1}}{\sqrt{d_k}}) softmax(\dfrac{e_{m2}}{\sqrt{d_k}}) … softmax(\dfrac{e_{mn}}{\sqrt{d_k}}) \\ \end{pmatrix} \cdot \begin{pmatrix} v_{11} v_{12} … v_{1d_v} \\ v_{21} v_{22} … v_{2d_v} \\ … … … … \\ v_{n1} v_{n2} … v_{nd_v} \end{pmatrix}= \begin{pmatrix} \widetilde{x_1} \\ … \\ \widetilde{x_m} \end{pmatrix} \)

Multi Head Attention

על בסיס המנגנון שהראינו, כותבי המאמר הציגו תוספת של Multi Head לתהליך.

ההבדל במימוש הוא שבמקום ליצור סט אחד של ווקטורי queries, keys, values לכל איבר ברצף ע”י סט יחיד ומשותף של מטריצות {Wk,Wq,WV}, מנגנון ה Multi Head Attention

מייצר h סטים כאלה ע”י h סטים משותפים של מטריצות.

\( \{W^q_i,W^k_i,W^v_i \}_{i=1}^h \)

לאחר מכן, מנגנון ה Scaled Dot-Product Attention מופעל במקביל על כל אחת מ h ההטלות(ללא תלות אחת בשנייה) ומקבלים במוצא h ווקטורי attention לכל אחד מ m האיברים ברצף.

לאחר מכן, מבצעים שרשור בין כל h הווקטורים ששייכים לכל איבר, לקבלת ווקטור בודד בגודל 1 xhdv . הווקטור המשורשר מוטל ע”י מטריצה Wo לקבלת ווקטור הייצוג הסופי.

הרעיון שעומד מאחורי ה Multi Head Attention הוא שכעת פונקציית ה attention יכולה לחלץ מידע מהאיברים ברצף שהם מיוצגים במספר תתי מרחב שונים וכך היכולת לחלץ מידע שתומך במשימה ולהדגיש אותו גדלה משמעותית.

פונקצייתה Multi Head Attention יכולה להיות מתוארת בצורה הבאה:

\( multihead(X)=concat(head_1,head_2,…head_h) \cdot W^o \\ s.t: head_i=attention(X \cdot W^i_q, X \cdot W^i_k, X \cdot W^i_v) \)

לסיכום

בכתבה זאת, הראינו את המוטיבציה והבסיס למנגנון ה attention בלמידה עמוקה, כמו גם את המימוש של המקרה הפרטי של המנגנון כפי שהוא מיושם במודלים שמבוססים על Transformers.

מי שמתעניין, ורוצה להעמיק עוד יותר, אני ממליץ בחום לקרוא את 2 המאמרים הבאים, שהם בהחלט נחשבים לפורצי דרך בתחום:

מאמר המציג את השימושים ב attention בעולם ה Computer Vision:

אם לאחר קריאת הכתבה צצות לכם שאלות או שתרצו הרחבה נוספת בנושאים קשורים, מוזמנים לכתוב לי למייל או ליצור קשר ב LinkedIn ואשמח לנסות לעזור 🙂

Barmadar13@gmail.com

https://www.linkedin.com/in/bar-madar-838b15160/

Posted by bar madar in deep

מערכת לזיהוי דובר מבוססת למידה עמוקה

מיועד ל- מתחילים (כתבה קצת טכנית)

נכתב על ידי bar madar

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

מוטיבציה

ביומטריה קולית היא טכנולוגיה שמתבססת על זיהוי דפוסי קול כדיי לאמת זהות של אנשים. הדבר אפשרי, מכיוון שכל ייצור חי, שונה פיזיולוגית מרעהו וכך גם בית הקול וחלל הפה , שהם בעצם “מחוללי” אותות הדיבור שלנו. לכל בן אדם, קיימים מאפייני דיבור אקוסטיים ופונטים שייחודיים רק לו. כמו שלא קיימים 2 אנשים עם אותה טביעת אצבע, כך גם לא קיימים 2 אנשים עם אותה חתימה קולית.

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

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

הגדרת הבעיה

זיהוי דובר, זה תהליך שבו בהינתן קטע דיבור, יש להחליט באופן אוטומטי מי הדובר בקטע על סמך המידע הכלול באות הדיבור. להבדיל ממשימת זיהוי הדיבור בה נשאלת השאלה “מה נאמר?” כאן נשאלת השאלה “מי אמר?”

את בעיית זיהוי הדובר מקובל לחלק ל2 תתי בעיות:

* סיווג דובר מתוך מאגר סגור של דוברים – בהינתן X דוברים ידועים למערכת, ובהינתן קטע דיבור חדש y, על המערכת לזהות למי מבין X הדוברים המוכרים קטע y שייך. או במילים אחרות, המטרה היא למצוא מי מהדוברים הידועים נשמע הכי קרוב לקטע הדיבור החדש שהתקבל במערכת.

* אימות דובר –בהינתן קטע דיבור של דובר לא ידוע וטענה לזהות הדובר בקטע עבור דובר מוכר למערכת, יש להחליט האם הטענה נכונה או שלא. במילים אחרות, בהינתן 2 קטעי דיבור (של דובר לא ידוע ושלא דובר מוכר) על המערכת להחליט האם 2 הקטעים שייכים לאותו דובר.

בכתבה, נתייחס לבעיית זיהוי הדובר כאל בעיית אימות דובר.

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

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

בכתבה זאת, אנו מתייחסים לבעיית זיהוי דובר לא תלוית טקסט.

מערכת לזיהוי דובר מבוססת למידה עמוקה

מערכת לזיהוי דובר מבוססת למידה עמוקהממומשת על ידי חיבור של חמשת השלבים הבאים:

1. הוצאת פיצ’רים לדאטה הגולמי.

2. אימון מודל רשת נוירונים לסיווג דוברים מקבוצה סגורה.

3. הוצאת ווקטור זהות לכל דובר “נרשם למערכת” או “מועמד” על ידי למידת מעבר מהמודל שאימנו בשלב הקודם.

4. הוצאת תוצאת תאימות עבור 2 קטעי דיבור.

5. קבלת החלטה.

ניתן לראות את סכימת המערכת הבסיסית באיור הבא:

כעת, נעבור לחלק המעניין בו נסביר על כל שלב במערכת, ולאחריו תדעו איך ניתן לזהות דובר בעזרת למידה עמוקה 🙂

1. הוצאת פיצ’רים

בשלב הראשון, יש לבצע ווקטוריזציה וניקוי לדאטה הגולמי (קטעי אודיו).

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

להוצאת הפיצ’רים נשתמש באלגוריתם ה(MFCC(Mel Frequency Cepstrum Coefficient אשר נפוץ מאוד גם בעולם זיהוי הדיבור. הייחודיות באלגוריתם זה היא העבודה במרחב התדר של האות וההתחקות אחר הדרך הפיזיולוגית בה האוזן האנושית מדגישה את מנעד התדרים ע”י שימוש בסולם MEL  (מתייחס לתדר או גובה הצליל הנשמעים על ידי האוזן האנושית ביחס לערכים הנמדדים בפועל. לבני האדם הרבה יותר קל להבחין בשינויים קטנים בגובה הצליל בתדרים נמוכים)

לאלגוריתם הMFCC מספר שלבים:

1. אות הדיבור הרציף נדגם ונחתך לפריימים נחפפים בעלי גודל זהה.

2. על כל פריים, מופעלת התמרת פורייה דיסקרטית (Discrete Fourrier Transform) ומחושבת האנרגיה בספקטרום התדרי לקבלת ייצוג האות בתחום התדר.

3. הייצוג התדרי של הפריימים עובר דרך פילטר חלונות ((hamming אשר מכווצים ומורחבים לפי סולם MEL. מספר החלונות שנבחר, יהיה מספר הפיצ’רים שנקבל עבור כל פריים.

4. קבלת פיצ’רי הMFCC תהיה על ידי הפעלת התמרת קוסינוס בדידה (Discrete Cosine Transform) על ווקטורי הפיצ’רים, שנועדה לייצר דה-קורלציה בין הפיצ’רים בווקטור.

לאחר הוצאת הפיצ’רים עבור כל פריים, מתבצע סינון פריימים שבהם אין דיבור (Voice Activity Detection).

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

2. אימון מודל לסיווג דוברים מקבוצה סגורה

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

תכונה קריטית שצריכה להיות לווקטורי הזהות, היא שהם צריכים להיות בעלי גודל זהה ללא תלות באורך קטע הדיבור שעל בסיסו הם חולצו, על מנת שבהמשך נוכל “להשוות ביניהם”. בהמשך נראה כיצד הגבלה זאת משפיעה על ארכיטקטורת המודל שלנו.

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

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

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

את ווקטור הזהות המייצג כל דובר על סמך קטע הדיבור שנכנס למערכת, נוציא מאחת השכבות האחרונות של מודל זה.

המודל המסווג בנוי מ3 חלקים:

1. שכבות ייצוג פריים (frame-level)– לחלק הזה ייכנסו סדרות של פיצ’רים המייצגים את הפריימים שמרכיבים את קטע הדיבור. במאמר https://www.danielpovey.com/files/2018_icassp_xvectors.pdf שהציג לראשונה את שיטת ה x-vector שהפכה לSOTA בתחום, נעשה שימוש בארכיטקטורת Time Delay Neural Network (מופיעה באיור) שהיא אימפלמנטציה של רשת קונבולוציה חד מימדית, כאשר הקלט לרשת הוא שרשור של פריים במקום ה-t, יחד עם מספר קבוע של פריימים עוקבים ואוחרים לו. בכל שכבה יש קונטקסט קבוע בין הייצוגים של הפריימים (ניתן להתייחס אל זה כאל פילטר בגודל ספציפי) וככל שמעמיקים ברשת ככה הקונטקסט גדל (ניתן לראות בתמונה את הקווים האדומים שמסמנים את הקונטקסט בכל שכבה). בצורה הזאת, אנחנו גם מרוויחים ניצול מיטבי של המידע עבור כל פריים וגם מתאפשר חישוב בצורה יעילה (מבלי לחשב קשרים בין פריימים רחוקים ללא קורלציה).

אפשרות נוספת למימוש שלב הפריים הוא בעזרת ארכיטקטורת RESNET, כאשר הקלט הוא מטריצה שמייצגת קטע דיבור ככה שכל שורה היא ווקטור פיצ’רים של פריים (פריימים עוקבים מיוצגים ע”י שורות סמוכות במטריצה).

2. שכבה חשובה מאוד במודל המסווג שלנו היא שכבת ה”איגום” (pooling layer). מכיוון שהמערכת צריכה לעבוד עם קטעי דיבור באורכים שונים, יש צורך בשכבת מעבר משלב ייצוג הפריים לשלב ייצוג ה”קטע” (segment-level).

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

דוגמא פשוטה לשכבה כזאת היא שכבת איגום סטטיסטית שמחשבת פרמטרים סטטיסטים (תוחלת וסטיית תקן)  עבור כל הפריימים השייכים לקטע ולכן המוצא שלה יהיה תלוי במימד השכבה שבקצה הרשת ולא בכמות הפריימים. שכבות איגום חכמות יותר יכולות לשלב attention על מנת לחשב ממוצע משוקלל חכם בין כל הפריימים או שכבת Learnable Dictionary Encoding שלומדת פרמטרי קידוד יחד עם מילון מובנה עבור כל פריים על מנת להוציא את הייצוג המיטבי לקטע.

3. השכבה האחרונה במודל המסווג, היא שכבת הסיווג, שנעשה בה שימוש רק במהלך אימון המודל (ולא בשלב למידת המעבר). דוגמא פשוטה לשכבה כזאת היא softmax עם cross entropy loss סטנדרטי כאשר כמות המוצאים זהה לכמות הדוברים במאגר האימון הסגור.

3. חילוץ ווקטור זהות דובר מהמודל המסווג

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

בתמונה, ניתן לראות מודל מחלץ שמאומן ע”י דאטה סגור של T דוברים. ווקטור הזהות מחולץ מאחת משכבות הembedding.

4. תוצאת תאימות עבור 2 קטעי דיבור

השלב הרביעי בתהליך מתחיל לאחר שכבר חילצנו ווקטורי זהות דובר עבור 2 קטעי דיבור, וכעת יש להשוות ביניהם, או במילים אחרות להוציא להם תוצאת תאימות (similarity score).

תוצאת התאימות המתאימה ביותר למקרה שלנו היא יחס הlikelihood בין 2 היפותזות:

* H_0– 2 קטעי הדיבור שייכים לאותו הדובר

* H_1– 2 קטעי הדיבור שייכים לדוברים שונים

כאשר x_1,x_2 מסמלים את ווקטורי הזהות שחולצו ל 2 קטעי הדיבור. ניתן לראות שהתוצאה נעה בין 1 (קטעים זהים) ל 0.

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

אבל במצב הריאלי, כאשר אין מספיק דאטה ברשותנו, נרצה להשתמש במודל סטטיסטי חכם אשר מאומן ע”י צמדים של קטעי דיבור בעלי תיוג של שייכות לאותו דובר. מודל הPLDA(Probability Linear Discriminant Analysis) עושה שימוש במטריצות הפיזור של בתוך הקלאס ומחוץ לקלאס

(between-class and within-class scatter matrix), אשר מחושבות ע”י צמדי קטעי האימונים, ומגדיר משתנה חבוי שהוא משתנה הקלאס שיוגדר להיות משתנה אקראי גאוסי (רציף לעומת הבדיד במודל הGMM). בעזרת משתנים אלו, מודל הPLDA ממדל את ההסתברות לדובר כלשהו וגם את ההסתברות המותנת של קטע דיבור בהנתן דובר כלשהו. בעזרת התפלגויות אלה, ונוסחאת ההסברות השלמה, ניתן עבור 2 קטעי דיבור, לחשב את תוצאת התאימות ביניהם.

בהסבר הקצרצר כאן חסכתי לכם את הפיתוחים המתמטיים של המודל, אבל מידע נוסף למתעניינים נמצא בקישור הבא: https://link.springer.com/content/pdf/10.1007/11744085_41.pdf

קבלת החלטה

השלב האחרון בתהליך זיהוי הדובר, הוא קבלת ההחלטה של המערכת, האם 2 הקטעים שייכים לאותו דובר או שלא. תוצאת התאימות היא רציפה ולכן ההחלטה מתקבלת ע”י קביעת סף מראש, שאם התוצאה עוברת אותו, ההחלטה היא חיובית ולהיפך. קביעת הסף תתבצע בדרך כלל בהתאם לאפליקציית המערכת ול”מחיר” השגיאה.

בעולם זיהוי הדובר קיימות 2 שגיאות:

* שגיאת קבלה (False Alarm)– כאשר 2 הקטעים שייכים לדוברים שונים אבל המערכת מחליטה שהם שייכים לאותו הדובר

* שגיאת דחייה (False reject)– כאשר 2 הקטעים שייכים לאותו דובר אבל המערכת מחליטה שהם שייכים לדוברים שונים

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

הערכת ביצועי המערכת

חלק בלתי נפרד מכל תהליך של פתרון בעיה בעזרת מערכת כלשהי, הוא ניתוח ביצועי המערכת.

על מנת למדוד את ביצועי מערכת זיהוי הדובר, נשתמש בדאטה אבלואציה ובכלי גרפי שנקרא Detection Error Tradeoff Curve.

דאטה האבלואציה יורכב מצמדי “מבחן” של קטעי דיבור, ותיוג האם הם שייכים לאותו דובר או לא (target \ non-target). בגרף, הצירים מייצגים את יחסי שגיאות המערכת עבור סט אבלואציה של צמדי קטעי קול המתוייגיםכtarget  או non-target.

נריץ את המערכת על טווח רחב של ספים, ועבור כל סף החלטה נמדוד את יחסי השגיאות. כלומר, עבור יחס שגיאת קבלה, נחשב את מספר השגיאות ביחס לכל הצמדים המתוייגים כ-non-target,ועבור יחס שגיאת דחייה נחשב את מספר השגיאות ביחס לכל הצמדים המתוייגים כ-target.

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

ניתן לראות, שככל שהגרף קרוב יותר לראשית הצירים ככה ביצועי המערכת טובים יותר. נקודת עניין על הגרף היא נקודת הEqual Error Rate  שמסמנת את ביצועי המערכת עבור נקודת עבודה בה יחסי השגיאות שווים.

בגרף הבא, ניתן לראות השוואה בין 4 מערכות שונות שנבדקו על אותו דאטה סט, הנקודות על הגרפים הן נקודות הEER:

לסיכום

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

אם לאחר קריאת הכתבה צצות לכם שאלות או שתרצו הרחבה נוספת בנושאים קשורים, מוזמנים לכתוב לי במייל ואשמח לנסות לעזור (-:

Barmadar13@gmail.com

linkedin.com/in/bar-madar-838b15160

Posted by bar madar in deep