Classification

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

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

נכתב על ידי 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

מבוא למערכת המלצות ומדדי דיוק מקובלים בתחום

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

נכתב על ידי David Kohav

איך מערכת המלצות עובדת ?

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

מאיפה הנתונים על המשתמש מגיעים ?

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

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

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

ארכיטקטורה נפוצה היא ה TOP-N – בו המערכת מצליחה לזהות את N פריטים (לדוגמה N=10) שהמשתמש הכי מתעניין בהם.

ארכיטקטורה כללית

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

 

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

בסיסי הנתונים בעולם האמיתי יהיו לדוגמא mongodb, קסנדרה או Memcached. בסיסי נתונים אלו מספקים כמות נתונים גדולה בשאילתות פשוטות, באופן אידיאלי הנתונים מנורמלים באמצעות טכניקות כמו mean centering או z-scores כדי להבטיח שהנתונים דומים בין המשתמשים אבל בעולם האמיתי לעיתים קרובות הנתונים שלנו דלילים מכדי לנרמל אותם ביעילות.

  1. candidate generation –  בתהליך אנו רוצים לייצר מועמדים להמלצה, פריטים שלדעתנו עשויים להיות מעניינים עבור המשתמש בהתבסס על התנהגותו בעבר, כך שבשלב ייצור המועמדים, לוקחים את כל הפריטים שהמשתמש ראה בהם עניין בעבר ואז עם מאגר נתונים אחר item similarities להתייעץ בהתבסס על התנהגות מצטברת.

דוגמה:

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

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

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

  1. בשלב הבא נעבור לדירוג מועמדים – candidate ranking.

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

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

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

  1. שלב הסינון – Filtering – יהיה צורך בסינון כלשהו לפני הצגת רשימת המועמדים הסופית המומלצת למשתמש.
  • שלב הסינון הוא המקום בו אנו עשויים לוותר על המלצות פריטים שהמשתמש כבר דירג, מכיוון שאיננו רוצים להמליץ על פריטים שהמשתמש כבר ראה.
  • אנו עשויים להחיל כאן רשימת עצירה (stop list) כדי להסיר פריטים שיכולים להעליב את המשתמש או להסיר פריטים שנמצאים מתחת לציון איכות או סף מינימלי מסויים.
  • זה המקום בו אנו מיישמים את מספר ההמלצות, N המלצות, הכי רלוונטיות למשתמש לדוגמה 10 ההמלצות הכי רלוונטיות.
  1. הפלט למשתמש (אזור תצוגת הסרטים למטה בתמונה) – הפלט משלב הסינון עובר לשלב תצוגת המשתמש, על ידי יישומון וכו’.

הדיאגרמה הזו היא גרסה מפוענחת של מה שמכנים סינון שיתופי מבוסס פריטים (item-based collaborative filtering). החלק הקשה הוא בניית הדמיון בין הפריטים.

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

 

הערכה – אימון \ מבחן בדיקה ואימות צולב

Evaluating – Train/Test and cross-validation

אימון ומבחן

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

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

 

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

תהליך עם נתוני אימון ומבחן

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

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

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

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

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

k-fold cross-validation -תהליך אימות צולב

ניתן לשפר את שיטת פיצול נתונים של אימון ומבחן ע”י שיטת  k-fold cross-validation.

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

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

  • החיסרון זה יותר כוח חישוב
  • היתרון שאתה נמנע מ overfitting אל מול קבוצה בודדת של נתוני אימון.

מסקנה, מטרת מערכת המלצות

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

סקירת מדדי הדיוק של מערכת ממליצים

  1. mean absolute error – MAE – שגיאה ממוצעת בערך מוחלט

התמונה מ https://www.dataquest.io/blog/understanding-regression-error-metrics/

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

  1. שגיאה ממוצעת בשורש הריבועי, root mean square error- RMSE

התמונה מ https://medium.com/analytics-vidhya/calculating-accuracy-of-an-ml-model-8ae7894802e

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

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

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

מדדי דיוק אלה לא באמת מודדים את מה שהמערכות הממליצות אמורות לעשות.

מכוון פחות אכפת לנו שמערכת ההמלצות דייקה לנו בדירוג משתמש שכבר ראה ודירג

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

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

מדדי דיוק לרשימת המלצות עליונות

  1. hit rate , אחוזי הצלחה – מדידת דיוק של רשימות עליונות ( TOP N ) עבור משתמשים בודדים.

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

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

התמונה מ https://slideplayer.com/slide/9347453/

 

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

לעומת בדיקת דיוק כמו MSE ו RMSE שאיתם מדדנו את דיוק הדירוג האישי של המשתמשים, פה אנו מודדים את דיוק הרשימות הראשוניות top n עבור משתמשים בודדים.

בעזרת שיטת leave-one-out cross-validation אנו נבצע את המדידה, אז כמו שאמרתי במדידה זו מחשבים את ההמלצות העליונות עבור כל משתמש בנתוני האימון שלנו אבל אנחנו נסיר בכוונה אחד מאותם פריטים מנתוני האימון מכל משתמש למען מערך נתוני המבחן, שיטה זו נקראת leave-one-out.

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

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

  1. ARHR – average reciprocal hit rate – השפעה ממוצעת על אחוזי ההצלחה.

הוא מאוד דומה ל hit rate אך המדד ARHR מציג היכן נמצא המיקום של הפריט ברשימת הפריטים העליונים (top n) של המשתמש:

התמונה מ https://medium.com/@arthurlee_73761/recsys-16-local-item-item-models-for-top-n-recommendation-753555b5c1c

זה אומר שכאשר המערכת מצליחה להמליץ על פריטים עליונים יותר ברשימה זו נחשבת ל HIT מאשר

המלצה על מיקום פריטים נמוכים יותר מרשימת המומלצים.

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

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

Reciprocal rank Rank
1/3 3
1/2 2
1 1

וכך אנו “מענישים” יותר את מה שאנחנו פחות רוצים להמליץ.

  1. cumulative hit rank – cHR – הצטברות של אחוזי הצלחה

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

הכוונה שאסור להכניס לרשימה הממליצה פריטים שאנו חושבים שהמשתמש לא יהנה מהם.

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

Predicted Rating Hit Rank
5.0 4
3.0 2
5.0 1
2.0 10
  1. Rating hit rate – rHR – שיעור צפיות בדירוג

כאן אנו מסתכלים על קצב ההתאמה (hit rate) אנו מחשבים את ציון הדירוג עבור כל דירוג כדי למצוא איזה סוג דירוג מקבל יותר צפיות. אנו מסכמים את מספר ההצלחות עבור כל סוג של דירוג ברשימת ה- Top-N שלנו ומחלקים את המספר הכולל של הסרטים מכל דירוג ברשימת ה- Top-N שלנו.

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

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

מדדים להערכת תפקוד מערכת המלצות

  1. Coverage – זהו מדד הכיסוי המודד את אחוז ההמלצות האפשריות שהמערכת מסוגלת לספק.

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

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

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

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

  1. Diversity – זהו מדד הגיוון המודד את אחוז הפריטים השונים זה מזה שיש ברשימת ההמלצות של המשתמש.

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

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

בערכי הדמיון האלו כדי למדוד את הגיוון.

S = avg similarity between recommendation pairs

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

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

  1. Novelty – מדד ממוצע לפופולריות של פריטים ברשימת ההמלצות העליונות.

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

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

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

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

איך תיאוריית הזנב הארוך מתקשרת למערכת המלצות?

מטרת מערכת המלצות היא פריטי השירות מה שנקרא תאוריית הזנב הארוך.

לפי ויקיפדיה:

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

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

לפי הגרף, בזנב הארוך ציר ה Y הוא מספר המכירות או הפופולריות, וציר ה X מייצג את המוצרים.

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

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

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

  1. Churn rate – מדד קצב הנטישה

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

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

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

  1. Responsiveness – מדד היענות.

מודד באיזו מהירות משפיעה התנהגות המשתמש על רשימת ההמלצות.

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

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

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

  1. בדיקות A/B באופן מקוון, כדי לכוון את מערכת הממליצים.

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

בדיקות ה A/B הוא מדד מצויין כדי להבין מה קורה בעולם האמיתי ואפילו יכולת לתת מסקנות אשר יכולות להוריד את מידת המורכבות של המערכת.

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

 

By David Kohav

Linkedin: https://www.linkedin.com/in/davidkochav/

GitHub: https://github.com/DavidKohav/recommender-systems

Posted by David Kohav in deep

הסבר למתחילים על העברת לימוד -Transfer Learning

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

נכתב על ידי Ron Jacobson

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

  • בניית מודל מאפס
  • שימוש במודל קיים ומאומן כדי להיעזר במשקלים שלו. (Transfer Learning)

במאמר זה נתמקד באפשרות השניה.

ישנם מספר מודלים אשר יכולים לעזור לנו לבצע העברת לימוד (Transfer Learning) או כיוונון סופי (Fine-Tuning) בצורה טובה ויעילה.

מהי העברת למידה?

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

איך זה עובד?

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

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

המודל למעשה יהיה בארכיטקטורה הבאה:

 

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

מדוע משתמשים בהעברת למידה?

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

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

כלומר, למעשה נחסוך בשתי דרכים:

1: הקטנת הדאטה הנדרש – לא יהיה צורך במערך אימונים גדול במיוחד.

2: הקטנת הכוח החישובי הנדרש. היות ואנו משתמשים במשקולות אשר אומנו מראש ונותר רק ללמוד את המשקולות של השכבות האחרונות.

מתי כדאי להשתמש בהעברת למידה?

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

בדרך כלל כדאי להשתמש בהעברת למידה כאשר:

(א) אין ברשותך מספיק נתוני אימון מתוייגים כדי לאמן את הרשת שלך מאפס

(ב) כבר קיימת רשת אשר אומנה מראש על משימה דומה, ובד”כ על כמויות אדירות של נתונים.

(ג) מקרה נוסף שבו השימוש יהיה מתאים הוא כאשר למשימה 1 ולמשימה 2 יש את אותו קלט. (למשל תמונה באותו הגודל)

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

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

אילו מודלים יעזרו לנו בהעברת הלמידה?

ישנם מספר מודלים מפורסמים אשר לכל אחד היתרונות שלו. אנו נדון בכמה מהמפורסמים והעדכניים יותר.

מודל VGG16

VGG16 פורסם בשנת 2014 והוא אחד מסוגי הרשתות הפשוטות ביותר (בין ארכיטקטורות ה – CNN האחרות שהיו בתחרות Imagenet). רשת זו מכילה סה”כ 16 שכבות מתוכם 13 שכבות קונבלוציה ו 3 שכבות Dense לצורך הסיווג. מספר הפילטרים בשכבות בקונבלוציה הולכים וגדלים  בעוד המימדים הגיאומטריים הולכים וקטנים.

החסרונות של ארכיטקטורה זו הינם:

  1. שלב האימון הינו איטי יחסית
  2. התהליך מייצר מודל גדול מאוד.

הארכיטקטורה של VGG16 ניראת כך:

https://www.semanticscholar.org/paper/Face-Recognition-across-Time-Lapse-Using-Neural-Khiyari-Wechsler/1c147261f5ab1b8ee0a54021a3168fa191096df8

באם נבחר להשתמש במודל זה, אנו נבצע את הצעדים הבאים כדי לממש את VGG16:

  • נייבא את האפליקיישן של VGG16 מ- applications
  • נוסיף את המשקולות השמורים לארכיטקטורה (weights = ‘ImageNet’)
  • נשתמש במודל כדי לבצע תחזיות
  • אציין כי קיימת רשת דומה מאוד בשם VGG19 אשר מכילה מאפיינים דומים למה שתואר לעיל.

מודל InceptionNets

רשת הידועה גם בשם “GoogleNet“. המורכבת מסה”כ 22 שכבות והייתה המודל המנצח בתחרות ImageNet של שנת 2014.

מודולי Inception הם אבן היסוד של InceptionNets והרעיון המרכזי של מודול ה – Inception הוא לעצב טופולוגיה של הרשת המקומית בצורה טובה (כלומר רשת בתוך רשת).

מודלים אלו משתמשים בקונבלוציות בגדלים שונים כדי ליצור Feature-Map מגוון.

בנוסף, הם גם מכילים קונבלוציה של 1X1 כדי לבצע הפחתת מימדים.

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

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

https://arxiv.org/pdf/1409.4842.pdf

והארכיטקטורה השלמה ניראת כך:

https://arxiv.org/pdf/1409.4842.pdf

 

 

מודל Resnets

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

עם זאת, לאחר יציאת מודל Resnet התברר כי הדבר לא ממש מדויק. להלן הבעיות עם רשתות שהן עמוקות יותר:

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

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

כפי שמופיע באיור להלן:

https://towardsdatascience.com/an-overview-of-resnet-and-its-variants-5281e2f56035

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

באמצעות בלוקים שיוריים ברשת, ניתן לבנות רשתות בכל עומק שהוא תחת ההבנה כי שכבות חדשות למעשה מסייעות ללמוד תבניות חדשות בנתוני הקלט. מחברי המאמר יצרו ארכיטקטורת רשת עצבית עם 152 שכבות. הסוגים השונים של Resnets כגון Resnet34, Resnet50, Resnet101 הפיקו את הפתרונות עם דיוק גבוה מאוד בתחרויות Imagenet.

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

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

לסיכום

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

Posted by Ron Jacobson in deep

התקפות על למידת מכונה (Adversarial Attacks)

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

נכתב על ידי Oz Wilson

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

חלוקה לסוגי תקיפות

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

נהוג להבדיל בין שני סוגי התקפות דיגיטליות²:

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

ב) קופסה שחורה – לתוקף אין שום ידע או שיש לו ידע מוגבל על המודל. אם יש לתוקף גישה לתת למודל קלט ולחלץ פלט אז הוא מרוויח עוד מידע.

במאמר זה אספר על שלושה אפיקי התקפה שונים שמטרתם להכשיל Deep Neural Networks שמאומנות על ידי מאגרי תמונות מוכרות כגון MNIST, CIFAR ו-ImageNet: התקפות מבוססות גרדיאנט, התקפות מבוססות על אוגמנטציה מרחבית והתקפות גבול.

1) התקפות מבוססות גרדיאנט

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

שיטת Projected Gradient Descent- PGD

בשיטה זו מאמנים יצירת קלט זדוני x (כזה שיכשיל את המודל המותקף) באופן איטרטיבי. תהליך האימון מבוסס על כך שלוקחים גרדיאנט של פונקציית ההפסד J_{\Theta }^{adv}(x)  (תוסבר בהמשך) וכל איטרציה מכפילים בפרמטר α הגדול מ-0 שהוא ה – learning rate כמו ב BackPropogation-

כדי לייעל את התהליך לא מחפשים בכל מרחב הקלט, אלא רק בסביבה של הנקודות x במרחק 𝛆 מ-x_{0} (מרחק הגדול מ-0). סביבה זו מיוצגת על ידי ההיטל –\prod ל-N_{\varepsilon }(x_{0}) . מעדכנים את הקלט הזדוני x, כאשר הקלט מאותחל להפרעה רנדומלית בתוך הסביבה הזו³-

פונקציית ההפסד של שיטת PGD

פונקציית ההפסד מטרתה למדוד עד כמה הקלט הזדוני מביא לידי תגובה רצויה למודל המותקף. הפונקציה מוגדרת כ³-

הביטוי max_{j\not\equiv y_{0}}m_{\Theta }(x)_{j} הינו ערך פונקציית הלוגיט המקסימלי כאשר ϴ הם פרמטרי המודל – m ו- j אינה המחלקה התואמת ל-label ה- y_{0} של הקלט הזדוני x. 

פונקציה ההפסד J_{\Theta }^{adv}(x) רוצה להקטין את ההפרש בין ערך פונקציית הלוגיט המקסימלי לבין ערך פונקציית הלוגיט של ה-Label של הקלט הזדוני x – m_{\Theta }(x)_{y_{0}}.

בנוסף,  𝛆 תוחם את נורמה ה – ∞L_{∞} של ההפרש בין כל נקודה של הקלט הזדוני לקלט המקורי (ראו כתבה קצרה המסבירה על הנורמות השונות⁴).

לדוגמה –

במצב בינארי, נניח כי קיימת תמונה של חתול y_{0}. המחלקה של חתול מקבלת ערך לפי פונקציית הלוגיט I^{1}=1 . המחלקה של כלב (j) מקבלת ערך I^{2}=2. כלומר, לפי ערכי פונקציית הלוגיט, התמונה בעלת סיכוי יותר גבוה להיות תמונה של כלב. במצב הנתון קיים רק ערך (j) אחד שמייצג מחלקה שאינה חתול ולכן הוא יהיה מקסימלי לפי –max_{j\neq y_{0}}m_{\Theta }(x)_{j}. הפונקציה תמיד תיתן תוצאה שלילית כאשר קיים ניבוי מחלקה שגוי, כפי שניתן לראות גם בדוגמה I^{1}-I^{2}=-1 . כך, על ידי הפחתת פונקציית ההפסד עוד ועוד, נלמד כיצד למצוא הפרעה זדונית שתביא לניבוי מחלקה שגוי בהסתברות הולכת וגדלה.

איור 1 – בדוגמה עם 2 מחלקות, נראה מה קורה שהפרעה דוחפת קלט שהיה מסווג נכון מעבר לגבול ההחלטה של המודל לסיווג שגוי¹, נלקח מ – http://www.cleverhans.io/

ישנם עוד שיטות דומות ל-PGD, כמו BIM – Basic Iterative Method  וכמו Fast gradient sign method – FGSM. ההבדל היחיד² בין PGD ל – BIM הוא תנאי ההתחלה. לעומת זאת FGSM דומה לשתי השיטות האלו אך אינה איטרטיבית ומקבלת תוצאות סבירות בצעד אחד גדול².

במצבים בהם לא ניתן לקחת גרדיאנטים או שהם אינם עוזרים להתקפה ניתן לקרב אותם בעזרת שיטות סטוכסטיות. ניתן לעשות זאת בעזרת שיטה מוצלחת הנקראת SPSA – Simultaneous Perturbation Stochastic Approximation:

איור 2 – הפסאודו קוד³ נלקח מ – https://arxiv.org/pdf/1802.05666.pdf. למי שרוצה להבין לעמוק אז מצורף המאמר המקורי שעליו הפסאודו קוד מבוסס -https://www.jhuapl.edu/spsa/pdf-spsa/spall_tac92.pdf

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

2) התקפות מבוססות על אוגמנטציה מרחבית

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

איור 3 – סיבוב או הזזה דוחפים קלט שהיה מסווג בצורה נכונה לסיווג שגוי⁵-https://arxiv.org/pdf/1712.02779.pdf

3) התקפות גבול

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

איור 4 -הפסאודו קוד⁶ נלקח מ – https://arxiv.org/pdf/1712.04248.pdf

סיכום

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

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

קישורים:

¹ http://www.cleverhans.io/ – Cleverhans blog

² https://arxiv.org/pdf/1804.00097.pdf – Adversarial Attacks and Defences Competition

https://arxiv.org/pdf/1802.05666.pdf – Adversarial Risk and the Dangers of Evaluating Against Weak Attacks ³

medium.com/@montjoile/l0-norm-l1-norm-l2-norm-l-infinity-norm-7a7d18a4f40c

https://arxiv.org/pdf/1712.02779.pdf – A Rotation and a Translation Suffice: Fooling CNNs with Simple Transformations⁵

https://arxiv.org/pdf/1712.04248.pdf – Decision-Based Adversarial Attacks: Reliable Attacks Against Black-Box Machine Learning Models ⁶

https://github.com/google/unrestricted-adversarial-examples

Posted by Oz Wilson in deep

רשתות סיאמיות – להצליח איפה שדיפ לרנינג נכשל – חלק א

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

נכתב על ידי thebeancounter

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

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

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

מה עושים כשאין מספיק DATA ?

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

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

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

רשתות סיאמיות

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

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

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

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

תוצאה טובה לרשת סיאמית מאומנת לבעיית One-Shot Image Recognition  למשל, היא רשת שמסוגלת לקחת דוגמאות נתונים, ולקודד אותן כך שאת התוצאה – ניתן יהיה להזין למסווג אחר, שיקבע האם שתי דוגמאות נובעות מאותה התפלגות או לא, בעיקר על פי המרחק בניהן, גם אם לא פגש את אחת ההתפלגויות באימון.

דוגמית קוד

להלן דוגמה ממומשת מעל tf.keras

המימוש פשוט, וכמו כל מימוש פשוט של רעיון מחקרי מורכב – הוא לא עובד טוב (שאף אחד לא יספר לכם אחרת) מדובר ברשת פשוטה, המקבלת שתי דוגמאות MNIST בתור קלט

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

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

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

כנסו לריפו הזה כדי לראות את כל הקוד של המאמר.

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

 

 

 

 

 

 

Posted by thebeancounter in deep

איפה יש חניה פנויה ? Parkam

המרואיין: עופר חסון (CTO)

רקע

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

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

כמה אנשי פיתוח ? איך מחולקים ?

אנשי הפיתוח בחברה מחולקים לשלוש קבוצות: צוות פיתוח מובייל (אנדרואיד ו-iOS), צוות Datascience, וצוות הליבה (Backend, Server, Frontend).

מהם המוצרים בחברה ?

1) אפליקציית ניווט לציבור הרחב.

2) ממשק בקרה לבעלי חניונים/עיריות.

3) API לאינטגרציה עבור לקוחות שכבר יש להם מערכת בקרה קיימת.

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

אילו חלקים במוצר מצריכים אלגוריתמיקה ?

חלק ראשון: עיבוד התמונה (Deep Learning) למטרת זיהוי חניה תפוסה/פנויה.

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

פיתחנו ארכיטקטורות Light Weight משלנו מבוססות Shufflenet בשילוב עם Squeeze-and-Excitation Networks.

כמו כן, אנו עוסקים בהבנת סצינה באמצעות  Semantic Segmentation ו- Object Detection כדי לעזור למיפוי להיות יותר אוטומטי.

חלק שני:הניווט

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

מה עובד לכם טוב ?

בהקשר של הצד ההנדסי, העבודה ב -Scale, הניהול של ה- Data והתיוג, בנינו  Pipelines אוטומטיים שעובדים יפה.

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

הרשת שפיתחנו נותנת תוצאות מדהימות!

מה מאתגר אתכם ?

קשיים של העולם האמיתי: מצלמות מתלכלכות, זזות וכו’.

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

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

בעיות שפתרתם בדרך יצירתית ?

לבעיית זיהוי הרכב: האם זה אותו רכב או לא ? לקחנו אלגוריתם מתחום ה- Audio של זיהוי דוברים והשמשנו אותו לבעיה שלנו וזה עובד לנו טוב!

ספר על משימת איסוף ה-DBאצלכם ? (מי עושה ? מי בודק ? מי מתייג ? מי מנהל ?)

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

כשהם מסיימים זה עובר אוטומטית לצוות ה-Datascience שלנו לואלידציה.

ה-Flow שפיתחנו הוא אוטומטי ועובד ביעילות.

מהם אתגרי העתיד ?

עולם החניה מעלה הרבה דרישות, חלקן מורכבות וחלקן מיידיות עבורנו.

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

מסייע ויזואלי לתמיכה טכנית – Techsee

המרואיין: רונן רוזנברג (CTO)

רקע

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

כמה אנשי פיתוח ? איך מחולקים ?

בחברה סה”כ 47 אנשים מתוכם 22 אנשי פיתוח ומתוכם 8 עוסקים באלגוריתמים.

מהם המוצרים בחברה?

Eve –Self Service

מסייע טכני ויזואלי. זו למעשה אפליקציית מוביל\וואב שבאמצעות Computer Vision AI&Augmented Reality מסייעת למשתמש הלא טכני לבצע פעולות התקנה או תיקון למוצרים ביתיים.

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

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

TechSee Live Contact Centers

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

סרט של לקוח שלנו שמשתמש במוצר זה:

איזה חלק במוצר מצריך אלגוריתמיקה?

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

משתמשים בין השאר ב PSPNET לסגמטציה ועשינו לה התאמות ואופטימיזציות שתעבוד מהר ומדויק גם בארכיטקטורה רזה במיוחד. לגבי מציאות רבודה (Augmented reality) כל נסיון להשתמש בחבילות תוכנה מוכנות כדוגמת ARKit/ARCore נכשל בשטח כישלון חרוץ, אז פיתחנו משהו מתקדם שמשלב AI עם הספריות הקיימות. אנו נהנים משני העולמות!

מה קל לכם? (אלגוריתמית)

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

מה קשה לכם? (אלגוריתמית)

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

בעיות שפתרתם בדרך יצירתית?

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

ספר על משימת איסוף ה DB אצלכם? (מי עושה? מי בודק? מי מתייג? מי מנהל?)

פיתחנו מגוון כלים לתיוג תמונות, חלקם אוטומטיים וחלקם ידניים.

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

מהם אתגרי העתיד?

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

Posted by תמיר נווה in companies

ניתוח תלת מימד של CT לצורך ניבוי סרטן ריאות

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

נכתב על ידי תמיר נווה

בכתבה זו אספר על בעיית עיבוד סריקות CT (שהינן תמונות תלת מימדיות) ובפרט אספר על תחרות ה-Kaggle לזיהוי סרטן ריאות: Data Sciense Bowl 2017 ועל הפתרונות המנצחים בתחרות זו מתוך ה-1972 צוותים שהשתתפו בתחרות.

האלגוריתם שזכה מקום ראשון (של צוות grt123 בתוצאה של loss=0.39975) נמצא כאן וכמובן הוציאו על זה מאמר.

תיאור הבעיה

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

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

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

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

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

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

אז בואו קצת נבין איך זה נראה. מראה הגושים יכול להיות מאוד שונה ממקרה למקרה:

לקוח מ Evaluate the Malignancy of Pulmonary Nodules Using the 3D Deep Leaky Noisy-or Network

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

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

על ה-DB

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

כל מכונת סריקה מייצרת סריקה בקצב דגימה שונה בציר העומק ולכן המרווח בין זוג תמונות חתך עוקבות (slice thickness) הוא שונה. וזו תופעה איתה יש להתמודד (בשלב העיבוד המקדים Pre-Processing).

הגושים (Nodules) אותם יש לחפש הינם בגודל טיפוסי של 1x1x1 סמ”ר  בעוד סריקת CT ממוצעת הינה בגודל 30x30x40 סמ”ר ולכן מדובר בחיפוש מחט בערימת שחת. אם נשווה לעולם היותר מוכר (לי) של דו מימד, זה כמו לחפש אוביקט בעל שטח של בערך 30 פיקסלים (ז”א בערך 5×5 פיקסלים) בתמונה בגודל 1000×1000. התיוג של ה DB מבוסס על שקלול אבחנות של כמה רופאים.

הרחבת DB תלת מימדי (Augmentation)

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

בעולם התלת מימדי יש לנו יותר אפשרויות של הרחבה מאשר בדו מימד.

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

אם יש בקוביה גוש, גם יהיה גוש בכל אחת מה 48 סיבובים\היפוכים שלה:

תודה ל Дейка2

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

על הפתרון שזכה במקום הראשון

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

עיבוד מקדים (Pre-Processing)

לפני השלב הראשון יש כמו תמיד עיבוד מקדים שמטרתו לייצר אחידות בין הסריקות ולהסיר את כל מה שמחוץ לריאות. העיבוד המקדים כולל המרת התמונות ל- (Hounsfield Scale=HU) שהינו נירמול רמות הצבע כמקובל בסריקות CT, המרה לתמונה בינארית (לפי סף) ומחיקת כל מה שאינו בתוך ה- Connected Component  העיקרי בתמונה (שהינו הריאות). כמו כן פעולות מורפולוגיות בכדי ליצור מסיכה (mask) שבעזרתה ניקח מהתמונה המקורית רק את אזור הריאות.

שלב ראשון – גילוי מועמדים

השלב הראשון ממומש באמצעות מה שהכותבים מכנים N-Net = Nodule Net שהינה רשת 3D RPN מבוססת U-Net אשר מחזירה מלבנים (Bounding Boxes) סביב הגושים עם סף גילוי נמוך כדי לקבל כמה שיותר מועמדים גם אם אינם משמעותיים להחלטה הסופית. רשת זו מאמנים עם הרבה אוגמנטציות (Augmentation) של היפוכים (Flips), סיבובים, שינויי גודל והזזות קטנות. אגב, על רשת ה U-Net ניתן לקרוא בבלוג זה כאן.

בשלב השני לוקחים את חמשת הגושים החשודים ביותר שאותרו בשלב הראשון ובאמצעות אלגוריתםLeaky noisy-or model (יוסבר בהמשך) מחשבים פרדיקציה לקיום המחלה. אלגוריתם זה מניח שיש “זליגה” קלה של הסתברות לקיום האירוע (המחלה) גם אם אין אף תופעה (גוש) המרמז על כך.

חפיפה בין המודלים

לכל אחד מהשלבים (הראשון והשני) יש מודל אחר. האחד מחזיר מלבנים והשני מסווג קיום או אי קיום סרטן (Detection & Classification) והאימון מתבצע לסירוגין בין שני המודלים (Epoch לזה ו Epoch לזה) כאשר עיקר המשקולות של שתי המודלים משותפים. שיטה זו עוזרת למנוע Overfitting (שהרי מקטינה את כמות המשקלים לאימון).

המודל השני (שכאמור חופף חלקית עם המודל הראשון) מוסבר בתרשים הבא:

לקוח מ Evaluate the Malignancy of Pulmonary Nodules Using the 3D Deep Leaky Noisy-or Network

חלק עליון בתרשים (a):

לוקחים את החלק המרכזי (Crop בגודל 96x96x96) מתמונת הגוש (הקוביה) שיצא מהשלב הראשון מזינים אותו לרשת ה N-Net (המודל הראשון) ולוקחים את השכבת הקונבולוציה האחרונה שלו כפיצ’ר בגודל 24x24x24x128 ממנו לוקחים רק את המרכז בגודל 2x2x2x128 עושים עליו max-pooling ונשארים עם פיצ’ר וקטור בגודל 128 לכל גוש מועמד.

חלק תחתון בתרשים (b):

ומשם עוד Fully-connected, Max-pooling, Sigmoid activation בכדי להגיע לפרדיקציה הסופית (המשקללת את המידע מחמשת הפיצ’רים של הגושים העיקריים).

שלב שני – שיקלול הנתונים של כל גוש (Leaky Noisy-or Method)

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

שיקלול שכן לוקח בחשבון את סך הפרדיקציות מכל גוש הינו Noisy-Or ההופכי למכפלת ההסתברויות של העדר סרטן: (ההסתברות שהראשון מעיד על סרטן או שהשני או שהשלישי…)

אך מה קורה אם גוש ממאיר ביותר התפספס בגילוי בשלב הראשון ?

לצורך כך משתמשים במודל ה- Leaky Noisy-or method שמניח שייתכן והפרדיקציה חיובית על אף שאף גוש לא ניבא זאת. הפרמטר Pd נלמד גם כן בשלב האימון. (ז”א הוא תלוי תמונה ולא תלוי גוש)

זה אכן המודל שהביא לתוצאה הטובה ביותר.

באימון המודלים משתמשים בין השאר ב Gradient clipping וב- Batch normalization.

על הפתרון שזכה במקום השני

לאלגוריתם (ולצוות) שלקח את המקום השני בתחרות יש שתי כתבות מפורטות של כל אחד מהמפתחים  Daniel Hammackו Julian de Wit.

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

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

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

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

מה שהם עשו זה השתמשו במאגר נתונים המקורי שממנו נגזר המאגר של התחרות שנקרא LIDC-IDRI שמכיל בנוסף לסריקות ולגושים אותם איבחנו רופאים, גם מאפיינים אותם איבחנו הרופאים לכל גוש. למשל גודל, מידת הממאירות, חיספוס וכו’… מידע זה שהוסר מהמאגר שבתחרות היווה נקודת מפתח להצלחה.

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

לקוח מ 2nd place solution for the 2017 national datascience bowl

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

טכניקת אימון אותה שווה להזכיר בה הם השתמשו נקראת Curriculum Learning. הרעיון הוא קודם לאמן דגימות קטנות ופשוטות ואז לאמן עם הדוגמאות הקשות. גישה זו אינטואיטיבית לנו הלומדים האנושיים כי תמיד הורגלנו ללמוד את הפשוט (כיתה א’) ואז כשזה מוטמע במוחנו, ללמוד את הנושאים היותר מסובכים (כיתה ב’ וכו’…). לפי התיאור שלהם הם קודם אימנו עם קוביות בגודל 32x32x32 ואז אימנו עם קוביות בגודל 64x64x64.

קישורים

  1. למי שמחפש מאגרי נתונים ובעיות בתחום הרפואי חייבים להכיר את: Grand-Challenges
  2. LUNA16  הינה תחרות לזיהוי גושים (Nodules) בכמעט אלף תמונות CT
  3. מאגר LIDC-IDRI בתחום סרטן הריאות
  4. MicroDicom – כלי חינמי מומלץ לראות Dicoms

Posted by תמיר נווה in deep

למידת מכונה? לא לגאונים בלבד

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

נכתב על ידי Moti Gadian

תמיד חלמת ללמוד Machine Learning  או  Deep Learning  אבל נבהלת מכל הנוסחאות? , חיפשת דוגמאות קוד והתבלבלת מכל המושגים הטכניים? חושב שהנושא של למידת מכונה מיועד רק למתמטיקאים או מדענים? זה בדיוק המאמר בשבילך!

תחום ה Deep Learning צבר תאוצה בשנים האחרונות, וכולם רוצים לקחת חלק בטכנולוגיה הזו.

היום כאשר הנושא נכנס לתודעה ורואים את מיטב החברות הגדולות ( Google , Facebook ועוד) מפתחות ספריות או  Frameworks בינה מלאכותית  – כמעט כל מפתח יכול להתחיל לבנות מודל בסיסי בכמה שורות קוד פשוטות.

במאמר זה נתייחס לספרייה Keras (למרות שהיא יותר קרובה להיות Framework) שהינה ספרייה עילית לבניית מודלי בינה מלאכותית או בשמם המדעי Neural Networks .

ככלל, הFlow  של תהליך Deep Learning מורכב מ-3 חלקים עיקריים:

  1. הכנת המידע   (Data)
  2. הגדרת מודל
  3. בניית המודל
  4. אימון של המודל – הזנת
  5. המידע אליו והפעלת האלגוריתמים
  6. חיזוי (Prediction)  – שימוש במודל ובחינה שלו

לאחר שהתהליך הושלם והשגנו אחוז גבוה של דיוק (ההסתברות שהמודל שלנו יחזיר תשובות נכונות),

ניתן להכין את המודל לשלב ה-Production אולם אנחנו נעסוק בעיקר בחלק שבו אנו בונים מודל ומאמנים אותו.

מוכנים? אז בואו נתחיל!

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

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

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

המבנה הפשוט של רשת נוירונים מורכב מ-3 חלקים (שכבות) :

  • קלט
  • שכבות ביניים (hidden) עליהם מבוצעים החישובים
  • פלט

די עם ההקדמות תן לכתוב קוד!

את הקוד שלנו אנחנו נכתוב ב Python שהיא השפה הכי פופולארית לכתיבת מודלים.

שלב ראשון – התקנת הספריות:

פתחו את הטרמינל (שורת הפקודה) והקלידו את הפקודה הבאה

Pip install tensorflow

חכו כמה דק’ עד שהספרייה תתוקן.

(אנחנו בעצם מתקינים את הספריהTensorflow  מבית Google אולם Keras  כבר כלול בה כשכבת אבסטרקציה)

שלב 2  –  הכנת ה Data

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

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

שימו לב שחילקנו את הdata  שלנו שלני חלקים:

  • החלק המרכזי שעליו נאמן את המודל (train)
  • החלק שעליו נעשה test וכך נוכל לבחון את הביצועים של המודל עבור מידע שעדיין הוא לא ראה ואומן עליו.

שלב 3 – בניית המודל , קונפיגורציה והזנת המידע (אימון)

שלב 4  – מדידת ביצועים

לאחר שאימנו את המודל נותר כעת לבחון אותו על מידע חדש שהוא לא ראה מימיו כדי לראות את היעילות שלו בפעול הלכה למעשה.

בסוף הריצה אנו אמורים לקבל משהו דומה לזה:

evaluation result: loss(0.10702921551428735) | accuracy(0.9663)

זהוו !! – כל הכבוד בניתם את המודל הראשון שלכם.

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

Posted by Moti Gadian in deep

Transfer Learning – הכללת ידע

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

נכתב על ידי tomer peled

מוטיבציה

למידה עמוקה (Deep Learning) שינתה את העולם בעזרת מפגש של טכנולוגיה ותיקה (Neural Networks) שהחלה בשנות החמישים והבשלה של תנאים: כח מחשוב, כמויות גדולות של Data זמין וסטנדרטיזציה של שיטות עבודה – Benchmarks סטנדרטים, קוד פתוח. אך כמויות גדולות של Data רלוונטי לא בהכרח זמינות עבור כל בעיה.

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

הגדרה

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

Transfer Learning

בשני מאמרים פורצי דרך [5], [4] הוכח שרשת שלמדה לפתור בעייה מסוימת – למשל סיווג תמונות מ 1000 קטגוריות המצויות ב ImageNet, יכולה בתהליך פשוט של Fine Tuning לעבור התאמה  לפתרון בעיה אחרת כגון סיווג אנשים (שלא מופיעים כקטגוריה ב ImageNet), מוצרים מחנות מכוונת או סיווג סצינות.

למעשה רוב העבודה שנעשית היום בלמידה עמוקה מבוססת על Tranfer-Learning ומאפשרת לחסוך לימוד על חומרה מרובת GPU במשך שבועות כמו שנעשה על ImageNet.

למה זה עובד ?

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

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

אז איך עושים את זה ?

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

  • הדרך הפשוטה ביותר – ולעיתים זה כל מה שנידרש היא להשתמש ברשת מאומנת מראש על בעיה אחרת כגון ImageNet כ feature-extractor (מחלץ תכונות) ולאמן מסווג למשל Linear-SVM או SoftMax התכונות שחולצו מהתמונות שלנו.
  • הרחבה אפשרית לשיפור ביצועים נקראת כוונון עדין fine-tuning. כלומר התאמה קטנה של המשקלות בשאר הרשת.
    • מקובל להקפיא את הלימוד בשכבות הנמוכות של הרשת. מאחר שההכללה בלימוד על בסיס נתונים גדול כ Image-Net טובה מההכללה שתתקבל על סט תמונות קטן ומגוון פחות וכן ה features בשכבות אלו מבטאים אבסטרקציה כגילוי שפות וכתמים המשותפים לכלל הבעיות.
    • את השכבות העליונות ברשת מאמנים בקצב לימוד (Learning-rate) נמוך על מנת לשמור על השפעה קטנה.
    • לעיתים מאמנים בו זמנית את השכבות העליונות ברשת בקצב נמוך ואת המסווג בקצב גבוה יותר.

מקורות


Posted by tomer peled in deep

ניתוח מתמטי לאלגוריתם PCA

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

נכתב על ידי Ori Cohen

הקדמה

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

 (Atul Butte, Stanford School of Medicine)

כתבה זו מתארת את העבודה שעשיתי עם נח גורני כעבודה אקדמאית.

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

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

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

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

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

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

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

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

בהמשך נדגים כיצד הורדת הממדים שמתרחשת בעקבות הפעלת תהליך ה-PCA מאיצה את תהליך הלמידה וגורמת לעליה בדיוק שלו.

מהו PCA

תהליך ה-PCA הוא מהתהליכים הפופולריים ביותר להורדת ממדים בנתונים.

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

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

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

למה זה מעניין אותנו?

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

בדקנו את תוצאות הפעלת התהליך על בעיית למידה קלאסית בתחום סיווג תמונות, סט המידע MNIST, שמורכב מאלפי תמונות של ספרות שנכתבו בכתב יד שעלינו לזהות. במקרה שלנו במקום תמונות בגודל 21X21 אימנו את המודל על קלטים בגודל 50 בלבד (בעקבות הפעלת ה-PCA).

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

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

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

מדוע PCA  משפר ?

השאלה שבאמת מעניינת אותנו עכשיו היא למה זה קורה?

על מנת לענות על שאלה זו עלינו לחשוב על בעיית למידת מכונה כבעיית חיפוש.

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

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

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

ניסוח פורמלי של השיטה

הגדרה: משתנה מקרי הוא התאמה של ערך מספרי לאירועים אפשריים במרחב ההסתברות. פורמלית, משתנה מקרי X מעל מרחב הסתברות \Omega הוא פונקציה  X:\Omega \rightarrow \Re.

הגדרה: וקטור מקרי X הוא וקטור p-ממדי המקיים כי לכל 1\leq i\leq p: X_i הוא משתנה מקרי.

הגדרה: מטריצת שונויות היא מטריצה V מגודל pxp בה:

V_ij=cov(X_i,X_j )=E[X_i X_j ]-E[X_i ]E[X_j ]

הגדרה: גורם עיקרי של וקטור מקרי X הוא משתנה מקרי ({\alpha \in }\Re ^{p})z=\alpha \cdot x  כך ש- Var(z) מקסימלי תחת האילוץ \left \| \alpha \right \|=1.

הערה: למרות שבדר”כ ניקח את הנורמה האוקלידית (כלומר, נדרוש כי \alpha \cdot \alpha =1), ניתן להחליף זאת בנורמות אחרות (נורמת מקסימום, נורמת סכום וכו’).

מסקנה: המקדמים \alpha _k של הגורמים העיקריים z_k (1\leq k\leq p) הם הווקטורים העצמיים של מטריצת השונויות V, המתאימים לערכים העצמיים \lambda _k.

הגדרה: התפלגות D  עם פרמטרים (a_1,a_2,...) היא משפחת פונקציות המתאימות לכל מאורע מהצורה X<c

 (X משתנה מקרי, c קבוע) סיכוי כלשהו לפי תבנית התלויה בפרמטרים הרלוונטיים, כלומר פונקציית ההתפלגות היא מהצורה:

P(X<c|a_1,a_2...)

סימון: אם המשתנה המקרי X מתפלג לפי ההתפלגות  עם הפרמטרים (a_1,a_2,...) נסמן:

X\sim D(a_1,a_2,...)

הגדרה: סדרת התפלגויות D עם הפרשים (\triangle a_1,\triangle a_2,...) הינה אוסף של התפלגויות

D_i=D_i(a_{1}^{i},a_{2}^{i},...), 1\leq i\leq N

כך שמתקיים:

a_{j}^{i}=a_{j}^{0}+(i-1)\Delta a_j

כלומר, בכל שלב מוסיפים לכל פרמטר את ההפרש המתאים.

הגדרה: רכיב עיקרי יקרא מסדר k אם הע”ע המתאים לו הינו ה-k בגודלו.

סימון: את אוסף הרכיבים מסדר k של סדרת ההתפלגויות D=D(\Delta a_1,\Delta a_2,...) נסמן ע”י:

PC_k(D)

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

  • נקבע את התפלגות בסיסית D_0(a_1,a_2,...). במקרה שלנו ההתפלגות הבסיסית הינה ההתפלגות הנורמלית הסטנדרטית N(0,1)
  • נקבע את ההפרשים (\bigtriangleup a_1,\bigtriangleup a_2,...). במקרה שלנו נרצה לשנות את סטיית התקן של ההתפלגות.
  • נייצר סדרת התפלגויות \left \{ D_i \right \}_{i=1}^{N} כאשר  מספר גדול מספיק. למעשה אנו משנים את ענן הנקודות אותם אנו דוגמים על מנת לראות את ההשפעה של הפרמטרים על התוצאות לאחר הפעלת תהליך ה-PCA.
  • עבור כל התפלגות D_iנחשב את הגורמים העיקריים
  • נשרטט בדיאגרמת פיזור (scatter plot) את האוסף\left \{ PC(D_i)) \right \}_{i=1}^{N} עבור הגורמים העיקריים הראשונים. אם נזכר בדוגמה של למידת המכונה, נשים לב כי הפיזורים הללו הם למעשה מרחב הקלטים האפשריים של מודל הלמידה שלנו.

תוצאות

לצורך כך נייצר וקטורים עצמיים מתוך וקטור מקרי באורך 6 בו כל קואורדינטה מתפלגת בהתפלגות נורמלית.

כעת נבצע 100 חזרות של השלבים הבאים:

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

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

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

לדוגמה, כל נקודה בגרף הראשון מייצגת את אחד מהגורמים העיקריים הראשונים (כלומר, כל אחד מהם מתאים לערך העצמי הגדול ביותר שנובע מהתהליך ה-PCA עבור ההתפלגות ממנה הוא נוצר) ואנו יכולים לראות שבעוד השינוי שחוללנו בהתפלגות הווקטור המקרי שינתה את הערכים שמופיעים בקואורדינטות y,z בטווח רחב ([-10,10]) הערך בציר ה-x כמעט ולא משתנה.

נשים לב לכמה דברים:

  • בשני הממדים הראשונים אנו יכולים לראות כי השינויים בתוצאות התהליך נמצאים אך ורק על מישורים, כלומר במונחים של בעיות חיפוש, חסכנו לעצמנו חיפוש במרחב תלת ממדי וכעת אנו צריכים לחפש אך ורק על מרחב דו-ממדי.
  • שני הממדים הראשונים מייצגים את רוב המידע שנמצא בנתונים, כאשר אנו מגיעים לרכיב השלישי הערכים שלו הם כבר בסדרי גודל של 10^{-2}, כלומר חסרי מידע מועיל על הנתונים המקוריים.

סיכום ומסקנות

אז מה אנו יכולים להסיק מכל זה?

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

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

ניתן לראות את תהליך ה-PCA במגוון רחב של שימושים, החל מניתוח תמונות וכלה בסיווג של תנועות בני אדם בהתבסס על חיישנים שונים. רשימה ארוכה של שימושים ניתן למצוא באתרים הבאים:

 https://www.intechopen.com/books/principal-component-analysis-engineering-applications

https://www.intechopen.com/books/principal-component-analysis-multidisciplinary-applications

Posted by Ori Cohen in deep

רשת ה U-Net: סגמנטציה של תמונות מיקרוסקופיות

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

נכתב על ידי Hen Grinberg

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

תודה ל MathWorks https://www.mathworks.com/help/vision/ug/semantic-segmentation-basics.html

שני בסיסי הנתונים (datasets) הנפוצים עבור משימה זו הם VOC2012 ו MSCOCO .

אחת הגישות הראשונות והמוכרות של שימוש בלמידה עמוקה (deep learning – או בקיצור DL) עבור בעיה זו הייתה סיווג קטעי תמונה (patch classification) כאשר כל פיקסל בתמונה המקורית סווג בנפרד למחלקה הרלוונטית על ידי הפיקסלים שנמצאים סביבו באותו קטע תמונה והפיקסל שאותו אנחנו רוצים לסווג נמצא במרכז. הבעיה המרכזית בשיטה זו שהיא מאוד בזבזנית מבחינה חישובית ולא יעילה מכיוון שישנם המון קטעי תמונה שהם כמעט זהים (פיקסלים צמודים בתמונת המקור ימצאו בקטעי תמונות כמעט זהים).

רשתות קונבולוציה מלאות (fully convolutional networks)

בשנת 2014 הופיעה פרדיגמה / ארכיטקטורה חדשה שפותחה על ידי מספר חוקרים באוניברסיטת ברקלי שנקראת “רשתות קונבולוציוניות מלאות” (FCN=fully convolutional networks). פרדיגמה זו שונה מכל מה שהיה לפניה בכך שהיא מחליפה  שכבות מחוברות באופן מלא (fully connected layers) בשכבות קונבולוציה וע”י כך מאפשרת לקבל בכניסה לרשת תמונות בגדלים שונים. כמו כן היא גם הרבה יותר מהירה משיטת סיווג קטעי תמונה. מאז, כמעט כל השיטות שהביאו לביצועים הטובים ביותר עבור בעיה זו השתמשו בארכיטקטורה זו.

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

אחת השיטות להתמודד עם בעיה זו הינה ארכיטקטורת מקודד-מפענח (encoder-decoder). המקודד מפחית בהדרגה המימד המרחבי (spatial dimension) באמצעות שכבות אגרגציה ואילו המפענח מגדיל בהדרגה את המימד המרחבי. ישנם בדרך כלל קשרי דילוג (skip connections) בין המקודד למפענח עבור שכבות מקבילות, על מנת לעזור למפענח לשחזר את התמונה לגודלה המקורי ולספק מידע אודות המיקום המדויק של כל פיקסל בתמונה המקורית. רשת פופולרית שפועלת על פי ארכיטקטורה זו היא U-Net.

תודה ל U-Net: Convolutional Networks for Biomedical
Image Segmentation

כיצד עובדת רשת U-Net?

הרשת מורכבת משני חלקים  – החלק המצמצם (החלק השמאלי בתרשים) והחלק המרחיב (החלק הימני בתרשים). החלק המצמצם בנוי לפי ארכיטקטורה קונבולוציונית טיפוסית, פרוצדורות  של 2 קונבולוציות בגודל 3×3  ללא שכבת אפסים מסביב לתמונה (padding) שאחריהן באה פונקציית אקטיבציה מסוג RELU, כאשר לאחר הקונבולוציה השניה מפעילים שכבת max pooling בגודל 2×2 עם קפיצות של 2 פיקסלים בכל פעם (stride=2) שמחזירה את הערך הגבוה ביותר בכל ריבוע בגודל 2×2 בתמונה. המטרה של שכבת הmax pooling  הינה להקטין את גודל התמונה. אחרי כל פרוצדורה מספר מפות הפיצ’רים (feature maps) גדל פי 2 וגודל התמונה קטן פי 2.

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

בשלב הבא משרשרים בין מפות פיצ’רים מקבילות של המפענח והמקודד (skip connections) כאשר מקטינים את גודלן של כל מפות הפיצ’רים של המקודד (encoder) על מנת שיהיו בעלות גודל זהה לאילו של המפענח (decoder). מטרת פעולת השרשור הינה לשפר את משימת המיקום של הפיקסלים בתמונה המורחבת (localization). בשלב הבא ישנן 2 קונבולוציות בגודל 3×3  ולאחר כל אחת מהן ישנה פונקציית אקטיבציה מסוג RELU. 

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

האימון והתוצאות

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

w_{c}(x) נועד לאזן פיקסלים ממחלקות בתדירויות שונות, ו d_{1}(x), d_{2}(x) הינם המרחק מפיקסל x לגבול של המחלקה הקרובה ביותר או השניה הקרובה ביותר בהתאמה.

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

קישורים

הסברים, קוד ומודל להורדה של U-Net:

https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/

מימוש של רשתU-Net  ב Tensorflow:

https://www.kaggle.com/vijaybj/basic-u-net-using-tensorflow

Posted by Hen Grinberg in deep

לחולל DATA חדש כדי לשפר סיווג (הרחבת Data בעזרת GAN)

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

נכתב על ידי תמיר נווה

מה עושים כשאין מספיק Data ?

כשרוצים לאמן רשת Deep Learning ואין מספיק Data ישנם מספר שיטות מה לעשות, העיקריות הינן:

  • – Data Augmentation (למשל בתמונות: סיבובים, הזזות, הרעשות, מחיקות, שינויי הארה)
  • – הקטנת המודל
  • – יצירת DB סינטטי
  • – עזרה לאימון ע”י Data Preprocessing (למשל בתמונות Cropping מתוך הבנה מה חשוב ומה מיותר בתמונה על מנת לסווג)

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

רציתי להתעמק ולהבין למה שזה יעבוד ועד כמה זה בכלל משפר תוצאות ?

גיגול קצר הביא אותי לשני המאמרים האלו: (ששניהם אגב יצאו במרץ 2018 ואף אחד מהם לא מצטט את השני)

DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

GAN-based Synthetic Medical Image Augmentation for increased CNN Performance in Liver Lesion Classification

בחרתי להתעמק במאמר הראשון מבין השניים (שנקרא בקיצור DAGAN), כי הם מצרפים לו קוד שאפילו רץ לי במכה ראשונה 🙂

בתמונות פנים הבאות ניתן לראות שהתמונות האמיתיות (לקוחות מ VGG-Face) הם רק בעמודה השמאלית הן של הגברים והן של הנשים, ובכל השאר העמודות התמונות מג’נרטות\מזויפות. (ז”א תוצר של DAGAN)

תודה ל DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

איך בדיוק קורה הקסם ?

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

מדובר על Database המחולק לכמה מחלקות ומטרתנו להגדיל את ה DB כדי לשפר רשת סיווג (אחרת).

הרשת שמגדילה את ה DB מורכבת מGeneratror  ו Discriminator.

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

התרשים הבא (לקוח מהמאמר) והוא מסביר הכל:

תודה ל  DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

מאמנים רשת Generator (צד שמאל בתרשים) המקבלת רעש גאוסיאני (z) ותמונה אמיתית (xi) ממחלקה c ועל בסיסם לג’נרט תמונה מזויפת (xg). ובמקביל לאמן רשת Discriminator (צד ימין בתרשים) להבדיל בין זוג תמונות אמיתי (xi, xj) ממחלקה c לבין זוג תמונות שאחת מהן אמיתית ואחת מזויפת (xi,xg) כאשר השניה (xg) נוצרה על בסיס הראשונה (xi).

בצד שמאל (הג’ינרוט) משתמשים במקודד-מפענח כאשר המפענח מקבל שירשור של הטלה לינארית ל z (הרעש המוגרל) ושל xi (התמונה האמיתית).

המימוש המוצע

הכותבים מימשו את הרעיון באופן הבא:

ה Generator (המחולק לEncoder  ול- Decoder) ממומש ע”י שילוב של UNet ושל ResNet והכותבים קוראים לו UResNet:

תודה ל DATA AUGMENTATION GENERATIVE ADVERSARIAL NETWORKS

ה Discriminator ממומש ע”י DenseNet.

סדרי גודל ותוצאות

ראשית נציין עובדה חשובה שכשהשוו תוצאות של ה classifier, בתוצאות ללא ה Gan Augmentation הם כן השתמשו ב Augmentation קלאסי (שכלל: סיבובים של 90 מעלות, הזזות, הוספת רעש לבן), ובתוצאות ים ה Gan Augmentation הם עשו גם Augmentation  קלאסי, מה שאומר שהגישה של ה Gan Augmentation באמת תרמה ביחס להוספת תמונות באופן רגיל.

הבחינה נעשתה על שלושה אתגרי קלאסיפיקציה:

האחד במאגר Omniglot שהינו מאגר של עשרות אלפי תמונות של 1623 אותיות שונות מחמישים שפות שונות בכתב יד. השני ממאגר תמונות פנים VGG-Face והשלישי ממאגר תמונות כתב יד EMNIST שהינו הרחבה של MNIST  הפופולארי.

השיפור בביצועי הקלאסיפיקציה משמעותי:

הבעיה עם Augmentation רגיל   עם Gan Augmentation 
Omniglot 69% 82%
EMNIST 73.9% 76%
VGG-Face 4.5% 12%

 

הריצה מאוד ארוכה אגב: 500 epochs על עשרות אלפי תמונות, חייבים כמה GPUים כדי להריץ בזמן סביר.

קישורים

ניתן להשתמש ב-DAGAN להרחבת DB כלשהוא של תמונות, כקופסה שחורה באמצעות הקוד הבא:

https://github.com/AntreasAntoniou/DAGAN

Posted by תמיר נווה in deep

Random Erasing Data Augmentation – הרחבת מידע בעזרת מחיקה אקראית

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

נכתב על ידי Yanai Ankri

 הרחבת מאגר הנתונים – Data Augmentation

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

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

data augmentation

https://zhuanlan.zhihu.com/p/44363288

המוטיבציה לשיטת המחיקה האקראית

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

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

image recognition 

הרחבה באמצעות מחיקה אקראית

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

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

תודה ל Random Erasing Data Augmentation

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

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

תודה ל Random Erasing Data Augmentation

תוצאות

להלן תרשים המתאר את שיפור הביצועים באימון מודל ResNet על מאגר תמונות Cifar-10 עם ובלי שיטת המחיקות האקראיות (Random Erasing). ניתן לראות איך ללא השגת תמונות נוספות אמיתיות לאימון, הרשת מצליחה בזיהוי בשגיאה נמוכה באופן משמעותי:

תודה ל Random Erasing Data Augmentation

קישורים

לקוד –  https://github.com/zhunzhong07/Random-Erasing

למאמר – https://arxiv.org/abs/1708.04896

Posted by Yanai Ankri in deep

מהי קלאסיפיקציה ? דוגמא מהעולם העסקי: סגמנטציה של לקוחות

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

נכתב על ידי יובל מרנין

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

בגרף הבא מוצגים הרכישות ומספר הקניות של לקוח בחודש בסופר של רכישות מזון on-line. כל נקודה בגרף מייצגת לקוח כאשר ציר ה-X מציין את סך הרכישות וציר ה-Y את כמות הרכישות.

קלאסיפיקציה

באופן גס ניתן לומר שמסתתרים בנתונים שלושה סוגים של לקוחות או במילים אחרות שלושה סגמנטים:

קלאסיפיקציה

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

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

מכיוון שכל לקוח שייך לסגמנט שונה אפשר להתייחס בצורה פרסונלית לפי מאפייני הסגמנט אליו הוא משתייך:

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

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

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

Posted by יובל מרנין in deep