יום ראשון, 5 ביולי 2020

ולסיכום, קצת הומור




כישורים נחוצים ומסלול לימוד מומלץ ללמידת מכונה



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

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

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

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


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

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


למידה סטטית לעומת זמן אמת


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

למידה סטטית:

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


למידה בזמן אמת:

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


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


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

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

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

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

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

העברת למידה



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

סוגי שגיאות בסיווג בלמידת במכונה




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

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

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

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

למה צריך את שני המדדים? נבהיר ע"י דוגמה – מסווג שתפקידו להגיד האם התמונה היא של חתול או של כלב. המסווג טיפש ולכן הוא תמיד מחזיר תשובה שהתמונה היא של חתול. נניח שאנחנו בודקים את המסווג בעזרת חמש תמונות של חתול וחמש של כלב.
הRecall  של המסווג יהיה 100% מכיוון שהוא זיהה את כל תמונות החתולים בהצלחה.
הPrecision  לעומת זאת, יהיה רק 50% מכיוון שהוא טעה חצי מהפעמים והמדגם סימטרי בגודלו.

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