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

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




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



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

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

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

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


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

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


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


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

למידה סטטית:

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


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

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


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


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

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

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

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

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

העברת למידה



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

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




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

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

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

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

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

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




יום שבת, 2 במאי 2020

איך ‏נראה ‏פרוייקט ‏למידת ‏מכונה? ‏


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

 

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

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

 

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

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

 

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

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

 

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

לאחר קבלת תוצאות ראשוניות אנחנו מתחילים לטייב את האלגוריתם. לדוגמא, אם שמנו לב שיש לנו יותר מדי זיהוי שווא (FALSE POSITIVE) נעלה את המחיר של כל טעות מסוג זה ונריץ שוב. ברגע שהגענו ליחס FP-FN סביר, מספרים ששתנים בין פרוייקטים – מערכת ספאם יכולה להיות בעלת אחוז FN גבוהה יחסית, מ'סימום נמחק את האימייל בעצמנו. לעומת זאת למערכת שמזהה התפתחות סרטנית נסלח יותר על התראות שווא – מקסימום עשינו בדיקה נוספת סתם, מאשר פיספוס של אבחון.

 

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

 

 

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


יום שני, 6 באפריל 2020

האם מישהו סוף סוף ינצח את האסייתים בגיימינג? והאם זה בכלל יהיה מחשב?

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



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

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


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


יום חמישי, 26 במרץ 2020

אז מה זה בעצם למידת מכונה

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

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

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

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

ועכשיו לקצת היסטוריה -