JavaRush /בלוג Java /Random-HE /למידת מכונה למפתחי Java, חלק 1

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

פורסם בקבוצה
הגדר אלגוריתם למידת מכונה ופתח את פונקציית הניבוי הראשונה שלך באמצעות Java. מכוניות בנהיגה עצמית, מערכות זיהוי פנים ועוזרות קוליות פותחו כולם באמצעות טכנולוגיות ומסגרות למידת מכונה. וזה רק הגל הראשון. במהלך 10 השנים הבאות, דור חדש של מוצרים ישנה את העולם שלנו, ויוליד גישות חדשות לפיתוח תוכניות, מוצרים ויישומים. למידת מכונה למפתחי Java, חלק 1 - 1כמתכנת ג'אווה, אתה רוצה לתפוס את הגל הזה עכשיו כשחברות טכנולוגיה מתחילות להשקיע רבות בלמידת מכונה. מה שאתה לומד היום אתה יכול להשתמש בחמש השנים הבאות. אבל מאיפה להתחיל? מאמר זה נועד לענות על שאלה זו. תקבל רושם ראשוני של עקרונות למידת מכונה על ידי ביצוע המדריך הקצר שלנו ליישום והכנת אלגוריתם למידת מכונה. לאחר שלמדת על המבנה של אלגוריתם למידה והתכונות בהן אתה יכול להשתמש כדי לאמן אותו, להעריך אותו ולבחור את הפונקציה המספקת את דיוק הניבוי הטוב ביותר, תקבל הבנה כיצד להשתמש במסגרת JVM (Weka) כדי לבנות פתרונות למידת מכונה. מאמר זה מתמקד בלמידת מכונה מפוקחת מכיוון שהוא העיקרון הנפוץ ביותר בפיתוח יישומים חכמים.

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

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

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

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

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

כל למידת מכונה מבוססת על נתונים. עבור פרויקט למידת מכונה בפיקוח, עליך לסמן את הנתונים בסמנים באופן המספק תשובות משמעותיות לשאלה הנשאלת. להלן, בטבלה 1, כל רשומת פרטי בית מסומנת בתווית "מחיר בית". על ידי זיהוי הקשר בין נתוני הרשומה למחיר הבית, האלגוריתם אמור בסופו של דבר להיות מסוגל לחזות את מחיר השוק עבור בתים שאינם כלולים ברשימה הנתונה. (שימו לב ששטח הבית מצוין במ"ר, ומחיר הבית באירו).
טבלה 1. רשימת בתים
סִימָן סִימָן סִימָן תווית
אזור הבית מספר חדרים גיל הבית מחיר דירה צפוי
90 מ"ר / 295 רגל 2 חדרים בן 23 €249,000
101 מ"ר / 331 רגל 3 חדרים לא €338,000
1330 מ"ר / 4363 רגל 11 חדרים 12 שנים 6,500,000 €
בשלבים המוקדמים, סביר להניח שתתייג את הנתונים באופן ידני, אבל בסופו של דבר תלמד את התוכנית שלך לעשות זאת בעצמה. בטח כבר ראיתם את הגישה הזו עובדת עם לקוחות אימייל, כאשר על מנת להעביר מייל לתיקיית הספאם, אתם עונים על השאלה "האם זה דואר דואר אלקטרוני?" כשאתה משיב, אתה מאמן את התוכנית לזהות מיילים שאתה לא רוצה לראות. מסנן הספאם של האפליקציה מאומן לסמן הודעות מאותו מקור או המכילות את אותו תוכן ולנהל אותן לפי הכללים המתאימים. מערכי נתונים מסומנים נדרשים למטרות הכנה ובדיקה בלבד. לאחר השלמת שלב זה, אלגוריתם למידת מכונה פועל על הנתונים הלא מסומנים. לדוגמה, אתה יכול להזין אלגוריתם חיזוי רשומה חדשה, ללא תווית, של נתונים על בית, והוא אמור לחזות אוטומטית את המחיר הצפוי של הבית על סמך ה"ידע" שנרכש מנתוני ההכנה.

איך מכונה לומדת לחזות

האתגר בלמידת מכונה מפוקחת הוא למצוא את פונקציית החיזוי המתאימה לשאלה נתונה. מבחינה מתמטית, הקושי הוא למצוא פונקציה שלוקחת משתנה כקלט хומחזירה את הערך החזוי у. פונקציה זו של השערות (hθ)היא תוצאה של תהליך הכנה. לעתים קרובות פונקציית ההשערה נקראת גם הפונקציה האובייקטיבית או פונקציית החיזוי.
y = h θ (x)
ברוב המקרים, хמדובר במערך נתונים. בדוגמה שלנו מדובר במערך דו מימדי של אלמנטים המגדירים בית, המורכב ממספר החדרים ושטח הבית. מערך של ערכים כאלה הוא וקטור תכונה. על ידי ציון פונקציית מטרה ספציפית, נוכל להשתמש בה כדי לחזות כל וקטור תכונה х. כדי לחזות את מחירו של בית, עליך לקרוא לפונקציית המטרה באמצעות וקטור תכונה {101.0, 3.0}המורכב משטח הבית ומספר החדרים:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
בקוד המקור מדוגמה-1, הערכים במערך хמייצגים וקטור של תכונות הבית. הערך уהמוחזר על ידי הפונקציה האובייקטיבית הוא המחיר החזוי של הבית. המטרה של למידת מכונה היא לקבוע את הפונקציה האובייקטיבית שתעבוד בצורה מדויקת ככל האפשר בהינתן פרמטרי קלט לא ידועים. בלמידת מכונה, הפונקציה האובייקטיבית (hθ)נקראת לפעמים מודל. מודל זה הוא תוצאה של תהליך למידה.
למידת מכונה למפתחי Java, חלק 1 - 3
בהתבסס על דגימות אימון מסומנות, אלגוריתם הלמידה מחפש מבנים או דפוסים בנתוני האימון. אז זה בונה מודל שבדרך כלל טוב לנתונים. ככלל, תהליך הלמידה הוא חקרני באופיו. ברוב המקרים, התהליך חוזר על עצמו פעמים רבות באמצעות גרסאות שונות של אלגוריתמים ותצורות למידה. כתוצאה מכך, כל המודלים מוערכים על סמך מדדי ביצועים, ביניהם נבחר הטוב ביותר. והמודל הזה משמש לחישוב ערכים משוערים עבור נתונים לא מתויגים עתידיים.

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

כדי ללמד מכונה "לחשוב", תחילה עליך לבחור את אלגוריתם הלמידה שבו תשתמש. לדוגמה, רגרסיה לינארית. זהו אחד האלגוריתמים הפשוטים והפופולריים ביותר של למידת מכונה מפוקחת. האלגוריתם מניח שהקשר בין תכונות הקלט וסמני התוצאה הוא ליניארי. פונקציית הרגרסיה הלינארית הכללית למטה מחזירה את הערך החזוי על ידי סיכום כל האלמנטים של וקטור התכונה כפול הפרמטר θ (תטא) . פרמטר זה משמש במהלך תהליך האימון כדי להתאים או "לכוון" את פונקציית הרגרסיה בהתבסס על נתוני האימון.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
בפונקציית רגרסיה ליניארית, פרמטר תטא ופרמטרי תכונה ממוספרים עם כתוביות משנה. התווית קובעת את מיקום הפרמטר (θ)ופרמטר התכונה (х)בוקטור. שימו לב שהתכונה x 0 היא מונח תזוזה קבועה והיא משמעותית 1למטרות חישוביות. כתוצאה מכך, המדד של פרמטרים משמעותיים כגון שטח הבית מתחיל ב-x 1 . לכן, אם ל-x 1 מוקצה הערך הראשון של וקטור התכונה (אזור הבית), אז x 2 ייקח את הערך הבא (מספר חדרים) וכן הלאה. דוגמה-2 מדגימה את יישום Java של פונקציית הרגרסיה הלינארית, מסומנת מתמטית כ-h θ (x). למען הפשטות, חישובים מבוצעים באמצעות double. בשיטה apply(), נקבע שהאלמנט הראשון של המערך יהיה שווה ל-1.0 ויוגדר מחוץ לפונקציה הזו. דוגמה 2: רגרסיה לינארית ב-Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 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 מ"ר ייחזה כפי שמוצג להלן:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
באיור למטה ניתן לראות את הגרף של פונקציית יעד החיזוי (קו כחול). זה מתקבל על ידי חישוב הפונקציה האובייקטיבית עבור כל הערכים של שטח הבית. הטבלה מכילה גם זוגות מחיר-אזור המשמשים לאימון.
למידת מכונה למפתחי Java, חלק 1 - 4
כרגע טבלת החיזוי נראית די טוב. הקואורדינטות של הגרף (מיקום ושיפוע) נקבעות על ידי הווקטור θ { 1.004579, 5.286822 }. אבל איך אתה יכול לקבוע איזה θ-וקטור המתאים ביותר ליישום שלך? האם הפונקציה תתאים יותר אם תשנה את הפרמטר הראשון או אולי השני? כדי לקבוע את וקטור התטא המתאים ביותר, אתה זקוק לפונקציית עזר שמעריכה עד כמה הפונקציה האובייקטיבית עושה את העבודה. להמשך תרגום מאנגלית. מחבר: גרגור רוט, אדריכל תוכנה, JavaWorld.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION