רגרסיה לוגיסטית בג'אווה

1. הקדמה

רגרסיה לוגיסטית היא מכשיר חשוב בארגז הכלים של מתרגלים למידת מכונה (ML).

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

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

2. סקירה כללית

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

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

אימונים הם חלק מתהליך עבודה חוזר של ML:

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

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

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

3. פרדיגמות של ML

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

  • למידה מפוקחת (סיווג תמונות, זיהוי אובייקטים, ניתוח סנטימנט)
  • למידה ללא פיקוח (זיהוי חריגות)
  • למידת חיזוק (אסטרטגיות משחק)

המקרה אותו אנו מתארים במדריך זה שייך ללמידה בפיקוח.

4. ארגז כלים ML

ב- ML יש סט כלים שאנו יכולים ליישם בבניית מודל. בואו נזכיר כמה מהם:

  • רגרסיה לינארית
  • רגרסיה לוגיסטית
  • רשתות עצביות
  • תמיכה במכונה וקטורית
  • k- השכנים הקרובים ביותר

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

5. ספריות ML

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

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

6. רגרסיה לוגיסטית בזיהוי ספרות

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

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

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

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

6.1. נתוני קלט

כנתוני הקלט, אנו משתמשים במסד הנתונים הידוע של MNIST של ספרות בכתב יד. כנתוני הקלט, יש לנו 28 × 28 פיקסל תמונות בקנה מידה אפור. לכל תמונה יש תווית טבעית שהיא הספרה שהתמונה מייצגת:

על מנת לאמוד את יעילות המודל שאנו הולכים לבנות, אנו מחלקים את נתוני הקלט למערכות אימונים ומבחנים:

רכבת DataSetIterator = RecordReaderDataSetIterator חדש (...); מבחן DataSetIterator = RecordReaderDataSetIterator חדש (...);

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

6.2. בניין מודלים

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

LeNet-5 היא רשת עצבית המורכבת מסדרת שכבות שהופכות את תמונת הפיקסלים 28 × 28 לווקטור עשר-ממדי:

וקטור הפלט העשר-ממדי מכיל הסתברויות שתווית תמונת הקלט היא 0, או 1, או 2, וכן הלאה.

לדוגמא, אם לווקטור הפלט יש את הצורה הבאה:

{0.1, 0.0, 0.3, 0.2, 0.1, 0.1, 0.0, 0.1, 0.1, 0.0}

פירוש הדבר שההסתברות שתמונת הקלט תהיה אפס היא 0.1, לאחת היא 0, להיות שתיים היא 0.3 וכו '. אנו רואים שההסתברות המקסימאלית (0.3) תואמת לתווית 3.

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

הקמנו את המודל על ידי יצירת a MultiLayerNetwork לְהִתְנַגֵד:

מודל MultiLayerNetwork = MultiLayerNetwork חדש (config);

בבנאי שלו, עלינו לעבור א תצורה מרובת שכבות לְהִתְנַגֵד. זהו העצם המתאר את הגיאומטריה של הרשת העצבית. על מנת להגדיר את הגיאומטריה של הרשת, עלינו להגדיר כל שכבה.

בואו נראה כיצד אנו עושים זאת עם הראשון והשני:

שכבת ConvolutionLayer1 = ConvolutionLayer חדש. Builder (5, 5) .nIn (ערוצים) .stride (1, 1) .nOut (20). Activation (Activation.IDENTITY) .build (); SubsamplingLayer layer2 = SubsamplingLayer new. Builder (SubsamplingLayer.PoolingType.MAX) .kernelSize (2, 2). Stride (2, 2) .build ();

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

כעת, אנו מוכנים לבנות את תצורה מרובת שכבות לְהִתְנַגֵד:

MultiLayerConfiguration config = חדש NeuralNetConfiguration.Builder () // שלבי הכנה. רשימה (). שכבה (שכבה 1). שכבה (שכבה 2) // שכבות אחרות ושלבים אחרונים .בניין ();

שאנו מעבירים ל MultiLayerNetwork בַּנַאִי.

6.3. הַדְרָכָה

המודל שבנינו מכיל 431080 פרמטרים או משקולות. אנחנו לא נביא כאן את החישוב המדויק של המספר הזה, אבל עלינו להיות מודעים לכך שסתם tבשכבה הראשונה שלו יש יותר מ 24x24x20 = 11520 משקולות.

שלב האימונים פשוט כמו:

model.fit (רכבת); 

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

הערכת הערכה = model.evaluate (מבחן); logger.info (eval.stats ());

דגם ה- LeNet-5 משיג דיוק גבוה למדי של כמעט 99% אפילו בתרגול אימונים יחיד (תקופה). אם אנו רוצים להשיג דיוק גבוה יותר, עלינו לבצע איטרציות רבות יותר באמצעות רגיל לולאה:

עבור (int i = 0; i <epochs; i ++) {model.fit (רכבת); train.reset (); test.reset (); } 

6.4. נְבוּאָה

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

תמונה INDArray = NativeImageLoader חדש (גובה, רוחב, ערוצים) .asMatrix (קובץ); ImagePreProcessingScaler חדש (0, 1). טרנספורמציה (תמונה);

המשתנה תמונה מכיל את התמונה שלנו מצטמצמת ל 28 × 28 בגודל אפור. אנחנו יכולים להאכיל אותו למודל שלנו:

פלט INDArray = model.output (תמונה);

המשתנה תְפוּקָה יכיל את ההסתברויות שהתמונה תהיה אפס, אחת, שתיים וכו '.

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

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

7. מסקנה

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

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


$config[zx-auto] not found$config[zx-overlay] not found