בינה מלאכותית-למידת מכונה
בינה מלאכותית – למידת מכונה ML
תוכן עניינים:
1 מבוא. 2
1.1 רקע תיאורטי 2
1.2 למידת מכונה. 2
1.3 תהליך העבודה (Workflow) של ML. 5
במשך הרבה שנים עלו דרישות מאנשי מחשבים לפתח מערכות שידעו לזהות אובייקטים שונים, כמו פנים, אנשים, חיות, נשק וכד'. ובמשך השנים גם התפתחו אלגוריתמים שונים, כל אחד מיועד למטרה אחרת.
למשל, אחת השיטות שפותחה כבר מזמן לזיהוי פנים היא על ידי השוואת תכונות תווי הפנים שבתמונה לתמונות שמאוחסנות במאגרי נתונים. אלגוריתם פשוט למד כבר מזמן לזהות בזמן צילום דיגיטלי, פנים אנושיות וכך עשה פוקוס עליהם, כדי שהפנים לא יצאו מטושטשים.
חלק מהאלגוריתמים מזהים תווי פנים על ידי אלימינציה של תכונות שונות שאינן רלוונטיות לצורך הזיהוי. לדוגמה, ייתכן ואלגוריתם לנתח המיקום היחסי, הגודל, והצורה של העיניים, האף, עצמות הלחיים והלסת של אדם. תכונות אלה משמשות לאחר מכן לצורך איתור של תמונות אחרות בהן קיימות תכונות תואמות. אלגוריתמים אחרים מנרמלים את כל מאגר הנתונים המכיל את תמונות הפנים, לאחר מכן דוחסים את הנתונים הקיימים ורק הנתונים הנחוצים לצורך זיהוי תווי הפנים נשמרים. רק לאחר מכן נערכת ההשוואה בין התמונה שנלקחה ובין מאגר הנתונים של תווי הפנים.
מערכות זיהוי הפנים אלו אינן מושלמות והן מתקשות להפיק תוצאות טובות תחת תנאים מסוימים.
הן אינן עובדות היטב במצבים של תאורה גרועה, כאשר האדם חובש משקפי שמש, כאשר לאדם שיער ארוך, כאשר אובייקטים אחרים מכסים באופן חלקי את פניו וכאשר התמונות ברזולוציה נמוכה.
חיסרון מהותי נוסף הוא שהאפקטיביות של מערכות זיהוי פנים רבות נמוכה בהרבה במידה והתמונה מכילה הבעת פנים כלשהי. אפילו במידה והאדם חייך בתמונה, הזיהוי יאבד מן היעילות.
למידת מכונה-Machine learning זוהי טכניקת ניתוח נתונים המלמדת את המחשבים לעשות מה שבא באופן טבעי לבני אדם – ללמוד מניסיון. אלגוריתמים של Machine learning משתמשים בשיטות חישוביות מתקדמות כדי “ללמוד” מידע ישירות מהנתונים ללא הסתמכות על משוואה קבועה מראש כמודל.
האלגוריתמים משתפרים באופן מיטבי בביצועיהם כאשר מספר הדגימות העומדות ללמידה גדל.
השימוש בשיטות של Machine learning בא לידי ביטוי במיוחד כאשר יש צורך לחזות תרחישים מסוימים, או צורך לזהות דפוס התנהגותי מסוים, וכל זה מאוסף נתונים שקיים בארגון .Machine learning
לא כל בעיה ניתן לפתור בעזרת ML – להיפך. הבעיות העיקריות שניתן לפתור בעזרת ML מחולקות לקטגוריות הבאות:
- Regression – חיזוי של ערך, על בסיס נתונים. למשל: שערוך ערך של דירה על סמך הנתונים שלה (שטח, גיל, וכו’) או הערכה מה יהיה סכום העסקאות של לקוח בחודש הקרוב – על סמך עסקאות עבר, גיל, ומדדים של הרגלי קנייה.
- Classification – סיווג של entities למספר סגור של קבוצות מוגדרות, למשל: שביעות רצון של לקוח (3 ערכים אפשריים: נאמן, רגיל, נוטה לעזוב), האם עסקה היא לגיטימית או הונאה (2 ערכים אפשריים), וכו’.
- Clustering – גיבוש קבוצות של פריטים מסוימים. למשל: ברוסיה יש 10,500 ערים – צור קבוצות של ערים דומות (ע”פ סדרה של נתונים על הערים, קרי: מספר תושבים, הכנסה ממוצעת, שטח, שנות קיום, וכו’).
- Recommender Systems – חיזוי פריטים דומים שמישהו עשוי להתעניין בהם, למשל: אם אהבת דיסק של כנסיית השכל – אולי תאהב את הדיסק החדש של שלמה ארצי (לא!!!!!!)
- Collaborative Filtering –מי שאהב X אהב גם Y” – המלצת תוכן או מוצר למשתמש, ע”פ סיווג של משתמשים “דומים”, ותיאור הפריטים שקבוצת ה”משתמשים הדומים” נוטה לאהוב.
בפרוייקט שלי מימשתי את למידת המכונה מצורת Regression.
את עולם ה-ML מחלקים בדרך ל-2 קטגוריות:
Supervised Learning – למידה מפוקחת
כאשר יש לנו מאגר של נתונים ותשובות (= target value), שהושגו בצורה כזו או אחרת (מדידה, עבודה של מומחים, וכו’) – ואנו רוצים שהמחשב ינסה לחקות את התשובות.
דוגמה קלאסית: שערוך ערך של דירה. גם אם יש לנו נתונים של אלפי דירות ומחיר מכירה של כל אחד מהן (אתר מדלן?!) – זו תהיה משימה כמעט בלתי אפשרית לכתוב קוד בעזרת if ו-for שיבצע שיערוך של מחיר דירה, ובצורה טובה.
בעזרת ML אנו יכולים לפעול באופן הבא:
- להשתמש ב-Domain Knowledge (בקיצור DK) על מנת למצוא, או לפחות לנחש את ה-features (תכונות) שמסבירות את מחיר הדירה. מיקום, ושטח במ”ר הם features חזקים מאוד, קומה וגיל הבנין הם features בינוניים וצבע הקירות או גודל המטבח יחסית לגודל חדר האמבטיה – הם features זניחים או אפילו מטעים.
- בשלב הבא אנו נבחר אלגוריתם למידה (מתוך מבחר אלגוריתמים בתחום) ונפעיל אותו על 80% מהנתונים שלנו (למשל).
- האלגוריתם ירכיב מודל חיזוי, ע”פ כל מיני שיטות מתמטיות / סטטיסטיות – שניתן להריץ: לשלוח לו פרטים של דירה – ולקבל תשובה = מחיר משוערך.
- נשתמש ב-20% הנתונים הנותרים שלא השתמשנו בהם ללמידה – לצורך ביקורת: עד כמה טוב המודל שנוצר? מה התפלגות התשובות שלו?
- כך אפשר לחזור כמה מחזורים עד שאנו מוצאים אלגוריתם ו-tuning שמספקים תוצאות שאנו מרוצים מהן.
- שלב זה יש לנו תוכנה שיכולה לשערך בדיוק כזה או אחר (בשאיפה: דיוק דיי טוב) את העלות הצפויה של דירה ע”פ נתונים גולמיים.
- כמובן שניתן לשפר את המודל עם הכנסה של Domain Knowledge נוסף: למשל אנו יכולים להעריך שיש הבדל בהתנהגות בין המרכז לפריפריה. אולי הרכבה של 2 מודלים שונים: אחד למרכז ואחד לפריפריה – תשיג תוצאה טובה יותר.
- יש עוד כלים רבים לשיפור מודל החיזוי – מדובר בד”כ בתהליך איטרטיבי ומשמעותי של שיפורים.
Unsupervised Learning – למידה לא מפוקחת
זוהי קטגוריה מעט שונה של ML בה יש לנו סט של נתונים, אך ללא תשובות (target value) – מהם אנו מנסים להפיק תובנות.
למשל: אנו מנסים לסווג מאמרים לקבוצות הגיוניות, מבלי שיש דוגמה לסיווג שכזה.
ניתן להשתמש ב-features כמו אורך המאמר, מספר המלים שחוזר פעמים רבות יותר בכל מאמר, או המצאות / אי המצאות של מילות מפתח.
גם כאן, אנו בוחרים אלגוריתם שיבנה לנו מודל, לו נזין נתונים של מאמרים – ונקבל הצעה לחלוקה לקבוצות.
ההערכה של הצלחת המודל תהיה תהליך קצת שונה: אולי תהליך ידני, אולי הרצה של סימולטור כזה או אחר שינסה לקבוע את הצלחת המודל.
טכניקות של ML מסוגלות לפתור בעיות שלא היה ניתן לפתור בצורה אחרת: מזיהוי כתב יד, המלצות תוכן (“אנשים שקנו X גם קנו Y”), זיהוי פריצות אבטחה, או נהיגה של רכב אוטונומי. את כל הבעיות הללו – אתם מוזמנים לנסות ולפתור בעזרת קוד אימפרטיבי.
בפרויקט שלי מימשתי את למידת המכונה מצורת Supervised Learning – למידה מפוקחת
- תהליך העבודה (Workflow) של ML
תהליך העבודה של ML הוא מעט יותר מורכב ממה שתיארתי. מכיוון שעיקר העבודה על ML היא התהליך ולא כתיבת קוד – אפרט מעט יותר על התהליך.
אני אתמקד בתהליך שמתאים ל Supervised Learning, כמו בעיית רגרסיה (ניבוי ערך של נכס נדל”ן).
השלבים בתהליך הם:
- הגדרת הבעיה –> כיוון הפתרון
זהו השלב הראשון ו”הקשה” ביותר: לעתים קרובות אין שום מתודולוגיה שיכולה להנחות אותנו כיצד לבצע אותו. הגדרת הבעיה לרוב נעשית על-ידי אנשי הביזנס, ואנשי ה ML אמורים לאמת, לעמת, ולפרט אותה.
הבעיה שבחרתי לפתור היא חיזוי עלרוד של תמונות נוף.
- השגת הנתונים (Obtaining Data)
לכמות הנתונים יש גם חשיבות גדולה: אלגוריתמים רבים יהיו מוצלחים הרבה יותר – כאשר יש להם יותר נתונים ללמוד מהם.
לפעמים הנתונים נמצאים במערכות הארגון – ופשוט יש לשלוף אותם / או להתחיל לאסוף אותם. פעמים אחרות הדרך להשיג את הנתונים היא דרך צד שלישי (ספק, אתר) או ממש לקנות נתונים מארגון אחר שיש לו אותם.
שלב זה בעיה משולבת של Domain Knowledge, תכנות, והבנה ארגונית טובה – ברוב הפעמים לא תוכלו להשיג את הנתונים לבד.
את הנתונים שלי הורדתי מאתר Kaggle
- קרצוף הנתונים (Scrubbing Data)
גם ברגע שיש נתונים “נכונים “- לרוב יהיו להם בעיות איכות (Data Quality):
- להשלים ערכים חסרים (או להסיר אותם, אם תיקון לא אפשרי). באג בפרודקשיין עשוי לגרור לאחוז כזה או אחר של נתונים שגויים או חסרים – לאורך תקופה.
- לתקן אי התאמות. למשל שמי הופיע פעם בספריית הוידאו גם כ “דניאל קאופמן” וגם כ “דניאל קופמן” – הייתי מיוצג כשני אנשים, למרות שאני אדם אחד – מה שיגרום להטיה בניתוח הנתונים.
- יש טכניקות שונות (חלקן מבוססות ML) בכדי להתאים ולזהות שבעצם מדובר באותו האדם (בסבירות כזו או אחרת)
- נורמליזציה של הנתונים, למשל: כל התאריכים באותו ה format כך שניתן יהיה לעשות השוואות. המרה של מיילים לקילומטרים, סדר נתונים כזה לסדר אחר, וכו’. ישנו כלל של ML שטוען: “הנתונים שתקבלו תמיד יהיו בפורמט הלא-נכון”
שלב השגת הנתונים + “הקרצוף” נחשבים בד”כ לכ 50-80% מכלל העבודה ב ML Workflow – החלק הארי. שלב זה דורש יכולות תכנות, קצת הבנה סטטיסטית (עבור תיקונים וקירובים), ומעט Domain Knowledge – על מנת להבין את הנתונים טוב יותר. כמעט תמיד ניתן להשקיע עוד עבודה בכדי לשפר עוד יותר את איכות הנתונים – וחשוב לדעת גם מתי “לעצור”.
- בחירת האלגוריתם
ישנם עשרות אלגוריתמים של ML וכמה שרלוונטיים לכל סוג של בעיה. עליכם להבין את הנתונים ואת האלגוריתם – על מנת (לנסות ו)להתאים את האלגוריתם הטוב ביותר.
למשל: בעיה של Binary Classification ניתן לפתור בעזרת Naive Bayes (מודל סטטיסטי שלא דורש כמויות גדולות של נתונים ורץ מהר), בעזרת Logistic Regression מבצע רגרסיה בין features ע”פ משקולות נתונות), או עץ החלטה (שמנסה לשערך הסתברות של כל feature בנפרד – ואז לסכם את סך ההסתברויות.
הבחירה באלגוריתם תשפיע על רמת הדיוק של התוצאה, על מהירות הריצה, על הרגישות לכמות ולאיכות הנתונים, על קלות הבנת התוצאות של האלגוריתם, ועל ההתאמה לבעיה הספציפית וסוג הנתונים שיש לנו, ועוד.
- אימון המודל
זהו השלב בו מזרימים את הנתונים לאלגוריתם, ובד”כ בונים תהליך אוטומטי שיעשה זאת.
נרצה לנסות אימון של המערכת עם קבוצות שונות של features וכך לבדוק אילו features הם מוצלחים יותר לפתרון הבעיה. זהו סוג של fine tuning של האלגוריתם, למשל:
- האם כדאי לשלוח mean או average?
- אולי כדאי average כאשר מנקים מעט נקודות קיצון?
- כיצד ניתן לצמצם את כמות ה – features ,קרי: סוגי הנתונים?
לרוב, פחות features יובילו לכמות קטנה יותר של טעויות ולעתים קרובות הנתונים שלנו יתעדכנו בצורה שוטפת, וברגע שנתגבש על מודל שעובד – נרצה לאמן מחדש את המערכת כל שבוע, או אפילו כל יום.
שלב זה דורש הבנה סטטיסטית, מעט תכנות, ויכולות תפעול.
- בחינת המודל
בשלב זה אנו מריצים את קבוצת הביקורת (או טכניקה אחרת שבחרנו) על מנת לבחון את הצלחת המודל. זהו שלב בעיקר מדעי / סטטיסטי – בו אנו מנסים להעריך עד כמה המודל מוצלח.
בשלב זה בדרך כלל יהיו השגות חדשות על איכות הנתונים / סוג הנתונים הנדרש / התאמת האלגוריתם וכו’. מכאן חוזרים לכמה איטרציות נוספות של שיפורים – עד שמגיעים לרמה הרצויה. כמה איטרציות? תלוי כמה טוב צריך להיות המודל, כמה זמן יש לכם, ועד כמה אתם מעריכים שזמן נוסף ישפר את המודל.
בסופו של דבר, יש מודל חיזוי מספיק טוב – שניתן לחבר למערכות ה Production ולהתחיל להשתמש בו.
- סיכום
למידת מכונה היא סוג של שיטה מדעית לחיזוי על סמך מציאת דפוסים (Patterns) בנתוני עבר. יש בה הרבה יותר מן האומנות (הרבה בחירות לא מדויקות וניחושים מושכלים, הרבה fine-tuning) – מאשר תחומים קלאסיים של כתיבת תוכנה.
ישנן מספר סוגי רשתות ML – ANN, CNN, RNN ועוד כמה.
אני מזמין את כל מי שמתעניין בתחום, להתחחיל ללמוד ולבנות רשתות בצורה עצמאית.