למידת מכונה למפתחי Java, חלק 1: אלגוריתמים ללימוד מכונה

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

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

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

למידת מכונה למפתחי Java, חלק 2

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

לימוד מכונה ובינה מלאכותית

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

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

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

למידה מפוקחת לעומת למידה ללא פיקוח

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

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

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

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

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

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

לימוד מכונה מפוקח

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

לוח 1. רשומות בית

תכונה תכונה תכונה תווית
גודל הבית מספר חדרים גיל הבית עלות בית משוערת
90 מ"ר / 295 רגל 2 חדרים 23 שנים 249,000 €
101 מ"ר / 331 רגל 3 חדרים לא 338,000 €
1330 מ"ר / 4363 רגל 11 חדרים 12 שנים 6,500,000 €

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

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

כיצד מכונות לומדות לחזות

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

גרגור רוט

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

 // target function h (which is the output of the learn process) Function h = ...; // set the feature vector with house size=101 and number-of-rooms=3 Double[] x = new Double[] { 101.0, 3.0 }; // and predicted the house price (label) double y = h.apply(x); 

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

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

גרגור רוט

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

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

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

רגרסיה לינארית

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

גרגור רוט

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

רישום 2 מציג יישום Java של פונקציית רגרסיה לינארית זו, המוצג באופן מתמטי כ h θ (x). לשם פשטות, החישוב נעשה באמצעות סוג הנתונים double. בתוך apply()השיטה, צפוי שהאלמנט הראשון של המערך נקבע עם ערך 1.0 מחוץ לפונקציה זו.

רישום 2. רגרסיה לינארית בג'אווה

 public class LinearRegressionFunction implements Function { private final double[] thetaVector; LinearRegressionFunction(double[] thetaVector) { this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length); } public Double apply(Double[] featureVector) { // for computational reasons the first element has to be 1.0 assert featureVector[0] == 1.0; // simple, sequential implementation double prediction = 0; for (int j = 0; j < thetaVector.length; j++) { prediction += thetaVector[j] * featureVector[j]; } return prediction; } public double[] getThetas() { return Arrays.copyOf(thetaVector, thetaVector.length); } } 

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

בדוגמה שלהלן LinearRegressionFunctionיונתן לחזות את מחיר הבית על פי גודל הבית. בהתחשב בכך ש- x 0 צריך להיות ערך קבוע של 1.0, פונקציית היעד מופעלת באמצעות שני פרמטרי תטא. פרמטרי התטא הם הפלט של תהליך למידה. לאחר יצירת המופע החדש, ניתן לחזות את מחיר הבית בגודל 1330 מ"ר באופן הבא:

 // the theta vector used here was output of a train process double[] thetaVector = new double[] { 1.004579, 5.286822 }; LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector); // create the feature vector function with x0=1 (for computational reasons) and x1=house-size Double[] featureVector = new Double[] { 1.0, 1330.0 }; // make the prediction double predictedPrice = targetFunction.apply(featureVector); 

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

גרגור רוט

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

ציון פונקציית היעד

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

גרגור רוט