ברוך בואך ל-"שלום, עולם" של למידה חישובית

1. לפני שמתחילים

במעבדה זו תלמדו את העקרונות הבסיסיים של למידה חישובית (ML); במקום לתכנת כללים מפורשים בשפה מסוימת, כמו Java או C++ , תבנו מערכת שמלמדת על נתונים להסיק את הכללים שקובעים את הקשר בין המספרים.

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

cc3628d9a1547597.png

if(speed<4){
  status=WALKING;
}

אפשר להאריך את הפעולה כדי שיפעל עם תנאי אחר.

f2cc3929221107b8.png

if(speed<4){
    status=WALKING;
} else {
    status=RUNNING;
}

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

aeb282cf03d5cff.png

if(speed<4){
    status=WALKING;
} else if(speed<12){
    status=RUNNING;
} else {
    status=BIKING;
}

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

fc772abb6fee2804.png

// Now what?

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

דרישות מוקדמות

לפני שתנסו את שיעור הקוד הזה, כדאי לכם:

  • ידע מעמיק ב-Python
  • מיומנויות תכנות בסיסיות

מה תלמדו

  • העקרונות הבסיסיים של למידה חישובית

מה תיצור

  • המודל הראשון שלך ללמידה חישובית

מה צריך?

אם מעולם לא יצרת מודל ML באמצעות TensorFlow, ניתן להשתמש ב-Colaboratory, סביבה מבוססת דפדפן המכילה את כל התלות הנדרשות. תוכלו למצוא את הקוד עבור שאר קוד הקוד פועל ב-Colab.

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

2. מהו ML?

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

c72f871306134e45.png

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

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

9b85a337ee816e1b.png

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

6ff58697a85931f4.png

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

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

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

אם חוזרים לתרשים הזה:

53ff9e2cb511936e.png

כתוצאה מכך, השתמש במודלים האלה בזמן הריצה:

693430bb4d7fa001.png

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

3. יצירת מודל ML הראשון שלך

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

X:

‎-1

0

1

2

3

4

כן:

-2

1

4

7

10

13

כשמביטים בהם, מבחינים בערך של X גדל ב-1 ככל שקוראים משמאל לימין והערך של Y עולה ב-3. בוודאי אתם חושבים ש-Y שווה פי 3 או פחות. בשלב הבא, אתם בטח מסתכלים על ה-0 ב-X ורואים ש-Y הוא 1, ואתם מחפשים את הקשר Y=3X+1.

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

עכשיו צריך לבדוק את הקוד כדי לעשות זאת.

איך תאמנו רשת נוירונים כדי לבצע את המשימה המקבילה? המערכת משתמשת בנתונים! מזינים על ידי מערך של X's וקבוצה של Y's, כדי שתהיה אפשרות להבין את הקשר ביניהם.

ייבוא

התחלת הייבוא מתבצעת. כאן אתם מייבאים את TensorFlow וקוראים ל-tf לשימוש קל.

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

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

import tensorflow as tf
import numpy as np
from tensorflow import keras

הגדרה ויצירה של רשת נוירונים

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

model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])

בשלב הבא, כותבים את הקוד כדי להיעזר ברשת הנוירונים. כשעושים זאת, צריך לציין שתי פונקציות – loss וoptimizer.

בדוגמה זו אתם יודעים שהקשר בין המספרים הוא Y=3X+1.

כשהמחשב מנסה ללמוד זאת, הוא מבצע ניחושים, אולי Y=10X+10. הפונקציה loss מודדת את התשובות המנוגדות מול התשובות הנכונות הידועות ומודדת את הביצועים הטובים או הגרועים.

בשלב הבא, המודל משתמש בפונקציה optimizer כדי לנחש עוד. לפי התוצאה של פונקציית ההפסד, היא מנסה למזער את ההפסד. בשלב זה, יכול להיות שיופיע משהו כמו Y=5X+5. זה עדיין די גרוע, אבל הוא קרוב יותר לתוצאה הנכונה (ההפסד נמוך יותר).

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

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

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

model.compile(optimizer='sgd', loss='mean_squared_error')

מספקים את הנתונים

בשלב הבא, מזינים נתונים מסוימים. במקרה כזה, תיקחו את ששת המשתנים X ו-Y מוקדם יותר. אפשר לראות שהקשר בין השניים הוא Y=3X+1, כך שה-X הוא -1, ו-Y הוא -2.

לשם כך, ספריית Fithon בשם NumPy מספקת מבני נתונים רבים מסוג 'מערך'. מציינים את הערכים כמערך ב-NumPy עם np.array[].

xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-2.0, 1.0, 4.0, 7.0, 10.0, 13.0], dtype=float)

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

4. אימון רשת נוירונים

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

model.fit(xs, ys, epochs=500)

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

f110d5abed07c1b9.png

עם התקדמות האימון, ההפסדים יהיו קטנים מאוד.

81ca5e71298b414b.png

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

12b187014b639fd.png

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

5. שימוש במודל

יש לכם מודל שהוכשר ללמוד את הקשר בין X ל-Y. אפשר להשתמש בשיטת model.predict כדי לחשב את ה-Y עבור X X לא ידוע. למשל, אם X הוא 10, מה לדעתך יהיה Y? צריך לנחש לפני שמריצים את הקוד הבא:

print(model.predict([10.0]))

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

רשתות נוירונים מתייחסות להסתברות, כך שלפי התחזיות, יש סבירות גבוהה מאוד שהקשר בין X ל-Y הוא Y=3X+1, אבל הוא לא יכול לדעת בוודאות עם שש נקודות נתונים בלבד. התוצאה הזו קרובה מאוד ל-31, אבל לא בהכרח 31.

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

6. מזל טוב

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

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

למידע נוסף

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